メインコンテンツへスキップ
Change page

イーサリアム仮想マシン(EVM)

最終編集者: , 2024年4月1日

イーサリアム仮想マシン(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の構成図 イーサリアム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は一時的なメモリ(ワードアドレスによるバイト配列として)を持ちますが、これはトランザクション間には継続されません。

しかし、スマートコントラクトにはマークルパトリシアストレージのツリーが(ワードアドレス可能なワードアレイとして)含まれており、当該アカウントに関連付けられ、グローバルな状態の一部となっています。

コンパイルされたスマートコントラクトのバイトコードは、XORANDADDSUBのような標準的なスタック操作を行う多数のEVMオペコードとして実行されます。 また、EVMはADDRESSBALANCEBLOCKHASHなど、ブロックチェーン固有のスタック操作を多数実装しています。

EVMを実行にガスが必要な箇所を示す図 イーサリアムEVM(opens in a new tab)からの図解

EVMの実装

EVMのすべての実装は、イーサリアムイエローペーパーに記載されている仕様を遵守する必要があります。

イーサリアムが誕生してから9年間にわたって、EVMは数多くの改訂を受け、様々なプログラミング言語で実装されてきました。

イーサリアム実行クライアントにはEVMの実装が含まれています。 また、次のようなスタンドアローンの実装も複数あります。

参考文献

この記事は役に立ちましたか?