[EIP684] 同じアドレスでのコントラクトの作成を無効にする提案を理解しよう！

# はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、既に存在するアドレスで新しくコントラクトを作成しようとすると、エラーを返してコードの変更を防ぐ提案している**EIP684**についてまとめていきます！

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

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

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

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

# 概要

このEIPはイーサリアムのブロックチェーン上で、特定のアドレスに既にスマートコントラクトのコードが存在する場合に、そのアドレスで新たなコントラクトを「**作成**」しようとする行為を禁止するものです。
通常、スマートコントラクトはブロックチェーン上にデプロイされる時に一意のアドレスが割り当てられ、そのアドレスはコントラクトの識別子として機能します。
しかし、何らかの方法で既存のコントラクトのアドレスに新しいコードを「**上書き**」することが可能な場合、攻撃者はコントラクトの振る舞いを不正に変更することができ、これがセキュリティリスクとなります。
このEIPによって、既にコードが存在するアドレスに対して新たなコントラクト作成を試みると、そのトランザクションはエラーになり、不正なコードの上書きが防がれます。
これにより、イーサリアムのブロックチェーン上でのセキュリティが強化され、コントラクトの不変性が保証されることになります。

# 仕様

イーサリアムのブロックチェーンにおいてコントラクトを作成する時の特定のルールについて言及しています。
具体的には、新しいコントラクトを作成しようとする時に、そのコントラクトが配置される予定のアドレスに既に何らかのデータ（具体的には、0以外のノンス値やすでにデプロイされているコード）が存在する場合、そのコントラクトの作成は許可されません。
ノンスは、特定のアドレスが関与したトランザクションの数を示す値であり、コード長はそのアドレスにデプロイされたスマートコントラクトのサイズを指します。
このルールにより、既に使用されているアドレスに新たなコントラクトを強制的にデプロイしようとする試みを阻止し、イーサリアムのセキュリティを強化しています。
さらに、この変更は過去にマイニングされた全てのブロックにも適用されるため、ブロックチェーンの履歴全体にわたってこのセキュリティルールが強制されることになります。
これにより、過去のトランザクションを改ざんすることによる潜在的な攻撃を防ぐことができます。

# 補足

スマートコントラクトは、その不変性、つまり一度ブロックチェーンにデプロイされたらそのコードは変更不可能であるという性質に大きく依存しています。
これにより、コントラクトが後から改ざんされることなく、信頼性と透明性が保証されます。
しかし、理論上は、攻撃者が非常に高い計算能力を持っていれば、特定のアドレスに格納されたスマートコントラクトのコードを変更し、そのコントラクトを利用して不正な操作を行う可能性があります。
このような攻撃は、ブロックチェーンのセキュリティメカニズムを突破し、資金を不正に移動させたり、データを改ざんしたりすることを含む様々な悪意のある活動を行うことができます。
このようなリスクを認識し、これに対処するための措置を講じることは、ブロックチェーン技術とスマートコントラクトを使用するシステムのセキュリティを維持する上で非常に重要です。

# 互換性

これは実行レイヤーのアップグレードなので、ハードフォークの必要があります。

# テスト

```
Address : 0xd0bBEc6D2c628b7e2E6D5556daA14a5181b604C5,
Balance : 1000000000000000000, // 1 ether
Nonce   : 0,
code    : "",

Address : 0x7658771dc6Af74a3d2F8499D349FF9c1a0DF8826,
Balance : 0,
Nonce   : 1,
Code    : "0xB0B0FACE",
```

ブロックチェーンの初期状態（ジェネシスブロック）における2つのアドレスに割り当てられた資産と状態が示されています。
最初のアドレスは`1 ETH`の残高を持ち、ノンス（そのアドレスが行ったトランザクション数）は`0`、コードは空です。
これは一般的なユーザーアカウント（EOA）を示しています。
二番目のアドレスは残高が`0`で、ノンスが`1`、そして何らかのコード（"0xB0B0FACE"と表される）が割り当てられています。
このコードの存在は、このアドレスがスマートコントラクトであることを示しています。

最初のアドレス（EOA）から送信された最初のトランザクションによって作成されたコントラクトは、ソルト（コントラクト作成時に使用される追加のデータ）なしで行われるべきですが、何らかの理由でこのプロセスは失敗し、トランザクションは`revert`（取り消し）されるべきだと説明されています。
この文脈での「`revert`」とは、トランザクションが失敗し、その変更が全て無効にされることを意味します。
つまり、何らかのエラーまたはルール違反が発生し、トランザクションが成功しないことを示しています。
このケースでは、具体的な失敗の理由は示されていませんが、ジェネシス割り当ての状態やトランザクションの詳細から、何らかのルール違反や予期せぬ問題が発生した可能性があります。

# セキュリティ

このEIPはセキュリティのアップグレードであり、デプロイされたコードの普遍性を強制します。

# 引用

Vitalik Buterin (@vbuterin), Renan Rodrigues de Souza (@RenanSouza2), "EIP-684: Revert creation in case of collision," Ethereum Improvement Proposals, no. 684, March 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-684.

# 最後に

今回は「既に存在するアドレスで新しくコントラクトを作成しようとすると、エラーを返してコードの変更を防ぐ提案している**EIP684**」についてまとめてきました！
いかがだったでしょうか？

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