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 f3a7aa41..6b68f43c 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 @@ -27,6 +27,7 @@ public: virtual void recreate_primary_wallet() = 0; 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; 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 44ddb5b9..1b38599f 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 @@ -83,9 +83,10 @@ public: sidechain_net_handler_bitcoin(peerplays_sidechain_plugin &_plugin, const boost::program_options::variables_map &options); virtual ~sidechain_net_handler_bitcoin(); - void recreate_primary_wallet(); - void process_deposit(const son_wallet_deposit_object &swdo); - void process_withdrawal(const son_wallet_withdraw_object &swwo); + void recreate_primary_wallet() override; + void process_deposit(const son_wallet_deposit_object &swdo) override; + void process_withdrawal(const son_wallet_withdraw_object &swwo) override; + void process_signing() override; private: std::string ip; @@ -99,10 +100,10 @@ private: std::unique_ptr bitcoin_client; std::unique_ptr listener; - std::string create_multisignature_wallet(const std::vector public_keys); - std::string transfer(const std::string &from, const std::string &to, const uint64_t amount); - std::string sign_transaction(const std::string &transaction); - std::string send_transaction(const std::string &transaction); + std::string create_multisignature_wallet(const std::vector public_keys) override; + std::string transfer(const std::string &from, const std::string &to, const uint64_t amount) override; + std::string sign_transaction(const std::string &transaction) override; + std::string send_transaction(const std::string &transaction) override; std::string sign_and_send_transaction_with_wallet(const std::string &tx_json); std::string create_weighted_multisignature_wallet( const std::vector>& public_keys ); void transfer_all_btc(const std::string& from_address, const vector& from_sons, const std::string& to_address); 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 943c3a90..fd5d96f5 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 @@ -13,15 +13,16 @@ public: sidechain_net_handler_peerplays(peerplays_sidechain_plugin &_plugin, const boost::program_options::variables_map &options); virtual ~sidechain_net_handler_peerplays(); - void recreate_primary_wallet(); - void process_deposit(const son_wallet_deposit_object &swdo); - void process_withdrawal(const son_wallet_withdraw_object &swwo); + void recreate_primary_wallet() override; + void process_deposit(const son_wallet_deposit_object &swdo) override; + void process_withdrawal(const son_wallet_withdraw_object &swwo) override; + void process_signing() override; private: - std::string create_multisignature_wallet(const std::vector public_keys); - std::string transfer(const std::string &from, const std::string &to, const uint64_t amount); - std::string sign_transaction(const std::string &transaction); - std::string send_transaction(const std::string &transaction); + std::string create_multisignature_wallet(const std::vector public_keys) override; + std::string transfer(const std::string &from, const std::string &to, const uint64_t amount) override; + std::string sign_transaction(const std::string &transaction) override; + std::string send_transaction(const std::string &transaction) override; void on_applied_block(const signed_block &b); }; 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 8e246bce..957d9192 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 @@ -19,6 +19,7 @@ public: void recreate_primary_wallet(); void process_deposits(); void process_withdrawals(); + void process_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 eb31cfb8..f2d4f12f 100644 --- a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp +++ b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp @@ -51,6 +51,7 @@ public: void recreate_primary_wallet(); void process_deposits(); void process_withdrawals(); + void process_signing(); private: peerplays_sidechain_plugin &plugin; @@ -332,6 +333,7 @@ void peerplays_sidechain_plugin_impl::son_processing() { // Tasks that are executed by all active SONs, no matter if scheduled // E.g. sending approvals and signing approve_proposals(); + process_signing(); // Tasks that are executed by scheduled and active SON if (sons.find(next_son_id) != sons.end()) { @@ -347,9 +349,14 @@ void peerplays_sidechain_plugin_impl::son_processing() { process_deposits(); process_withdrawals(); + } } +void peerplays_sidechain_plugin_impl::process_signing() { + net_manager->process_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) { @@ -430,6 +437,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; + } } } } @@ -519,42 +531,6 @@ void peerplays_sidechain_plugin_impl::create_son_deregister_proposals() { }); fut.wait(fc::seconds(10)); } - - if(proposal->proposed_transaction.operations.size() == 1 - && proposal->proposed_transaction.operations[0].which() == chain::operation::tag::value) { - approve_proposal( son_id, proposal->id ); - continue; - } - } - } - - if( object_id.is() ) { - const object* obj = plugin.database().find_object(object_id); - const chain::bitcoin_transaction_object* tx_object = dynamic_cast(obj); - - for (son_id_type son_id : _sons) { - auto it = tx_object->signatures.find(son_id); - if (it == tx_object->signatures.end()) - continue; - if (it->second.empty()) - { - bitcoin_transaction_sign_operation op; - son_object s_obj= get_son_object(son_id); - op.payer = s_obj.son_account; - op.tx_id = tx_object->id; - fc::ecc::private_key k = get_private_key(son_id); - op.signatures = signatures_for_raw_transaction(tx_object->unsigned_tx, tx_object->in_amounts, tx_object->redeem_script, k); - - signed_transaction trx = plugin.database().create_signed_transaction(k, op); - try { - 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){ - ilog("sidechain_net_handler: sending proposal for son wallet update operation failed with exception ${e}",("e", e.what())); - return; - } - } } } } diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp index 19188440..6508eb04 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp @@ -1,8 +1,10 @@ #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 b29f019e..a0f64942 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -628,7 +629,6 @@ void sidechain_net_handler_bitcoin::recreate_primary_wallet() { } string address = create_weighted_multisignature_wallet(son_pubkeys_bitcoin); - bytes redeem_script = get_weighted_multisig_redeem_script(son_pubkeys_bitcoin); ilog(address); @@ -673,6 +673,40 @@ void sidechain_net_handler_bitcoin::process_withdrawal(const son_wallet_withdraw transfer_withdrawal_from_primary_wallet(swwo); } +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) { + auto sons = plugin.get_sons(); + for (son_id_type son_id : sons) { + auto it = tx_object.signatures.find(son_id); + if (it == tx_object.signatures.end()) + continue; + if (it->second.empty()) + { + bitcoin_transaction_sign_operation op; + son_object s_obj= plugin.get_son_object(son_id); + op.payer = s_obj.son_account; + op.tx_id = tx_object.id; + fc::ecc::private_key k = plugin.get_private_key(son_id); + op.signatures = signatures_for_raw_transaction(tx_object.unsigned_tx, tx_object.in_amounts, tx_object.redeem_script, k); + + signed_transaction trx = plugin.database().create_signed_transaction(k, op); + try { + 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){ + ilog("sidechain_net_handler: bitcoin transaction signing failed with exception ${e}",("e", e.what())); + return; + } + } + } + }); +} + std::string sidechain_net_handler_bitcoin::create_multisignature_wallet(const std::vector public_keys) { return bitcoin_client->addmultisigaddress(public_keys); } diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_peerplays.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_peerplays.cpp index a30dc4d7..3db22f07 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_peerplays.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_peerplays.cpp @@ -39,6 +39,9 @@ void sidechain_net_handler_peerplays::process_deposit(const son_wallet_deposit_o void sidechain_net_handler_peerplays::process_withdrawal(const son_wallet_withdraw_object &swwo) { } +void sidechain_net_handler_peerplays::process_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 05b6b5b8..3fbcc37f 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp @@ -57,4 +57,10 @@ void sidechain_net_manager::process_withdrawals() { } } +void sidechain_net_manager::process_signing() { + for (size_t i = 0; i < net_handlers.size(); i++) { + net_handlers.at(i)->process_signing(); + } +} + }} // namespace graphene::peerplays_sidechain