イーサリアム仮想マシン(EVM)
最終更新: 2026年2月25日
イーサリアム仮想マシン(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によって定義されています。
Ethereum EVM illustrated (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は一時的な_メモリ_(ワードアドレス指定バイト配列として)を維持しますが、トランザクションをまたいで永続化されることはありません。
一時ストレージ
一時ストレージは、TSTOREおよびTLOADオペコードを介してアクセスされる、トランザクションごとのキー・バリューストアです。 同一トランザクション中のすべての内部コールにわたって永続しますが、トランザクションの終了時にクリアされます。 メモリとは異なり、一時ストレージは実行フレームではなくEVM状態の一部としてモデル化されていますが、グローバル状態にはコミットされません。 一時ストレージは、トランザクション中の内部コール間でのガス効率の良い一時的な状態共有を可能にします。
ストレージ
コントラクトには、問題のアカウントに関連付けられ、グローバル状態の一部であるマークルパトリシア_ストレージ_ツリー(ワードアドレス指定のワード配列として)が含まれています。 この永続ストレージは、単一のトランザクションの期間中のみ利用可能で、アカウントの永続ストレージツリーの一部を形成しない一時ストレージとは異なります。
オペコード
コンパイルされたスマートコントラクトのバイトコードは、XOR、AND、ADD、SUBなどの標準的なスタック操作を実行する多数のEVMオペコードとして実行されます。 またEVMは、ADDRESS、BALANCE、BLOCKHASHなど、ブロックチェーンに固有のスタック操作も多数実装しています。 オペコードセットには、一時ストレージへのアクセスを提供するTSTOREとTLOADも含まれます。
Ethereum EVM illustrated (opens in a new tab)より引用した図
EVMの実装
EVMのすべての実装は、イーサリアムイエローペーパーに記載されている仕様を遵守する必要があります。
イーサリアムの10年の歴史の中で、EVMは数度の改訂を経ており、様々なプログラミング言語による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)