mirror of
https://github.com/jwinterm/aeon.git
synced 2026-10-24 06:18:32 +02:00
fixes
This commit is contained in:
@@ -1506,19 +1506,27 @@ bool blockchain_storage::handle_block_to_main_chain(const block& bl, const crypt
|
||||
TIME_MEASURE_FINISH(target_calculating_time);
|
||||
TIME_MEASURE_START(longhash_calculating_time);
|
||||
crypto::hash proof_of_work = null_hash;
|
||||
if(!m_checkpoints.is_in_checkpoint_zone(get_current_blockchain_height()))
|
||||
{
|
||||
proof_of_work = get_block_longhash(bl, m_blocks.size());
|
||||
|
||||
if(!check_hash(proof_of_work, current_diffic))
|
||||
{
|
||||
LOG_PRINT_L0("Block with id: " << id << ENDL
|
||||
<< "have not enough proof of work: " << proof_of_work << ENDL
|
||||
<< "nexpected difficulty: " << current_diffic );
|
||||
bvc.m_verifivation_failed = true;
|
||||
return false;
|
||||
}
|
||||
}else
|
||||
// Formerly the code below contained an if loop with the following condition
|
||||
// !m_checkpoints.is_in_checkpoint_zone(get_current_blockchain_height())
|
||||
// however, this caused the daemon to not bother checking PoW for blocks
|
||||
// before checkpoints, which is very dangerous behaviour. We moved the PoW
|
||||
// validation out of the next chunk of code to make sure that we correctly
|
||||
// check PoW now.
|
||||
proof_of_work = get_block_longhash(bl, m_blocks.size());
|
||||
|
||||
if(!check_hash(proof_of_work, current_diffic))
|
||||
{
|
||||
LOG_PRINT_L0("Block with id: " << id << ENDL
|
||||
<< "have not enough proof of work: " << proof_of_work << ENDL
|
||||
<< "nexpected difficulty: " << current_diffic );
|
||||
bvc.m_verifivation_failed = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// If we're at a checkpoint, ensure that our hardcoded checkpoint hash
|
||||
// is correct.
|
||||
if(m_checkpoints.is_in_checkpoint_zone(get_current_blockchain_height()))
|
||||
{
|
||||
if(!m_checkpoints.check_block(get_current_blockchain_height(), id))
|
||||
{
|
||||
@@ -1527,6 +1535,7 @@ bool blockchain_storage::handle_block_to_main_chain(const block& bl, const crypt
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
TIME_MEASURE_FINISH(longhash_calculating_time);
|
||||
|
||||
if(!prevalidate_miner_transaction(bl, m_blocks.size()))
|
||||
|
||||
@@ -28,7 +28,8 @@ namespace cryptonote
|
||||
m_blockchain_storage(m_mempool),
|
||||
m_miner(this),
|
||||
m_miner_address(boost::value_initialized<account_public_address>()),
|
||||
m_starter_message_showed(false)
|
||||
m_starter_message_showed(false),
|
||||
m_target_blockchain_height(0)
|
||||
{
|
||||
set_cryptonote_protocol(pprotocol);
|
||||
}
|
||||
@@ -516,4 +517,11 @@ namespace cryptonote
|
||||
return true;
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
void core::set_target_blockchain_height(uint64_t target_blockchain_height) {
|
||||
m_target_blockchain_height = target_blockchain_height;
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
uint64_t core::get_target_blockchain_height() const {
|
||||
return m_target_blockchain_height;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,6 +90,9 @@ namespace cryptonote
|
||||
void print_blockchain_outs(const std::string& file);
|
||||
void on_synchronized();
|
||||
|
||||
void set_target_blockchain_height(uint64_t target_blockchain_height);
|
||||
uint64_t get_target_blockchain_height() const;
|
||||
|
||||
private:
|
||||
bool add_new_tx(const transaction& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prefix_hash, size_t blob_size, tx_verification_context& tvc, bool keeped_by_block);
|
||||
bool add_new_tx(const transaction& tx, tx_verification_context& tvc, bool keeped_by_block);
|
||||
@@ -124,6 +127,8 @@ namespace cryptonote
|
||||
epee::math_helper::once_a_time_seconds<60*60*12, false> m_store_blockchain_interval;
|
||||
friend class tx_validate_inputs;
|
||||
std::atomic<bool> m_starter_message_showed;
|
||||
|
||||
uint64_t m_target_blockchain_height;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -188,10 +188,19 @@ namespace cryptonote
|
||||
return true;
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
bool miner::is_mining()
|
||||
bool miner::is_mining() const
|
||||
{
|
||||
return !m_stop;
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
const account_public_address& miner::get_mining_address() const
|
||||
{
|
||||
return m_mine_address;
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
uint32_t miner::get_threads_count() const {
|
||||
return m_threads_total;
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
bool miner::start(const account_public_address& adr, size_t threads_count, const boost::thread::attributes& attrs)
|
||||
{
|
||||
@@ -226,12 +235,14 @@ namespace cryptonote
|
||||
return true;
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
uint64_t miner::get_speed()
|
||||
uint64_t miner::get_speed() const
|
||||
{
|
||||
if(is_mining())
|
||||
if(is_mining()) {
|
||||
return m_current_hash_rate;
|
||||
else
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
void miner::send_stop_signal()
|
||||
|
||||
@@ -35,10 +35,12 @@ namespace cryptonote
|
||||
bool set_block_template(const block& bl, const difficulty_type& diffic, uint64_t height);
|
||||
bool on_block_chain_update();
|
||||
bool start(const account_public_address& adr, size_t threads_count, const boost::thread::attributes& attrs);
|
||||
uint64_t get_speed();
|
||||
uint64_t get_speed() const;
|
||||
uint32_t get_threads_count() const;
|
||||
void send_stop_signal();
|
||||
bool stop();
|
||||
bool is_mining();
|
||||
bool is_mining() const;
|
||||
const account_public_address& get_mining_address() const;
|
||||
bool on_idle();
|
||||
void on_synchronized();
|
||||
//synchronous analog (for fast calls)
|
||||
|
||||
@@ -350,18 +350,69 @@ namespace cryptonote
|
||||
//---------------------------------------------------------------------------------
|
||||
bool tx_memory_pool::fill_block_template(block &bl, size_t median_size, uint64_t already_generated_coins, size_t &total_size, uint64_t &fee)
|
||||
{
|
||||
// Warning: This function takes already_generated_
|
||||
// coins as an argument and appears to do nothing
|
||||
// with it.
|
||||
|
||||
CRITICAL_REGION_LOCAL(m_transactions_lock);
|
||||
|
||||
total_size = 0;
|
||||
fee = 0;
|
||||
|
||||
size_t max_total_size = 2 * median_size - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE;
|
||||
size_t max_total_size = 2 * median_size - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE; // Max block size
|
||||
std::unordered_set<crypto::key_image> k_images;
|
||||
|
||||
// Tx size limit as in wallet2.h
|
||||
// tx_pool.cpp uses size_t for tx sizes, whereas
|
||||
// wallet2.h uses uint64_t; just use size_t here
|
||||
// for now
|
||||
size_t upper_transaction_size_limit = ((CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE * 125) / 100) - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE;
|
||||
|
||||
// Calculate size limit based on median too; useful
|
||||
// for when we actually fix wallet2.h's maximum
|
||||
// allowable tx size
|
||||
//
|
||||
// Can be removed when wallet2.h calculates max
|
||||
// tx size based on the median too; just use
|
||||
// upper_transaction_size_limit_median in all cases
|
||||
size_t upper_transaction_size_limit_median = ((median_size * 125) / 100) - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE;
|
||||
if (upper_transaction_size_limit_median > upper_transaction_size_limit)
|
||||
upper_transaction_size_limit = upper_transaction_size_limit_median;
|
||||
|
||||
BOOST_FOREACH(transactions_container::value_type& tx, m_transactions)
|
||||
{
|
||||
// Can not exceed maximum block size
|
||||
if (max_total_size < total_size + tx.second.blob_size)
|
||||
continue;
|
||||
|
||||
// Check to see if the minimum fee is included;
|
||||
// exclude tx missing minimum fee
|
||||
if (tx.second.fee < DEFAULT_FEE)
|
||||
continue;
|
||||
|
||||
// Skip transactions that are too large
|
||||
// TODO: Correct upper_transactions_size_limit
|
||||
// such that it is based on median block size;
|
||||
// We need to make a similar patch for
|
||||
// wallet2.h
|
||||
if (tx.second.blob_size > upper_transaction_size_limit)
|
||||
continue;
|
||||
|
||||
// If adding this tx will make the block size
|
||||
// greater than 130% of the median, reject the
|
||||
// tx; this will keep down largely punitive tx
|
||||
// from being included
|
||||
if ( (total_size + tx.second.blob_size) > ((130 * median_size) / 100) )
|
||||
continue;
|
||||
|
||||
// If we've exceeded the penalty free size,
|
||||
// stop including more tx
|
||||
if (total_size > median_size)
|
||||
break;
|
||||
|
||||
// Skip transactions that are not ready to be
|
||||
// included into the blockchain or that are
|
||||
// missing key images
|
||||
if (!is_transaction_ready_to_go(tx.second) || have_key_images(k_images, tx.second.tx))
|
||||
continue;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user