Improve block and tx processing efficiency by less repeat hashing
BlockchainLMDB::add_block() BlockchainLMDB::add_transaction_data() BlockchainDB::add_transaction()
This commit is contained in:
parent
3676ac5841
commit
8909d7d82e
|
@ -152,12 +152,13 @@ void BlockchainLMDB::add_block( const block& blk
|
||||||
, const size_t& block_size
|
, const size_t& block_size
|
||||||
, const difficulty_type& cumulative_difficulty
|
, const difficulty_type& cumulative_difficulty
|
||||||
, const uint64_t& coins_generated
|
, const uint64_t& coins_generated
|
||||||
|
, const crypto::hash& blk_hash
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
||||||
check_open();
|
check_open();
|
||||||
|
|
||||||
MDB_val_copy<crypto::hash> val_h(get_block_hash(blk));
|
MDB_val_copy<crypto::hash> val_h(blk_hash);
|
||||||
MDB_val unused;
|
MDB_val unused;
|
||||||
if (mdb_get(*m_write_txn, m_block_heights, &val_h, &unused) == 0)
|
if (mdb_get(*m_write_txn, m_block_heights, &val_h, &unused) == 0)
|
||||||
throw1(BLOCK_EXISTS("Attempting to add block that's already in the db"));
|
throw1(BLOCK_EXISTS("Attempting to add block that's already in the db"));
|
||||||
|
@ -243,12 +244,12 @@ void BlockchainLMDB::remove_block()
|
||||||
throw1(DB_ERROR("Failed to add removal of block hash to db transaction"));
|
throw1(DB_ERROR("Failed to add removal of block hash to db transaction"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, const transaction& tx)
|
void BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, const transaction& tx, const crypto::hash& tx_hash)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
||||||
check_open();
|
check_open();
|
||||||
|
|
||||||
MDB_val_copy<crypto::hash> val_h(get_transaction_hash(tx));
|
MDB_val_copy<crypto::hash> val_h(tx_hash);
|
||||||
MDB_val unused;
|
MDB_val unused;
|
||||||
if (mdb_get(*m_write_txn, m_txs, &val_h, &unused) == 0)
|
if (mdb_get(*m_write_txn, m_txs, &val_h, &unused) == 0)
|
||||||
throw1(TX_EXISTS("Attempting to add transaction that's already in the db"));
|
throw1(TX_EXISTS("Attempting to add transaction that's already in the db"));
|
||||||
|
|
|
@ -184,11 +184,12 @@ private:
|
||||||
, const size_t& block_size
|
, const size_t& block_size
|
||||||
, const difficulty_type& cumulative_difficulty
|
, const difficulty_type& cumulative_difficulty
|
||||||
, const uint64_t& coins_generated
|
, const uint64_t& coins_generated
|
||||||
|
, const crypto::hash& block_hash
|
||||||
);
|
);
|
||||||
|
|
||||||
virtual void remove_block();
|
virtual void remove_block();
|
||||||
|
|
||||||
virtual void add_transaction_data(const crypto::hash& blk_hash, const transaction& tx);
|
virtual void add_transaction_data(const crypto::hash& blk_hash, const transaction& tx, const crypto::hash& tx_hash);
|
||||||
|
|
||||||
virtual void remove_transaction_data(const crypto::hash& tx_hash, const transaction& tx);
|
virtual void remove_transaction_data(const crypto::hash& tx_hash, const transaction& tx);
|
||||||
|
|
||||||
|
|
|
@ -42,11 +42,21 @@ void BlockchainDB::pop_block()
|
||||||
pop_block(blk, txs);
|
pop_block(blk, txs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const transaction& tx)
|
void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const transaction& tx, const crypto::hash* tx_hash_ptr)
|
||||||
{
|
{
|
||||||
crypto::hash tx_hash = get_transaction_hash(tx);
|
crypto::hash tx_hash;
|
||||||
|
if (!tx_hash_ptr)
|
||||||
|
{
|
||||||
|
// should only need to compute hash for miner transactions
|
||||||
|
tx_hash = get_transaction_hash(tx);
|
||||||
|
LOG_PRINT_L3("null tx_hash_ptr - needed to compute: " << tx_hash);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tx_hash = *tx_hash_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
add_transaction_data(blk_hash, tx);
|
add_transaction_data(blk_hash, tx, tx_hash);
|
||||||
|
|
||||||
// iterate tx.vout using indices instead of C++11 foreach syntax because
|
// iterate tx.vout using indices instead of C++11 foreach syntax because
|
||||||
// we need the index
|
// we need the index
|
||||||
|
@ -81,7 +91,7 @@ uint64_t BlockchainDB::add_block( const block& blk
|
||||||
|
|
||||||
// call out to subclass implementation to add the block & metadata
|
// call out to subclass implementation to add the block & metadata
|
||||||
time1 = epee::misc_utils::get_tick_count();
|
time1 = epee::misc_utils::get_tick_count();
|
||||||
add_block(blk, block_size, cumulative_difficulty, coins_generated);
|
add_block(blk, block_size, cumulative_difficulty, coins_generated, blk_hash);
|
||||||
TIME_MEASURE_FINISH(time1);
|
TIME_MEASURE_FINISH(time1);
|
||||||
time_add_block1 += time1;
|
time_add_block1 += time1;
|
||||||
|
|
||||||
|
@ -89,9 +99,13 @@ uint64_t BlockchainDB::add_block( const block& blk
|
||||||
|
|
||||||
time1 = epee::misc_utils::get_tick_count();
|
time1 = epee::misc_utils::get_tick_count();
|
||||||
add_transaction(blk_hash, blk.miner_tx);
|
add_transaction(blk_hash, blk.miner_tx);
|
||||||
|
int tx_i = 0;
|
||||||
|
crypto::hash tx_hash = null_hash;
|
||||||
for (const transaction& tx : txs)
|
for (const transaction& tx : txs)
|
||||||
{
|
{
|
||||||
add_transaction(blk_hash, tx);
|
tx_hash = blk.tx_hashes[tx_i];
|
||||||
|
add_transaction(blk_hash, tx, &tx_hash);
|
||||||
|
++tx_i;
|
||||||
}
|
}
|
||||||
TIME_MEASURE_FINISH(time1);
|
TIME_MEASURE_FINISH(time1);
|
||||||
time_add_transaction += time1;
|
time_add_transaction += time1;
|
||||||
|
|
|
@ -265,13 +265,14 @@ private:
|
||||||
, const size_t& block_size
|
, const size_t& block_size
|
||||||
, const difficulty_type& cumulative_difficulty
|
, const difficulty_type& cumulative_difficulty
|
||||||
, const uint64_t& coins_generated
|
, const uint64_t& coins_generated
|
||||||
|
, const crypto::hash& blk_hash
|
||||||
) = 0;
|
) = 0;
|
||||||
|
|
||||||
// tells the subclass to remove data about the top block
|
// tells the subclass to remove data about the top block
|
||||||
virtual void remove_block() = 0;
|
virtual void remove_block() = 0;
|
||||||
|
|
||||||
// tells the subclass to store the transaction and its metadata
|
// tells the subclass to store the transaction and its metadata
|
||||||
virtual void add_transaction_data(const crypto::hash& blk_hash, const transaction& tx) = 0;
|
virtual void add_transaction_data(const crypto::hash& blk_hash, const transaction& tx, const crypto::hash& tx_hash) = 0;
|
||||||
|
|
||||||
// tells the subclass to remove data about a transaction
|
// tells the subclass to remove data about a transaction
|
||||||
virtual void remove_transaction_data(const crypto::hash& tx_hash, const transaction& tx) = 0;
|
virtual void remove_transaction_data(const crypto::hash& tx_hash, const transaction& tx) = 0;
|
||||||
|
@ -296,7 +297,7 @@ private:
|
||||||
void pop_block();
|
void pop_block();
|
||||||
|
|
||||||
// helper function for add_transactions, to add each individual tx
|
// helper function for add_transactions, to add each individual tx
|
||||||
void add_transaction(const crypto::hash& blk_hash, const transaction& tx);
|
void add_transaction(const crypto::hash& blk_hash, const transaction& tx, const crypto::hash* tx_hash_ptr = NULL);
|
||||||
|
|
||||||
// helper function to remove transaction from blockchain
|
// helper function to remove transaction from blockchain
|
||||||
void remove_transaction(const crypto::hash& tx_hash);
|
void remove_transaction(const crypto::hash& tx_hash);
|
||||||
|
|
Loading…
Reference in New Issue