aboutsummaryrefslogtreecommitdiff
path: root/src/blockchain_db/blockchain_db.cpp
diff options
context:
space:
mode:
authorwarptangent <warptangent@tutanota.com>2016-01-31 05:10:14 -0800
committerHoward Chu <hyc@symas.com>2016-04-05 20:30:50 +0100
commit132c666f67937676bea1cc145c242b857f9852a2 (patch)
tree2496f5c995ba5e2b1100b8e318bd7d751f7cbf51 /src/blockchain_db/blockchain_db.cpp
parentblockchain_utilities: Update documentation (diff)
downloadmonero-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.cpp9
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