From 23d5779798a9714940434d894e0291e566c8f0a1 Mon Sep 17 00:00:00 2001 From: Srdjan Obucina Date: Mon, 23 Mar 2020 07:27:42 +0100 Subject: [PATCH] Improved check for sidechain transaction object creation --- .../chain/protocol/sidechain_transaction.hpp | 8 ++------ .../chain/sidechain_transaction_object.hpp | 12 ++++++------ .../chain/sidechain_transaction_evaluator.cpp | 16 ++++++++-------- .../sidechain_net_handler_bitcoin.cpp | 8 ++++---- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp b/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp index 28a54dde..9080b820 100644 --- a/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp +++ b/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp @@ -13,9 +13,7 @@ namespace graphene { namespace chain { account_id_type payer; sidechain_type sidechain; - optional son_wallet_id; - optional son_wallet_deposit_id; - optional son_wallet_withdraw_id; + object_id_type object_id; std::string transaction; std::vector signers; @@ -56,9 +54,7 @@ namespace graphene { namespace chain { FC_REFLECT( graphene::chain::sidechain_transaction_create_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::sidechain_transaction_create_operation, (fee)(payer) (sidechain) - (son_wallet_id) - (son_wallet_deposit_id) - (son_wallet_withdraw_id) + (object_id) (transaction) (signers) ) diff --git a/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp b/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp index bcfef779..bc5e36a3 100644 --- a/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp +++ b/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp @@ -18,9 +18,7 @@ namespace graphene { namespace chain { static const uint8_t type_id = sidechain_transaction_object_type; sidechain_type sidechain; - optional son_wallet_id; - optional son_wallet_deposit_id; - optional son_wallet_withdraw_id; + object_id_type object_id; std::string transaction; std::vector> signers; @@ -29,6 +27,7 @@ namespace graphene { namespace chain { bool sent = false; }; + struct by_object_id; struct by_sidechain_and_complete; struct by_sidechain_and_complete_and_sent; using sidechain_transaction_multi_index_type = multi_index_container< @@ -37,6 +36,9 @@ namespace graphene { namespace chain { ordered_unique< tag, member >, + ordered_unique< tag, + member + >, ordered_non_unique< tag, composite_key, @@ -57,9 +59,7 @@ namespace graphene { namespace chain { FC_REFLECT_DERIVED( graphene::chain::sidechain_transaction_object, (graphene::db::object ), (sidechain) - (son_wallet_id) - (son_wallet_deposit_id) - (son_wallet_withdraw_id) + (object_id) (transaction) (signers) (valid) diff --git a/libraries/chain/sidechain_transaction_evaluator.cpp b/libraries/chain/sidechain_transaction_evaluator.cpp index 4e170418..1d724e73 100644 --- a/libraries/chain/sidechain_transaction_evaluator.cpp +++ b/libraries/chain/sidechain_transaction_evaluator.cpp @@ -13,11 +13,13 @@ void_result sidechain_transaction_create_evaluator::do_evaluate(const sidechain_ FC_ASSERT(db().head_block_time() >= HARDFORK_SON_TIME, "Not allowed until SON HARDFORK"); FC_ASSERT( op.payer == GRAPHENE_SON_ACCOUNT, "SON paying account must be set as payer." ); - //FC_ASSERT( (!op.son_wallet_id && !op.son_wallet_deposit_id && !op.son_wallet_withdraw_id), "Sidechain transaction origin not set." ); - //FC_ASSERT( op.son_wallet_id && op.son_wallet_deposit_id, "Sidechain transaction origin ambiguous. Single origin required." ); - //FC_ASSERT( op.son_wallet_id && op.son_wallet_withdraw_id, "Sidechain transaction origin ambiguous. Single origin required." ); - //FC_ASSERT( op.son_wallet_deposit_id && op.son_wallet_withdraw_id, "Sidechain transaction origin ambiguous. Single origin required." ); - FC_ASSERT( !op.transaction.empty(), "Sidechain transaction data not set." ); + FC_ASSERT((op.object_id.is() || op.object_id.is() || op.object_id.is()), "Invalid object id"); + + const auto &sto_idx = db().get_index_type().indices().get(); + const auto &sto_obj = sto_idx.find(op.object_id); + FC_ASSERT(sto_obj == sto_idx.end(), "Sidechain transaction for a given object is already created"); + + FC_ASSERT(!op.transaction.empty(), "Sidechain transaction data not set"); return void_result(); } FC_CAPTURE_AND_RETHROW( ( op ) ) } @@ -26,9 +28,7 @@ object_id_type sidechain_transaction_create_evaluator::do_apply(const sidechain_ { try { const auto &new_sidechain_transaction_object = db().create([&](sidechain_transaction_object &sto) { sto.sidechain = op.sidechain; - sto.son_wallet_id = op.son_wallet_id; - sto.son_wallet_deposit_id = op.son_wallet_deposit_id; - sto.son_wallet_withdraw_id = op.son_wallet_withdraw_id; + sto.object_id = op.object_id; sto.transaction = op.transaction; 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); diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index 86fc8134..c97aeec4 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -834,7 +834,7 @@ void sidechain_net_handler_bitcoin::recreate_primary_wallet() { son_wallet_update_operation op; op.payer = GRAPHENE_SON_ACCOUNT; - op.son_wallet_id = (*active_sw).id; + op.son_wallet_id = active_sw->id; op.sidechain = sidechain_type::bitcoin; op.address = res.str(); @@ -905,7 +905,7 @@ void sidechain_net_handler_bitcoin::recreate_primary_wallet() { sidechain_transaction_create_operation stc_op; stc_op.payer = GRAPHENE_SON_ACCOUNT; - stc_op.son_wallet_id = (*prev_sw).id; + stc_op.object_id = prev_sw->id; stc_op.sidechain = sidechain; stc_op.transaction = tx_str; stc_op.signers = signers; @@ -981,7 +981,7 @@ bool sidechain_net_handler_bitcoin::process_deposit(const son_wallet_deposit_obj sidechain_transaction_create_operation stc_op; stc_op.payer = GRAPHENE_SON_ACCOUNT; - stc_op.son_wallet_deposit_id = swdo.id; + stc_op.object_id = swdo.id; stc_op.sidechain = sidechain; stc_op.transaction = tx_str; stc_op.signers = signers; @@ -1063,7 +1063,7 @@ bool sidechain_net_handler_bitcoin::process_withdrawal(const son_wallet_withdraw sidechain_transaction_create_operation stc_op; stc_op.payer = GRAPHENE_SON_ACCOUNT; - stc_op.son_wallet_withdraw_id = swwo.id; + stc_op.object_id = swwo.id; stc_op.sidechain = sidechain; stc_op.transaction = tx_str; stc_op.signers = signers;