blockchain: fix bitflipping test with quantized block rewards
Block reward may now be less than the full amount allowed. This was breaking the bitflipping test. We now keep track of whether a block which was accepted by the core has a lower than allowed block reward, and allow this in the test.
This commit is contained in:
parent
22ddf09bea
commit
81cb0fcdcc
|
@ -941,13 +941,14 @@ bool Blockchain::prevalidate_miner_transaction(const block& b, uint64_t height)
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
// This function validates the miner transaction reward
|
// This function validates the miner transaction reward
|
||||||
bool Blockchain::validate_miner_transaction(const block& b, size_t cumulative_block_size, uint64_t fee, uint64_t& base_reward, uint64_t already_generated_coins)
|
bool Blockchain::validate_miner_transaction(const block& b, size_t cumulative_block_size, uint64_t fee, uint64_t& base_reward, uint64_t already_generated_coins, bool &partial_block_reward)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||||
//validate reward
|
//validate reward
|
||||||
uint64_t money_in_use = 0;
|
uint64_t money_in_use = 0;
|
||||||
BOOST_FOREACH(auto& o, b.miner_tx.vout)
|
BOOST_FOREACH(auto& o, b.miner_tx.vout)
|
||||||
money_in_use += o.amount;
|
money_in_use += o.amount;
|
||||||
|
partial_block_reward = false;
|
||||||
|
|
||||||
std::vector<size_t> last_blocks_sizes;
|
std::vector<size_t> last_blocks_sizes;
|
||||||
get_last_n_blocks_sizes(last_blocks_sizes, CRYPTONOTE_REWARD_BLOCKS_WINDOW);
|
get_last_n_blocks_sizes(last_blocks_sizes, CRYPTONOTE_REWARD_BLOCKS_WINDOW);
|
||||||
|
@ -977,6 +978,8 @@ bool Blockchain::validate_miner_transaction(const block& b, size_t cumulative_bl
|
||||||
// emission. This modifies the emission curve very slightly.
|
// emission. This modifies the emission curve very slightly.
|
||||||
CHECK_AND_ASSERT_MES(money_in_use - fee <= base_reward, false, "base reward calculation bug");
|
CHECK_AND_ASSERT_MES(money_in_use - fee <= base_reward, false, "base reward calculation bug");
|
||||||
base_reward = money_in_use - fee;
|
base_reward = money_in_use - fee;
|
||||||
|
if(base_reward + fee != money_in_use)
|
||||||
|
partial_block_reward = true;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -253,7 +253,7 @@ namespace cryptonote
|
||||||
bool handle_alternative_block(const block& b, const crypto::hash& id, block_verification_context& bvc);
|
bool handle_alternative_block(const block& b, const crypto::hash& id, block_verification_context& bvc);
|
||||||
difficulty_type get_next_difficulty_for_alternative_chain(const std::list<blocks_ext_by_hash::iterator>& alt_chain, block_extended_info& bei) const;
|
difficulty_type get_next_difficulty_for_alternative_chain(const std::list<blocks_ext_by_hash::iterator>& alt_chain, block_extended_info& bei) const;
|
||||||
bool prevalidate_miner_transaction(const block& b, uint64_t height);
|
bool prevalidate_miner_transaction(const block& b, uint64_t height);
|
||||||
bool validate_miner_transaction(const block& b, size_t cumulative_block_size, uint64_t fee, uint64_t& base_reward, uint64_t already_generated_coins);
|
bool validate_miner_transaction(const block& b, size_t cumulative_block_size, uint64_t fee, uint64_t& base_reward, uint64_t already_generated_coins, bool &partial_block_reward);
|
||||||
bool validate_transaction(const block& b, uint64_t height, const transaction& tx);
|
bool validate_transaction(const block& b, uint64_t height, const transaction& tx);
|
||||||
bool rollback_blockchain_switching(std::list<block>& original_chain, uint64_t rollback_height);
|
bool rollback_blockchain_switching(std::list<block>& original_chain, uint64_t rollback_height);
|
||||||
bool add_transaction_from_block(const transaction& tx, const crypto::hash& tx_id, const crypto::hash& bl_id, uint64_t bl_height);
|
bool add_transaction_from_block(const transaction& tx, const crypto::hash& tx_id, const crypto::hash& bl_id, uint64_t bl_height);
|
||||||
|
|
|
@ -48,5 +48,6 @@ namespace cryptonote
|
||||||
bool m_verifivation_failed; //bad block, should drop connection
|
bool m_verifivation_failed; //bad block, should drop connection
|
||||||
bool m_marked_as_orphaned;
|
bool m_marked_as_orphaned;
|
||||||
bool m_already_exists;
|
bool m_already_exists;
|
||||||
|
bool m_partial_block_reward;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -618,7 +618,8 @@ bool gen_block_invalid_binary_format::check_block_verification_context(const cry
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return !bvc.m_added_to_main_chain && (bvc.m_already_exists || bvc.m_marked_as_orphaned || bvc.m_verifivation_failed);
|
return (!bvc.m_added_to_main_chain && (bvc.m_already_exists || bvc.m_marked_as_orphaned || bvc.m_verifivation_failed))
|
||||||
|
|| (bvc.m_added_to_main_chain && bvc.m_partial_block_reward);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue