From ab9a7f2fca5bdc3491414cbaeeab64114db590bc Mon Sep 17 00:00:00 2001 From: gladcow Date: Wed, 4 Mar 2020 17:42:56 +0300 Subject: [PATCH] publish signed tx --- .../sidechain_net_handler.hpp | 1 + .../sidechain_net_handler_bitcoin.hpp | 2 + .../sidechain_net_handler_peerplays.hpp | 1 + .../sidechain_net_manager.hpp | 1 + .../peerplays_sidechain_plugin.cpp | 12 ++++ .../sidechain_net_handler.cpp | 2 - .../sidechain_net_handler_bitcoin.cpp | 56 ++++++++++++++++++- .../sidechain_net_handler_peerplays.cpp | 3 + .../sidechain_net_manager.cpp | 6 ++ 9 files changed, 80 insertions(+), 4 deletions(-) diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler.hpp index 6b68f43c..11a66569 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler.hpp @@ -28,6 +28,7 @@ public: virtual void process_deposit(const son_wallet_deposit_object &swdo) = 0; virtual void process_withdrawal(const son_wallet_withdraw_object &swwo) = 0; virtual void process_signing() = 0; + virtual void complete_signing() = 0; protected: peerplays_sidechain_plugin &plugin; diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp index 1b38599f..7bc0bda1 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp @@ -87,6 +87,7 @@ public: void process_deposit(const son_wallet_deposit_object &swdo) override; void process_withdrawal(const son_wallet_withdraw_object &swwo) override; void process_signing() override; + void complete_signing() override; private: std::string ip; @@ -109,6 +110,7 @@ private: void transfer_all_btc(const std::string& from_address, const vector& from_sons, const std::string& to_address); std::string transfer_deposit_to_primary_wallet(const son_wallet_deposit_object &swdo); std::string transfer_withdrawal_from_primary_wallet(const son_wallet_withdraw_object &swwo); + void publish_btc_tx(const bitcoin_transaction_object &tx_object); void handle_event(const std::string &event_data); std::vector extract_info_from_block(const std::string &_block); diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_peerplays.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_peerplays.hpp index fd5d96f5..82f6e7ba 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_peerplays.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_peerplays.hpp @@ -17,6 +17,7 @@ public: void process_deposit(const son_wallet_deposit_object &swdo) override; void process_withdrawal(const son_wallet_withdraw_object &swwo) override; void process_signing() override; + void complete_signing() override; private: std::string create_multisignature_wallet(const std::vector public_keys) override; diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_manager.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_manager.hpp index 957d9192..5f0200d1 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_manager.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_manager.hpp @@ -20,6 +20,7 @@ public: void process_deposits(); void process_withdrawals(); void process_signing(); + void complete_signing(); private: peerplays_sidechain_plugin &plugin; diff --git a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp index f2d4f12f..128e1c55 100644 --- a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp +++ b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp @@ -52,6 +52,7 @@ public: void process_deposits(); void process_withdrawals(); void process_signing(); + void complete_signing(); private: peerplays_sidechain_plugin &plugin; @@ -350,6 +351,8 @@ void peerplays_sidechain_plugin_impl::son_processing() { process_withdrawals(); + complete_signing(); + } } @@ -357,6 +360,10 @@ void peerplays_sidechain_plugin_impl::process_signing() { net_manager->process_signing(); } +void peerplays_sidechain_plugin_impl::complete_signing() { + net_manager->complete_signing(); +} + void peerplays_sidechain_plugin_impl::approve_proposals() { auto approve_proposal = [&](const chain::son_id_type &son_id, const chain::proposal_id_type &proposal_id) { @@ -442,6 +449,11 @@ void peerplays_sidechain_plugin_impl::approve_proposals() { approve_proposal(son_id, proposal.id); continue; } + + if (proposal.proposed_transaction.operations.size() == 1 && proposal.proposed_transaction.operations[0].which() == chain::operation::tag::value) { + approve_proposal(son_id, proposal.id); + continue; + } } } } diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp index 6508eb04..19188440 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp @@ -1,10 +1,8 @@ #include #include -#include #include #include -#include #include diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index a0f64942..fb3063ab 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -673,12 +673,20 @@ void sidechain_net_handler_bitcoin::process_withdrawal(const son_wallet_withdraw transfer_withdrawal_from_primary_wallet(swwo); } +static bool has_enough_signatures(const bitcoin_transaction_object &tx_object) { + // TODO: Verify with weights calculation + bool has_empty = false; + for(auto s: tx_object.signatures) + has_empty |= s.second.empty(); + return !has_empty; +} + void sidechain_net_handler_bitcoin::process_signing() { const auto &idx = plugin.database().get_index_type().indices().get(); const auto &idx_range = idx.equal_range(false); - std::for_each(idx_range.first, idx_range.second, [&](const bitcoin_transaction_object &tx_object) { + // collect signatures auto sons = plugin.get_sons(); for (son_id_type son_id : sons) { auto it = tx_object.signatures.find(son_id); @@ -704,7 +712,40 @@ void sidechain_net_handler_bitcoin::process_signing() { } } } - }); + }); +} + +void sidechain_net_handler_bitcoin::complete_signing() +{ + const auto &idx = plugin.database().get_index_type().indices().get(); + const auto &idx_range = idx.equal_range(false); + std::for_each(idx_range.first, idx_range.second, + [&](const bitcoin_transaction_object &tx_object) { + // check if all signatures collected + if (has_enough_signatures(tx_object)) { + publish_btc_tx(tx_object); + bitcoin_send_transaction_process_operation op; + op.payer = GRAPHENE_SON_ACCOUNT; + op.bitcoin_transaction_id = tx_object.id; + + const chain::global_property_object& gpo = database.get_global_properties(); + proposal_create_operation proposal_op; + proposal_op.fee_paying_account = plugin.get_son_object(plugin.get_current_son_id()).son_account; + proposal_op.proposed_ops.emplace_back( op_wrapper( op ) ); + uint32_t lifetime = ( gpo.parameters.block_interval * gpo.active_witnesses.size() ) * 3; + proposal_op.expiration_time = time_point_sec( database.head_block_time().sec_since_epoch() + lifetime ); + + signed_transaction trx = database.create_signed_transaction(plugin.get_private_key(plugin.get_current_son_id()), proposal_op); + try { + 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){ + ilog("sidechain_net_handler_bitcoin: sending proposal for bitcoin send operation failed with exception ${e}",("e", e.what())); + return; + } + } + }); } std::string sidechain_net_handler_bitcoin::create_multisignature_wallet(const std::vector public_keys) { @@ -928,6 +969,17 @@ std::string sidechain_net_handler_bitcoin::transfer_withdrawal_from_primary_wall return sign_and_send_transaction_with_wallet(reply_str); } +void sidechain_net_handler_bitcoin::publish_btc_tx(const bitcoin_transaction_object &tx_object) +{ + std::vector> signatures; + signatures.resize(tx_object.signatures.size()); + std::transform(tx_object.signatures.begin(), tx_object.signatures.end(), + signatures.begin(), [](const std::pair>& p) { return p.second; } + ); + bytes signed_tx = add_signatures_to_unsigned_tx(tx_object.unsigned_tx, signatures, tx_object.redeem_script); + bitcoin_client->sendrawtransaction(fc::to_hex((const char*)&signed_tx[0], signed_tx.size())); +} + void sidechain_net_handler_bitcoin::handle_event(const std::string &event_data) { std::string block = bitcoin_client->getblock(event_data); if (block != "") { diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_peerplays.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_peerplays.cpp index 3db22f07..af00f675 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_peerplays.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_peerplays.cpp @@ -42,6 +42,9 @@ void sidechain_net_handler_peerplays::process_withdrawal(const son_wallet_withdr void sidechain_net_handler_peerplays::process_signing() { } +void sidechain_net_handler_peerplays::complete_signing() { +} + std::string sidechain_net_handler_peerplays::create_multisignature_wallet(const std::vector public_keys) { return ""; } diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp index 3fbcc37f..335ee632 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp @@ -63,4 +63,10 @@ void sidechain_net_manager::process_signing() { } } +void sidechain_net_manager::complete_signing() { + for (size_t i = 0; i < net_handlers.size(); i++) { + net_handlers.at(i)->complete_signing(); + } +} + }} // namespace graphene::peerplays_sidechain