[EIP158] 空のアカウントの自動削除によるステートサイズ減少の仕組みを理解しよう！

# はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、空のアカウントの自動削除により、Ethereumのステートサイズが大幅に削減される仕組みを提案している**EIP158**についてまとめていきます！

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

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

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

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

# 仕様

イーサリアムネットワークのアップデート後に適用される新しいルールについて説明しています。
主なポイントは以下の通りです。

### アカウント削除のルール
アカウントが特定の状態（`nonce`、残高 [`balance`]、コード、ストレージが全て`0`または空）になると、そのアカウントは自動的に削除されます。
これは、ブロックチェーン上に不要なアカウントが残らないようにするための措置です。

### 「タッチ」による削除
特定の操作（例えば、トランザクションの受取アドレスになることなど）によって「**タッチ**」されたアドレスに空のアカウントが存在する場合、そのアカウントは削除されます。
これにより、ブロックチェーンの効率が向上します。

### EVMにおける存在の確認
EVMがアカウントの存在を確認する時、空の状態は存在しないことと同等として扱われます。
つまり、アカウントが空の場合、EVMはそのアカウントが存在しないとみなします。
これは、ブロックチェーンの処理を効率化するための措置です。

### ガスコストの削減
ゼロ値のトランザクション（イーサリアムを送らない呼び出しや自殺行為）では、これまで`25000`のガスコストが発生していましたが、このルール変更によりこれらのガスコストは発生しなくなります。

このような変更は、ブロックチェーンの効率を高めるために導入されます。
不要なアカウントを削除することで、ブロックチェーンのデータ量を減らし、処理速度を向上させることができます。
また、ガスコストの削減により、トランザクションのコストも低下します。

:::note info
### suicideとzero-value
「**suicide**」は、スマートコントラクト（またはアカウント）が自己破棄を行うことを意味し、「**zero-value**」とは、その操作においてイーサリアム（ETH）が移動されないことを指します。
具体的には以下のように理解できます。

**Suicide操作（自己破棄）**
スマートコントラクトは、特定の条件下で自身を破棄する機能を持っています。
これは、EVM（イーサリアム仮想マシン）の命令セットの一部として定義されており、「`SELFDESTRUCT`」命令として知られています。
この操作を実行すると、コントラクトのコードとストレージがブロックチェーンから削除されます。
この機能は、不要になったコントラクトをクリーンアップするためや、特定の論理に基づいて自動的に終了するように設計されたコントラクトに使用されます。

**ero-Value（ゼロ値）**
通常、自己破棄操作を行う時には、コントラクトが保有するETHの残高が指定されたアドレスに送金されます。
しかし、「**zero-value suicide**」という場合は、コントラクトがETHを全く保有していない、つまり残高がゼロである状態で自己破棄を行うことを意味します。
この場合、ETHの移動は発生しません。

「**zero-value suicides**」は、ガスの使用量やブロックチェーン上のデータ量に影響を与えるため、イーサリアムのプロトコルやネットワークのパフォーマンスに関連する議論でしばしば取り上げられます。
自己破棄操作は、ブロックチェーンの状態を変更するため、特定のガスコストが発生します。
しかし、ゼロ値の場合、ETHの移動に関連するコストは発生せず、主にコントラクトのデータをブロックチェーンから削除するためのコストのみが関連します。
これにより、ブロックチェーンの効率性が改善される可能性があります。
:::

以下はイーサリアムブロックチェーンのアップデートに伴い、「**タッチ**」が発生する特定のシナリオと、アカウントが空であると見なされる条件について説明しています。

「**タッチ**」とは、アカウントに何らかの変更が加えられることで、この場合には以下のようなシチュエーションが含まれます。

- **ゼロ値のCALL操作**
    - イーサリアムを送らずに関数を呼び出す場合。
- **CREATE操作**
    - 新しいコントラクトを作成するが、その結果コードが空でイーサリアム残高もゼロになる場合。
- **ゼロ値のSUICIDE操作**
    - アカウントが自己破棄を行うが、イーサリアムを送らない場合。
- **トランザクションの受取人**
    - トランザクションでイーサリアムを受け取るアカウント。
- **コントラクト作成トランザクションによって作成されるコントラクト**。
- **マイナーによるトランザクション手数料の受け取り**
    - ガス価格がゼロの場合でも、トランザクション処理後にブロックや**uncle**、**nephew**報酬を受け取る。

EVMがアカウントを空とみなす条件は、残高が`0`、`code`が空、`nonce`が`0`の場合です。
ストレージの内容はこの判定に影響しません。
これにより、クライアントの実装が単純化され、`balance`、`code`、`nonce`が空でもストレージが空でない場合に余計な`25000`ガスがかかるような異常な状況を避けることができます。

このルールは、ブロックチェーンの効率を高め、無駄なデータやコストを削減することを目的としています。
また、ブロックチェーンの処理速度とセキュリティを向上させるためのものです。

:::note info
### block/uncle/nephew rewards
**block/uncle/nephew rewards**とは、イーサリアムブロックチェーンにおけるマイニング報酬の一部を指します。
これらの報酬は、ブロックチェーンネットワークにおける異なる役割を果たすマイナーに支払われます。

