Single sidechain transaction signature per block allowed only

This commit is contained in:
Srdjan Obucina 2020-03-23 08:03:52 +01:00
parent 23d5779798
commit 09d7337cd3
4 changed files with 10 additions and 0 deletions

View file

@ -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) )

View file

@ -22,6 +22,7 @@ namespace graphene { namespace chain {
std::string transaction;
std::vector<std::pair<son_id_type, bool>> 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) )

View file

@ -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;
});

View file

@ -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);