From f0a8e8e37605728edecb11e9b2647bf4a96df48c Mon Sep 17 00:00:00 2001 From: Srdjan Obucina Date: Wed, 22 Jan 2020 02:43:24 +0100 Subject: [PATCH] Send RPC command to bitcoin node to recreate multisig wallet --- .../sidechain_net_handler.hpp | 2 +- .../sidechain_net_handler_bitcoin.hpp | 2 +- .../sidechain_net_manager.hpp | 2 +- .../peerplays_sidechain_plugin.cpp | 28 +++++++++++++++++-- .../sidechain_net_handler_bitcoin.cpp | 28 ++++++++++++++----- .../sidechain_net_manager.cpp | 5 ++-- 6 files changed, 52 insertions(+), 15 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 50e28df7..0eec6a55 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 @@ -17,7 +17,7 @@ public: graphene::peerplays_sidechain::sidechain_type get_sidechain(); std::vector get_sidechain_addresses(); - virtual void recreate_primary_wallet(const vector& participants) = 0; + virtual string recreate_primary_wallet(const vector& participants) = 0; protected: std::shared_ptr database; 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 de7509ca..117bec29 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 @@ -60,7 +60,7 @@ public: sidechain_net_handler_bitcoin(std::shared_ptr db, const boost::program_options::variables_map& options); virtual ~sidechain_net_handler_bitcoin(); - void recreate_primary_wallet(const vector& participants); + string recreate_primary_wallet(const vector& participants); bool connection_is_not_defined() const; 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 5d489dd0..93e0ce85 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 @@ -16,7 +16,7 @@ public: virtual ~sidechain_net_manager(); bool create_handler(peerplays_sidechain::sidechain_type sidechain, const boost::program_options::variables_map& options); - void recreate_primary_wallet(peerplays_sidechain::sidechain_type sidechain, const vector& participants); + string recreate_primary_wallet(peerplays_sidechain::sidechain_type sidechain, const vector& participants); private: std::shared_ptr database; std::vector> net_handlers; diff --git a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp index 6df98e2a..45f029e4 100644 --- a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp +++ b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp @@ -1,5 +1,8 @@ #include +#include +#include + #include #include @@ -253,21 +256,40 @@ void peerplays_sidechain_plugin_impl::son_event_processing_loop() void peerplays_sidechain_plugin_impl::recreate_primary_wallet() { + ilog(__FUNCTION__); chain::database& d = plugin.database(); + ilog(__FUNCTION__); const auto& idx_swi = d.get_index_type().indices().get(); auto obj = idx_swi.rbegin(); if (obj != idx_swi.rend()) { - if (obj->addresses.at(sidechain_type::bitcoin).empty()) { + ilog(__FUNCTION__); + if ((obj->addresses.find(sidechain_type::bitcoin) == obj->addresses.end()) || + (obj->addresses.at(sidechain_type::bitcoin).empty())) { + ilog(__FUNCTION__); auto active_sons = d.get_global_properties().active_sons; vector son_pubkeys_bitcoin; for ( const son_info& si : active_sons ) { son_pubkeys_bitcoin.push_back(si.sidechain_public_keys.at(sidechain_type::bitcoin)); } - net_manager->recreate_primary_wallet(sidechain_type::bitcoin, son_pubkeys_bitcoin); - } + ilog(__FUNCTION__); + string reply_str = net_manager->recreate_primary_wallet(sidechain_type::bitcoin, son_pubkeys_bitcoin); + ilog(reply_str); + std::stringstream ss(reply_str); + boost::property_tree::ptree json; + boost::property_tree::read_json( ss, json ); + + if (json.count( "result" )) { + //if (json.get_child( "result" ).count( "address" )) { + d.modify(*obj, [&, &obj, &json](son_wallet_object &swo) { + ilog(__FUNCTION__); + swo.addresses[sidechain_type::bitcoin] = json.get_child("result").get_value();; + }); + //} + } + } } } diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index adaffe41..391599d2 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -132,23 +132,36 @@ void bitcoin_rpc_client::send_btc_tx( const std::string& tx_hex ) std::string bitcoin_rpc_client::add_multisig_address( const std::vector public_keys ) { std::string body = std::string("{\"jsonrpc\": \"1.0\", \"id\":\"addmultisigaddress\", \"method\": \"addmultisigaddress\", \"params\": ["); - std::string params = "2, \"["; + std::string params = "2, ["; std::string pubkeys = ""; for (std::string pubkey : public_keys) { if (!pubkeys.empty()) { - pubkeys = pubkeys + ", "; + pubkeys = pubkeys + ","; } pubkeys = pubkeys + std::string("\"") + pubkey + std::string("\""); } - params = params + pubkeys + std::string("]\""); + params = params + pubkeys + std::string("]"); body = body + params + std::string("] }"); - ilog(body); + const auto reply = send_post_request( body ); - //const auto reply = send_post_request( body ); + if( reply.body.empty() ) + return ""; + std::string reply_str( reply.body.begin(), reply.body.end() ); + + std::stringstream ss(reply_str); + boost::property_tree::ptree json; + boost::property_tree::read_json( ss, json ); + + if( reply.status == 200 ) { + return reply_str; + } + + if( json.count( "error" ) && !json.get_child( "error" ).empty() ) { + wlog( "BTC multisig address creation failed! Reply: ${msg}", ("msg", reply_str) ); + } return ""; - } bool bitcoin_rpc_client::connection_is_not_defined() const @@ -237,9 +250,10 @@ sidechain_net_handler_bitcoin::sidechain_net_handler_bitcoin(std::shared_ptr& participants ) { +string sidechain_net_handler_bitcoin::recreate_primary_wallet( const vector& participants ) { ilog(__FUNCTION__); string result = create_multisignature_wallet(participants); + return result; } bool sidechain_net_handler_bitcoin::connection_is_not_defined() const diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp index 43eb3d0a..cf380e8b 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp @@ -34,13 +34,14 @@ bool sidechain_net_manager::create_handler(peerplays_sidechain::sidechain_type s return ret_val; } -void sidechain_net_manager::recreate_primary_wallet(peerplays_sidechain::sidechain_type sidechain, const vector& participants) { +string sidechain_net_manager::recreate_primary_wallet(peerplays_sidechain::sidechain_type sidechain, const vector& participants) { ilog(__FUNCTION__); for ( size_t i = 0; i < net_handlers.size(); i++ ) { if (net_handlers.at(i)->get_sidechain() == sidechain) { - net_handlers.at(i)->recreate_primary_wallet(participants); + return net_handlers.at(i)->recreate_primary_wallet(participants); } } + return ""; } } } // graphene::peerplays_sidechain