Refactor transaction signing in particular order, BTC only (maybe) need it

This commit is contained in:
Srdjan Obucina 2020-03-21 03:23:04 +01:00
parent 68f246b955
commit 0a63eed265
2 changed files with 36 additions and 32 deletions

View file

@ -269,41 +269,30 @@ void sidechain_net_handler::process_sidechain_transactions() {
const auto &idx_range = idx.equal_range(std::make_tuple(sidechain, false));
std::for_each(idx_range.first, idx_range.second, [&](const sidechain_transaction_object &sto) {
son_id_type invalid_signer = son_id_type(0xFFFFFFFF);
son_id_type next_signer = invalid_signer;
for (auto &signer : sto.signers) {
if (signer.second == false) {
next_signer = signer.first;
break;
}
ilog("Sidechain transaction to process: ${sto}", ("sto", sto));
bool complete = false;
std::string processed_sidechain_tx = process_sidechain_transaction(sto, complete);
if (processed_sidechain_tx.empty()) {
wlog("Sidechain transaction not processed: ${sto}", ("sto", sto));
return;
}
if ((next_signer != invalid_signer) && (next_signer == plugin.get_current_son_id())) {
ilog("Sidechain transaction to process: ${sto}", ("sto", sto));
sidechain_transaction_sign_operation sts_op;
sts_op.payer = plugin.get_son_object(plugin.get_current_son_id()).son_account;
sts_op.sidechain_transaction_id = sto.id;
sts_op.transaction = processed_sidechain_tx;
sts_op.complete = complete;
bool complete = false;
std::string processed_sidechain_tx = process_sidechain_transaction(sto, complete);
if (processed_sidechain_tx.empty()) {
wlog("Sidechain transaction not processed: ${sto}", ("sto", sto));
return;
}
sidechain_transaction_sign_operation sts_op;
sts_op.payer = plugin.get_son_object(plugin.get_current_son_id()).son_account;
sts_op.sidechain_transaction_id = sto.id;
sts_op.transaction = processed_sidechain_tx;
sts_op.complete = complete;
signed_transaction trx = plugin.database().create_signed_transaction(plugin.get_private_key(plugin.get_current_son_id()), sts_op);
trx.validate();
try {
plugin.database().push_transaction(trx, database::validation_steps::skip_block_size_check);
if (plugin.app().p2p_node())
plugin.app().p2p_node()->broadcast(net::trx_message(trx));
} catch (fc::exception e) {
elog("Sending proposal for sidechain transaction sign operation failed with exception ${e}", ("e", e.what()));
}
signed_transaction trx = plugin.database().create_signed_transaction(plugin.get_private_key(plugin.get_current_son_id()), sts_op);
trx.validate();
try {
plugin.database().push_transaction(trx, database::validation_steps::skip_block_size_check);
if (plugin.app().p2p_node())
plugin.app().p2p_node()->broadcast(net::trx_message(trx));
} catch (fc::exception e) {
elog("Sending proposal for sidechain transaction sign operation failed with exception ${e}", ("e", e.what()));
}
});
}

View file

@ -881,6 +881,21 @@ std::string sidechain_net_handler_bitcoin::process_withdrawal(const son_wallet_w
}
std::string sidechain_net_handler_bitcoin::process_sidechain_transaction(const sidechain_transaction_object &sto, bool &complete) {
//// Uncomment to get signing in order from sto.signers
//son_id_type invalid_signer = son_id_type(0xFFFFFFFF);
//son_id_type next_signer = invalid_signer;
//for (auto &signer : sto.signers) {
// if (signer.second == false) {
// next_signer = signer.first;
// break;
// }
//}
//
//if ((next_signer == invalid_signer) || (next_signer != plugin.get_current_son_id())) {
// return "";
//}
return sign_transaction(sto.transaction, complete);
}