# [EIP649] difficulty bombを遅延させてブロック報酬を調整する提案を理解しよう！

> イーサリアムのネットワークでは、「難易度爆弾（difficulty bomb）」というメカニズムが導入されており、これは意図的にブロック生成時間を時間が経つにつれて遅くするものです。

- URL: https://cardene.dev/articles/c553ec071cb5015c1254
- 公開日: 2024-02-01
- 更新日: 2024-02-01
- トピック: Blockchain
- タグ: ethereum, solidity, smartcontract, ブロックチェーン

## はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

今回は、難易度爆弾によって増加している平均ブロック時間を約1年半遅延させ、**BYZANTIUM**フォーク時にブロック報酬を減少させること仕組みを提案している**EIP649**についてまとめていきます！

:::message
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://eips.ethereum.org/EIPS/eip-649

他にも様々なEIPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

## 概要

イーサリアムのネットワークでは、「**難易度爆弾（difficulty bomb）**」というメカニズムが導入されており、これは意図的にブロック生成時間を時間が経つにつれて遅くするものです。
この目的は、将来的にイーサリアムをプルーフ・オブ・ステーク（PoS）のコンセンサスメカニズムに移行させるための一つのプレッシャーとして機能します。
しかし、この難易度爆弾が発動すると、トランザクションの確認時間が長くなり、ネットワークの使用効率が低下します。

提案されている改善提案では、この難易度爆弾を一時的に遅らせることで、ネットワークの効率性を一時的に保ちつつ、PoSへの移行を準備する時間を得ることが目的です。
具体的には、**BYZANTIUM_FORK_BLKNUM**時に、クライアントが使用するブロック番号を偽造して、実際よりも難易度爆弾が約300万ブロック遅れているかのように計算させます。
これにより、ブロック生成時間の増加が一時的に抑制されます。

さらに、この提案ではブロック報酬の減少も含まれています。
これは、難易度爆弾を遅らせることによるインフレ抑制と、PoSへの移行に向けたインセンティブ構造の調整を目的としています。
具体的には、ブロック報酬が`3ETH`に調整され、これに伴い、ブロックを生成したマイナーの**uncle**と**nephew**に与えられる報酬も適宜調整されます。

:::message
#### uncleとnephew
イーサリアムのブロックチェーンでは、「おじ（uncle）」と「甥（nephew）」という用語が特殊な意味を持っています。
これらは、イーサリアムのネットワークにおけるブロックの関係性と報酬システムを理解するために重要な概念です。

**Uncleブロック**
Uncleブロックとは、有効なブロックの一つですが、メインチェーンには含まれないブロックのことを指します。
イーサリアムでは、複数のマイナーがほぼ同時に新しいブロックを見つけることがありますが、ネットワークは最終的にそのうちの1つをメインチェーンに組み込みます。
メインチェーンに組み込まれなかったブロックは、有効な計算作業の証として「**Uncle**」として認識されます。

**Nephewブロック**
Nephewブロックとは、メインチェーンに組み込まれるブロックのことで、特にUncleブロックを参照しているブロックのことを指します。
Nephewブロックのマイナーは、自分のブロックにUncleブロックを参照することで追加の報酬を得ることができます。

**報酬システム**
イーサリアムでは、ネットワークのセキュリティを向上させ、より多くのマイナーに報酬を分配するために、おじブロックを含む報酬システムを導入しています。
おじブロックのマイナーは、メインチェーンに組み込まれたとはいえないものの、有効な計算作業を行ったとして報酬を受け取ります。
また、Nephewブロックを生成したマイナーも、Uncleブロックを参照することで追加の報酬を得ることができます。

このシステムにより、ネットワークはより分散され、異なるマイナーが報酬を受け取る機会が増えるため、中央集権化のリスクを減少させることができます。
また、ブロック生成の競争が激しい場合でも、努力が報われやすくなります。
:::

## 動機

