From 834438acb8b0a5aa0f04b9e5c1801f798c50cc93 Mon Sep 17 00:00:00 2001 From: Lee *!* Clagett Date: Mon, 17 Mar 2025 19:19:20 -0400 Subject: [PATCH] Remove hidden transaction copy in add_block --- src/blockchain_db/blockchain_db.cpp | 13 ++++++------- src/blockchain_db/blockchain_db.h | 6 ++++-- src/blockchain_db/lmdb/db_lmdb.cpp | 10 ++++------ src/blockchain_db/lmdb/db_lmdb.h | 2 +- src/blockchain_db/testdb.h | 2 +- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/blockchain_db/blockchain_db.cpp b/src/blockchain_db/blockchain_db.cpp index 894eb15c7c..b290f81f32 100644 --- a/src/blockchain_db/blockchain_db.cpp +++ b/src/blockchain_db/blockchain_db.cpp @@ -179,10 +179,8 @@ void BlockchainDB::pop_block() pop_block(blk, txs); } -void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const std::pair& txp, const crypto::hash* tx_hash_ptr, const crypto::hash* tx_prunable_hash_ptr) +void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const transaction& tx, const epee::span blob, const crypto::hash* tx_hash_ptr, const crypto::hash* tx_prunable_hash_ptr) { - const transaction &tx = txp.first; - bool miner_tx = false; crypto::hash tx_hash, tx_prunable_hash; if (!tx_hash_ptr) @@ -197,8 +195,9 @@ void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const std::pair } if (tx.version >= 2) { + const boost::string_ref ref{reinterpret_cast(blob.data()), blob.size()}; if (!tx_prunable_hash_ptr) - tx_prunable_hash = get_transaction_prunable_hash(tx, &txp.second); + tx_prunable_hash = get_transaction_prunable_hash(tx, &ref); else tx_prunable_hash = *tx_prunable_hash_ptr; } @@ -221,7 +220,7 @@ void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const std::pair } } - uint64_t tx_id = add_transaction_data(blk_hash, txp, tx_hash, tx_prunable_hash); + uint64_t tx_id = add_transaction_data(blk_hash, tx, blob, tx_hash, tx_prunable_hash); std::vector amount_output_indices(tx.vout.size()); @@ -275,7 +274,7 @@ uint64_t BlockchainDB::add_block( const std::pair& blck uint64_t num_rct_outs = 0; blobdata miner_bd = tx_to_blob(blk.miner_tx); - add_transaction(blk_hash, std::make_pair(blk.miner_tx, blobdata_ref(miner_bd))); + add_transaction(blk_hash, blk.miner_tx, epee::strspan(miner_bd)); if (blk.miner_tx.version == 2) num_rct_outs += blk.miner_tx.vout.size(); int tx_i = 0; @@ -283,7 +282,7 @@ uint64_t BlockchainDB::add_block( const std::pair& blck for (const std::pair& tx : txs) { tx_hash = blk.tx_hashes[tx_i]; - add_transaction(blk_hash, tx, &tx_hash); + add_transaction(blk_hash, tx.first, epee::strspan(tx.second), &tx_hash); for (const auto &vout: tx.first.vout) { if (vout.amount == 0) diff --git a/src/blockchain_db/blockchain_db.h b/src/blockchain_db/blockchain_db.h index 3e953da30d..5bcc63d7f5 100644 --- a/src/blockchain_db/blockchain_db.h +++ b/src/blockchain_db/blockchain_db.h @@ -436,11 +436,12 @@ private: * * @param blk_hash the hash of the block containing the transaction * @param tx the transaction to be added + * @param blob for `tx` * @param tx_hash the hash of the transaction * @param tx_prunable_hash the hash of the prunable part of the transaction * @return the transaction ID */ - virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const std::pair& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash) = 0; + virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const transaction& tx, epee::span blob, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash) = 0; /** * @brief remove data about a transaction @@ -565,10 +566,11 @@ protected: * * @param blk_hash hash of the block which has the transaction * @param tx the transaction to add + * @param blob for `tx` * @param tx_hash_ptr the hash of the transaction, if already calculated * @param tx_prunable_hash_ptr the hash of the prunable part of the transaction, if already calculated */ - void add_transaction(const crypto::hash& blk_hash, const std::pair& tx, const crypto::hash* tx_hash_ptr = NULL, const crypto::hash* tx_prunable_hash_ptr = NULL); + void add_transaction(const crypto::hash& blk_hash, const transaction& tx, epee::span blob, const crypto::hash* tx_hash_ptr = NULL, const crypto::hash* tx_prunable_hash_ptr = NULL); mutable uint64_t time_tx_exists = 0; //!< a performance metric uint64_t time_commit1 = 0; //!< a performance metric diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp index bbfcaaf193..ff44923ff3 100644 --- a/src/blockchain_db/lmdb/db_lmdb.cpp +++ b/src/blockchain_db/lmdb/db_lmdb.cpp @@ -887,7 +887,7 @@ void BlockchainLMDB::remove_block() throw1(DB_ERROR(lmdb_error("Failed to add removal of block info to db transaction: ", result).c_str())); } -uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, const std::pair& txp, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash) +uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, const transaction& tx, const epee::span blob, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash) { LOG_PRINT_L3("BlockchainLMDB::" << __func__); check_open(); @@ -913,7 +913,6 @@ uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, cons throw1(DB_ERROR(lmdb_error(std::string("Error checking if tx index exists for tx hash ") + epee::string_tools::pod_to_hex(tx_hash) + ": ", result).c_str())); } - const cryptonote::transaction &tx = txp.first; txindex ti; ti.key = tx_hash; ti.data.tx_id = tx_id; @@ -927,8 +926,6 @@ uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, cons if (result) throw0(DB_ERROR(lmdb_error("Failed to add tx data to db transaction: ", result).c_str())); - const cryptonote::blobdata_ref &blob = txp.second; - unsigned int unprunable_size = tx.unprunable_size; if (unprunable_size == 0) { @@ -5133,7 +5130,8 @@ void BlockchainLMDB::migrate_0_1() if (!parse_and_validate_block_from_blob(bd, b)) throw0(DB_ERROR("Failed to parse block from blob retrieved from the db")); - add_transaction(null_hash, std::make_pair(b.miner_tx, tx_to_blob(b.miner_tx))); + const auto miner_blob = tx_to_blob(b.miner_tx); + add_transaction(null_hash, b.miner_tx, epee::strspan(miner_blob)); for (unsigned int j = 0; j(v.mv_data), v.mv_size}; if (!parse_and_validate_tx_from_blob(bd, tx)) throw0(DB_ERROR("Failed to parse tx from blob retrieved from the db")); - add_transaction(null_hash, std::make_pair(std::move(tx), bd), &b.tx_hashes[j]); + add_transaction(null_hash, std::move(tx), epee::strspan(bd), &b.tx_hashes[j]); result = mdb_cursor_del(c_txs, 0); if (result) throw0(DB_ERROR(lmdb_error("Failed to get record from txs: ", result).c_str())); diff --git a/src/blockchain_db/lmdb/db_lmdb.h b/src/blockchain_db/lmdb/db_lmdb.h index 6eeb942dc2..3addd38381 100644 --- a/src/blockchain_db/lmdb/db_lmdb.h +++ b/src/blockchain_db/lmdb/db_lmdb.h @@ -374,7 +374,7 @@ private: virtual void remove_block(); - virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const std::pair& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash); + virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const transaction& tx, epee::span blob, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash); virtual void remove_transaction_data(const crypto::hash& tx_hash, const transaction& tx); diff --git a/src/blockchain_db/testdb.h b/src/blockchain_db/testdb.h index 308bdd4c24..3a787066e6 100644 --- a/src/blockchain_db/testdb.h +++ b/src/blockchain_db/testdb.h @@ -110,7 +110,7 @@ public: virtual std::vector> get_tx_amount_output_indices(const uint64_t tx_index, size_t n_txes) const override { return std::vector>(); } virtual bool has_key_image(const crypto::key_image& img) const override { return false; } virtual void remove_block() override { } - virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const std::pair& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash) override {return 0;} + virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const cryptonote::transaction& tx, epee::span blob, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash) override {return 0;} virtual void remove_transaction_data(const crypto::hash& tx_hash, const cryptonote::transaction& tx) override {} virtual uint64_t add_output(const crypto::hash& tx_hash, const cryptonote::tx_out& tx_output, const uint64_t& local_index, const uint64_t unlock_time, const rct::key *commitment) override {return 0;} virtual void add_tx_amount_output_indices(const uint64_t tx_index, const std::vector& amount_output_indices) override {}