blockchain: add missing overflow check for already generated coins

When reaching the tail emission phase, the amount of coins will
eventually go over MONEY_SUPPLY, overflowing 64 bits. There was
a check added to blockchain_storage, but this was not ported to
the blockchain DB version.

Reported by smooth.
This commit is contained in:
moneromooo-monero 2016-04-17 14:43:16 +01:00
parent d6fd6be5de
commit 70c86561af
No known key found for this signature in database
GPG Key ID: 686F07454D6CEFC3
1 changed files with 5 additions and 1 deletions

View File

@ -2713,7 +2713,11 @@ leave:
// populate various metadata about the block to be stored alongside it. // populate various metadata about the block to be stored alongside it.
block_size = cumulative_block_size; block_size = cumulative_block_size;
cumulative_difficulty = current_diffic; cumulative_difficulty = current_diffic;
already_generated_coins = already_generated_coins + base_reward; // In the "tail" state when the minimum subsidy (implemented in get_block_reward) is in effect, the number of
// coins will eventually exceed MONEY_SUPPLY and overflow a uint64. To prevent overflow, cap already_generated_coins
// at MONEY_SUPPLY. already_generated_coins is only used to compute the block subsidy and MONEY_SUPPLY yields a
// subsidy of 0 under the base formula and therefore the minimum subsidy >0 in the tail state.
already_generated_coins = base_reward < (MONEY_SUPPLY-already_generated_coins) ? already_generated_coins + base_reward : MONEY_SUPPLY;
if(m_db->height()) if(m_db->height())
cumulative_difficulty += m_db->get_block_cumulative_difficulty(m_db->height() - 1); cumulative_difficulty += m_db->get_block_cumulative_difficulty(m_db->height() - 1);