イーサリアムネットワークは、現在のプルーフ・オブ・ワーク（PoW）コンセンサスメカニズムから、よりエネルギー効率が良くセキュリティも高いとされるプルーフ・オブ・ステーク（PoS）への移行を計画しています。
この移行は、**Casper**と呼ばれるアップデートを通じて行われる予定でしたが、開発の遅れにより、PoWに基づくEthashアルゴリズムが引き続き使用されています。

この遅れの結果、システムの安定性を維持し、マイナーの活動を奨励するために、ブロック生成時間を平均15秒に保つことが重要です。
これにより、ネットワークの処理能力と効率が維持されます。
しかし、長期的な安定性を保つためには、氷河時代（難易度爆弾）の遅延によってマイナーへの報酬が不当に増加することを避ける必要があります。
この難易度爆弾は、ブロック生成時間を意図的に遅くし、ネットワークをPoSへ移行するためのインセンティブを作るために設計されました。

提案された対策として、ブロック報酬を削減することで、難易度爆弾の遅延を相殺し、システムの経済的な均衡を保つことが考えられます。
これは、マイナーが得る報酬を減少させ、インフレを抑制するとともに、マイナーがPoSへの移行に反対して独自のチェーンを作るインセンティブを減少させる効果があります。
このようにして、イーサリアムネットワークは、PoSへの移行に向けてよりスムーズに進むことができるようになります。

## 仕様

##### 難易度の緩和（偽のブロック番号を使用）
難易度計算のために、指数関数的な氷河時代のコンポーネントで使用されている`block.number`を、以下の式で置き換えます。

```
fake_block_number = max(0, block.number - 3_000_000) if block.number >= BYZANTIUM_FORK_BLKNUM else block.number
```

**BYZANTIUM**フォーク以降、難易度計算において実際のブロック番号の代わりに「**偽のブロック番号**」を使用することで、氷河時代（ブロック生成時間の指数関数的な増加）の影響を緩和します。
具体的には、**BYZANTIUM**フォークのブロック番号に達した場合、実際のブロック番号から300万を減算した数値を使用し、それ以外の場合は実際のブロック番号をそのまま使用します。
これにより、難易度の急激な上昇を防ぎ、ブロック生成時間を適切な範囲内に保つことができます。

##### ブロック、Uncle、Nephewの報酬の調整
Ether発行量を一定に保つために、ブロック報酬を`new_block_reward`に調整します。

```
new_block_reward = 3_000_000_000_000_000_000 if block.number >= BYZANTIUM_FORK_BLKNUM else block.reward
```

同様に、`block.number >= BYZANTIUM_FORK_BLKNUM`でUncleがブロックに含まれており、`block.number - uncle.number = k`である場合、Uncleの報酬は以下のようになります。

```
new_uncle_reward = (8 - k) * new_block_reward / 8
```

これは、単に`new_block_reward`で調整された既存のメトロポリス以前のUncleの報酬の式です。

`block.number >= BYZANTIUM_FORK_BLKNUM`の場合のNephewの報酬は以下のようになります。

```
new_nephew_reward = new_block_reward / 32
```

これも、単に`new_block_reward`で調整された既存のメトロポリス以前のNephewの報酬の式です。

**BYZANTIUM**フォーク以降、ブロック報酬は一律`3 ETH`に設定されます。
これは、Etherの一定の発行量を維持するための措置です。
UncleブロックとNephewブロックの報酬もこの新しいブロック報酬に基づいて調整されます。
Uncleブロックの報酬は、メインチェーンのブロックとUncleブロックとの間のブロック数（k）に基づいて計算され、報酬額は新しいブロック報酬に比例して減少します。
Nephewブロックの報酬は、新しいブロック報酬の`1/32`とされ、これによりネットワークのセキュリティを高めるとともに、マイナーに適切なインセンティブを提供します。
これらの調整により、イーサリアムネットワークは難易度の急激な上昇を避けつつ、マイナーへの適切な報酬を提供してネットワークのセキュリティと効率を保つことができます。

## 補足

