diff options
author | warptangent <warptangent@tutanota.com> | 2016-01-31 05:10:14 -0800 |
---|---|---|
committer | Howard Chu <hyc@symas.com> | 2016-04-05 20:30:50 +0100 |
commit | 132c666f67937676bea1cc145c242b857f9852a2 (patch) | |
tree | 2496f5c995ba5e2b1100b8e318bd7d751f7cbf51 /src/blockchain_db/blockchain_db.cpp | |
parent | blockchain_utilities: Update documentation (diff) | |
download | monero-132c666f67937676bea1cc145c242b857f9852a2.tar.xz |
Update schema for "tx_outputs" to use array containing amount output indices
This speeds up wallet refresh by directly retrieving a tx's amount output indices.
It removes the indirection and walking the amount output duplicate list
for every amount in each requested tx.
"tx_outputs" is used by:
Amount output indices are needed for wallet refresh.
Global output indices are needed for removing a tx.
Both amount output indices and global output indices are now stored in
an array of 64-bit unsigned ints:
tx_outputs[<tx_hash>] -> [ <a1_oi, a1_gi, a2_oi, a2_gi, ...> ]
Previously it was:
tx_outputs[<tx_hash>] -> duplicate list of <a1_gi, a2_gi, a3_gi, ...>
The amount output list had to be walked for every amount in order to
find each amount's output index, by comparing the amount's global output
index with each one in the duplicate list until a match was found.
See also d045dfa7ce0bf131681193c97560da26f9f37900
Diffstat (limited to 'src/blockchain_db/blockchain_db.cpp')
-rw-r--r-- | src/blockchain_db/blockchain_db.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/blockchain_db/blockchain_db.cpp b/src/blockchain_db/blockchain_db.cpp index a66f4a403..b1b233b58 100644 --- a/src/blockchain_db/blockchain_db.cpp +++ b/src/blockchain_db/blockchain_db.cpp @@ -84,12 +84,19 @@ void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const transacti add_transaction_data(blk_hash, tx, tx_hash); + std::vector<uint64_t> amount_output_indices; + std::vector<uint64_t> global_output_indices; + // iterate tx.vout using indices instead of C++11 foreach syntax because // we need the index for (uint64_t i = 0; i < tx.vout.size(); ++i) { - add_output(tx_hash, tx.vout[i], i, tx.unlock_time); + uint64_t amount_output_index, global_output_index; + add_output(tx_hash, tx.vout[i], i, tx.unlock_time, amount_output_index, global_output_index); + amount_output_indices.push_back(amount_output_index); + global_output_indices.push_back(global_output_index); } + add_amount_and_global_output_indices(tx_hash, amount_output_indices, global_output_indices); } uint64_t BlockchainDB::add_block( const block& blk |