EIP-1234 Difficulty bomb delay and block reward adjustment (Constantinople Difficulty Bomb Delay and Block Reward Adjustment)

Final · Consensus & staking · EIP status Final · created 2018-07-19

A change that delays the difficulty bomb's effect by about 12 months and lowers the block reward to 2 ETH in exchange. It proposes including this in the Constantinople hard fork, the second stage of Metropolis.

Why it is needed

Ethereum has a mechanism called the difficulty bomb. It is code that automatically raises mining difficulty over time, gradually slowing down block production, also known as the ice age. It is meant to pressure the network toward moving to proof-of-stake, but as development of the transition project, Casper, fell behind, the bomb alone started kicking in first. As a result, average block time has been creeping up little by little. For roughly the next 12 months, proof-of-work mining needs to be able to produce a block every 15 seconds, so the bomb must be delayed. However, delaying the bomb alone would suddenly increase miner revenue, so block rewards are reduced at the same time to offset the delay effect and keep the system in roughly the same state as before. Reducing rewards also lowers the chance of a miner-led chain split ahead of the move to proof-of-stake.

What changes

Today

After EIP-1234

Who is affected

In depth

Mitigating the difficulty bomb with a fake block number

In calc_difficulty, which computes difficulty, the block.number used in the exponentially growing ice age term is replaced with a fake value. The formula is fake_block_number = max(0, block.number - 5_000_000) if block.number >= CNSTNTNPL_FORK_BLKNUM else block.number. After the fork block (CNSTNTNPL_FORK_BLKNUM), the bomb term is computed using the actual number minus 5 million, so from a client's perspective the bomb appears to kick in about 5 million blocks later than set at the Homestead fork.

Adjusting the block reward to 2 ETH

To keep ether issuance constant, the block reward is changed to new_block_reward. new_block_reward = 2_000_000_000_000_000_000 if block.number >= CNSTNTNPL_FORK_BLKNUM else block.reward, and this value is 2E18 wei, i.e., 2 ETH. It applies from the fork block onward, and before that the existing reward is used as is.

Uncle/nephew rewards follow the same formula

When an uncle is included in a block after the fork and block.number - uncle.number = k, the uncle reward is new_uncle_reward = (8 - k) * new_block_reward / 8. The nephew reward received by the miner who included the uncle is new_nephew_reward = new_block_reward / 32. Both formulas are exactly the ones used before Constantinople; only the base value changes to new_block_reward.

Why rewards are reduced at the same time

Delaying the ice age alone would have the effect of suddenly increasing miner rewards. Reducing block rewards by an offsetting amount keeps the system in the same general state as before. The original text also explains that reducing rewards as Ethereum approaches proof-of-stake lowers the likelihood of a miner-led chain split.

Calculating the delay period and alternatives

This change delays the ice age by 29,000,000 seconds, about 12 months. After that, the chain reaches 30-second block times again in the winter of 2019. As an alternative, a proposal to add a special rule to the difficulty calculation that effectively freezes difficulty between block ranges was suggested, and the original text notes it produces a similar result. This was discussed at All Core Devs meeting #42 and subsequent meetings, and was accepted at Constantinople session #1.

Backwards compatibility and fork inclusion

Because this EIP changes the difficulty calculation and the block/uncle/nephew reward structure, it is not backwards compatible. It must therefore be included in a scheduled hard fork that applies uniformly at a fixed block number, and the original text proposes including it in Constantinople, the second hard fork of Metropolis. The implementation logic is no different from EIP-649, and a Parity-Ethereum implementation is available in pull request parity-ethereum#9187. This EIP's status is Final.

Original EIP · ← EIPs