イーサリアムネットワークの開発において、氷河時代（難易度爆弾）の遅延は、ブロック生成時間が増加しネットワークの効率が低下するのを防ぐための重要な対策です。
この変更により、ブロック時間は約1.4年間（42百万秒）延長され、2018年末には元の`30`秒のブロック時間に戻る予定でした。
また、難易度計算に特別なルールを追加し、異なるブロック間で難易度を一時停止することで、難易度の増加を効果的に制御するという代替案も提案されました。
どちらの方法も、ネットワークの安定性を保ちながら難易度の急激な上昇を抑えることを目的としています。

この問題は、イーサリアムの開発者コミュニティであるAll Core Devs Meetingで複数回にわたって議論されました。
最終的に、[All Core Devs Meeting #19](https://github.com/ethereum/pm/blob/master/AllCoreDevs-Meetings/Meeting%2019.md)で仕様についての合意が得られ、EIP（Ethereum Improvement Proposal）の問題[#649](https://github.com/ethereum/EIPs/issues/649)で詳細な仕様が起草されました。
その後、[EIP #186](https://github.com/ethereum/EIPs/issues/186)を置き換える形で、ブロック報酬の削減と難易度爆弾の遅延を組み合わせた提案がAll Core Devs Meeting [#20](https://github.com/ethereum/pm/blob/master/AllCoreDevs-Meetings/Meeting%2020.md)および#21で決定され、[#22](https://github.com/ethereum/pm/blob/master/AllCoreDevs-Meetings/Meeting%2021.md)で正式に受け入れられました。これにより、イーサリアムネットワークの長期的な発展と持続可能性を支えるための重要な一歩が踏み出されました。

## 互換性

このEIP（Ethereum Improvement Proposal、イーサリアム改善提案）は、イーサリアムネットワークの難易度計算と報酬構造に大きな変更を加えることを提案しています。
具体的には、ブロックの生成難易度の計算方法、UncleブロックとNephewブロックに対する報酬の体系に変更を加えるものです。
このような根本的な変更は、ネットワーク上の既存のルールと互換性がなく、旧来のシステムやソフトウェアとの間に互換性の問題を生じさせます。

そのため、このような変更を実装する時には、ネットワーク全体で一斉に変更を適用する必要があり、これは「**ハードフォーク**」と呼ばれるプロセスを通じて行われます。
ハードフォークは、ネットワークのプロトコルに重大な変更を加え、すべてのノードが新しいルールに従うか、または古いルールを維持する新しいチェーンを形成するかを選択するプロセスです。

このEIPをメトロポリスアップデートの一環として、特にその最初の段階である**ハードフォーク**フォークに含めることが提案されています。
メトロポリスアップデートは、イーサリアムネットワークの機能拡張と改善を目的とした一連のアップデートです。
**ハードフォーク**フォークを通じて、このEIPによる変更を適用することで、ネットワークは新しい難易度計算法と報酬構造にスムーズに移行することができ、長期的なネットワークの安定性とセキュリティが保たれることになります。

## テスト

テストケースは ethereum/tests [#269](https://github.com/ethereum/tests/pull/269) にあります。

## 実装

以下のクライアントが**EIP649**を実装しました。

- Geth [#15028](https://github.com/ethereum/go-ethereum/pull/15028)
- Parity [#5855](https://github.com/paritytech/parity/pull/5855)
- EthereumJ [#927](https://github.com/ethereum/ethereumj/pull/927)
- Cpp-Ethereum [#4050](https://github.com/ethereum/cpp-ethereum/issues/4050)
- PyEthereum [#383](https://github.com/ethereum/pyethereum/pull/383)

その他の注目すべき実装。

- Eth-Isabelle [#459](https://github.com/pirapira/eth-isabelle/issues/459)
- Py-EVM [#123](https://github.com/ethereum/py-evm/pull/123)

## 引用

Afri Schoedon (@5chdn), Vitalik Buterin (@vbuterin), "EIP-649: Metropolis Difficulty Bomb Delay and Block Reward Reduction," Ethereum Improvement Proposals, no. 649, June 2017. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-649.

## 最後に

今回は「難易度爆弾によって増加している平均ブロック時間を約1年半遅延させ、**BYZANTIUM**フォーク時にブロック報酬を減少させること仕組みを提案している**EIP649**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4
