forked from lthn/blockchain
Merge branch 'release'
This commit is contained in:
commit
4303f84152
7 changed files with 83 additions and 18 deletions
|
|
@ -67,6 +67,7 @@ using namespace currency;
|
|||
#define BLOCKCHAIN_STORAGE_OPTIONS_ID_STORAGE_MAJOR_COMPATIBILITY_VERSION 3 //DON'T CHANGE THIS, if you need to resync db change BLOCKCHAIN_STORAGE_MAJOR_COMPATIBILITY_VERSION
|
||||
#define BLOCKCHAIN_STORAGE_OPTIONS_ID_STORAGE_MINOR_COMPATIBILITY_VERSION 4 //mismatch here means some reinitializations
|
||||
#define BLOCKCHAIN_STORAGE_OPTIONS_ID_MAJOR_FAILURE 5 //if not blocks should ever be added with this condition
|
||||
#define BLOCKCHAIN_STORAGE_OPTIONS_ID_MOST_RECENT_HARDFORK_ID 6
|
||||
|
||||
|
||||
#define TARGETDATA_CACHE_SIZE DIFFICULTY_WINDOW + 10
|
||||
|
|
@ -95,6 +96,7 @@ blockchain_storage::blockchain_storage(tx_memory_pool& tx_pool) :m_db(nullptr, m
|
|||
m_db_storage_major_compatibility_version(BLOCKCHAIN_STORAGE_OPTIONS_ID_STORAGE_MAJOR_COMPATIBILITY_VERSION, m_db_solo_options),
|
||||
m_db_storage_minor_compatibility_version(BLOCKCHAIN_STORAGE_OPTIONS_ID_STORAGE_MINOR_COMPATIBILITY_VERSION, m_db_solo_options),
|
||||
m_db_major_failure(BLOCKCHAIN_STORAGE_OPTIONS_ID_MAJOR_FAILURE, m_db_solo_options),
|
||||
m_db_most_recent_hardfork_id(BLOCKCHAIN_STORAGE_OPTIONS_ID_MOST_RECENT_HARDFORK_ID, m_db_solo_options),
|
||||
m_db_per_block_gindex_incs(m_db),
|
||||
m_tx_pool(tx_pool),
|
||||
m_is_in_checkpoint_zone(false),
|
||||
|
|
@ -116,6 +118,7 @@ blockchain_storage::blockchain_storage(tx_memory_pool& tx_pool) :m_db(nullptr, m
|
|||
m_services_mgr.set_core_runtime_config(m_core_runtime_config);
|
||||
m_performance_data.epic_failure_happend = false;
|
||||
}
|
||||
|
||||
blockchain_storage::~blockchain_storage()
|
||||
{
|
||||
if (!m_deinit_is_done)
|
||||
|
|
@ -451,7 +454,48 @@ bool blockchain_storage::init(const std::string& config_folder, const boost::pro
|
|||
m_db.commit_transaction();
|
||||
LOG_PRINT_MAGENTA("migration of m_db_per_block_gindex_incs completed successfully", LOG_LEVEL_0);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef TESTNET
|
||||
// MAINNET ONLY
|
||||
if (m_db_most_recent_hardfork_id == 0)
|
||||
{
|
||||
// HF5 and the first time use: we need to check
|
||||
// to handle this case we manually check hash for the block right after HF5 activation, and if it doesn't match -- truncate the blockchain
|
||||
block blk{};
|
||||
if (get_block_by_height(ZANO_HARDFORK_05_AFTER_HEIGHT + 1, blk))
|
||||
{
|
||||
crypto::hash b3076401_id = epee::string_tools::hex_to_pod<crypto::hash>("8d93e0a7ab93b367dea44862f27ee9ca044649db84a9f44bf095d2eebc133b2d");
|
||||
crypto::hash h = get_block_hash(blk);
|
||||
if (h != b3076401_id)
|
||||
{
|
||||
LOG_PRINT_L0("In the blockchain hash for the block 3076401 is " << h << " while it is expected to be " << b3076401_id <<
|
||||
". Most likely recent blocks are alternative and invalid for the current hardfork, thus we truncate the blockchain, so that block 3076400 becomes new top block...");
|
||||
truncate_blockchain(ZANO_HARDFORK_05_AFTER_HEIGHT + 1);
|
||||
m_tx_pool.clear();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// do nothing if there's no such block (yet)
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
uint64_t next_block_height = get_top_block_height() + 1;
|
||||
size_t current_hardfork_id = m_core_runtime_config.hard_forks.get_the_most_recent_hardfork_id_for_height(next_block_height); // note: current rules are effective for top_block_height+1
|
||||
if (m_db_most_recent_hardfork_id < current_hardfork_id)
|
||||
{
|
||||
// most likely we have blocks that don't meet new hardfork criteria, so we need to remove last N blocks till the hardfork height and try to resync them again
|
||||
uint64_t height_right_before_hardfork_activation = m_core_runtime_config.hard_forks.get_height_the_hardfork_active_after(current_hardfork_id);
|
||||
LOG_PRINT_L0("The most recent hardfork id in the DB is " << m_db_most_recent_hardfork_id << " while according to the code, the top block must belong to the hardfork " <<
|
||||
current_hardfork_id << ". Most likely recent blocks are alternative and invalid for the current hardfork, thus we truncate the blockchain, so that block " <<
|
||||
height_right_before_hardfork_activation << " becomes new top block...");
|
||||
truncate_blockchain(height_right_before_hardfork_activation + 1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
} // if (m_db_blocks.size() != 0)
|
||||
|
||||
if (need_reinit)
|
||||
{
|
||||
|
|
@ -505,9 +549,10 @@ bool blockchain_storage::init(const std::string& config_folder, const boost::pro
|
|||
set_lost_tx_unmixable();
|
||||
m_db.commit_transaction();
|
||||
|
||||
LOG_PRINT_GREEN("Blockchain initialized, ver: " << m_db_storage_major_compatibility_version << "." << m_db_storage_minor_compatibility_version << ", last block: " << m_db_blocks.size() - 1 << ENDL
|
||||
LOG_PRINT_GREEN("Blockchain initialized, ver: " << m_db_storage_major_compatibility_version << "." << m_db_storage_minor_compatibility_version << ENDL
|
||||
<< " genesis: " << get_block_hash(m_db_blocks[0]->bl) << ENDL
|
||||
<< " last block: " << m_db_blocks.size() - 1 << ", " << misc_utils::get_time_interval_string(timestamp_diff) << " ago" << ENDL
|
||||
<< " last hardfork id: " << m_db_most_recent_hardfork_id << ENDL
|
||||
<< " current pos difficulty: " << get_next_diff_conditional(true) << ENDL
|
||||
<< " current pow difficulty: " << get_next_diff_conditional(false) << ENDL
|
||||
<< " total transactions: " << m_db_transactions.size() << ENDL
|
||||
|
|
@ -579,6 +624,7 @@ void blockchain_storage::store_db_solo_options_values()
|
|||
m_db_storage_major_compatibility_version = BLOCKCHAIN_STORAGE_MAJOR_COMPATIBILITY_VERSION;
|
||||
m_db_storage_minor_compatibility_version = BLOCKCHAIN_STORAGE_MINOR_COMPATIBILITY_VERSION;
|
||||
m_db_last_worked_version = std::string(PROJECT_VERSION_LONG);
|
||||
m_db_most_recent_hardfork_id = m_core_runtime_config.hard_forks.get_the_most_recent_hardfork_id_for_height(get_top_block_height() + 1 /* <-- next block height */);
|
||||
m_db.commit_transaction();
|
||||
}
|
||||
//------------------------------------------------------------------
|
||||
|
|
@ -5380,6 +5426,13 @@ void blockchain_storage::do_full_db_warm_up() const
|
|||
}
|
||||
}
|
||||
//------------------------------------------------------------------
|
||||
void blockchain_storage::on_hardfork_activated(size_t hardfork_id)
|
||||
{
|
||||
m_db.begin_transaction();
|
||||
m_db_most_recent_hardfork_id = hardfork_id;
|
||||
m_db.commit_transaction();
|
||||
}
|
||||
//------------------------------------------------------------------
|
||||
bool blockchain_storage::check_tx_input(const transaction& tx, size_t in_index, const txin_to_key& txin, const crypto::hash& tx_prefix_hash, uint64_t& max_related_block_height, uint64_t& source_max_unlock_time_for_pos_coinbase) const
|
||||
{
|
||||
CRITICAL_REGION_LOCAL(m_read_lock);
|
||||
|
|
@ -7508,11 +7561,11 @@ bool blockchain_storage::add_new_block(const block& bl, block_verification_conte
|
|||
}
|
||||
}
|
||||
//------------------------------------------------------------------
|
||||
bool blockchain_storage::truncate_blockchain(uint64_t to_height)
|
||||
bool blockchain_storage::truncate_blockchain(uint64_t to_blockchain_size)
|
||||
{
|
||||
m_db.begin_transaction();
|
||||
uint64_t inital_height = get_current_blockchain_size();
|
||||
while (get_current_blockchain_size() > to_height)
|
||||
uint64_t inital_blockchain_size = get_current_blockchain_size();
|
||||
while (get_current_blockchain_size() > to_blockchain_size)
|
||||
{
|
||||
transactions_map ot;
|
||||
pop_block_from_blockchain(ot);
|
||||
|
|
@ -7521,7 +7574,7 @@ bool blockchain_storage::truncate_blockchain(uint64_t to_height)
|
|||
m_alternative_chains.clear();
|
||||
m_altblocks_keyimages.clear();
|
||||
m_alternative_chains_txs.clear();
|
||||
LOG_PRINT_MAGENTA("Blockchain truncated from " << inital_height << " to " << get_current_blockchain_size(), LOG_LEVEL_0);
|
||||
LOG_PRINT_MAGENTA("Blockchain truncated from size " << inital_blockchain_size << " to size " << get_current_blockchain_size() << ". Alt blocks cleared.", LOG_LEVEL_0);
|
||||
m_db.commit_transaction();
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -215,7 +215,7 @@ namespace currency
|
|||
bool clear();
|
||||
bool reset_and_set_genesis_block(const block& b);
|
||||
//debug function
|
||||
bool truncate_blockchain(uint64_t to_height);
|
||||
bool truncate_blockchain(uint64_t to_blockchain_size);
|
||||
//------------- readers members -----------------
|
||||
bool pre_validate_relayed_block(block& b, block_verification_context& bvc, const crypto::hash& id)const ;
|
||||
//bool push_new_block();
|
||||
|
|
@ -513,6 +513,7 @@ namespace currency
|
|||
void set_db_l2_cache_size(uint64_t ceched_elements) const;
|
||||
//experimental
|
||||
void do_full_db_warm_up() const;
|
||||
void on_hardfork_activated(size_t hardfork_id);
|
||||
|
||||
private:
|
||||
|
||||
|
|
@ -566,6 +567,7 @@ namespace currency
|
|||
tools::db::solo_db_value<uint64_t, uint64_t, solo_options_container> m_db_storage_major_compatibility_version;
|
||||
tools::db::solo_db_value<uint64_t, uint64_t, solo_options_container> m_db_storage_minor_compatibility_version;
|
||||
tools::db::solo_db_value<uint64_t, bool, solo_options_container> m_db_major_failure; //safety fuse
|
||||
tools::db::solo_db_value<uint64_t, uint64_t, solo_options_container> m_db_most_recent_hardfork_id;
|
||||
|
||||
outputs_container m_db_outputs;
|
||||
multisig_outs_container m_db_multisig_outs;
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ namespace currency
|
|||
END_SERIALIZE()
|
||||
|
||||
// This is an optional data fields, It is not included in serialization and therefore is never stored in the database.
|
||||
// It might be calculated “on the fly” to speed up access operations.
|
||||
// It might be calculated "on the fly" to speed up access operations.
|
||||
mutable std::shared_ptr<crypto::hash> m_cache_coinbase_id;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -55,6 +55,12 @@ namespace currency
|
|||
return epee::string_tools::num_to_string_fast(m_height_the_hardfork_n_active_after[hardfork_id]);
|
||||
}
|
||||
|
||||
uint64_t get_height_the_hardfork_active_after(size_t hardfork_id) const
|
||||
{
|
||||
CHECK_AND_ASSERT_THROW_MES(hardfork_id < m_total_count, "invalid hardfork id: " << hardfork_id);
|
||||
return m_height_the_hardfork_n_active_after[hardfork_id];
|
||||
}
|
||||
|
||||
size_t get_the_most_recent_hardfork_id_for_height(uint64_t height) const
|
||||
{
|
||||
for(size_t hid = m_total_count - 1; hid != 0; --hid) // 0 is not including
|
||||
|
|
|
|||
|
|
@ -566,6 +566,7 @@ namespace currency
|
|||
if (hardfork_id_for_prev_block != hardfork_id_for_curr_block)
|
||||
{
|
||||
LOG_PRINT_GREEN("Hardfork " << hardfork_id_for_curr_block << " has been activated after the block at height " << h, LOG_LEVEL_0);
|
||||
m_blockchain_storage.on_hardfork_activated(hardfork_id_for_curr_block);
|
||||
m_pprotocol->on_hardfork_activated(hardfork_id_for_curr_block);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -238,18 +238,21 @@ namespace currency
|
|||
}
|
||||
TIME_MEASURE_FINISH_PD(check_inputs_time);
|
||||
|
||||
if (tx.version > TRANSACTION_VERSION_PRE_HF4)
|
||||
if (!from_core)
|
||||
{
|
||||
TIME_MEASURE_START_PD(check_post_hf4_balance);
|
||||
r = check_tx_balance(tx, id);
|
||||
CHECK_AND_ASSERT_MES_CUSTOM(r, false, { tvc.m_verification_failed = true; }, "post-HF4 tx: balance proof is invalid");
|
||||
TIME_MEASURE_FINISH_PD(check_post_hf4_balance);
|
||||
if (tx.version > TRANSACTION_VERSION_PRE_HF4)
|
||||
{
|
||||
TIME_MEASURE_START_PD(check_post_hf4_balance);
|
||||
r = check_tx_balance(tx, id);
|
||||
CHECK_AND_ASSERT_MES_CUSTOM(r, false, { tvc.m_verification_failed = true; }, "post-HF4 tx: balance proof is invalid");
|
||||
TIME_MEASURE_FINISH_PD(check_post_hf4_balance);
|
||||
|
||||
r = process_type_in_variant_container_and_make_sure_its_unique<asset_descriptor_operation>(tx.extra, [&](const asset_descriptor_operation& ado){
|
||||
r = process_type_in_variant_container_and_make_sure_its_unique<asset_descriptor_operation>(tx.extra, [&](const asset_descriptor_operation& ado) {
|
||||
asset_op_verification_context avc = { tx, id, ado };
|
||||
return m_blockchain.validate_asset_operation(avc, m_blockchain.get_current_blockchain_size());
|
||||
}, true);
|
||||
CHECK_AND_ASSERT_MES_CUSTOM(r, false, { tvc.m_verification_failed = true; }, "post-HF4 tx: asset operation is invalid");
|
||||
}, true);
|
||||
CHECK_AND_ASSERT_MES_CUSTOM(r, false, { tvc.m_verification_failed = true; }, "post-HF4 tx: asset operation is invalid");
|
||||
}
|
||||
}
|
||||
|
||||
do_insert_transaction(tx, id, blob_size, kept_by_block, tx_fee, ch_inp_res ? max_used_block_id : null_hash, ch_inp_res ? max_used_block_height : 0);
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@
|
|||
|
||||
#define PROJECT_MAJOR_VERSION "2"
|
||||
#define PROJECT_MINOR_VERSION "1"
|
||||
#define PROJECT_REVISION "1"
|
||||
#define PROJECT_REVISION "2"
|
||||
#define PROJECT_VERSION PROJECT_MAJOR_VERSION "." PROJECT_MINOR_VERSION "." PROJECT_REVISION
|
||||
|
||||
#define PROJECT_VERSION_BUILD_NO 392
|
||||
#define PROJECT_VERSION_BUILD_NO 394
|
||||
#define PROJECT_VERSION_BUILD_NO_STR STRINGIFY_EXPAND(PROJECT_VERSION_BUILD_NO)
|
||||
#define PROJECT_VERSION_LONG PROJECT_VERSION "." PROJECT_VERSION_BUILD_NO_STR "[" BUILD_COMMIT_ID "]"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue