From 09d7337cd3443659f2ee2263dd67d93074cb56c9 Mon Sep 17 00:00:00 2001 From: Srdjan Obucina Date: Mon, 23 Mar 2020 08:03:52 +0100 Subject: [PATCH] Single sidechain transaction signature per block allowed only --- .../graphene/chain/protocol/sidechain_transaction.hpp | 2 ++ .../include/graphene/chain/sidechain_transaction_object.hpp | 2 ++ libraries/chain/sidechain_transaction_evaluator.cpp | 5 +++++ .../plugins/peerplays_sidechain/sidechain_net_handler.cpp | 1 + 4 files changed, 10 insertions(+) diff --git a/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp b/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp index 9080b820..4ddbd7ce 100644 --- a/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp +++ b/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp @@ -30,6 +30,7 @@ namespace graphene { namespace chain { sidechain_transaction_id_type sidechain_transaction_id; std::string transaction; + block_id_type block; bool complete; account_id_type fee_payer()const { return payer; } @@ -62,6 +63,7 @@ FC_REFLECT( graphene::chain::sidechain_transaction_sign_operation::fee_parameter FC_REFLECT( graphene::chain::sidechain_transaction_sign_operation, (fee)(payer) (sidechain_transaction_id) (transaction) + (block) (complete) ) FC_REFLECT( graphene::chain::sidechain_transaction_send_operation::fee_parameters_type, (fee) ) diff --git a/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp b/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp index bc5e36a3..f4f596cf 100644 --- a/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp +++ b/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp @@ -22,6 +22,7 @@ namespace graphene { namespace chain { std::string transaction; std::vector> signers; + block_id_type block; bool valid = false; bool complete = false; bool sent = false; @@ -62,6 +63,7 @@ FC_REFLECT_DERIVED( graphene::chain::sidechain_transaction_object, (graphene::db (object_id) (transaction) (signers) + (block) (valid) (complete) (sent) ) diff --git a/libraries/chain/sidechain_transaction_evaluator.cpp b/libraries/chain/sidechain_transaction_evaluator.cpp index 1d724e73..d49ad08a 100644 --- a/libraries/chain/sidechain_transaction_evaluator.cpp +++ b/libraries/chain/sidechain_transaction_evaluator.cpp @@ -33,6 +33,7 @@ object_id_type sidechain_transaction_create_evaluator::do_apply(const sidechain_ std::transform(op.signers.begin(), op.signers.end(), std::inserter(sto.signers, sto.signers.end()), [](const son_id_type son_id) { return std::make_pair(son_id, false); }); + sto.block = db().head_block_id(); sto.valid = true; sto.complete = false; sto.sent = false; @@ -60,6 +61,8 @@ void_result sidechain_transaction_sign_evaluator::do_evaluate(const sidechain_tr } FC_ASSERT(expected, "Signer not expected"); + FC_ASSERT(sto_obj->block == op.block, "Sidechain transaction already signed in this block"); + FC_ASSERT(sto_obj->valid, "Transaction not valid"); FC_ASSERT(!sto_obj->complete, "Transaction signing completed"); FC_ASSERT(!sto_obj->sent, "Transaction already sent"); @@ -77,6 +80,7 @@ object_id_type sidechain_transaction_sign_evaluator::do_apply(const sidechain_tr db().modify(*sto_obj, [&](sidechain_transaction_object &sto) { sto.transaction = op.transaction; + sto.block = db().head_block_id(); sto.complete = op.complete; for (size_t i = 0; i < sto.signers.size(); i++) { if (sto.signers.at(i).first == son_obj->id) { @@ -113,6 +117,7 @@ object_id_type sidechain_transaction_send_evaluator::do_apply(const sidechain_tr auto sto_obj = sto_idx.find(op.sidechain_transaction_id); db().modify(*sto_obj, [&](sidechain_transaction_object &sto) { + sto.block = db().head_block_id(); sto.sent = true; }); diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp index 8485e2a4..64fbcbf6 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp @@ -258,6 +258,7 @@ void sidechain_net_handler::process_sidechain_transactions() { sts_op.payer = plugin.get_current_son_object().son_account; sts_op.sidechain_transaction_id = sto.id; sts_op.transaction = processed_sidechain_tx; + sts_op.block = sto.block; sts_op.complete = complete; signed_transaction trx = database.create_signed_transaction(plugin.get_private_key(plugin.get_current_son_id()), sts_op);