イーサリアム仮想マシン(EVM)
最終編集者: @HiroyukiNaito(opens in a new tab), 2024年6月21日
イーサリアム仮想マシン(EVM)は、分散型の仮想環境でイーサリアムノードのすべてにわたり一貫して安全にコードを実行します。 ノードでは、スマートコントラクトを実行するためにEVMが動作しており、「ガス」を使用して演算に必要な計算量を測定します。これにより、効率的なリソースの割り当てとネットワークのセキュリティを確保しています。
前提知識
EVMを理解するためには、バイト(opens in a new tab)、メモリ(opens in a new tab)、スタック(opens in a new tab)など、コンピュータサイエンスの一般的な用語に関する基本知識が必要です。 また、暗号学やブロックチェーンの概念であるハッシュ関数(opens in a new tab)、マークルツリー(opens in a new tab)などを知っていると理解の手助けになります。
台帳から状態マシンへ
「分散台帳」の例えは、ビットコインのようなブロックチェーンを説明する際によく使用され、暗号技術の基本的なツールを使用して分散型通貨を可能にするものです。 台帳はアクティビティの記録を維持し、アクティビティは台帳を変更する上で、誰かができること・できないことを定める一連の規則に従います。 例えば、あるビットコインアドレスで、以前に受け取ったビットコインよりも多くのビットコインを使用できません。 このルールは、ビットコインをはじめとする多くのブロックチェーンのすべてのトランザクションを支えるものです。
イーサリアムには、ほぼ同様の直観的なルールに従うイーサリアムのネイティブ暗号通貨(イーサ)に加えて、スマートコントラクトというさらに強力な機能があります。 この機能は複雑なため、説明にはより詳しい例が必要になります。 イーサリアムは分散台帳ではなく、分散型の状態マシン(opens in a new tab)です。 イーサリアムの状態とは、全アカウントとその残高を保持するだけでなく、予め定義されたルールに従ってブロックごとに変化し、任意のマシンコードを実行できるマシンの状態を保持する、巨大なデータ構造です。 ブロックごとの状態変化の具体的なルールは、EVMによって定義されています。
イーサリアムEVM(opens in a new tab)からの図解
イーサリアムの状態遷移関数
EVMは数学の関数のように動作し、入力に対して決定論的な出力が得られます。 そのため、イーサリアムを状態遷移関数を持つと正式に表現することもできます。
1Y(S, T)= S'
古い有効な状態 (S)
と新しい有効なトランザクションのセット(T)
により、イーサリアムの状態遷移関数Y(S, T)
は新しい有効な出力状態 S'
を生成します。
状態
イーサリアムにおける「状態」とは、修正マークルパトリシアツリーと呼ばれる巨大なデータ構造であり、ハッシュでリンクされたすべてのアカウントを保持し、ブロックチェーンに保存されている単一のルートハッシュにまとめることができます。
トランザクション
イーサリアムにおける「トランザクション」とは、アカウントから暗号的に署名された一連の指示です。 トランザクションには、メッセージの呼び出しが発生するものと、コントラクトの作成が発生するものの2種類があります。
スマートコントラクトを作成すると、コンパイルされたスマートコントラクトバイトコードを含む、新規コントラクトアカウントが作られます。 他のアカウントがスマートコントラクトへメッセージの呼び出しを行うたびに、そのバイトコードが実行されます。
EVM指示
EVMは1024項目を含むスタックマシン(opens in a new tab)として実行されます。 各項目は256ビットの単語で、これは256ビットの暗号(Keccak-256ハッシュやsecp256k1シグネチャなど)を使いやすいように選択されています。
実行中、EVMは一時的なメモリ(ワードアドレスによるバイト配列として)を持ちますが、これはトランザクション間には継続されません。
しかし、スマートコントラクトにはマークルパトリシアストレージのツリーが(ワードアドレス可能なワードアレイとして)含まれており、当該アカウントに関連付けられ、グローバルな状態の一部となっています。
コンパイルされたスマートコントラクトのバイトコードは、XOR
、AND
、 ADD
、 SUB
のような標準的なスタック操作を行う多数のEVMオペコードとして実行されます。 また、EVMはADDRESS
、BALANCE
、BLOCKHASH
など、ブロックチェーン固有のスタック操作を多数実装しています。
イーサリアムEVM(opens in a new tab)からの図解
EVMの実装
EVMのすべての実装は、イーサリアムイエローペーパーに記載されている仕様を遵守する必要があります。
イーサリアムが誕生してから9年間にわたって、EVMは数多くの改訂を受け、様々なプログラミング言語で実装されてきました。
イーサリアム実行クライアントにはEVMの実装が含まれています。 また、次のようなスタンドアローンの実装も複数あります。
- Py-EVM(opens in a new tab) - Python
- evmone(opens in a new tab) - C++
- ethereumjs-vm(opens in a new tab) - JavaScript
- revm(opens in a new tab) - Rust
参考文献
- イーサリアムイエローペーパー(opens in a new tab)
- Jellopaper(別名: KEVM): KにおけるEVMのセマンティクス(opens in a new tab)
- The Beigepaper(opens in a new tab)
- イーサリアム仮想マシンのオペコード(opens in a new tab)
- イーサリアム仮想マシンオペコードのインタラクティブリファレンス(opens in a new tab)
- Solidityドキュメントの簡単な紹介(opens in a new tab)
- マスタリング・イーサリアム - イーサリアム仮想マシン(opens in a new tab)