From c25108f22888323a13a91abb6382b0c52d274f48 Mon Sep 17 00:00:00 2001 From: Srdjan Obucina Date: Tue, 21 Jan 2020 04:32:19 +0100 Subject: [PATCH] Send RPC command to bitcoin node to recreate multisig wallet --- .../sidechain_net_handler.hpp | 3 ++ .../sidechain_net_handler_bitcoin.hpp | 3 ++ .../sidechain_net_manager.hpp | 1 + .../peerplays_sidechain_plugin.cpp | 31 ++++++++++++++++++- .../sidechain_net_handler.cpp | 4 +++ .../sidechain_net_handler_bitcoin.cpp | 29 ++++++++++++++++- .../sidechain_net_manager.cpp | 9 ++++++ 7 files changed, 78 insertions(+), 2 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 e841a639..50e28df7 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 @@ -14,8 +14,11 @@ public: sidechain_net_handler(std::shared_ptr db, const boost::program_options::variables_map& options); virtual ~sidechain_net_handler(); + graphene::peerplays_sidechain::sidechain_type get_sidechain(); std::vector get_sidechain_addresses(); + virtual void recreate_primary_wallet(const vector& participants) = 0; + protected: std::shared_ptr database; graphene::peerplays_sidechain::sidechain_type sidechain; 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 4c37c530..de7509ca 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 @@ -19,6 +19,7 @@ public: bool receive_mempool_entry_tx( const std::string& tx_hash ); uint64_t receive_estimated_fee(); void send_btc_tx( const std::string& tx_hex ); + std::string add_multisig_address( const std::vector public_keys ); bool connection_is_not_defined() const; private: @@ -59,6 +60,8 @@ 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); + bool connection_is_not_defined() const; std::string create_multisignature_wallet( const std::vector public_keys ); 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 c60aa73b..5d489dd0 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,6 +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); 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 c835522f..6df98e2a 100644 --- a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp +++ b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp @@ -2,8 +2,10 @@ #include #include -#include + #include +#include +#include #include #include @@ -25,13 +27,16 @@ class peerplays_sidechain_plugin_impl boost::program_options::options_description& cfg); void plugin_initialize(const boost::program_options::variables_map& options); void plugin_startup(); + void schedule_heartbeat_loop(); void heartbeat_loop(); void schedule_son_event_processing_loop(); void son_event_processing_loop(); + void recreate_primary_wallet(); chain::proposal_create_operation create_son_down_proposal(chain::son_id_type son_id, fc::time_point_sec last_active_ts); void on_block_applied( const signed_block& b ); void on_objects_new(const vector& new_object_ids); + private: peerplays_sidechain_plugin& plugin; @@ -43,6 +48,7 @@ class peerplays_sidechain_plugin_impl std::set _sons; fc::future _heartbeat_task; fc::future _son_event_processing_task; + }; peerplays_sidechain_plugin_impl::peerplays_sidechain_plugin_impl(peerplays_sidechain_plugin& _plugin) : @@ -245,6 +251,26 @@ void peerplays_sidechain_plugin_impl::son_event_processing_loop() schedule_son_event_processing_loop(); } +void peerplays_sidechain_plugin_impl::recreate_primary_wallet() +{ + chain::database& d = plugin.database(); + + 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()) { + 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); + } + + } +} + chain::proposal_create_operation peerplays_sidechain_plugin_impl::create_son_down_proposal(chain::son_id_type son_id, fc::time_point_sec last_active_ts) { chain::database& d = plugin.database(); @@ -268,6 +294,9 @@ chain::proposal_create_operation peerplays_sidechain_plugin_impl::create_son_dow void peerplays_sidechain_plugin_impl::on_block_applied( const signed_block& b ) { + + recreate_primary_wallet(); + chain::database& d = plugin.database(); chain::son_id_type my_son_id = *(_sons.begin()); const chain::global_property_object& gpo = d.get_global_properties(); diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp index 85196685..410b691c 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp @@ -14,6 +14,10 @@ sidechain_net_handler::sidechain_net_handler(std::shared_ptr sidechain_net_handler::get_sidechain_addresses() { std::vector result; diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index a2bd8d94..adaffe41 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -129,6 +129,28 @@ 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 pubkeys = ""; + for (std::string pubkey : public_keys) { + if (!pubkeys.empty()) { + pubkeys = pubkeys + ", "; + } + pubkeys = pubkeys + std::string("\"") + pubkey + std::string("\""); + } + params = params + pubkeys + std::string("]\""); + body = body + params + std::string("] }"); + + ilog(body); + + //const auto reply = send_post_request( body ); + + return ""; + +} + bool bitcoin_rpc_client::connection_is_not_defined() const { return ip.empty() || rpc_port == 0 || user.empty() || password.empty(); @@ -215,6 +237,11 @@ sidechain_net_handler_bitcoin::sidechain_net_handler_bitcoin(std::shared_ptr& participants ) { + ilog(__FUNCTION__); + string result = create_multisignature_wallet(participants); +} + bool sidechain_net_handler_bitcoin::connection_is_not_defined() const { return listener->connection_is_not_defined() && bitcoin_client->connection_is_not_defined(); @@ -222,7 +249,7 @@ bool sidechain_net_handler_bitcoin::connection_is_not_defined() const std::string sidechain_net_handler_bitcoin::create_multisignature_wallet( const std::vector public_keys ) { - return ""; + return bitcoin_client->add_multisig_address(public_keys); } std::string sidechain_net_handler_bitcoin::transfer( const std::string& from, const std::string& to, const uint64_t amount ) diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp index 7c39fd81..43eb3d0a 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp @@ -34,5 +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) { + 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); + } + } +} + } } // graphene::peerplays_sidechain