From a06af5bf17ebe245693af9c93e8fc05a321e27cd Mon Sep 17 00:00:00 2001 From: gladcow Date: Tue, 3 Mar 2020 15:24:56 +0300 Subject: [PATCH] change proposal to transaction object in bitcoin_transaction_sign_operation --- .../chain/protocol/sidechain_transaction.hpp | 8 +-- .../chain/sidechain_transaction_evaluator.hpp | 3 +- .../chain/sidechain_transaction_object.hpp | 5 +- .../chain/sidechain_transaction_evaluator.cpp | 52 +++++++------------ .../peerplays_sidechain_plugin.cpp | 9 ++-- .../sidechain_net_handler_bitcoin.cpp | 2 + tests/tests/sidechain_transaction_tests.cpp | 4 +- 7 files changed, 38 insertions(+), 45 deletions(-) diff --git a/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp b/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp index 77e4d160..115d31ee 100644 --- a/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp +++ b/libraries/chain/include/graphene/chain/protocol/sidechain_transaction.hpp @@ -13,6 +13,8 @@ namespace graphene { namespace chain { account_id_type payer; peerplays_sidechain::bytes unsigned_tx; + peerplays_sidechain::bytes redeem_script; + std::vector in_amounts; fc::flat_map> signatures; account_id_type fee_payer()const { return payer; } @@ -26,7 +28,7 @@ namespace graphene { namespace chain { asset fee; account_id_type payer; - proposal_id_type proposal_id; + bitcoin_transaction_id_type tx_id; std::vector signatures; account_id_type fee_payer()const { return payer; } @@ -51,10 +53,10 @@ namespace graphene { namespace chain { } } // graphene::chain FC_REFLECT( graphene::chain::bitcoin_transaction_send_operation::fee_parameters_type, (fee) ) -FC_REFLECT( graphene::chain::bitcoin_transaction_send_operation, (fee)(payer)(unsigned_tx)(signatures) ) +FC_REFLECT( graphene::chain::bitcoin_transaction_send_operation, (fee)(payer)(unsigned_tx)(redeem_script)(in_amounts)(signatures) ) FC_REFLECT( graphene::chain::bitcoin_transaction_sign_operation::fee_parameters_type, (fee) ) -FC_REFLECT( graphene::chain::bitcoin_transaction_sign_operation, (fee)(payer)(proposal_id)(signatures) ) +FC_REFLECT( graphene::chain::bitcoin_transaction_sign_operation, (fee)(payer)(tx_id)(signatures) ) FC_REFLECT( graphene::chain::bitcoin_send_transaction_process_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::bitcoin_send_transaction_process_operation, (fee)(payer)(bitcoin_transaction_id) ) diff --git a/libraries/chain/include/graphene/chain/sidechain_transaction_evaluator.hpp b/libraries/chain/include/graphene/chain/sidechain_transaction_evaluator.hpp index aac04698..87a79a7d 100644 --- a/libraries/chain/include/graphene/chain/sidechain_transaction_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/sidechain_transaction_evaluator.hpp @@ -20,7 +20,6 @@ public: void_result do_evaluate(const bitcoin_transaction_sign_operation& o); object_id_type do_apply(const bitcoin_transaction_sign_operation& o); - void update_proposal( const bitcoin_transaction_sign_operation& o ); }; class bitcoin_send_transaction_process_evaluator : public evaluator @@ -32,4 +31,4 @@ public: object_id_type do_apply(const bitcoin_send_transaction_process_operation& o); }; -} } // namespace graphene::chain \ No newline at end of file +} } // namespace graphene::chain diff --git a/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp b/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp index 95417852..953bc4a2 100644 --- a/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp +++ b/libraries/chain/include/graphene/chain/sidechain_transaction_object.hpp @@ -17,6 +17,9 @@ namespace graphene { namespace chain { static const uint8_t type_id = bitcoin_transaction_object_type; // Bitcoin structs go here. bool processed = false; + peerplays_sidechain::bytes unsigned_tx; + peerplays_sidechain::bytes redeem_script; + std::vector in_amounts; fc::flat_map> signatures; }; @@ -36,4 +39,4 @@ namespace graphene { namespace chain { } } // graphene::chain FC_REFLECT_DERIVED( graphene::chain::bitcoin_transaction_object, (graphene::db::object), - (processed)(signatures) ) + (processed)(unsigned_tx)(redeem_script)(in_amounts)(signatures) ) diff --git a/libraries/chain/sidechain_transaction_evaluator.cpp b/libraries/chain/sidechain_transaction_evaluator.cpp index a77c7f64..59a093a4 100644 --- a/libraries/chain/sidechain_transaction_evaluator.cpp +++ b/libraries/chain/sidechain_transaction_evaluator.cpp @@ -28,6 +28,9 @@ object_id_type bitcoin_transaction_send_evaluator::do_apply(const bitcoin_transa { const auto &new_bitcoin_transaction_object = db().create([&](bitcoin_transaction_object &obj) { obj.processed = false; + obj.unsigned_tx = op.unsigned_tx; + obj.redeem_script = op.redeem_script; + obj.in_amounts = op.in_amounts; obj.signatures = op.signatures; }); return new_bitcoin_transaction_object.id; @@ -40,22 +43,26 @@ void_result bitcoin_transaction_sign_evaluator::do_evaluate(const bitcoin_transa try { FC_ASSERT(db().head_block_time() >= HARDFORK_SON_TIME, "Not allowed until SON HARDFORK"); // can be removed after HF date pass - const auto &proposal_idx = db().get_index_type().indices().get(); - const auto &proposal_itr = proposal_idx.find(op.proposal_id); - FC_ASSERT(proposal_idx.end() != proposal_itr, "proposal not found"); - // Checks can this SON approve this proposal - auto can_this_son_approve_this_proposal = [&]() { + const auto &tx_idx = db().get_index_type().indices().get(); + const auto &tx_itr = tx_idx.find(op.tx_id); + FC_ASSERT(tx_idx.end() != tx_itr, "bitcoin transaction not found"); + + // Checks can this SON sign this tx + auto can_this_son_sign_this_tx = [&]() { const auto &sidx = db().get_index_type().indices().get(); auto son_obj = sidx.find(op.payer); if (son_obj == sidx.end()) { return false; } - // TODO: Check if the SON is included in the PW script. - return true; + auto it = tx_itr->signatures.find(son_obj->id); + if (it == tx_itr->signatures.end()) + return false; + // tx is not signed with this son already + return it->second.empty(); }; - FC_ASSERT(can_this_son_approve_this_proposal(), "Invalid approval received"); + FC_ASSERT(can_this_son_sign_this_tx(), "Invalid approval received"); return void_result(); } FC_CAPTURE_AND_RETHROW((op)) @@ -65,44 +72,23 @@ object_id_type bitcoin_transaction_sign_evaluator::do_apply(const bitcoin_transa { try { - const auto &proposal = op.proposal_id(db()); + const auto &bitcoin_tx = op.tx_id(db()); const auto &sidx = db().get_index_type().indices().get(); auto son_obj = sidx.find(op.payer); - db().modify(proposal, [&](proposal_object &po) { - auto bitcoin_transaction_send_op = po.proposed_transaction.operations[0].get(); - bitcoin_transaction_send_op.signatures[son_obj->id] = op.signatures; - po.proposed_transaction.operations[0] = bitcoin_transaction_send_op; + db().modify(bitcoin_tx, [&](bitcoin_transaction_object &btx) { + btx.signatures[son_obj->id] = op.signatures; }); db().modify( son_obj->statistics( db() ), [&]( son_statistics_object& sso ) { sso.txs_signed += 1; } ); - update_proposal(op); + return bitcoin_tx.id; } FC_CAPTURE_AND_RETHROW((op)) } -void bitcoin_transaction_sign_evaluator::update_proposal(const bitcoin_transaction_sign_operation &op) -{ - database &d = db(); - proposal_update_operation update_op; - - update_op.fee_paying_account = op.payer; - update_op.proposal = op.proposal_id; - update_op.active_approvals_to_add = {op.payer}; - - bool skip_fee_old = trx_state->skip_fee; - bool skip_fee_schedule_check_old = trx_state->skip_fee_schedule_check; - trx_state->skip_fee = true; - trx_state->skip_fee_schedule_check = true; - - d.apply_operation(*trx_state, update_op); - - trx_state->skip_fee = skip_fee_old; - trx_state->skip_fee_schedule_check = skip_fee_schedule_check_old; -} void_result bitcoin_send_transaction_process_evaluator::do_evaluate(const bitcoin_send_transaction_process_operation &op) { diff --git a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp index b1ffd2a5..eb31cfb8 100644 --- a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp +++ b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include namespace bpo = boost::program_options; @@ -540,13 +541,13 @@ void peerplays_sidechain_plugin_impl::create_son_deregister_proposals() { bitcoin_transaction_sign_operation op; son_object s_obj= get_son_object(son_id); op.payer = s_obj.son_account; - // op.tx_id = object_id; + op.tx_id = tx_object->id; fc::ecc::private_key k = get_private_key(son_id); - //op.signatures = signatures_for_raw_transaction(unsigned_tx, amounts, redeem_script, k); + op.signatures = signatures_for_raw_transaction(tx_object->unsigned_tx, tx_object->in_amounts, tx_object->redeem_script, k); - signed_transaction trx = database().create_signed_transaction(get_private_key(plugin.get_current_son_id()), op); + signed_transaction trx = plugin.database().create_signed_transaction(k, op); try { - database().push_transaction(trx, database::validation_steps::skip_block_size_check); + 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){ diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index 6c8eda35..75cbb0de 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -764,6 +764,8 @@ void sidechain_net_handler_bitcoin::transfer_all_btc(const std::string& from_add bitcoin_transaction_send_operation op; op.payer = GRAPHENE_SON_ACCOUNT; + op.redeem_script = from_redeem_script; + op.in_amounts = amounts; tx.to_bytes(op.unsigned_tx); // add signatures std::set plugin_sons = plugin.get_sons(); diff --git a/tests/tests/sidechain_transaction_tests.cpp b/tests/tests/sidechain_transaction_tests.cpp index 25e319f0..2a827468 100644 --- a/tests/tests/sidechain_transaction_tests.cpp +++ b/tests/tests/sidechain_transaction_tests.cpp @@ -231,7 +231,7 @@ BOOST_AUTO_TEST_CASE(bitcoin_transaction_send_test) bitcoin_transaction_sign_operation sign_op; sign_op.payer = alice_id; - sign_op.proposal_id = proposal_id_type(0); + //sign_op.proposal_id = proposal_id_type(0); sign_op.signatures.push_back(a1); sign_op.signatures.push_back(a2); sign_op.signatures.push_back(a3); @@ -270,7 +270,7 @@ BOOST_AUTO_TEST_CASE(bitcoin_transaction_send_test) bitcoin_transaction_sign_operation sign_op; sign_op.payer = bob_id; - sign_op.proposal_id = proposal_id_type(0); + //sign_op.proposal_id = proposal_id_type(0); sign_op.signatures.push_back(b1); sign_op.signatures.push_back(b2); sign_op.signatures.push_back(b3);