From 77e00ccba14975251c75bdb146f85d3feac540ee Mon Sep 17 00:00:00 2001 From: moneroexamples Date: Sun, 29 Apr 2018 14:51:53 +0800 Subject: [PATCH] some performance i,provements --- README.md | 12 ++-- src/OutputInputIdentification.cpp | 57 +++++++++++++--- src/OutputInputIdentification.h | 14 +++- src/TxSearch.cpp | 105 +++++++++++++++++++++--------- 4 files changed, 143 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index e70c83e..2667932 100755 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ Open Monero is not as fast as MyMonero. in back, because viewkey is unknown. -## Example compilation on Ubuntu 16.04 +## Example compilation on Ubuntu 18.04 Below are example and basic instructions on how to setup up and run Open Monero on Ubuntu 16.04. For other Linux operating systems, the instructions are analogical. @@ -96,18 +96,18 @@ Download and compile recent Monero into your home folder: # first install monero dependecines sudo apt update -sudo apt install git build-essential cmake libboost-all-dev miniupnpc libunbound-dev graphviz doxygen libunwind8-dev pkg-config libssl-dev libcurl4-openssl-dev libgtest-dev libreadline-dev libzmq3-dev -sudo wget -O /usr/local/include/zmq.hpp https://raw.githubusercontent.com/zeromq/cppzmq/master/zmq.hpp +sudo apt install git build-essential cmake libboost-all-dev miniupnpc libunbound-dev graphviz doxygen libunwind-dev pkg-config libssl-dev libcurl4-openssl-dev libgtest-dev libreadline-dev libzmq3-dev libsodium-dev # go to home folder cd ~ -# get latest development version of monero. Monero changes so fast -# that if something breaks during compilation of open monero, please make an issue -git clone https://github.com/monero-project/monero +git clone --recursive https://github.com/monero-project/monero cd monero/ +# checkout last monero version +git checkout -b last_release v0.12.0.0 + make ``` diff --git a/src/OutputInputIdentification.cpp b/src/OutputInputIdentification.cpp index 7c4aa14..d1ebe8d 100755 --- a/src/OutputInputIdentification.cpp +++ b/src/OutputInputIdentification.cpp @@ -18,14 +18,9 @@ OutputInputIdentification::OutputInputIdentification( viewkey = _v; tx = _tx; - tx_hash = get_transaction_hash(*tx); - tx_prefix_hash = get_transaction_prefix_hash(*tx); + tx_hash = get_transaction_hash(*tx); tx_pub_key = xmreg::get_tx_pub_key_from_received_outs(*tx); - tx_hash_str = pod_to_hex(tx_hash); - tx_prefix_hash_str = pod_to_hex(tx_prefix_hash); - tx_pub_key_str = pod_to_hex(tx_pub_key); - tx_is_coinbase = is_coinbase(*tx); is_rct = (tx->version == 2); @@ -39,7 +34,7 @@ OutputInputIdentification::OutputInputIdentification( if (!generate_key_derivation(tx_pub_key, *viewkey, derivation)) { cerr << "Cant get derived key for: " << "\n" - << "pub_tx_key: " << tx_pub_key << " and " + << "pub_tx_key: " << get_tx_pub_key_str() << " and " << "prv_view_key" << viewkey << endl; throw OutputInputIdentificationException("Cant get derived key for a tx"); @@ -47,11 +42,20 @@ OutputInputIdentification::OutputInputIdentification( if (!tx_is_coinbase) { - mixin_no = get_mixin_no(*tx); + } } +uint64_t +OutputInputIdentification::get_mixin_no() +{ + if (mixin_no == 0 && !tx_is_coinbase) + mixin_no = xmreg::get_mixin_no(*tx); + + return mixin_no; +} + void OutputInputIdentification::identify_outputs() { @@ -141,7 +145,7 @@ OutputInputIdentification::identify_outputs() // found an output associated with the given address and viewkey string msg = fmt::format("tx_hash: {:s}, output_pub_key: {:s}\n", - tx_hash_str, + get_tx_hash_str(), out_key_str); cout << msg << endl; @@ -254,4 +258,39 @@ OutputInputIdentification::identify_inputs( } + +string const& +OutputInputIdentification::get_tx_hash_str() +{ + if (tx_hash_str.empty()) + { + tx_hash_str = pod_to_hex(tx_hash); + } + + + return tx_hash_str; +} + + +string const& +OutputInputIdentification::get_tx_prefix_hash_str() +{ + if (tx_prefix_hash_str.empty()) + { + tx_prefix_hash = get_transaction_prefix_hash(*tx); + tx_prefix_hash_str = pod_to_hex(tx_prefix_hash); + } + + return tx_prefix_hash_str; +} + +string const& +OutputInputIdentification::get_tx_pub_key_str() +{ + if (tx_pub_key_str.empty()) + tx_pub_key_str = pod_to_hex(tx_pub_key); + + return tx_pub_key_str; +} + } diff --git a/src/OutputInputIdentification.h b/src/OutputInputIdentification.h index 4583094..5be1f3f 100755 --- a/src/OutputInputIdentification.h +++ b/src/OutputInputIdentification.h @@ -82,7 +82,7 @@ public: bool is_rct; uint8_t rct_type; - uint64_t mixin_no; + uint64_t mixin_no {}; // for each output, in a tx, check if it belongs // to the given account of specific address and viewkey @@ -128,6 +128,18 @@ public: void identify_inputs( const vector>& known_outputs_keys); + string const& + get_tx_hash_str(); + + string const& + get_tx_prefix_hash_str(); + + string const& + get_tx_pub_key_str(); + + uint64_t + get_mixin_no(); + private: // address and viewkey for this search thread. diff --git a/src/TxSearch.cpp b/src/TxSearch.cpp index 5d620b9..900188a 100755 --- a/src/TxSearch.cpp +++ b/src/TxSearch.cpp @@ -72,7 +72,7 @@ TxSearch::search() uint64_t loop_timestamp {current_timestamp}; - if (loop_idx % 5 == 0) + if (loop_idx % 10 == 0) { // get loop time every fith iteration. no need to call it // all the time. @@ -135,12 +135,14 @@ TxSearch::search() { // print status every 100th block - fmt::print(" - searching block {:d} of hash {:s} \n", - searched_blk_no, pod_to_hex(get_block_hash(blk))); + cout << " - searching block " << searched_blk_no + << " of hash: " + << searched_blk_no << get_block_hash(blk) << '\n'; } - DateTime blk_timestamp_mysql_format - = XmrTransaction::timestamp_to_DateTime(blk.timestamp); + // we will only create mysql DateTime object once, anything is found + // in a given block; + unique_ptr blk_timestamp_mysql_format; // searching for our incoming and outgoing xmr has two components. // @@ -177,7 +179,7 @@ TxSearch::search() if (!CurrentBlockchainStatus::tx_exist(oi_identification.tx_hash, blockchain_tx_id)) { - cerr << "Tx " << oi_identification.tx_hash_str + cerr << "Tx " << oi_identification.get_tx_hash_str() << "not found in blockchain !" << '\n'; continue; } @@ -189,8 +191,9 @@ TxSearch::search() uint64_t tx_mysql_id {0}; - // start mysql transaction - mysqlpp::Transaction trans(xmr_accounts->get_connection()->get_connection()); + // create pointer to mysql transaction object + // that we will initilize if we find something. + unique_ptr mysql_transaction; // if we identified some outputs as ours, // save them into mysql. @@ -230,11 +233,29 @@ TxSearch::search() // } // } + if (!blk_timestamp_mysql_format) + { + blk_timestamp_mysql_format + = unique_ptr( + new DateTime(static_cast(blk.timestamp))); + } + + if (!mysql_transaction) + { + // start mysql transaction here + mysql_transaction + = unique_ptr( + new mysqlpp::Transaction( + xmr_accounts->get_connection() + ->get_connection())); + } + + XmrTransaction tx_data; - tx_data.hash = oi_identification.tx_hash_str; - tx_data.prefix_hash = oi_identification.tx_prefix_hash_str; - tx_data.tx_pub_key = oi_identification.tx_pub_key_str; + tx_data.hash = oi_identification.get_tx_hash_str(); + tx_data.prefix_hash = oi_identification.get_tx_prefix_hash_str(); + tx_data.tx_pub_key = oi_identification.get_tx_pub_key_str(); tx_data.account_id = acc->id; tx_data.blockchain_tx_id = blockchain_tx_id; tx_data.total_received = oi_identification.total_received; @@ -253,8 +274,8 @@ TxSearch::search() tx_data.rct_type = oi_identification.rct_type; tx_data.spendable = is_spendable; tx_data.payment_id = CurrentBlockchainStatus::get_payment_id_as_string(tx); - tx_data.mixin = oi_identification.mixin_no; - tx_data.timestamp = blk_timestamp_mysql_format; + tx_data.mixin = oi_identification.get_mixin_no(); + tx_data.timestamp = *blk_timestamp_mysql_format; // insert tx_data into mysql's Transactions table @@ -283,7 +304,7 @@ TxSearch::search() out_data.account_id = acc->id; out_data.tx_id = tx_mysql_id; out_data.out_pub_key = out_info.pub_key; - out_data.tx_pub_key = oi_identification.tx_pub_key_str; + out_data.tx_pub_key = oi_identification.get_tx_pub_key_str(); out_data.amount = out_info.amount; out_data.out_index = out_info.idx_in_tx; out_data.rct_outpk = out_info.rtc_outpk; @@ -325,6 +346,26 @@ TxSearch::search() // so now, go over those inputs, and check // get detail info for each found mixin output from database + + if (!blk_timestamp_mysql_format) + { + blk_timestamp_mysql_format + = unique_ptr( + new DateTime(static_cast(blk.timestamp))); + } + + if (!mysql_transaction) + { + // start mysql transaction here if not already present + mysql_transaction + = unique_ptr( + new mysqlpp::Transaction( + xmr_accounts->get_connection() + ->get_connection())); + + } + + vector inputs_found; for (auto& in_info: oi_identification.identified_inputs) @@ -348,7 +389,7 @@ TxSearch::search() in_data.output_id = out.id; in_data.key_image = in_info.key_img; in_data.amount = out.amount; // must match corresponding output's amount - in_data.timestamp = blk_timestamp_mysql_format; + in_data.timestamp = *blk_timestamp_mysql_format; inputs_found.push_back(in_data); @@ -367,9 +408,7 @@ TxSearch::search() uint64_t total_sent {0}; for (const XmrInput& in_data: inputs_found) - { total_sent += in_data.amount; - } if (tx_mysql_id == 0) { @@ -381,9 +420,9 @@ TxSearch::search() XmrTransaction tx_data; - tx_data.hash = oi_identification.tx_hash_str; - tx_data.prefix_hash = oi_identification.tx_prefix_hash_str; - tx_data.tx_pub_key = oi_identification.tx_pub_key_str; + tx_data.hash = oi_identification.get_tx_hash_str(); + tx_data.prefix_hash = oi_identification.get_tx_prefix_hash_str(); + tx_data.tx_pub_key = oi_identification.get_tx_pub_key_str(); tx_data.account_id = acc->id; tx_data.blockchain_tx_id = blockchain_tx_id; tx_data.total_received = 0; // because this is spending, total_recieved is 0 @@ -395,8 +434,8 @@ TxSearch::search() tx_data.rct_type = oi_identification.rct_type; tx_data.spendable = is_spendable; tx_data.payment_id = CurrentBlockchainStatus::get_payment_id_as_string(tx); - tx_data.mixin = get_mixin_no(tx) - 1; - tx_data.timestamp = blk_timestamp_mysql_format; + tx_data.mixin = oi_identification.get_mixin_no(); + tx_data.timestamp = *blk_timestamp_mysql_format; // insert tx_data into mysql's Transactions table tx_mysql_id = xmr_accounts->insert_tx(tx_data); @@ -431,7 +470,8 @@ TxSearch::search() // to be written, i.e., Transactions, Outputs and Inputs. If so, write // all this into database. - trans.commit(); + if (mysql_transaction) + mysql_transaction->commit(); } // for (const transaction& tx: blk_txs) @@ -444,8 +484,15 @@ TxSearch::search() XmrAccount updated_acc = *acc; + if (!blk_timestamp_mysql_format) + { + blk_timestamp_mysql_format + = unique_ptr( + new DateTime(static_cast(blk.timestamp))); + } + updated_acc.scanned_block_height = searched_blk_no; - updated_acc.scanned_block_timestamp = blk_timestamp_mysql_format; + updated_acc.scanned_block_timestamp = *blk_timestamp_mysql_format; if (xmr_accounts->update(*acc, updated_acc)) { @@ -585,8 +632,8 @@ TxSearch::find_txs_in_mempool( j_tx["id"] = 0; // dont have any database id for tx in mempool // this id is used for sorting txs in the frontend. - j_tx["hash"] = oi_identification.tx_hash_str; - j_tx["tx_pub_key"] = oi_identification.tx_pub_key_str; + j_tx["hash"] = oi_identification.get_tx_hash_str(); + j_tx["tx_pub_key"] = oi_identification.get_tx_pub_key_str(); j_tx["timestamp"] = recieve_time; // when it got into mempool j_tx["total_received"] = oi_identification.total_received; j_tx["total_sent"] = 0; // to be set later when looking for key images @@ -600,7 +647,7 @@ TxSearch::find_txs_in_mempool( j_tx["coinbase"] = false; // mempool tx are not coinbase, so always false j_tx["is_rct"] = oi_identification.is_rct; j_tx["rct_type"] = oi_identification.rct_type; - j_tx["mixin"] = get_mixin_no(tx); + j_tx["mixin"] = oi_identification.get_mixin_no(); j_tx["mempool"] = true; j_transactions.push_back(j_tx); @@ -673,8 +720,8 @@ TxSearch::find_txs_in_mempool( j_tx["id"] = 0; // dont have any database id for tx in mempool // this id is used for sorting txs in the frontend. - j_tx["hash"] = oi_identification.tx_hash_str; - j_tx["tx_pub_key"] = oi_identification.tx_pub_key_str; + j_tx["hash"] = oi_identification.get_tx_hash_str(); + j_tx["tx_pub_key"] = oi_identification.get_tx_pub_key_str(); j_tx["timestamp"] = recieve_time; // when it got into mempool j_tx["total_received"] = 0; // we did not recive any outputs/xmr j_tx["total_sent"] = total_sent; // to be set later when looking for key images