Merge pull request #763
b852766
blockchain: for v3, require miner tx to have well behaved outs (moneromooo-monero)97638b1
core: fix miner tx block reward with fees (moneromooo-monero)
This commit is contained in:
commit
1559c71ef2
|
@ -948,7 +948,7 @@ 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 &partial_block_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 &partial_block_reward, uint8_t version)
|
||||||
{
|
{
|
||||||
LOG_PRINT_L3("Blockchain::" << __func__);
|
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||||
//validate reward
|
//validate reward
|
||||||
|
@ -957,6 +957,15 @@ bool Blockchain::validate_miner_transaction(const block& b, size_t cumulative_bl
|
||||||
money_in_use += o.amount;
|
money_in_use += o.amount;
|
||||||
partial_block_reward = false;
|
partial_block_reward = false;
|
||||||
|
|
||||||
|
if (version >= 3) {
|
||||||
|
for (auto &o: b.miner_tx.vout) {
|
||||||
|
if (!is_valid_decomposed_amount(o.amount)) {
|
||||||
|
LOG_PRINT_L1("miner tx output " << print_money(o.amount) << " is not a valid decomposed amount");
|
||||||
|
return 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);
|
||||||
if (!get_block_reward(epee::misc_utils::median(last_blocks_sizes), cumulative_block_size, already_generated_coins, base_reward, get_current_hard_fork_version()))
|
if (!get_block_reward(epee::misc_utils::median(last_blocks_sizes), cumulative_block_size, already_generated_coins, base_reward, get_current_hard_fork_version()))
|
||||||
|
@ -2698,7 +2707,7 @@ leave:
|
||||||
TIME_MEASURE_START(vmt);
|
TIME_MEASURE_START(vmt);
|
||||||
uint64_t base_reward = 0;
|
uint64_t base_reward = 0;
|
||||||
uint64_t already_generated_coins = m_db->height() ? m_db->get_block_already_generated_coins(m_db->height() - 1) : 0;
|
uint64_t already_generated_coins = m_db->height() ? m_db->get_block_already_generated_coins(m_db->height() - 1) : 0;
|
||||||
if(!validate_miner_transaction(bl, cumulative_block_size, fee_summary, base_reward, already_generated_coins, bvc.m_partial_block_reward))
|
if(!validate_miner_transaction(bl, cumulative_block_size, fee_summary, base_reward, already_generated_coins, bvc.m_partial_block_reward, m_hardfork->get_current_version()))
|
||||||
{
|
{
|
||||||
LOG_PRINT_L1("Block with id: " << id << " has incorrect miner transaction");
|
LOG_PRINT_L1("Block with id: " << id << " has incorrect miner transaction");
|
||||||
bvc.m_verifivation_failed = true;
|
bvc.m_verifivation_failed = true;
|
||||||
|
|
|
@ -980,10 +980,11 @@ namespace cryptonote
|
||||||
* @param base_reward return-by-reference the new block's generated coins
|
* @param base_reward return-by-reference the new block's generated coins
|
||||||
* @param already_generated_coins the amount of currency generated prior to this block
|
* @param already_generated_coins the amount of currency generated prior to this block
|
||||||
* @param partial_block_reward return-by-reference true if miner accepted only partial reward
|
* @param partial_block_reward return-by-reference true if miner accepted only partial reward
|
||||||
|
* @param version hard fork version for that transaction
|
||||||
*
|
*
|
||||||
* @return false if anything is found wrong with the miner transaction, otherwise true
|
* @return false if anything is found wrong with the miner transaction, otherwise true
|
||||||
*/
|
*/
|
||||||
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_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, uint8_t version);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief reverts the blockchain to its previous state following a failed switch
|
* @brief reverts the blockchain to its previous state following a failed switch
|
||||||
|
|
|
@ -126,20 +126,19 @@ namespace cryptonote
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// from hard fork 2, we cut out the low significant digits. This makes the tx smaller, and
|
|
||||||
// keeps the paid amount almost the same. The unpaid remainder gets pushed back to the
|
|
||||||
// emission schedule
|
|
||||||
if (hard_fork_version >= 2)
|
|
||||||
{
|
|
||||||
block_reward = block_reward - block_reward % ::config::BASE_REWARD_CLAMP_THRESHOLD;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(DEBUG_CREATE_BLOCK_TEMPLATE)
|
#if defined(DEBUG_CREATE_BLOCK_TEMPLATE)
|
||||||
LOG_PRINT_L1("Creating block template: reward " << block_reward <<
|
LOG_PRINT_L1("Creating block template: reward " << block_reward <<
|
||||||
", fee " << fee)
|
", fee " << fee)
|
||||||
#endif
|
#endif
|
||||||
block_reward += fee;
|
block_reward += fee;
|
||||||
|
|
||||||
|
// from hard fork 2, we cut out the low significant digits. This makes the tx smaller, and
|
||||||
|
// keeps the paid amount almost the same. The unpaid remainder gets pushed back to the
|
||||||
|
// emission schedule
|
||||||
|
if (hard_fork_version >= 2) {
|
||||||
|
block_reward = block_reward - block_reward % ::config::BASE_REWARD_CLAMP_THRESHOLD;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<uint64_t> out_amounts;
|
std::vector<uint64_t> out_amounts;
|
||||||
decompose_amount_into_digits(block_reward, hard_fork_version >= 2 ? 0 : ::config::DEFAULT_DUST_THRESHOLD,
|
decompose_amount_into_digits(block_reward, hard_fork_version >= 2 ? 0 : ::config::DEFAULT_DUST_THRESHOLD,
|
||||||
[&out_amounts](uint64_t a_chunk) { out_amounts.push_back(a_chunk); },
|
[&out_amounts](uint64_t a_chunk) { out_amounts.push_back(a_chunk); },
|
||||||
|
|
Loading…
Reference in New Issue