Skip to content

Commit

Permalink
Improve block and tx processing efficiency by less repeat hashing
Browse files Browse the repository at this point in the history
  BlockchainLMDB::add_block()
  BlockchainLMDB::add_transaction_data()

  BlockchainDB::add_transaction()
  • Loading branch information
warptangent committed Feb 23, 2015
1 parent 3676ac5 commit 8909d7d
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 11 deletions.
7 changes: 4 additions & 3 deletions src/cryptonote_core/BlockchainDB_impl/db_lmdb.cpp
Expand Up @@ -152,12 +152,13 @@ void BlockchainLMDB::add_block( const block& blk
, const size_t& block_size
, const difficulty_type& cumulative_difficulty
, const uint64_t& coins_generated
, const crypto::hash& blk_hash
)
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
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;
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"));
Expand Down Expand Up @@ -243,12 +244,12 @@ void BlockchainLMDB::remove_block()
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__);
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;
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"));
Expand Down
3 changes: 2 additions & 1 deletion src/cryptonote_core/BlockchainDB_impl/db_lmdb.h
Expand Up @@ -184,11 +184,12 @@ class BlockchainLMDB : public BlockchainDB
, const size_t& block_size
, const difficulty_type& cumulative_difficulty
, const uint64_t& coins_generated
, const crypto::hash& block_hash
);

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);

Expand Down
24 changes: 19 additions & 5 deletions src/cryptonote_core/blockchain_db.cpp
Expand Up @@ -42,11 +42,21 @@ void BlockchainDB::pop_block()
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
// we need the index
Expand Down Expand Up @@ -81,17 +91,21 @@ uint64_t BlockchainDB::add_block( const block& blk

// call out to subclass implementation to add the block & metadata
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_add_block1 += time1;

// call out to add the transactions

time1 = epee::misc_utils::get_tick_count();
add_transaction(blk_hash, blk.miner_tx);
int tx_i = 0;
crypto::hash tx_hash = null_hash;
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_add_transaction += time1;
Expand Down
5 changes: 3 additions & 2 deletions src/cryptonote_core/blockchain_db.h
Expand Up @@ -265,13 +265,14 @@ class BlockchainDB
, const size_t& block_size
, const difficulty_type& cumulative_difficulty
, const uint64_t& coins_generated
, const crypto::hash& blk_hash
) = 0;

// tells the subclass to remove data about the top block
virtual void remove_block() = 0;

// 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
virtual void remove_transaction_data(const crypto::hash& tx_hash, const transaction& tx) = 0;
Expand All @@ -296,7 +297,7 @@ class BlockchainDB
void pop_block();

// 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
void remove_transaction(const crypto::hash& tx_hash);
Expand Down

0 comments on commit 8909d7d

Please sign in to comment.