イーサリアム仮想マシン(EVM)
最終編集者: @, 2023年12月8日
イーサリアム仮想マシン(EVM)の物理的に例示することは、雲や海の波を指し示すようにはできませんが、イーサリアムクライアントを実行する数千の接続されたコンピュータによって維持される 1 つのエンティティとして存在します。
イーサリアムのプロトコル自体、この特別な状態マシンの継続的、無中断かつ変更不可能である動作を維持することが唯一の目的です。 すべてのイーサリアムアカウントとスマートコントラクトが存続する環境です。 チェーン内のすべてブロックにおいて、イーサリアムは単一の「正規」の状態のみを持ち、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
- eEVM(opens in a new tab) - C++
参考文献
- イーサリアムイエローペーパー(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)