From 0142348a9c0ec3224ce28432104f5a66c7aa6ee7 Mon Sep 17 00:00:00 2001 From: Srdjan Obucina Date: Mon, 27 Jan 2020 13:14:22 +0100 Subject: [PATCH] Updating wallet info through operation instead through database.modify() for persistance --- .../sidechain_net_handler.hpp | 6 ++- .../sidechain_net_handler_bitcoin.hpp | 3 +- .../sidechain_net_manager.hpp | 6 ++- .../peerplays_sidechain_plugin.cpp | 35 +++++---------- .../sidechain_net_handler.cpp | 7 +-- .../sidechain_net_handler_bitcoin.cpp | 44 +++++++++++++++++-- .../sidechain_net_manager.cpp | 29 ++++++++++-- 7 files changed, 92 insertions(+), 38 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 0eec6a55..399b7608 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 @@ -11,16 +11,18 @@ namespace graphene { namespace peerplays_sidechain { class sidechain_net_handler { public: - sidechain_net_handler(std::shared_ptr db, const boost::program_options::variables_map& options); + sidechain_net_handler(peerplays_sidechain_plugin& _plugin, const boost::program_options::variables_map& options); virtual ~sidechain_net_handler(); graphene::peerplays_sidechain::sidechain_type get_sidechain(); std::vector get_sidechain_addresses(); + virtual son_wallet_update_operation recreate_primary_wallet() = 0; virtual string recreate_primary_wallet(const vector& participants) = 0; protected: - std::shared_ptr database; + peerplays_sidechain_plugin& plugin; + graphene::chain::database& database; graphene::peerplays_sidechain::sidechain_type sidechain; void sidechain_event_data_received(const sidechain_event_data& sed); 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 117bec29..2e469138 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 @@ -57,9 +57,10 @@ private: class sidechain_net_handler_bitcoin : public sidechain_net_handler { public: - sidechain_net_handler_bitcoin(std::shared_ptr db, const boost::program_options::variables_map& options); + sidechain_net_handler_bitcoin(peerplays_sidechain_plugin& _plugin, const boost::program_options::variables_map& options); virtual ~sidechain_net_handler_bitcoin(); + son_wallet_update_operation recreate_primary_wallet(); 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 93e0ce85..e920d915 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 @@ -12,13 +12,15 @@ namespace graphene { namespace peerplays_sidechain { class sidechain_net_manager { public: - sidechain_net_manager(std::shared_ptr db); + sidechain_net_manager(peerplays_sidechain_plugin& _plugin); virtual ~sidechain_net_manager(); bool create_handler(peerplays_sidechain::sidechain_type sidechain, const boost::program_options::variables_map& options); + signed_transaction recreate_primary_wallet(); string recreate_primary_wallet(peerplays_sidechain::sidechain_type sidechain, const vector& participants); private: - std::shared_ptr database; + peerplays_sidechain_plugin& plugin; + graphene::chain::database& 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 18c82b9c..03645f93 100644 --- a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp +++ b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp @@ -132,7 +132,7 @@ void peerplays_sidechain_plugin_impl::plugin_initialize(const boost::program_opt throw; } - net_manager = std::unique_ptr(new sidechain_net_manager(plugin.app().chain_database())); + net_manager = std::unique_ptr(new sidechain_net_manager(plugin)); config_ready_bitcoin = options.count( "bitcoin-node-ip" ) && options.count( "bitcoin-node-zmq-port" ) && options.count( "bitcoin-node-rpc-port" ) && @@ -282,31 +282,18 @@ void peerplays_sidechain_plugin_impl::create_son_down_proposals() { void peerplays_sidechain_plugin_impl::recreate_primary_wallet() { chain::database& d = plugin.database(); + signed_transaction trx = net_manager->recreate_primary_wallet(); + auto dyn_props = d.get_dynamic_global_properties(); + trx.set_reference_block( dyn_props.head_block_id ); + trx.set_expiration( d.head_block_time() + d.get_global_properties().parameters.maximum_time_until_expiration ); + d.current_fee_schedule().set_fee( trx.operations.back() ); - const auto& idx_swi = d.get_index_type().indices().get(); - auto obj = idx_swi.rbegin(); - if (obj != idx_swi.rend()) { + trx.sign(_private_keys.begin()->second, d.get_chain_id()); - if ((obj->addresses.find(sidechain_type::bitcoin) == obj->addresses.end()) || - (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)); - } - string reply_str = net_manager->recreate_primary_wallet(sidechain_type::bitcoin, son_pubkeys_bitcoin); - - std::stringstream ss(reply_str); - boost::property_tree::ptree pt; - boost::property_tree::read_json( ss, pt ); - if( pt.count( "error" ) && pt.get_child( "error" ).empty() ) { - d.modify(*obj, [&, obj, pt](son_wallet_object &swo) { - std::stringstream ss; - boost::property_tree::json_parser::write_json(ss, pt.get_child("result")); - swo.addresses[sidechain_type::bitcoin] = ss.str(); - }); - } - } + try { + d.push_transaction(trx, database::validation_steps::skip_block_size_check); + } catch (fc::exception e) { + ilog("peerplays_sidechain_plugin_impl: sending son wallet update operations failed with exception ${e}",("e", e.what())); } } diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp index 410b691c..bb036d4a 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp @@ -6,8 +6,9 @@ namespace graphene { namespace peerplays_sidechain { -sidechain_net_handler::sidechain_net_handler(std::shared_ptr db, const boost::program_options::variables_map& options) : - database(db) +sidechain_net_handler::sidechain_net_handler(peerplays_sidechain_plugin& _plugin, const boost::program_options::variables_map& options) : + plugin(_plugin), + database(_plugin.database()) { } @@ -24,7 +25,7 @@ std::vector sidechain_net_handler::get_sidechain_addresses() { switch (sidechain) { case sidechain_type::bitcoin: { - const auto& sidechain_addresses_idx = database->get_index_type(); + const auto& sidechain_addresses_idx = database.get_index_type(); const auto& sidechain_addresses_by_sidechain_idx = sidechain_addresses_idx.indices().get(); const auto& sidechain_addresses_by_sidechain_range = sidechain_addresses_by_sidechain_idx.equal_range(sidechain); std::for_each(sidechain_addresses_by_sidechain_range.first, sidechain_addresses_by_sidechain_range.second, diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index 391599d2..886e7125 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -12,6 +12,9 @@ #include #include +#include +#include +#include namespace graphene { namespace peerplays_sidechain { @@ -221,8 +224,8 @@ void zmq_listener::handle_zmq() { // ============================================================================= -sidechain_net_handler_bitcoin::sidechain_net_handler_bitcoin(std::shared_ptr db, const boost::program_options::variables_map& options) : - sidechain_net_handler(db, options) { +sidechain_net_handler_bitcoin::sidechain_net_handler_bitcoin(peerplays_sidechain_plugin& _plugin, const boost::program_options::variables_map& options) : + sidechain_net_handler(_plugin, options) { sidechain = sidechain_type::bitcoin; ip = options.at("bitcoin-node-ip").as(); @@ -250,6 +253,41 @@ sidechain_net_handler_bitcoin::sidechain_net_handler_bitcoin(std::shared_ptr().indices().get(); + auto obj = idx_swi.rbegin(); + if (obj != idx_swi.rend()) { + + if ((obj->addresses.find(sidechain_type::bitcoin) == obj->addresses.end()) || + (obj->addresses.at(sidechain_type::bitcoin).empty())) { + auto active_sons = database.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)); + } + string reply_str = create_multisignature_wallet(son_pubkeys_bitcoin); + + ilog(reply_str); + + std::stringstream ss(reply_str); + boost::property_tree::ptree pt; + boost::property_tree::read_json( ss, pt ); + if( pt.count( "error" ) && pt.get_child( "error" ).empty() ) { + ilog(__FUNCTION__); + + son_wallet_update_operation op; + op.payer = database.get_global_properties().parameters.get_son_btc_account_id(); + op.son_wallet_id = (*obj).id; + op.sidechain = sidechain_type::bitcoin; + op.address = ss.str(); + + return op; + } + } + } + return {}; +} + string sidechain_net_handler_bitcoin::recreate_primary_wallet( const vector& participants ) { ilog(__FUNCTION__); string result = create_multisignature_wallet(participants); @@ -289,7 +327,7 @@ void sidechain_net_handler_bitcoin::handle_event( const std::string& event_data if( block != "" ) { const auto& vins = extract_info_from_block( block ); - const auto& sidechain_addresses_idx = database->get_index_type().indices().get(); + const auto& sidechain_addresses_idx = database.get_index_type().indices().get(); for( const auto& v : vins ) { const auto& addr_itr = sidechain_addresses_idx.find(std::make_tuple(sidechain_type::bitcoin, v.address)); diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp index cf380e8b..5ed57c76 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp @@ -1,12 +1,14 @@ #include #include +#include #include namespace graphene { namespace peerplays_sidechain { -sidechain_net_manager::sidechain_net_manager(std::shared_ptr db) : - database(db) +sidechain_net_manager::sidechain_net_manager(peerplays_sidechain_plugin& _plugin) : + plugin(_plugin), + database(_plugin.database()) { ilog(__FUNCTION__); } @@ -22,7 +24,7 @@ bool sidechain_net_manager::create_handler(peerplays_sidechain::sidechain_type s switch (sidechain) { case sidechain_type::bitcoin: { - std::unique_ptr h = std::unique_ptr(new sidechain_net_handler_bitcoin(database, options)); + std::unique_ptr h = std::unique_ptr(new sidechain_net_handler_bitcoin(plugin, options)); net_handlers.push_back(std::move(h)); ret_val = true; break; @@ -34,6 +36,27 @@ bool sidechain_net_manager::create_handler(peerplays_sidechain::sidechain_type s return ret_val; } +signed_transaction sidechain_net_manager::recreate_primary_wallet() { + ilog(__FUNCTION__); + + signed_transaction trx = {}; + + const auto& idx = database.get_index_type().indices().get(); + auto swo = idx.rbegin(); + + for ( size_t i = 0; i < net_handlers.size(); i++ ) { + son_wallet_update_operation op = net_handlers.at(i)->recreate_primary_wallet(); + + if (swo != idx.rend()) { + if (op.son_wallet_id == swo->id) { + trx.operations.push_back(op); + } + } + } + + return trx; +} + 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++ ) {