[EIP2384] 平均ブロック生成時間の増加を約611日間遅らせる提案を理解しよう！

# はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、平均ブロック生成時間の増加に対処するために、難易度爆弾を約4,000,000ブロック（約611日）遅延させる提案をしている**EIP2384**についてまとめていきます！

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

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

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

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

今回取り上げるEIPは以下の記事と内容はほとんど同じです。

https://qiita.com/cardene/items/f4d3f155968be681a00d

https://qiita.com/cardene/items/c553ec071cb5015c1254

# 概要

イーサリアムブロックチェーンでは、ブロック生成時間を意図的に遅くする「**難易度爆弾**」というメカニズムがあります。
この仕組みは、将来的にイーサリアムがプルーフ・オブ・ステーク（PoS）へと移行するためのインセンティブとして設計されていますが、その過程でネットワークの動作を遅くしてしまう副作用があります。

提案されているEIPは、この難易度爆弾によるブロック生成時間の増加を約611日間遅らせることを目指しています。
これは、ブロック生成に必要な計算の難易度を一時的に下げることで実現されます。
具体的には、イーサリアムクライアントが難易度を計算する時に、実際のブロック番号よりも遅れたブロック番号（偽のブロック番号）を使用します。
これにより、難易度爆弾が予定されていた時期よりも実質的に遅れて発動することになります。

この措置は、イーサリアムの開発者とユーザーにとって、ブロックチェーンの性能と安定性を一時的に維持するための一時的対策です。
将来的には、イーサリアムが完全にプルーフ・オブ・ステークに移行することで、このような難易度爆弾を回避する永続的な解決策が実現されることが期待されています。

# 動機

イーサリアムネットワークでは、難易度爆弾というメカニズムが設けられており、これによりブロック生成に必要な計算の難易度が時間とともに増加します。
2019年10月5日には、この難易度爆弾による影響が再び明確になり、ブロック生成時間が徐々に延長し始めました。
平均ブロック時間は、ブロック`8,600,000`時点で約`13.1`秒から、ブロック`8,900,000`時点で約`14.3`秒に増加しました。
この増加傾向は今後も続くと予想され、`100,000`ブロックごとにブロック時間は指数関数的に増加することが見込まれます。

この増加の結果、2019年12月末にはブロック生成時間が約20秒に達し、2020年2月からは30秒を超えるようになると推定されています。
ブロック生成時間の増加は、トランザクションの処理速度の低下を意味し、結果としてブロックチェーンの肥大化と使用コストの増加につながります。
このような状況は、ネットワークの効率性とユーザビリティに悪影響を及ぼすため、難易度爆弾の遅延はイーサリアムコミュニティにとって重要な課題です。
特に、イーサリアム2.0への移行が予定されている中、難易度爆弾の影響を最小限に抑え、スムーズな移行を実現するために遅延が推奨されています。

# 仕様

難易度計算（`calc_difficulty`）において、氷河期（難易度が指数関数的に増加する期間）の成分に使用される`block.number`（現在のブロック番号）を、特定の式を用いて置き換える方法について説明しています。
この式は、現在のブロック番号から`9,000,000`を差し引いた値を「**偽のブロック番号**」として使用します。
ただし、この操作はブロック番号が`MUIR_GLACIER_FORK_BLKNUM`（ミュア・グレイシャー・フォークのブロック番号）以上の場合に限り行われます。
それ未満の場合は、現在のブロック番号をそのまま使用します。

式は以下の通りです。

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

この方法により、実際のブロック番号が大きくなると、難易度計算で考慮される「**ブロック番号**」は実質的に小さくなります。
その結果、難易度の指数関数的な増加が緩和され、ブロック生成時間の過度な延長を防ぐことができます。
これは、ブロックチェーンの運用効率を保ちながら、氷河期による影響を遅らせるための一時的な対策として利用されます。

# 補足

この対策により、「**氷河期**」の到来が`52,000,000`秒（約611日）遅れることになります。
これは、ブロック生成時間が再び約`20`秒に戻るのが2021年7月頃になることを意味します。
「**氷河期**」とは、イーサリアムブロックチェーンにおいて、難易度が指数関数的に増加し、結果としてブロック生成時間が延長される期間のことを指します。

重要な点は、この遅延がEIP（Ethereum Improvement Proposal、イーサリアム改善提案）がフォークにて有効化された時点からではなく、約ブロック`8,800,000`から`4,000,000`ブロック分遅れることです。
つまり、このEIPの施行による「**氷河期**」の遅延は、提案がフォークで実際に有効化された時点ではなく、あらかじめ定められたブロック番号からの遅延として計算されます。
これは、イーサリアムネットワークの将来の計画を立てる際に、予測可能性と安定性を提供するための措置です。

# 互換性

このEIP（Ethereum Improvement Proposal、イーサリアム改善提案）は、将来のバージョンとの前方互換性がなく、難易度計算において後方互換性のない変更を導入します。
このため、特定のブロック番号での予定されたハードフォークに含めるべきです。
このEIPをイスタンブールフォークの直後に含めることが提案されています。

ハードフォークとは、ブロックチェーンのルールを変更するプロセスで、新しいルールに準拠しない古いノードは新しいブロックを認識できなくなります。
このEIPによる難易度計算の変更は既存のルールと互換性がないため、すべてのノードが新しいルールに同時に切り替わる必要があります。
そのため、ネットワーク全体で同意された特定のブロック番号でこの変更を行うハードフォークが必要とされます。

イスタンブールフォークは、イーサリアムネットワークの以前のアップデートであり、このEIPをイスタンブールフォークの直後に実施することで、ネットワークの安定性を維持しつつ、必要な改善を迅速に適用することができます。

# 実装

ロジックの実装は**EIP649**や**EIP1234**と変わりません。
Parity-Ethereumの実装は[parity-ethereum#9187](https://github.com/paritytech/parity-ethereum/pull/9187)にあります。

:::note info
**EIP649**については以下の記事を参考にしてください。
:::

https://qiita.com/cardene/items/c553ec071cb5015c1254

:::note info
**EIP1234**については以下の記事を参考にしてください。
:::

https://qiita.com/cardene/items/f4d3f155968be681a00d

# 引用

Eric Conner (@econoar), "EIP-2384: Muir Glacier Difficulty Bomb Delay," Ethereum Improvement Proposals, no. 2384, November 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2384.

# 最後に

今回は「平均ブロック生成時間の増加に対処するために、難易度爆弾を約4,000,000ブロック（約611日）遅延させる提案をしている**EIP2384**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下の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