From d76fd8d0122a62ed772e1aae97013bf1738566d4 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Wed, 1 Nov 2023 10:00:28 +0300 Subject: [PATCH] Refactor libbitcoin client --- .../bitcoin/libbitcoin_client.cpp | 19 +++-- .../bitcoin/libbitcoin_client.hpp | 27 +++---- .../sidechain_net_handler_bitcoin.hpp | 71 +++++++++---------- .../sidechain_net_handler_bitcoin.cpp | 8 +-- 4 files changed, 56 insertions(+), 69 deletions(-) diff --git a/libraries/plugins/peerplays_sidechain/bitcoin/libbitcoin_client.cpp b/libraries/plugins/peerplays_sidechain/bitcoin/libbitcoin_client.cpp index 8268be7b..766df3ed 100644 --- a/libraries/plugins/peerplays_sidechain/bitcoin/libbitcoin_client.cpp +++ b/libraries/plugins/peerplays_sidechain/bitcoin/libbitcoin_client.cpp @@ -3,7 +3,6 @@ #include -#include #include #include @@ -14,7 +13,7 @@ namespace graphene { namespace peerplays_sidechain { -libbitcoin_client::libbitcoin_client(std::string url) : +libbitcoin_client::libbitcoin_client(const std::string &url) : obelisk_client(LIBBITCOIN_SERVER_TIMEOUT, LIBBITCOIN_SERVER_RETRIES) { std::string reg_expr = "^((?Phttps|http|tcp):\\/\\/)?(?P[a-zA-Z0-9\\-\\.]+)(:(?P\\d{1,5}))?(?P\\/.+)?"; @@ -51,8 +50,6 @@ libbitcoin_client::libbitcoin_client(std::string url) : if (!obelisk_client.connect(connection)) { elog("Can't connect libbitcoin for url: ${url}", ("url", final_url)); } - - is_connected = true; } libbitcoin_client::~libbitcoin_client() { @@ -65,7 +62,7 @@ libbitcoin_client::~libbitcoin_client() { sub_thr.detach(); } -std::string libbitcoin_client::send_transaction(std::string tx) { +std::string libbitcoin_client::send_transaction(const std::string &tx) { std::string res; @@ -89,7 +86,7 @@ std::string libbitcoin_client::send_transaction(std::string tx) { return res; } -bool libbitcoin_client::get_transaction(const std::string tx, libbitcoin::chain::transaction &trx) { +bool libbitcoin_client::get_transaction(const std::string &tx, libbitcoin::chain::transaction &trx) { bool result = false; auto error_handler = [&](const std::error_code &ec) { elog("error on fetch_trx_by_hash: ${hash} ${error_code}", ("hash", tx)("error_code", ec.message())); @@ -111,7 +108,7 @@ bool libbitcoin_client::get_transaction(const std::string tx, libbitcoin::chain: return result; } -libbitcoin::chain::output::list libbitcoin_client::get_transaction_outs(std::string tx_id, std::string &tx_hash, uint32_t &confirmitions) { +libbitcoin::chain::output::list libbitcoin_client::get_transaction_outs(const std::string &tx_id, std::string &tx_hash, uint32_t &confirmitions) { libbitcoin::chain::output::list outs; libbitcoin::chain::transaction trx; @@ -127,7 +124,7 @@ libbitcoin::chain::output::list libbitcoin_client::get_transaction_outs(std::str return outs; } -std::vector libbitcoin_client::listunspent(std::string address, double amount) { +std::vector libbitcoin_client::listunspent(const std::string &address, double amount) { std::vector result; auto error_handler = [&](const std::error_code &ec) { @@ -180,7 +177,7 @@ bool libbitcoin_client::get_is_test_net() { return is_test_net; } -uint64_t libbitcoin_client::get_fee_from_trx(libbitcoin::chain::transaction trx) { +uint64_t libbitcoin_client::get_fee_from_trx(const libbitcoin::chain::transaction &trx) { bool general_fee_est_error = false; if (trx.is_coinbase()) { @@ -229,7 +226,7 @@ uint64_t libbitcoin_client::get_fee_from_trx(libbitcoin::chain::transaction trx) } } -uint64_t libbitcoin_client::get_average_fee_from_trxs(std::vector trx_list) { +uint64_t libbitcoin_client::get_average_fee_from_trxs(const std::vector &trx_list) { std::vector fee_per_trxs; for (auto &trx : trx_list) { @@ -253,7 +250,7 @@ uint64_t libbitcoin_client::get_average_fee_from_trxs(std::vector - block_update_handler; - -typedef std::function - address_update_handler; - -typedef std::function - subscription_expired_handler; +using address_update_handler = std::function; +using subscription_expired_handler = std::function; struct list_unspent_replay { std::string hash; @@ -37,16 +31,16 @@ struct list_unspent_replay { class libbitcoin_client { public: - libbitcoin_client(std::string url); + explicit libbitcoin_client(const std::string &url); ~libbitcoin_client(); - std::string send_transaction(const std::string tx); - bool get_transaction(const std::string tx, libbitcoin::chain::transaction &trx); - libbitcoin::chain::output::list get_transaction_outs(std::string tx_id, std::string &tx_hash, uint32_t &confirmitions); - std::vector listunspent(std::string address, double amount); - uint64_t get_average_fee_from_trxs(std::vector trx_list); - uint64_t get_fee_from_trx(libbitcoin::chain::transaction trx); + std::string send_transaction(const std::string &tx); + bool get_transaction(const std::string &tx, libbitcoin::chain::transaction &trx); + libbitcoin::chain::output::list get_transaction_outs(const std::string &tx_id, std::string &tx_hash, uint32_t &confirmitions); + std::vector listunspent(const std::string &address, double amount); + uint64_t get_average_fee_from_trxs(const std::vector &trx_list); + uint64_t get_fee_from_trx(const libbitcoin::chain::transaction &trx); bool get_is_test_net(); - void subscribe_to_address(const std::string address_str, address_update_handler address_updated_callback_handler, + void subscribe_to_address(const std::string &address_str, address_update_handler address_updated_callback_handler, subscription_expired_handler subcription_expired_callback_handler); bool is_target_trxs_pool_empty(); @@ -69,7 +63,6 @@ private: std::mutex trxs_pool_mutex; std::condition_variable poller_transacion_done; - bool is_connected = false; int16_t is_test_net = -1; std::thread sub_thr; std::thread poller_trx_thr; 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 5ad9bb6e..11fc69de 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 @@ -65,6 +65,7 @@ public: std::string label; }; + virtual ~bitcoin_client_base() = default; virtual uint64_t estimatesmartfee(uint16_t conf_target = 1) = 0; virtual std::vector getblock(const block_data &block, int32_t verbosity = 2) = 0; virtual btc_tx getrawtransaction(const std::string &txid, const bool verbose = false) = 0; @@ -72,9 +73,7 @@ public: virtual std::string getblockchaininfo() = 0; virtual std::vector listunspent_by_address_and_amount(const std::string &address, double transfer_amount, const uint32_t minconf = 1, const uint32_t maxconf = 9999999) = 0; virtual std::string sendrawtransaction(const std::string &tx_hex) = 0; - virtual void importmulti(const std::vector &address_or_script_array, const bool rescan = true) { - ; - }; + virtual void importmulti(const std::vector &address_or_script_array, const bool rescan = true){}; virtual std::string loadwallet(const std::string &filename) { return ""; }; @@ -102,20 +101,20 @@ public: public: bitcoin_rpc_client(const std::vector &_credentials, bool _debug_rpc_calls, bool _simulate_connection_reselection); - uint64_t estimatesmartfee(uint16_t conf_target = 1); + uint64_t estimatesmartfee(uint16_t conf_target = 1) final; std::vector getblock(const block_data &block, int32_t verbosity = 2); - btc_tx getrawtransaction(const std::string &txid, const bool verbose = false); - void getnetworkinfo(); - std::string getblockchaininfo(); - void importmulti(const std::vector &address_or_script_array, const bool rescan = true); + btc_tx getrawtransaction(const std::string &txid, const bool verbose = false) final; + void getnetworkinfo() final; + std::string getblockchaininfo() final; + void importmulti(const std::vector &address_or_script_array, const bool rescan = true) final; std::vector listunspent(const uint32_t minconf = 1, const uint32_t maxconf = 9999999); - std::vector listunspent_by_address_and_amount(const std::string &address, double transfer_amount, const uint32_t minconf = 1, const uint32_t maxconf = 9999999); - std::string loadwallet(const std::string &filename); - std::string sendrawtransaction(const std::string &tx_hex); - std::string walletlock(); - bool walletpassphrase(const std::string &passphrase, uint32_t timeout = 60); + std::vector listunspent_by_address_and_amount(const std::string &address, double transfer_amount, const uint32_t minconf = 1, const uint32_t maxconf = 9999999) final; + std::string loadwallet(const std::string &filename) final; + std::string sendrawtransaction(const std::string &tx_hex) final; + std::string walletlock() final; + bool walletpassphrase(const std::string &passphrase, uint32_t timeout = 60) final; - virtual uint64_t ping(rpc_connection &conn) const override; + uint64_t ping(rpc_connection &conn) const final; private: std::string ip; @@ -128,14 +127,14 @@ private: class bitcoin_libbitcoin_client : public bitcoin_client_base, public libbitcoin_client { public: - bitcoin_libbitcoin_client(std::string url); - uint64_t estimatesmartfee(uint16_t conf_target = 1); + explicit bitcoin_libbitcoin_client(const std::string &url); + uint64_t estimatesmartfee(uint16_t conf_target = 1) final; std::vector getblock(const block_data &block, int32_t verbosity = 2); - btc_tx getrawtransaction(const std::string &txid, const bool verbose = false); - void getnetworkinfo(); - std::string getblockchaininfo(); - std::vector listunspent_by_address_and_amount(const std::string &address, double transfer_amount, const uint32_t minconf = 1, const uint32_t maxconf = 9999999); - std::string sendrawtransaction(const std::string &tx_hex); + btc_tx getrawtransaction(const std::string &txid, const bool verbose = false) final; + void getnetworkinfo() final; + std::string getblockchaininfo() final; + std::vector listunspent_by_address_and_amount(const std::string &address, double transfer_amount, const uint32_t minconf = 1, const uint32_t maxconf = 9999999) final; + std::string sendrawtransaction(const std::string &tx_hex) final; private: bool is_test_net = false; @@ -147,13 +146,11 @@ private: class zmq_listener_base { public: - virtual ~zmq_listener_base(){}; - zmq_listener_base(std::string _ip, uint32_t _block_zmq_port, uint32_t _trx_zmq_port = 0) { - ip = _ip; - block_zmq_port = _block_zmq_port; - trx_zmq_port = _trx_zmq_port; - stopped = false; - }; + virtual ~zmq_listener_base() = default; + zmq_listener_base(const std::string &_ip, uint32_t _block_zmq_port, uint32_t _trx_zmq_port = 0) : + ip(_ip), + block_zmq_port(_block_zmq_port), + trx_zmq_port(_trx_zmq_port){}; virtual void start() = 0; boost::signals2::signal block_event_received; boost::signals2::signal trx_event_received; @@ -162,16 +159,16 @@ protected: std::string ip; uint32_t block_zmq_port; uint32_t trx_zmq_port; - std::atomic_bool stopped; + std::atomic_bool stopped{false}; std::thread block_thr; std::thread trx_thr; }; class zmq_listener : public zmq_listener_base { public: - zmq_listener(std::string _ip, uint32_t _block_zmq_port, uint32_t _trx_zmq_port = 0); - virtual ~zmq_listener(); - void start(); + zmq_listener(const std::string &_ip, uint32_t _block_zmq_port, uint32_t _trx_zmq_port = 0); + ~zmq_listener() final; + void start() final; private: void handle_zmq(); @@ -183,9 +180,9 @@ private: class zmq_listener_libbitcoin : public zmq_listener_base { public: - zmq_listener_libbitcoin(std::string _ip, uint32_t _block_zmq_port = 9093, uint32_t _trx_zmq_port = 9094); - virtual ~zmq_listener_libbitcoin(); - void start(); + zmq_listener_libbitcoin(const std::string &_ip, uint32_t _block_zmq_port = 9093, uint32_t _trx_zmq_port = 9094); + ~zmq_listener_libbitcoin() final; + void start() final; private: void handle_block(); @@ -234,7 +231,7 @@ private: uint32_t bitcoin_major_version; std::mutex event_handler_mutex; - typedef std::lock_guard scoped_lock; + using scoped_lock = std::lock_guard; std::string create_primary_wallet_address(const std::vector &son_pubkeys); @@ -246,7 +243,7 @@ private: std::string sign_transaction(const sidechain_transaction_object &sto); std::string send_transaction(const sidechain_transaction_object &sto); - void extract_deposit(const std::vector vins); + void extract_deposit(const std::vector &vins); void block_handle_event(const block_data &event_data); void subscribe_address_thread(); void trx_handle_event(const libbitcoin::chain::transaction &event_data); diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index 938b2a7b..cd00c28f 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -333,7 +333,7 @@ bool bitcoin_rpc_client::walletpassphrase(const std::string &passphrase, uint32_ else return true; } -bitcoin_libbitcoin_client::bitcoin_libbitcoin_client(std::string url) : +bitcoin_libbitcoin_client::bitcoin_libbitcoin_client(const std::string &url) : libbitcoin_client(url) { estimate_fee_ext = std::unique_ptr(new estimate_fee_external()); @@ -508,7 +508,7 @@ uint64_t bitcoin_rpc_client::ping(rpc_connection &conn) const { // ============================================================================= -zmq_listener::zmq_listener(std::string _ip, uint32_t _zmq_block_port, uint32_t _zmq_trx_port) : +zmq_listener::zmq_listener(const std::string &_ip, uint32_t _zmq_block_port, uint32_t _zmq_trx_port) : zmq_listener_base(_ip, _zmq_block_port, _zmq_trx_port), ctx(1), socket(ctx, ZMQ_SUB) { @@ -578,7 +578,7 @@ void zmq_listener::handle_zmq() { // ============================================================================= -zmq_listener_libbitcoin::zmq_listener_libbitcoin(std::string _ip, uint32_t _block_zmq_port, uint32_t _trx_zmq_port) : +zmq_listener_libbitcoin::zmq_listener_libbitcoin(const std::string &_ip, uint32_t _block_zmq_port, uint32_t _trx_zmq_port) : zmq_listener_base(_ip, _block_zmq_port, _trx_zmq_port), block_socket(block_context, libbitcoin::protocol::zmq::socket::role::subscriber), trx_socket(trx_context, libbitcoin::protocol::zmq::socket::role::subscriber) { @@ -1736,7 +1736,7 @@ void sidechain_net_handler_bitcoin::trx_event(const libbitcoin::chain::transacti extract_deposit(result); } -void sidechain_net_handler_bitcoin::extract_deposit(const std::vector vins) { +void sidechain_net_handler_bitcoin::extract_deposit(const std::vector &vins) { const auto &sidechain_addresses_idx = database.get_index_type().indices().get(); for (const auto &v : vins) { // !!! EXTRACT DEPOSIT ADDRESS FROM SIDECHAIN ADDRESS OBJECT