From 03836d3770ad28e691165f47388029b24f53ef09 Mon Sep 17 00:00:00 2001 From: serkixenos Date: Mon, 4 Apr 2022 23:22:34 -0400 Subject: [PATCH] Sidechain API, SONs listener log --- libraries/app/CMakeLists.txt | 2 +- libraries/app/api.cpp | 9 ++++ libraries/app/application.cpp | 1 + libraries/app/include/graphene/app/api.hpp | 17 ++++--- libraries/plugins/delayed_node/CMakeLists.txt | 2 +- .../peerplays_sidechain/CMakeLists.txt | 1 + .../peerplays_sidechain_plugin.hpp | 1 + .../peerplays_sidechain/sidechain_api.hpp | 34 +++++++++++++ .../sidechain_net_handler.hpp | 5 ++ .../sidechain_net_manager.hpp | 2 + .../peerplays_sidechain_plugin.cpp | 10 ++++ .../peerplays_sidechain/sidechain_api.cpp | 48 +++++++++++++++++++ .../sidechain_net_handler.cpp | 11 +++++ .../sidechain_net_handler_bitcoin.cpp | 7 ++- .../sidechain_net_handler_hive.cpp | 4 ++ .../sidechain_net_manager.cpp | 8 ++++ .../wallet/include/graphene/wallet/wallet.hpp | 6 +++ libraries/wallet/wallet.cpp | 37 ++++++++++++++ 18 files changed, 195 insertions(+), 10 deletions(-) create mode 100644 libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_api.hpp create mode 100644 libraries/plugins/peerplays_sidechain/sidechain_api.cpp diff --git a/libraries/app/CMakeLists.txt b/libraries/app/CMakeLists.txt index 12a6616b..fe92face 100644 --- a/libraries/app/CMakeLists.txt +++ b/libraries/app/CMakeLists.txt @@ -15,7 +15,7 @@ add_library( graphene_app #target_link_libraries( graphene_app graphene_market_history graphene_account_history graphene_chain fc graphene_db graphene_net graphene_utilities graphene_debug_witness ) target_link_libraries( graphene_app PUBLIC graphene_net graphene_utilities - graphene_account_history graphene_accounts_list graphene_affiliate_stats graphene_bookie graphene_debug_witness graphene_elasticsearch graphene_es_objects graphene_generate_genesis graphene_market_history ) + graphene_account_history graphene_accounts_list graphene_affiliate_stats graphene_bookie graphene_debug_witness graphene_elasticsearch graphene_es_objects graphene_generate_genesis graphene_market_history peerplays_sidechain ) target_include_directories( graphene_app PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" diff --git a/libraries/app/api.cpp b/libraries/app/api.cpp index eac6d3b8..f6b084f1 100644 --- a/libraries/app/api.cpp +++ b/libraries/app/api.cpp @@ -106,6 +106,10 @@ void login_api::enable_api(const std::string &api_name) { // can only enable this API if the plugin was loaded if (_app.get_plugin("affiliate_stats")) _affiliate_stats_api = std::make_shared(std::ref(_app)); + } else if (api_name == "sidechain_api") { + // can only enable this API if the plugin was loaded + if (_app.get_plugin("peerplays_sidechain")) + _sidechain_api = std::make_shared(std::ref(_app)); } return; } @@ -310,6 +314,11 @@ fc::api login_api::affiliate_sta return *_affiliate_stats_api; } +fc::api login_api::sidechain() const { + FC_ASSERT(_sidechain_api); + return *_sidechain_api; +} + vector history_api::get_fill_order_history(std::string asset_a, std::string asset_b, uint32_t limit) const { FC_ASSERT(_app.chain_database()); const auto &db = *_app.chain_database(); diff --git a/libraries/app/application.cpp b/libraries/app/application.cpp index 1ecdd8f7..19f1ed10 100644 --- a/libraries/app/application.cpp +++ b/libraries/app/application.cpp @@ -401,6 +401,7 @@ public: wild_access.allowed_apis.push_back("crypto_api"); wild_access.allowed_apis.push_back("bookie_api"); wild_access.allowed_apis.push_back("affiliate_stats_api"); + wild_access.allowed_apis.push_back("sidechain_api"); _apiaccess.permission_map["*"] = wild_access; } diff --git a/libraries/app/include/graphene/app/api.hpp b/libraries/app/include/graphene/app/api.hpp index c12d45bf..98be16a6 100644 --- a/libraries/app/include/graphene/app/api.hpp +++ b/libraries/app/include/graphene/app/api.hpp @@ -28,16 +28,15 @@ #include #include +#include + #include -#include - -#include - #include #include #include - -#include +#include +#include +#include #include #include @@ -405,6 +404,8 @@ public: fc::api bookie() const; /// @brief Retrieve the affiliate_stats API (if available) fc::api affiliate_stats() const; + /// @brief Retrieve the sidechain_api API (if available) + fc::api sidechain() const; /// @brief Called to enable an API, not reflected. void enable_api(const string &api_name); @@ -421,6 +422,7 @@ private: optional> _debug_api; optional> _bookie_api; optional> _affiliate_stats_api; + optional> _sidechain_api; }; }} // namespace graphene::app @@ -498,6 +500,7 @@ FC_API(graphene::app::login_api, (asset) (debug) (bookie) - (affiliate_stats)) + (affiliate_stats) + (sidechain)) // clang-format on diff --git a/libraries/plugins/delayed_node/CMakeLists.txt b/libraries/plugins/delayed_node/CMakeLists.txt index d481eb84..ab01b78d 100644 --- a/libraries/plugins/delayed_node/CMakeLists.txt +++ b/libraries/plugins/delayed_node/CMakeLists.txt @@ -4,7 +4,7 @@ add_library( graphene_delayed_node delayed_node_plugin.cpp ) -target_link_libraries( graphene_delayed_node PRIVATE graphene_plugin graphene_accounts_list graphene_affiliate_stats graphene_bookie graphene_debug_witness graphene_elasticsearch graphene_market_history ) +target_link_libraries( graphene_delayed_node PRIVATE graphene_plugin graphene_accounts_list graphene_affiliate_stats graphene_bookie graphene_debug_witness graphene_elasticsearch graphene_market_history peerplays_sidechain ) target_include_directories( graphene_delayed_node PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" ) diff --git a/libraries/plugins/peerplays_sidechain/CMakeLists.txt b/libraries/plugins/peerplays_sidechain/CMakeLists.txt index 66795016..9ea2ce34 100755 --- a/libraries/plugins/peerplays_sidechain/CMakeLists.txt +++ b/libraries/plugins/peerplays_sidechain/CMakeLists.txt @@ -2,6 +2,7 @@ file(GLOB_RECURSE HEADERS "include/graphene/peerplays_sidechain/*.hpp") add_library( peerplays_sidechain peerplays_sidechain_plugin.cpp + sidechain_api.cpp sidechain_net_manager.cpp sidechain_net_handler.cpp sidechain_net_handler_bitcoin.cpp diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/peerplays_sidechain_plugin.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/peerplays_sidechain_plugin.hpp index 6adfe944..92591d0a 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/peerplays_sidechain_plugin.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/peerplays_sidechain_plugin.hpp @@ -51,6 +51,7 @@ public: fc::ecc::private_key get_private_key(chain::public_key_type public_key); void log_son_proposal_retry(int op_type, object_id_type object_id); bool can_son_participate(int op_type, object_id_type object_id); + std::map> get_son_listener_log(); }; }} // namespace graphene::peerplays_sidechain diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_api.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_api.hpp new file mode 100644 index 00000000..b4636537 --- /dev/null +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_api.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include + +#include + +#include + +namespace graphene { namespace app { +class application; +}} // namespace graphene::app + +namespace graphene { namespace peerplays_sidechain { + +namespace detail { +class sidechain_api_impl; +} + +class sidechain_api { +public: + sidechain_api(app::application &_app); + virtual ~sidechain_api(); + + std::shared_ptr my; + + std::map> get_son_listener_log(); +}; + +}} // namespace graphene::peerplays_sidechain + +FC_API(graphene::peerplays_sidechain::sidechain_api, + (get_son_listener_log)) 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 21526d05..3aa4465c 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 @@ -47,6 +47,9 @@ public: virtual std::string send_sidechain_transaction(const sidechain_transaction_object &sto) = 0; virtual bool settle_sidechain_transaction(const sidechain_transaction_object &sto, asset &settle_amount) = 0; + void add_to_son_listener_log(std::string trx_id); + std::vector get_son_listener_log(); + protected: peerplays_sidechain_plugin &plugin; graphene::chain::database &database; @@ -56,6 +59,8 @@ protected: std::map private_keys; + std::vector son_listener_log; + void on_applied_block(const signed_block &b); private: 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 a35c1933..8bfda125 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 @@ -25,6 +25,8 @@ public: void send_sidechain_transactions(); void settle_sidechain_transactions(); + std::map> get_son_listener_log(); + private: peerplays_sidechain_plugin &plugin; graphene::chain::database &database; diff --git a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp index 26976676..ed80fbfc 100644 --- a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp +++ b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -44,6 +45,7 @@ public: fc::ecc::private_key get_private_key(chain::public_key_type public_key); void log_son_proposal_retry(int op_type, object_id_type object_id); bool can_son_participate(int op_type, object_id_type object_id); + std::map> get_son_listener_log(); void schedule_heartbeat_loop(); void heartbeat_loop(); @@ -528,6 +530,10 @@ bool peerplays_sidechain_plugin_impl::can_son_participate(int op_type, object_id return (itr == son_retry_count.end() || itr->second < retries_threshold); } +std::map> peerplays_sidechain_plugin_impl::get_son_listener_log() { + return net_manager->get_son_listener_log(); +} + void peerplays_sidechain_plugin_impl::approve_proposals() { auto check_approve_proposal = [&](const chain::son_id_type &son_id, const chain::proposal_object &proposal) { @@ -788,4 +794,8 @@ bool peerplays_sidechain_plugin::can_son_participate(int op_type, object_id_type return my->can_son_participate(op_type, object_id); } +std::map> peerplays_sidechain_plugin::get_son_listener_log() { + return my->get_son_listener_log(); +} + }} // namespace graphene::peerplays_sidechain diff --git a/libraries/plugins/peerplays_sidechain/sidechain_api.cpp b/libraries/plugins/peerplays_sidechain/sidechain_api.cpp new file mode 100644 index 00000000..2a85d034 --- /dev/null +++ b/libraries/plugins/peerplays_sidechain/sidechain_api.cpp @@ -0,0 +1,48 @@ +#include + +namespace graphene { namespace peerplays_sidechain { + +namespace detail { + +class sidechain_api_impl { +public: + sidechain_api_impl(app::application &app); + virtual ~sidechain_api_impl(); + + std::shared_ptr get_plugin(); + + std::map> get_son_listener_log(); + +private: + app::application &app; +}; + +sidechain_api_impl::sidechain_api_impl(app::application &_app) : + app(_app) { +} + +sidechain_api_impl::~sidechain_api_impl() { +} + +std::shared_ptr sidechain_api_impl::get_plugin() { + return app.get_plugin("peerplays_sidechain"); +} + +std::map> sidechain_api_impl::get_son_listener_log() { + return get_plugin()->get_son_listener_log(); +} + +} // namespace detail + +sidechain_api::sidechain_api(graphene::app::application &_app) : + my(std::make_shared(_app)) { +} + +sidechain_api::~sidechain_api() { +} + +std::map> sidechain_api::get_son_listener_log() { + return my->get_son_listener_log(); +} + +}} // namespace graphene::peerplays_sidechain diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp index 86876782..45fab4ee 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler.cpp @@ -618,6 +618,17 @@ void sidechain_net_handler::settle_sidechain_transactions() { }); } +void sidechain_net_handler::add_to_son_listener_log(std::string trx_id) { + son_listener_log.insert(son_listener_log.begin(), trx_id); + if (son_listener_log.size() > 33) { + son_listener_log.erase(son_listener_log.end()); + } +} + +std::vector sidechain_net_handler::get_son_listener_log() { + return son_listener_log; +} + void sidechain_net_handler::on_applied_block(const signed_block &b) { const chain::global_property_object &gpo = plugin.database().get_global_properties(); diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index 52d93f51..9289782a 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -1911,6 +1911,8 @@ void sidechain_net_handler_bitcoin::handle_event(const std::string &event_data) if (block.empty()) return; + add_to_son_listener_log("BLOCK : " + event_data); + auto vins = extract_info_from_block(block); scoped_lock interlock(event_handler_mutex); const auto &sidechain_addresses_idx = database.get_index_type().indices().get(); @@ -1940,6 +1942,9 @@ void sidechain_net_handler_bitcoin::handle_event(const std::string &event_data) sed.peerplays_to = database.get_global_properties().parameters.son_account(); price btc_price = database.get(database.get_global_properties().parameters.btc_asset()).options.core_exchange_rate; sed.peerplays_asset = asset(sed.sidechain_amount * btc_price.base.amount / btc_price.quote.amount); + + add_to_son_listener_log("TRX : " + sed.sidechain_transaction_id); + sidechain_event_data_received(sed); } } @@ -2056,7 +2061,7 @@ void sidechain_net_handler_bitcoin::on_changed_objects_cb(const vectorwalletpassphrase(wallet_password) ) + if (!bitcoin_client->walletpassphrase(wallet_password)) return; } diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_hive.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_hive.cpp index 0cbdef29..d63e6743 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_hive.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_hive.cpp @@ -846,6 +846,7 @@ void sidechain_net_handler_hive::hive_listener_loop() { void sidechain_net_handler_hive::handle_event(const std::string &event_data) { std::string block = node_rpc_client->block_api_get_block(std::atoll(event_data.c_str())); if (block != "") { + add_to_son_listener_log("BLOCK : " + event_data); std::stringstream ss(block); boost::property_tree::ptree block_json; boost::property_tree::read_json(ss, block_json); @@ -932,6 +933,9 @@ void sidechain_net_handler_hive::handle_event(const std::string &event_data) { sed.peerplays_from = accn; sed.peerplays_to = database.get_global_properties().parameters.son_account(); sed.peerplays_asset = asset(sed.sidechain_amount * sidechain_currency_price.base.amount / sidechain_currency_price.quote.amount); + + add_to_son_listener_log("TRX : " + sed.sidechain_transaction_id); + sidechain_event_data_received(sed); } } diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp index ff876b0c..e2cb1608 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_manager.cpp @@ -98,6 +98,14 @@ void sidechain_net_manager::settle_sidechain_transactions() { } } +std::map> sidechain_net_manager::get_son_listener_log() { + std::map> result; + for (size_t i = 0; i < net_handlers.size(); i++) { + result[net_handlers.at(i)->get_sidechain()] = net_handlers.at(i)->get_son_listener_log(); + } + return result; +} + void sidechain_net_manager::on_applied_block(const signed_block &b) { } diff --git a/libraries/wallet/include/graphene/wallet/wallet.hpp b/libraries/wallet/include/graphene/wallet/wallet.hpp index 56b43c81..02790e19 100644 --- a/libraries/wallet/include/graphene/wallet/wallet.hpp +++ b/libraries/wallet/include/graphene/wallet/wallet.hpp @@ -2591,6 +2591,11 @@ class wallet_api */ voters_info get_voters(const string &account_name_or_id) const; + /** + * @brief Demo plugin api + * @return The hello world string + */ + std::map> get_son_listener_log() const; fc::signal lock_changed; std::shared_ptr my; @@ -2905,4 +2910,5 @@ FC_API( graphene::wallet::wallet_api, (get_votes) (get_voters_by_id) (get_voters) + (get_son_listener_log) ) diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index 38d0f882..0232bc44 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -84,6 +84,7 @@ #include #include #include +#include #ifndef WIN32 # include @@ -4178,6 +4179,26 @@ public: } } + void use_sidechain_api() + { + if( _remote_sidechain ) + return; + try + { + _remote_sidechain = _remote_api->sidechain(); + } + catch( const fc::exception& e ) + { + std::cerr << "\nCouldn't get sidechain API. You probably are not configured\n" + "to access the sidechain API on the node you are connecting to.\n" + "\n" + "To fix this problem:\n" + "- Please ensure peerplays_sidechain plugin is enabled.\n" + "- Please follow the instructions in README.md to set up an apiaccess file.\n" + "\n"; + } + } + void network_add_nodes( const vector& nodes ) { use_network_node_api(); @@ -4294,6 +4315,16 @@ public: FC_CAPTURE_AND_RETHROW( (account_name_or_id) ) } + std::map> get_son_listener_log() + { + use_sidechain_api(); + try + { + return (*_remote_sidechain)->get_son_listener_log(); + } + FC_CAPTURE_AND_RETHROW() + } + string _wallet_filename; wallet_data _wallet; @@ -4308,6 +4339,7 @@ public: fc::api _remote_bookie; optional< fc::api > _remote_net_node; optional< fc::api > _remote_debug; + optional< fc::api > _remote_sidechain; flat_map _prototype_ops; @@ -7874,6 +7906,11 @@ voters_info wallet_api::get_voters(const string &account_name_or_id) const return my->get_voters(account_name_or_id); } +std::map> wallet_api::get_son_listener_log() const +{ + return my->get_son_listener_log(); +} + // default ctor necessary for FC_REFLECT signed_block_with_info::signed_block_with_info( const signed_block& block ) : signed_block( block ) -- 2.45.2