mirror of
https://codeberg.org/anoncontributorxmr/monero.git
synced 2024-11-23 11:23:26 +01:00
Avoid repeated (de)serialization when syncing
This commit is contained in:
parent
b747e836c8
commit
b044d03a51
@ -121,8 +121,10 @@ void BlockchainDB::pop_block()
|
|||||||
pop_block(blk, txs);
|
pop_block(blk, txs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const transaction& tx, const crypto::hash* tx_hash_ptr, const crypto::hash* tx_prunable_hash_ptr)
|
void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const std::pair<transaction, blobdata>& txp, const crypto::hash* tx_hash_ptr, const crypto::hash* tx_prunable_hash_ptr)
|
||||||
{
|
{
|
||||||
|
const transaction &tx = txp.first;
|
||||||
|
|
||||||
bool miner_tx = false;
|
bool miner_tx = false;
|
||||||
crypto::hash tx_hash, tx_prunable_hash;
|
crypto::hash tx_hash, tx_prunable_hash;
|
||||||
if (!tx_hash_ptr)
|
if (!tx_hash_ptr)
|
||||||
@ -138,7 +140,7 @@ void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const transacti
|
|||||||
if (tx.version >= 2)
|
if (tx.version >= 2)
|
||||||
{
|
{
|
||||||
if (!tx_prunable_hash_ptr)
|
if (!tx_prunable_hash_ptr)
|
||||||
tx_prunable_hash = get_transaction_prunable_hash(tx);
|
tx_prunable_hash = get_transaction_prunable_hash(tx, &txp.second);
|
||||||
else
|
else
|
||||||
tx_prunable_hash = *tx_prunable_hash_ptr;
|
tx_prunable_hash = *tx_prunable_hash_ptr;
|
||||||
}
|
}
|
||||||
@ -168,7 +170,7 @@ void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const transacti
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t tx_id = add_transaction_data(blk_hash, tx, tx_hash, tx_prunable_hash);
|
uint64_t tx_id = add_transaction_data(blk_hash, txp, tx_hash, tx_prunable_hash);
|
||||||
|
|
||||||
std::vector<uint64_t> amount_output_indices(tx.vout.size());
|
std::vector<uint64_t> amount_output_indices(tx.vout.size());
|
||||||
|
|
||||||
@ -195,14 +197,16 @@ void BlockchainDB::add_transaction(const crypto::hash& blk_hash, const transacti
|
|||||||
add_tx_amount_output_indices(tx_id, amount_output_indices);
|
add_tx_amount_output_indices(tx_id, amount_output_indices);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t BlockchainDB::add_block( const block& blk
|
uint64_t BlockchainDB::add_block( const std::pair<block, blobdata>& blck
|
||||||
, size_t block_weight
|
, size_t block_weight
|
||||||
, uint64_t long_term_block_weight
|
, uint64_t long_term_block_weight
|
||||||
, const difficulty_type& cumulative_difficulty
|
, const difficulty_type& cumulative_difficulty
|
||||||
, const uint64_t& coins_generated
|
, const uint64_t& coins_generated
|
||||||
, const std::vector<transaction>& txs
|
, const std::vector<std::pair<transaction, blobdata>>& txs
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
const block &blk = blck.first;
|
||||||
|
|
||||||
// sanity
|
// sanity
|
||||||
if (blk.tx_hashes.size() != txs.size())
|
if (blk.tx_hashes.size() != txs.size())
|
||||||
throw std::runtime_error("Inconsistent tx/hashes sizes");
|
throw std::runtime_error("Inconsistent tx/hashes sizes");
|
||||||
@ -221,16 +225,16 @@ uint64_t BlockchainDB::add_block( const block& blk
|
|||||||
time1 = epee::misc_utils::get_tick_count();
|
time1 = epee::misc_utils::get_tick_count();
|
||||||
|
|
||||||
uint64_t num_rct_outs = 0;
|
uint64_t num_rct_outs = 0;
|
||||||
add_transaction(blk_hash, blk.miner_tx);
|
add_transaction(blk_hash, std::make_pair(blk.miner_tx, tx_to_blob(blk.miner_tx)));
|
||||||
if (blk.miner_tx.version == 2)
|
if (blk.miner_tx.version == 2)
|
||||||
num_rct_outs += blk.miner_tx.vout.size();
|
num_rct_outs += blk.miner_tx.vout.size();
|
||||||
int tx_i = 0;
|
int tx_i = 0;
|
||||||
crypto::hash tx_hash = crypto::null_hash;
|
crypto::hash tx_hash = crypto::null_hash;
|
||||||
for (const transaction& tx : txs)
|
for (const std::pair<transaction, blobdata>& tx : txs)
|
||||||
{
|
{
|
||||||
tx_hash = blk.tx_hashes[tx_i];
|
tx_hash = blk.tx_hashes[tx_i];
|
||||||
add_transaction(blk_hash, tx, &tx_hash);
|
add_transaction(blk_hash, tx, &tx_hash);
|
||||||
for (const auto &vout: tx.vout)
|
for (const auto &vout: tx.first.vout)
|
||||||
{
|
{
|
||||||
if (vout.amount == 0)
|
if (vout.amount == 0)
|
||||||
++num_rct_outs;
|
++num_rct_outs;
|
||||||
|
@ -404,7 +404,7 @@ private:
|
|||||||
* @param tx_prunable_hash the hash of the prunable part of the transaction
|
* @param tx_prunable_hash the hash of the prunable part of the transaction
|
||||||
* @return the transaction ID
|
* @return the transaction ID
|
||||||
*/
|
*/
|
||||||
virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const transaction& 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 std::pair<transaction, blobdata>& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief remove data about a transaction
|
* @brief remove data about a transaction
|
||||||
@ -532,7 +532,7 @@ protected:
|
|||||||
* @param tx_hash_ptr the hash of the transaction, if already calculated
|
* @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
|
* @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 transaction& 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 std::pair<transaction, blobdata>& tx, 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
|
mutable uint64_t time_tx_exists = 0; //!< a performance metric
|
||||||
uint64_t time_commit1 = 0; //!< a performance metric
|
uint64_t time_commit1 = 0; //!< a performance metric
|
||||||
@ -798,12 +798,12 @@ public:
|
|||||||
*
|
*
|
||||||
* @return the height of the chain post-addition
|
* @return the height of the chain post-addition
|
||||||
*/
|
*/
|
||||||
virtual uint64_t add_block( const block& blk
|
virtual uint64_t add_block( const std::pair<block, blobdata>& blk
|
||||||
, size_t block_weight
|
, size_t block_weight
|
||||||
, uint64_t long_term_block_weight
|
, uint64_t long_term_block_weight
|
||||||
, const difficulty_type& cumulative_difficulty
|
, const difficulty_type& cumulative_difficulty
|
||||||
, const uint64_t& coins_generated
|
, const uint64_t& coins_generated
|
||||||
, const std::vector<transaction>& txs
|
, const std::vector<std::pair<transaction, blobdata>>& txs
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -823,7 +823,7 @@ void BlockchainLMDB::remove_block()
|
|||||||
throw1(DB_ERROR(lmdb_error("Failed to add removal of block info to db transaction: ", result).c_str()));
|
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 transaction& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash)
|
uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, const std::pair<transaction, blobdata>& txp, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
||||||
check_open();
|
check_open();
|
||||||
@ -849,6 +849,7 @@ 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()));
|
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;
|
txindex ti;
|
||||||
ti.key = tx_hash;
|
ti.key = tx_hash;
|
||||||
ti.data.tx_id = tx_id;
|
ti.data.tx_id = tx_id;
|
||||||
@ -862,7 +863,7 @@ uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, cons
|
|||||||
if (result)
|
if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to add tx data to db transaction: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to add tx data to db transaction: ", result).c_str()));
|
||||||
|
|
||||||
cryptonote::blobdata blob = tx_to_blob(tx);
|
const cryptonote::blobdata &blob = txp.second;
|
||||||
MDB_val_sized(blobval, blob);
|
MDB_val_sized(blobval, blob);
|
||||||
|
|
||||||
unsigned int unprunable_size = tx.unprunable_size;
|
unsigned int unprunable_size = tx.unprunable_size;
|
||||||
@ -3568,8 +3569,8 @@ void BlockchainLMDB::block_txn_abort()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t BlockchainLMDB::add_block(const block& blk, size_t block_weight, uint64_t long_term_block_weight, const difficulty_type& cumulative_difficulty, const uint64_t& coins_generated,
|
uint64_t BlockchainLMDB::add_block(const std::pair<block, blobdata>& blk, size_t block_weight, uint64_t long_term_block_weight, const difficulty_type& cumulative_difficulty, const uint64_t& coins_generated,
|
||||||
const std::vector<transaction>& txs)
|
const std::vector<std::pair<transaction, blobdata>>& txs)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
||||||
check_open();
|
check_open();
|
||||||
@ -4488,7 +4489,7 @@ void BlockchainLMDB::migrate_0_1()
|
|||||||
if (!parse_and_validate_block_from_blob(bd, b))
|
if (!parse_and_validate_block_from_blob(bd, b))
|
||||||
throw0(DB_ERROR("Failed to parse block from blob retrieved from the db"));
|
throw0(DB_ERROR("Failed to parse block from blob retrieved from the db"));
|
||||||
|
|
||||||
add_transaction(null_hash, b.miner_tx);
|
add_transaction(null_hash, std::make_pair(b.miner_tx, tx_to_blob(b.miner_tx)));
|
||||||
for (unsigned int j = 0; j<b.tx_hashes.size(); j++) {
|
for (unsigned int j = 0; j<b.tx_hashes.size(); j++) {
|
||||||
transaction tx;
|
transaction tx;
|
||||||
hk.mv_data = &b.tx_hashes[j];
|
hk.mv_data = &b.tx_hashes[j];
|
||||||
@ -4498,7 +4499,7 @@ void BlockchainLMDB::migrate_0_1()
|
|||||||
bd.assign(reinterpret_cast<char*>(v.mv_data), v.mv_size);
|
bd.assign(reinterpret_cast<char*>(v.mv_data), v.mv_size);
|
||||||
if (!parse_and_validate_tx_from_blob(bd, tx))
|
if (!parse_and_validate_tx_from_blob(bd, tx))
|
||||||
throw0(DB_ERROR("Failed to parse tx from blob retrieved from the db"));
|
throw0(DB_ERROR("Failed to parse tx from blob retrieved from the db"));
|
||||||
add_transaction(null_hash, tx, &b.tx_hashes[j]);
|
add_transaction(null_hash, std::make_pair(std::move(tx), bd), &b.tx_hashes[j]);
|
||||||
result = mdb_cursor_del(c_txs, 0);
|
result = mdb_cursor_del(c_txs, 0);
|
||||||
if (result)
|
if (result)
|
||||||
throw0(DB_ERROR(lmdb_error("Failed to get record from txs: ", result).c_str()));
|
throw0(DB_ERROR(lmdb_error("Failed to get record from txs: ", result).c_str()));
|
||||||
|
@ -292,12 +292,12 @@ public:
|
|||||||
virtual bool for_all_outputs(std::function<bool(uint64_t amount, const crypto::hash &tx_hash, uint64_t height, size_t tx_idx)> f) const;
|
virtual bool for_all_outputs(std::function<bool(uint64_t amount, const crypto::hash &tx_hash, uint64_t height, size_t tx_idx)> f) const;
|
||||||
virtual bool for_all_outputs(uint64_t amount, const std::function<bool(uint64_t height)> &f) const;
|
virtual bool for_all_outputs(uint64_t amount, const std::function<bool(uint64_t height)> &f) const;
|
||||||
|
|
||||||
virtual uint64_t add_block( const block& blk
|
virtual uint64_t add_block( const std::pair<block, blobdata>& blk
|
||||||
, size_t block_weight
|
, size_t block_weight
|
||||||
, uint64_t long_term_block_weight
|
, uint64_t long_term_block_weight
|
||||||
, const difficulty_type& cumulative_difficulty
|
, const difficulty_type& cumulative_difficulty
|
||||||
, const uint64_t& coins_generated
|
, const uint64_t& coins_generated
|
||||||
, const std::vector<transaction>& txs
|
, const std::vector<std::pair<transaction, blobdata>>& txs
|
||||||
);
|
);
|
||||||
|
|
||||||
virtual void set_batch_transactions(bool batch_transactions);
|
virtual void set_batch_transactions(bool batch_transactions);
|
||||||
@ -353,7 +353,7 @@ private:
|
|||||||
|
|
||||||
virtual void remove_block();
|
virtual void remove_block();
|
||||||
|
|
||||||
virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const transaction& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash);
|
virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const std::pair<transaction, blobdata>& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_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);
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ public:
|
|||||||
virtual std::vector<std::vector<uint64_t>> get_tx_amount_output_indices(const uint64_t tx_index, size_t n_txes) const { return std::vector<std::vector<uint64_t>>(); }
|
virtual std::vector<std::vector<uint64_t>> get_tx_amount_output_indices(const uint64_t tx_index, size_t n_txes) const { return std::vector<std::vector<uint64_t>>(); }
|
||||||
virtual bool has_key_image(const crypto::key_image& img) const { return false; }
|
virtual bool has_key_image(const crypto::key_image& img) const { return false; }
|
||||||
virtual void remove_block() { }
|
virtual void remove_block() { }
|
||||||
virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const cryptonote::transaction& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash) {return 0;}
|
virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const std::pair<cryptonote::transaction, cryptonote::blobdata>& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash) {return 0;}
|
||||||
virtual void remove_transaction_data(const crypto::hash& tx_hash, const cryptonote::transaction& tx) {}
|
virtual void remove_transaction_data(const crypto::hash& tx_hash, const cryptonote::transaction& tx) {}
|
||||||
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) {return 0;}
|
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) {return 0;}
|
||||||
virtual void add_tx_amount_output_indices(const uint64_t tx_index, const std::vector<uint64_t>& amount_output_indices) {}
|
virtual void add_tx_amount_output_indices(const uint64_t tx_index, const std::vector<uint64_t>& amount_output_indices) {}
|
||||||
|
@ -455,7 +455,7 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::vector<transaction> txs;
|
std::vector<std::pair<transaction, blobdata>> txs;
|
||||||
std::vector<transaction> archived_txs;
|
std::vector<transaction> archived_txs;
|
||||||
|
|
||||||
archived_txs = bp.txs;
|
archived_txs = bp.txs;
|
||||||
@ -472,7 +472,7 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
|
|||||||
// because add_block() calls
|
// because add_block() calls
|
||||||
// add_transaction(blk_hash, blk.miner_tx) first, and
|
// add_transaction(blk_hash, blk.miner_tx) first, and
|
||||||
// then a for loop for the transactions in txs.
|
// then a for loop for the transactions in txs.
|
||||||
txs.push_back(tx);
|
txs.push_back(std::make_pair(tx, tx_to_blob(tx)));
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t block_weight;
|
size_t block_weight;
|
||||||
@ -486,7 +486,7 @@ int import_from_file(cryptonote::core& core, const std::string& import_file_path
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
uint64_t long_term_block_weight = core.get_blockchain_storage().get_next_long_term_block_weight(block_weight);
|
uint64_t long_term_block_weight = core.get_blockchain_storage().get_next_long_term_block_weight(block_weight);
|
||||||
core.get_blockchain_storage().get_db().add_block(b, block_weight, long_term_block_weight, cumulative_difficulty, coins_generated, txs);
|
core.get_blockchain_storage().get_db().add_block(std::make_pair(b, block_to_blob(b)), block_weight, long_term_block_weight, cumulative_difficulty, coins_generated, txs);
|
||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
|
@ -3345,7 +3345,7 @@ bool Blockchain::check_block_timestamp(const block& b, uint64_t& median_ts) cons
|
|||||||
return check_block_timestamp(timestamps, b, median_ts);
|
return check_block_timestamp(timestamps, b, median_ts);
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
void Blockchain::return_tx_to_pool(std::vector<transaction> &txs)
|
void Blockchain::return_tx_to_pool(std::vector<std::pair<transaction, blobdata>> &txs)
|
||||||
{
|
{
|
||||||
uint8_t version = get_current_hard_fork_version();
|
uint8_t version = get_current_hard_fork_version();
|
||||||
for (auto& tx : txs)
|
for (auto& tx : txs)
|
||||||
@ -3356,9 +3356,11 @@ void Blockchain::return_tx_to_pool(std::vector<transaction> &txs)
|
|||||||
// that might not be always true. Unlikely though, and always relaying
|
// that might not be always true. Unlikely though, and always relaying
|
||||||
// these again might cause a spike of traffic as many nodes re-relay
|
// these again might cause a spike of traffic as many nodes re-relay
|
||||||
// all the transactions in a popped block when a reorg happens.
|
// all the transactions in a popped block when a reorg happens.
|
||||||
if (!m_tx_pool.add_tx(tx, tvc, true, true, false, version))
|
const size_t weight = get_transaction_weight(tx.first, tx.second.size());
|
||||||
|
const crypto::hash tx_hash = get_transaction_hash(tx.first);
|
||||||
|
if (!m_tx_pool.add_tx(tx.first, tx_hash, tx.second, weight, tvc, true, true, false, version))
|
||||||
{
|
{
|
||||||
MERROR("Failed to return taken transaction with hash: " << get_transaction_hash(tx) << " to tx_pool");
|
MERROR("Failed to return taken transaction with hash: " << get_transaction_hash(tx.first) << " to tx_pool");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3371,11 +3373,12 @@ bool Blockchain::flush_txes_from_pool(const std::vector<crypto::hash> &txids)
|
|||||||
for (const auto &txid: txids)
|
for (const auto &txid: txids)
|
||||||
{
|
{
|
||||||
cryptonote::transaction tx;
|
cryptonote::transaction tx;
|
||||||
|
cryptonote::blobdata txblob;
|
||||||
size_t tx_weight;
|
size_t tx_weight;
|
||||||
uint64_t fee;
|
uint64_t fee;
|
||||||
bool relayed, do_not_relay, double_spend_seen;
|
bool relayed, do_not_relay, double_spend_seen;
|
||||||
MINFO("Removing txid " << txid << " from the pool");
|
MINFO("Removing txid " << txid << " from the pool");
|
||||||
if(m_tx_pool.have_tx(txid) && !m_tx_pool.take_tx(txid, tx, tx_weight, fee, relayed, do_not_relay, double_spend_seen))
|
if(m_tx_pool.have_tx(txid) && !m_tx_pool.take_tx(txid, tx, txblob, tx_weight, fee, relayed, do_not_relay, double_spend_seen))
|
||||||
{
|
{
|
||||||
MERROR("Failed to remove txid " << txid << " from the pool");
|
MERROR("Failed to remove txid " << txid << " from the pool");
|
||||||
res = false;
|
res = false;
|
||||||
@ -3538,7 +3541,7 @@ leave:
|
|||||||
size_t coinbase_weight = get_transaction_weight(bl.miner_tx);
|
size_t coinbase_weight = get_transaction_weight(bl.miner_tx);
|
||||||
size_t cumulative_block_weight = coinbase_weight;
|
size_t cumulative_block_weight = coinbase_weight;
|
||||||
|
|
||||||
std::vector<transaction> txs;
|
std::vector<std::pair<transaction, blobdata>> txs;
|
||||||
key_images_container keys;
|
key_images_container keys;
|
||||||
|
|
||||||
uint64_t fee_summary = 0;
|
uint64_t fee_summary = 0;
|
||||||
@ -3558,6 +3561,7 @@ leave:
|
|||||||
for (const crypto::hash& tx_id : bl.tx_hashes)
|
for (const crypto::hash& tx_id : bl.tx_hashes)
|
||||||
{
|
{
|
||||||
transaction tx;
|
transaction tx;
|
||||||
|
blobdata txblob;
|
||||||
size_t tx_weight = 0;
|
size_t tx_weight = 0;
|
||||||
uint64_t fee = 0;
|
uint64_t fee = 0;
|
||||||
bool relayed = false, do_not_relay = false, double_spend_seen = false;
|
bool relayed = false, do_not_relay = false, double_spend_seen = false;
|
||||||
@ -3577,7 +3581,7 @@ leave:
|
|||||||
TIME_MEASURE_START(bb);
|
TIME_MEASURE_START(bb);
|
||||||
|
|
||||||
// get transaction with hash <tx_id> from tx_pool
|
// get transaction with hash <tx_id> from tx_pool
|
||||||
if(!m_tx_pool.take_tx(tx_id, tx, tx_weight, fee, relayed, do_not_relay, double_spend_seen))
|
if(!m_tx_pool.take_tx(tx_id, tx, txblob, tx_weight, fee, relayed, do_not_relay, double_spend_seen))
|
||||||
{
|
{
|
||||||
MERROR_VER("Block with id: " << id << " has at least one unknown transaction with id: " << tx_id);
|
MERROR_VER("Block with id: " << id << " has at least one unknown transaction with id: " << tx_id);
|
||||||
bvc.m_verifivation_failed = true;
|
bvc.m_verifivation_failed = true;
|
||||||
@ -3590,7 +3594,7 @@ leave:
|
|||||||
// add the transaction to the temp list of transactions, so we can either
|
// add the transaction to the temp list of transactions, so we can either
|
||||||
// store the list of transactions all at once or return the ones we've
|
// store the list of transactions all at once or return the ones we've
|
||||||
// taken from the tx_pool back to it if the block fails verification.
|
// taken from the tx_pool back to it if the block fails verification.
|
||||||
txs.push_back(tx);
|
txs.push_back(std::make_pair(tx, std::move(txblob)));
|
||||||
TIME_MEASURE_START(dd);
|
TIME_MEASURE_START(dd);
|
||||||
|
|
||||||
// FIXME: the storage should not be responsible for validation.
|
// FIXME: the storage should not be responsible for validation.
|
||||||
@ -3691,7 +3695,7 @@ leave:
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
uint64_t long_term_block_weight = get_next_long_term_block_weight(block_weight);
|
uint64_t long_term_block_weight = get_next_long_term_block_weight(block_weight);
|
||||||
new_height = m_db->add_block(bl, block_weight, long_term_block_weight, cumulative_difficulty, already_generated_coins, txs);
|
new_height = m_db->add_block(std::make_pair(bl, block_to_blob(bl)), block_weight, long_term_block_weight, cumulative_difficulty, already_generated_coins, txs);
|
||||||
}
|
}
|
||||||
catch (const KEY_IMAGE_EXISTS& e)
|
catch (const KEY_IMAGE_EXISTS& e)
|
||||||
{
|
{
|
||||||
@ -4770,10 +4774,11 @@ void Blockchain::load_compiled_in_block_hashes(const GetCheckpointsCallback& get
|
|||||||
uint64_t fee;
|
uint64_t fee;
|
||||||
bool relayed, do_not_relay, double_spend_seen;
|
bool relayed, do_not_relay, double_spend_seen;
|
||||||
transaction pool_tx;
|
transaction pool_tx;
|
||||||
|
blobdata txblob;
|
||||||
for(const transaction &tx : txs)
|
for(const transaction &tx : txs)
|
||||||
{
|
{
|
||||||
crypto::hash tx_hash = get_transaction_hash(tx);
|
crypto::hash tx_hash = get_transaction_hash(tx);
|
||||||
m_tx_pool.take_tx(tx_hash, pool_tx, tx_weight, fee, relayed, do_not_relay, double_spend_seen);
|
m_tx_pool.take_tx(tx_hash, pool_tx, txblob, tx_weight, fee, relayed, do_not_relay, double_spend_seen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1396,7 +1396,7 @@ namespace cryptonote
|
|||||||
* @return true
|
* @return true
|
||||||
*/
|
*/
|
||||||
bool update_next_cumulative_weight_limit(uint64_t *long_term_effective_median_block_weight = NULL);
|
bool update_next_cumulative_weight_limit(uint64_t *long_term_effective_median_block_weight = NULL);
|
||||||
void return_tx_to_pool(std::vector<transaction> &txs);
|
void return_tx_to_pool(std::vector<std::pair<transaction, blobdata>> &txs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief make sure a transaction isn't attempting a double-spend
|
* @brief make sure a transaction isn't attempting a double-spend
|
||||||
|
@ -453,7 +453,7 @@ namespace cryptonote
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
bool tx_memory_pool::take_tx(const crypto::hash &id, transaction &tx, size_t& tx_weight, uint64_t& fee, bool &relayed, bool &do_not_relay, bool &double_spend_seen)
|
bool tx_memory_pool::take_tx(const crypto::hash &id, transaction &tx, cryptonote::blobdata &txblob, size_t& tx_weight, uint64_t& fee, bool &relayed, bool &do_not_relay, bool &double_spend_seen)
|
||||||
{
|
{
|
||||||
CRITICAL_REGION_LOCAL(m_transactions_lock);
|
CRITICAL_REGION_LOCAL(m_transactions_lock);
|
||||||
CRITICAL_REGION_LOCAL1(m_blockchain);
|
CRITICAL_REGION_LOCAL1(m_blockchain);
|
||||||
@ -469,7 +469,7 @@ namespace cryptonote
|
|||||||
MERROR("Failed to find tx in txpool");
|
MERROR("Failed to find tx in txpool");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
cryptonote::blobdata txblob = m_blockchain.get_txpool_tx_blob(id);
|
txblob = m_blockchain.get_txpool_tx_blob(id);
|
||||||
auto ci = m_parsed_tx_cache.find(id);
|
auto ci = m_parsed_tx_cache.find(id);
|
||||||
if (ci != m_parsed_tx_cache.end())
|
if (ci != m_parsed_tx_cache.end())
|
||||||
{
|
{
|
||||||
|
@ -133,6 +133,7 @@ namespace cryptonote
|
|||||||
*
|
*
|
||||||
* @param id the hash of the transaction
|
* @param id the hash of the transaction
|
||||||
* @param tx return-by-reference the transaction taken
|
* @param tx return-by-reference the transaction taken
|
||||||
|
* @param txblob return-by-reference the transaction as a blob
|
||||||
* @param tx_weight return-by-reference the transaction's weight
|
* @param tx_weight return-by-reference the transaction's weight
|
||||||
* @param fee the transaction fee
|
* @param fee the transaction fee
|
||||||
* @param relayed return-by-reference was transaction relayed to us by the network?
|
* @param relayed return-by-reference was transaction relayed to us by the network?
|
||||||
@ -141,7 +142,7 @@ namespace cryptonote
|
|||||||
*
|
*
|
||||||
* @return true unless the transaction cannot be found in the pool
|
* @return true unless the transaction cannot be found in the pool
|
||||||
*/
|
*/
|
||||||
bool take_tx(const crypto::hash &id, transaction &tx, size_t& tx_weight, uint64_t& fee, bool &relayed, bool &do_not_relay, bool &double_spend_seen);
|
bool take_tx(const crypto::hash &id, transaction &tx, cryptonote::blobdata &txblob, size_t& tx_weight, uint64_t& fee, bool &relayed, bool &do_not_relay, bool &double_spend_seen);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief checks if the pool has a transaction with the given hash
|
* @brief checks if the pool has a transaction with the given hash
|
||||||
|
@ -129,7 +129,7 @@ static void test(test_t t, uint64_t blocks)
|
|||||||
cryptonote::block b;
|
cryptonote::block b;
|
||||||
b.major_version = 1;
|
b.major_version = 1;
|
||||||
b.minor_version = 1;
|
b.minor_version = 1;
|
||||||
bc->get_db().add_block(b, 300000, 300000, bc->get_db().height(), bc->get_db().height(), {});
|
bc->get_db().add_block(std::make_pair(b, ""), 300000, 300000, bc->get_db().height(), bc->get_db().height(), {});
|
||||||
if (!bc->update_next_cumulative_weight_limit())
|
if (!bc->update_next_cumulative_weight_limit())
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to update cumulative weight limit 1\n");
|
fprintf(stderr, "Failed to update cumulative weight limit 1\n");
|
||||||
@ -163,7 +163,7 @@ static void test(test_t t, uint64_t blocks)
|
|||||||
cryptonote::block b;
|
cryptonote::block b;
|
||||||
b.major_version = 10;
|
b.major_version = 10;
|
||||||
b.minor_version = 10;
|
b.minor_version = 10;
|
||||||
bc->get_db().add_block(std::move(b), w, ltw, bc->get_db().height(), bc->get_db().height(), {});
|
bc->get_db().add_block(std::make_pair(std::move(b), ""), w, ltw, bc->get_db().height(), bc->get_db().height(), {});
|
||||||
|
|
||||||
if (!bc->update_next_cumulative_weight_limit())
|
if (!bc->update_next_cumulative_weight_limit())
|
||||||
{
|
{
|
||||||
|
@ -163,17 +163,17 @@ protected:
|
|||||||
block bl;
|
block bl;
|
||||||
blobdata bd = h2b(i);
|
blobdata bd = h2b(i);
|
||||||
parse_and_validate_block_from_blob(bd, bl);
|
parse_and_validate_block_from_blob(bd, bl);
|
||||||
m_blocks.push_back(bl);
|
m_blocks.push_back(std::make_pair(bl, bd));
|
||||||
}
|
}
|
||||||
for (auto& i : t_transactions)
|
for (auto& i : t_transactions)
|
||||||
{
|
{
|
||||||
std::vector<transaction> txs;
|
std::vector<std::pair<transaction, blobdata>> txs;
|
||||||
for (auto& j : i)
|
for (auto& j : i)
|
||||||
{
|
{
|
||||||
transaction tx;
|
transaction tx;
|
||||||
blobdata bd = h2b(j);
|
blobdata bd = h2b(j);
|
||||||
parse_and_validate_tx_from_blob(bd, tx);
|
parse_and_validate_tx_from_blob(bd, tx);
|
||||||
txs.push_back(tx);
|
txs.push_back(std::make_pair(tx, bd));
|
||||||
}
|
}
|
||||||
m_txs.push_back(txs);
|
m_txs.push_back(txs);
|
||||||
}
|
}
|
||||||
@ -187,8 +187,8 @@ protected:
|
|||||||
BlockchainDB* m_db;
|
BlockchainDB* m_db;
|
||||||
HardFork m_hardfork;
|
HardFork m_hardfork;
|
||||||
std::string m_prefix;
|
std::string m_prefix;
|
||||||
std::vector<block> m_blocks;
|
std::vector<std::pair<block, blobdata>> m_blocks;
|
||||||
std::vector<std::vector<transaction> > m_txs;
|
std::vector<std::vector<std::pair<transaction, blobdata>>> m_txs;
|
||||||
std::vector<std::string> m_filenames;
|
std::vector<std::string> m_filenames;
|
||||||
|
|
||||||
void init_hard_fork()
|
void init_hard_fork()
|
||||||
@ -283,19 +283,19 @@ TYPED_TEST(BlockchainDBTest, AddBlock)
|
|||||||
ASSERT_NO_THROW(this->m_db->add_block(this->m_blocks[1], t_sizes[1], t_sizes[1], t_diffs[1], t_coins[1], this->m_txs[1]));
|
ASSERT_NO_THROW(this->m_db->add_block(this->m_blocks[1], t_sizes[1], t_sizes[1], t_diffs[1], t_coins[1], this->m_txs[1]));
|
||||||
|
|
||||||
block b;
|
block b;
|
||||||
ASSERT_TRUE(this->m_db->block_exists(get_block_hash(this->m_blocks[0])));
|
ASSERT_TRUE(this->m_db->block_exists(get_block_hash(this->m_blocks[0].first)));
|
||||||
ASSERT_NO_THROW(b = this->m_db->get_block(get_block_hash(this->m_blocks[0])));
|
ASSERT_NO_THROW(b = this->m_db->get_block(get_block_hash(this->m_blocks[0].first)));
|
||||||
|
|
||||||
ASSERT_TRUE(compare_blocks(this->m_blocks[0], b));
|
ASSERT_TRUE(compare_blocks(this->m_blocks[0].first, b));
|
||||||
|
|
||||||
ASSERT_NO_THROW(b = this->m_db->get_block_from_height(0));
|
ASSERT_NO_THROW(b = this->m_db->get_block_from_height(0));
|
||||||
|
|
||||||
ASSERT_TRUE(compare_blocks(this->m_blocks[0], b));
|
ASSERT_TRUE(compare_blocks(this->m_blocks[0].first, b));
|
||||||
|
|
||||||
// assert that we can't add the same block twice
|
// assert that we can't add the same block twice
|
||||||
ASSERT_THROW(this->m_db->add_block(this->m_blocks[0], t_sizes[0], t_sizes[0], t_diffs[0], t_coins[0], this->m_txs[0]), TX_EXISTS);
|
ASSERT_THROW(this->m_db->add_block(this->m_blocks[0], t_sizes[0], t_sizes[0], t_diffs[0], t_coins[0], this->m_txs[0]), TX_EXISTS);
|
||||||
|
|
||||||
for (auto& h : this->m_blocks[0].tx_hashes)
|
for (auto& h : this->m_blocks[0].first.tx_hashes)
|
||||||
{
|
{
|
||||||
transaction tx;
|
transaction tx;
|
||||||
ASSERT_TRUE(this->m_db->tx_exists(h));
|
ASSERT_TRUE(this->m_db->tx_exists(h));
|
||||||
@ -327,21 +327,21 @@ TYPED_TEST(BlockchainDBTest, RetrieveBlockData)
|
|||||||
ASSERT_NO_THROW(this->m_db->add_block(this->m_blocks[1], t_sizes[1], t_sizes[1], t_diffs[1], t_coins[1], this->m_txs[1]));
|
ASSERT_NO_THROW(this->m_db->add_block(this->m_blocks[1], t_sizes[1], t_sizes[1], t_diffs[1], t_coins[1], this->m_txs[1]));
|
||||||
ASSERT_EQ(t_diffs[1] - t_diffs[0], this->m_db->get_block_difficulty(1));
|
ASSERT_EQ(t_diffs[1] - t_diffs[0], this->m_db->get_block_difficulty(1));
|
||||||
|
|
||||||
ASSERT_HASH_EQ(get_block_hash(this->m_blocks[0]), this->m_db->get_block_hash_from_height(0));
|
ASSERT_HASH_EQ(get_block_hash(this->m_blocks[0].first), this->m_db->get_block_hash_from_height(0));
|
||||||
|
|
||||||
std::vector<block> blks;
|
std::vector<block> blks;
|
||||||
ASSERT_NO_THROW(blks = this->m_db->get_blocks_range(0, 1));
|
ASSERT_NO_THROW(blks = this->m_db->get_blocks_range(0, 1));
|
||||||
ASSERT_EQ(2, blks.size());
|
ASSERT_EQ(2, blks.size());
|
||||||
|
|
||||||
ASSERT_HASH_EQ(get_block_hash(this->m_blocks[0]), get_block_hash(blks[0]));
|
ASSERT_HASH_EQ(get_block_hash(this->m_blocks[0].first), get_block_hash(blks[0]));
|
||||||
ASSERT_HASH_EQ(get_block_hash(this->m_blocks[1]), get_block_hash(blks[1]));
|
ASSERT_HASH_EQ(get_block_hash(this->m_blocks[1].first), get_block_hash(blks[1]));
|
||||||
|
|
||||||
std::vector<crypto::hash> hashes;
|
std::vector<crypto::hash> hashes;
|
||||||
ASSERT_NO_THROW(hashes = this->m_db->get_hashes_range(0, 1));
|
ASSERT_NO_THROW(hashes = this->m_db->get_hashes_range(0, 1));
|
||||||
ASSERT_EQ(2, hashes.size());
|
ASSERT_EQ(2, hashes.size());
|
||||||
|
|
||||||
ASSERT_HASH_EQ(get_block_hash(this->m_blocks[0]), hashes[0]);
|
ASSERT_HASH_EQ(get_block_hash(this->m_blocks[0].first), hashes[0]);
|
||||||
ASSERT_HASH_EQ(get_block_hash(this->m_blocks[1]), hashes[1]);
|
ASSERT_HASH_EQ(get_block_hash(this->m_blocks[1].first), hashes[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
@ -123,7 +123,7 @@ TEST(long_term_block_weight, identical_before_fork)
|
|||||||
{
|
{
|
||||||
size_t w = h < CRYPTONOTE_REWARD_BLOCKS_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
size_t w = h < CRYPTONOTE_REWARD_BLOCKS_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
||||||
}
|
}
|
||||||
for (uint64_t h = 0; h < 10 * TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW; ++h)
|
for (uint64_t h = 0; h < 10 * TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW; ++h)
|
||||||
@ -140,7 +140,7 @@ TEST(long_term_block_weight, identical_after_fork_before_long_term_window)
|
|||||||
{
|
{
|
||||||
size_t w = h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
size_t w = h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
||||||
}
|
}
|
||||||
for (uint64_t h = 0; h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW; ++h)
|
for (uint64_t h = 0; h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW; ++h)
|
||||||
@ -157,7 +157,7 @@ TEST(long_term_block_weight, ceiling_at_30000000)
|
|||||||
{
|
{
|
||||||
size_t w = h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
size_t w = h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
||||||
}
|
}
|
||||||
ASSERT_EQ(bc->get_current_cumulative_block_weight_median(), 15000000);
|
ASSERT_EQ(bc->get_current_cumulative_block_weight_median(), 15000000);
|
||||||
@ -172,7 +172,7 @@ TEST(long_term_block_weight, multi_pop)
|
|||||||
{
|
{
|
||||||
size_t w = h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
size_t w = h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,7 +183,7 @@ TEST(long_term_block_weight, multi_pop)
|
|||||||
{
|
{
|
||||||
size_t w = h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
size_t w = h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ TEST(long_term_block_weight, multiple_updates)
|
|||||||
{
|
{
|
||||||
size_t w = h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
size_t w = h < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
||||||
const uint64_t effective_median = bc->get_current_cumulative_block_weight_median();
|
const uint64_t effective_median = bc->get_current_cumulative_block_weight_median();
|
||||||
const uint64_t effective_limit = bc->get_current_cumulative_block_weight_limit();
|
const uint64_t effective_limit = bc->get_current_cumulative_block_weight_limit();
|
||||||
@ -231,7 +231,7 @@ TEST(long_term_block_weight, pop_invariant_max)
|
|||||||
{
|
{
|
||||||
size_t w = bc->get_db().height() < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
size_t w = bc->get_db().height() < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,7 +259,7 @@ TEST(long_term_block_weight, pop_invariant_max)
|
|||||||
{
|
{
|
||||||
size_t w = bc->get_db().height() < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
size_t w = bc->get_db().height() < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, bc->get_db().height(), bc->get_db().height(), {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, bc->get_db().height(), bc->get_db().height(), {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,7 +279,7 @@ TEST(long_term_block_weight, pop_invariant_random)
|
|||||||
{
|
{
|
||||||
size_t w = bc->get_db().height() < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
size_t w = bc->get_db().height() < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : bc->get_current_cumulative_block_weight_limit();
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,7 +314,7 @@ TEST(long_term_block_weight, pop_invariant_random)
|
|||||||
uint32_t r = lcg();
|
uint32_t r = lcg();
|
||||||
size_t w = bc->get_db().height() < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : (r % bc->get_current_cumulative_block_weight_limit());
|
size_t w = bc->get_db().height() < TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW ? CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5 : (r % bc->get_current_cumulative_block_weight_limit());
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, bc->get_db().height(), bc->get_db().height(), {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, bc->get_db().height(), bc->get_db().height(), {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit());
|
||||||
const uint64_t effective_median = bc->get_current_cumulative_block_weight_median();
|
const uint64_t effective_median = bc->get_current_cumulative_block_weight_median();
|
||||||
const uint64_t effective_limit = bc->get_current_cumulative_block_weight_limit();
|
const uint64_t effective_limit = bc->get_current_cumulative_block_weight_limit();
|
||||||
@ -342,7 +342,7 @@ TEST(long_term_block_weight, long_growth_spike_and_drop)
|
|||||||
{
|
{
|
||||||
size_t w = CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5;
|
size_t w = CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V5;
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit(&long_term_effective_median_block_weight));
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit(&long_term_effective_median_block_weight));
|
||||||
}
|
}
|
||||||
ASSERT_EQ(long_term_effective_median_block_weight, 300000);
|
ASSERT_EQ(long_term_effective_median_block_weight, 300000);
|
||||||
@ -354,7 +354,7 @@ TEST(long_term_block_weight, long_growth_spike_and_drop)
|
|||||||
float t = h / float(365 * 720 * TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW / 100000);
|
float t = h / float(365 * 720 * TEST_LONG_TERM_BLOCK_WEIGHT_WINDOW / 100000);
|
||||||
size_t w = 300000 + t * 30000;
|
size_t w = 300000 + t * 30000;
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit(&long_term_effective_median_block_weight));
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit(&long_term_effective_median_block_weight));
|
||||||
}
|
}
|
||||||
ASSERT_GT(long_term_effective_median_block_weight, 300000 * 1.07);
|
ASSERT_GT(long_term_effective_median_block_weight, 300000 * 1.07);
|
||||||
@ -365,7 +365,7 @@ TEST(long_term_block_weight, long_growth_spike_and_drop)
|
|||||||
{
|
{
|
||||||
size_t w = bc->get_current_cumulative_block_weight_limit();
|
size_t w = bc->get_current_cumulative_block_weight_limit();
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit(&long_term_effective_median_block_weight));
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit(&long_term_effective_median_block_weight));
|
||||||
}
|
}
|
||||||
ASSERT_GT(long_term_effective_median_block_weight, 300000 * 1.07);
|
ASSERT_GT(long_term_effective_median_block_weight, 300000 * 1.07);
|
||||||
@ -376,7 +376,7 @@ TEST(long_term_block_weight, long_growth_spike_and_drop)
|
|||||||
{
|
{
|
||||||
size_t w = bc->get_current_cumulative_block_weight_median() * .25;
|
size_t w = bc->get_current_cumulative_block_weight_median() * .25;
|
||||||
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
uint64_t ltw = bc->get_next_long_term_block_weight(w);
|
||||||
bc->get_db().add_block(cryptonote::block(), w, ltw, h, h, {});
|
bc->get_db().add_block(std::make_pair(cryptonote::block(), ""), w, ltw, h, h, {});
|
||||||
ASSERT_TRUE(bc->update_next_cumulative_weight_limit(&long_term_effective_median_block_weight));
|
ASSERT_TRUE(bc->update_next_cumulative_weight_limit(&long_term_effective_median_block_weight));
|
||||||
}
|
}
|
||||||
ASSERT_GT(long_term_effective_median_block_weight, 300000 * 1.07);
|
ASSERT_GT(long_term_effective_median_block_weight, 300000 * 1.07);
|
||||||
|
Loading…
Reference in New Issue
Block a user