[EIP100] アンクルブロックをブロック生成の難易度調整に組み込む仕組みを理解しよう！

# はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、ブロック生成時間を一定にするための難易度調整に、アンクルブロックを含める仕組みを提案している**EIP100**についてまとめていきます！

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

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

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

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

# 仕様

ブロックチェーンでは、ブロックの生成速度を一定に保つために、ブロックの難易度を調整する必要があります。

```python
adj_factor = max((2 if len(parent.uncles) else 1) - ((timestamp - parent.timestamp) // 9), -99)

```

この式は、イーサリアムブロックチェーンの難易度調整アルゴリズムの一部で、特に**BYZANTIUM**フォークと呼ばれるアップデートを基にしたものです。

```python
adj_factor = max(1 - ((timestamp - parent.timestamp) // 10), -99)
child_diff = int(max(parent.difficulty + (parent.difficulty // BLOCK_DIFF_FACTOR) * adj_factor, min(parent.difficulty, MIN_DIFF)))
...
```

この式は、新しいブロックが前のブロック（親ブロック）よりも生成される時間が目標とする時間よりも短かった場合、難易度を上げることを意味します。
逆に、生成時間が長すぎる場合は難易度を下げます。
`10`秒という数値は、イーサリアムが目標とするブロック生成間隔です。
調整係数は、この目標と実際の間隔の差に基づいて計算され、新しいブロックの難易度に影響を与えます。

**BYZANTIUM**フォーク以降では、アンクルブロックの存在が難易度調整に影響を与えるようになります。
アンクルブロックがある場合、それはネットワークが分岐していることを示しており、ブロック生成の難易度をより敏感に調整する必要があります。
この変更により、`9`秒という新しい目標ブロック時間が導入され、難易度の調整がより細かくなります。

このように、ブロックの難易度を動的に調整することで、ブロックチェーンネットワークは一定の生成速度を維持し、ネットワークのセキュリティと効率を保つことができます。

:::note info
### アンクルブロック

![DALL·E 2024-01-20 07.59.00 - A visual representation of a blockchain network showing the main blockchain with a series of connected blocks in a straight line. Next to the main blo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570269/3a0d07bf-3a2a-a6d2-0066-1f105ae400ed.png)

アンクルブロックとは、ブロックチェーンにおける特定のブロックがメインチェーンの一部として承認される前に、他のブロックによって代わりに承認されたブロックのことを指します。
これらのブロックはメインチェーンに直接含まれてはいませんが、メインチェーンに接続されているため、間接的な関連性はあります。

ブロックチェーンでは、新しいブロックが生成されるたびに、ネットワークのノード（参加者）がその有効性を確認し、最も長いチェーン、つまり最も多くのブロックを含むチェーンをメインチェーンとして認識します。
アンクルブロックは、このプロセス中にほかのブロックによってメインチェーンに追加されなかったブロックです。
これらはメインチェーンには含まれませんが、その生成には労力がかかったため、特定のブロックチェーンシステムではこれらのブロックに対しても報酬が与えられることがあります。

画像は、メインチェーンとアンクルブロックの関係を視覚的に表したものです（CahtGPT生成）。
メインチェーン（メインブロックチェーンとラベル付けされている）は直線上に連なる一連のブロックで、アンクルブロック（アンクルブロックとラベル付けされている）はメインチェーンから枝分かれした短いチェーンとして描かれています。
これらのアンクルブロックはメインチェーンに接続されていますが、メインシーケンスの一部ではありません。
この図は、アンクルブロックがメインチェーンに関連しているが、直接的には含まれていないことを示しています。
:::

# 補足

ブロックチェーンでは、ブロック生成の一定の速度を保つことが重要です。
仕様部分で提案されている以下の新しい式は、アンクルブロックを考慮に入れることで、ブロック生成速度と通貨の発行量をより予測可能にし、操作に対する耐性を高めることを狙っています。
アンクルブロックは、正式なブロックチェーンには含まれないが、あるブロックの生成に影響を与えたブロックのことを指します。

```python
adj_factor = max(1 + len(parent.uncles) - ((timestamp - parent.timestamp) // 9), -99)
```

この新しい式では、アンクルブロックの数によって調整係数が変化します。
つまり、アンクルブロックが多いほど、そのブロックの難易度は低下し、ブロックチェーンに追加される可能性が高くなります。
これにより、ブロック生成の速度が増加する傾向にありますが、この式によってその影響が抑えられます。

分母を`9`に変更することで、この調整がより敏感になり、ブロックの生成時間が短縮されます。
現在のアンクル率が`7%`であることを考慮すると、実際のブロック時間は約`3%`短くなると予測されます。
これにより、ブロック生成の平均速度を一定に保ちつつ、通貨の発行量も予測可能で操作に強いものとなるわけです。

このような変更は、ブロックチェーンネットワークの安定性とセキュリティを高めるために重要であり、ブロックチェーン技術の進化の一環として考えられます。

# 参考

- [EIP 100 issue and discussion](https://github.com/ethereum/EIPs/issues/100)
- [https://bitslog.wordpress.com/2016/04/28/uncle-mining-an-ethereum-consensus-protocol-flaw/](https://bitslog.wordpress.com/2016/04/28/uncle-mining-an-ethereum-consensus-protocol-flaw/)

# 引用

Vitalik Buterin (@vbuterin), "EIP-100: Change difficulty adjustment to target mean block time including uncles," Ethereum Improvement Proposals, no. 100, April 2016. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-100.

# 最後に

今回は「ブロック生成時間を一定にするための難易度調整に、アンクルブロックを含める仕組みを提案している**EIP100**」についてまとめてきました！
いかがだったでしょうか？

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