**ブロック報酬（Block Rewards）**
ブロック報酬は、新しいブロックをマイニング（採掘）し、ブロックチェーンに成功裏に追加したマイナーに支払われます。
これは、新しいトランザクションをブロックに組み込み、ネットワークに貢献するインセンティブとして機能します。
ブロック報酬は、新しく発行されるイーサリアムとトランザクション手数料の合計で構成されます。

**アンクル報酬（Uncle Rewards）**
アンクル報酬は、イーサリアムのユニークな特徴で、競合するブロック（アンクルブロックと呼ばれる）をマイニングしたマイナーに支払われます。
イーサリアムでは、ブロック生成時間が非常に短いため、複数のマイナーが同時に異なるブロックを生成することがあります。
アンクルブロックはメインチェーンに含まれないが、マイニングの努力を認めるために報酬が与えられます。
これにより、ネットワークのセキュリティが高まり、小規模なマイナーも参加しやすくなります。

**ネフュー報酬（Nephew Rewards）**
ネフュー報酬は、アンクルブロックをメインチェーンに参照として含めることに成功したマイナーに支払われる小さな報酬です。
これにより、マイナーはアンクルブロックをメインチェーンに含めるインセンティブを持ち、ネットワークの健全性が保たれます。

これらの報酬システムにより、イーサリアムネットワークは、ブロックの生成と検証を通じて、分散型でセキュアなブロックチェーンを維持しています。
また、マイナーにとっては、ブロックの生成や検証作業に対する報酬となり、ネットワークのセキュリティと活動を促進します。
:::

## Specification (1c)

イーサリアムブロックチェーンのアップデートにおける特定の処理方法について説明しています。
具体的には、ブロックチェーン上の空（`null`）アカウントの取り扱いに関するルールが設けられています。

### 既存の「空」アカウントの取り扱い
新しい空アカウントの作成は防がれますが、既存の空アカウントは、それらの状態に何らかの変更が加えられない限り自動的には削除されません。
これにより、システムは不必要なアカウントの自動削除を行わずに、ブロックチェーンの安定性を維持します。
空かどうかは以下で定義されています。

```js
is_empty(acct): return get_balance(acct) == 0 and get_code(acct) == "" and get_nonce(acct) == 0
```

### 「空」アカウントの段階的削除
指定された「`N`」ブロックから開始し、空アカウントがなくなるまでの期間中、各ブロックで残された空アカウントの中から最も左に位置する`1000`個を選択し削除します。
これらのアカウントは`sha3`ハッシュ関数によってアドレスの順に並べられます。
この方法により、ブロックチェーン上のデータ構造を効率的に探索し、必要なアカウントを効率的に識別して削除することができます。

このアプローチは、ブロックチェーンのデータ量を段階的に削減し、無駄なアカウントを効率的にクリアすることを目指しています。
これにより、ブロックチェーンの全体的なパフォーマンスと管理の効率が向上することが期待されます。

# 補足

このテキストでは、イーサリアムブロックチェーン上の空アカウントに対する取り組みの一環として、大量の空アカウントを削除することの利点と潜在的な短期的な問題点について説明しています。

### 空アカウントの削除の利点
以前のプロトコルの欠陥により、多くの空アカウントが低コストで作成されていました。
これらのアカウントを削除することで、ブロックチェーンの状態サイズが大幅に削減され、フルクライアントのハードディスク負荷が軽減され、高速同期の時間が短縮されます。
また、すべての空オブジェクトがクリアされると、アカウントが空であるか存在しないかの区別がなくなり、プロトコルが長期的に単純化されます。

### 短期的な問題点
この提案により、既存の空アカウントをゼロ値で繰り返し呼び出すことによって、通常よりもはるかに低いコスト（アカウントごとに`700`ガス、`SUICIDE`の払い戻しで`350`ガス）で状態変更を引き起こすことが可能になります。
これにより、1ブロックあたりの状態書き込みが多くなり、短期的にはブロックの処理時間が長くなり、アンクルレートが増加する可能性があります。
しかし、これは空アカウントがすべてクリアされるまでの一時的な問題であり、その後は問題が解消されます。

この提案は、ブロックチェーンのパフォーマンスと効率を向上させるためのものですが、短期的には一部のリスクや問題が生じる可能性があることを認識する必要があります。
最終的には、この取り組みによりブロックチェーン全体の健全性と効率性が向上すると期待されています。

# 参考

- [EIP-158 issue and discussion](https://github.com/ethereum/EIPs/issues/158)
- [EIP-161 issue and discussion](https://github.com/ethereum/EIPs/issues/161)

# 引用

Vitalik Buterin (@vbuterin), "EIP-158: State clearing," Ethereum Improvement Proposals, no. 158, October 2016. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-158.

# 最後に

今回は「空のアカウントの自動削除により、Ethereumのステートサイズが大幅に削減される仕組みを提案している**EIP158**」についてまとめてきました！
いかがだったでしょうか？

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