EVMとは?
EVM(Ethereum Virtual Machine)は、Ethereum上でトランザクションを処理し、スマートコントラクトのコードを実行する環境です。EVMは共有型の仮想コンピューターとして機能し、そのルールは世界中のEthereum実行クライアントによって適用されます。ユーザーがトークンを送金する、分散型アプリケーションを通じて暗号資産を交換する、NFTを作成する、レンディングプロトコルに担保を預け入れる、または別のスマートコントラクトを呼び出すと、EVMはその操作の結果を計算します。EVMは、単一の物理マシンやサーバーとして存在するわけではありません。その代わり、参加する各Ethereumノードが、同じ順序で並んだトランザクションに同じ実行ルールを個別に適用します。この設計により、アカウント残高、コントラクトのストレージ、トークンの所有権など、ブロックチェーンの状態変更が正しく計算されたことをノードが確認できます。公式のEthereum Virtual Machineのドキュメントでは、EVMはEthereumノード間で一貫してコードを実行する分散型の仮想環境と説明されています。
EVMはEthereumの実行レイヤーの中核を担いますが、Ethereumネットワーク全体を指すものではありません。Ethereumは、コンセンサス、ピアツーピアネットワーク、データストレージ、ブロック生成、バリデーターなど、ほかのプロトコル要素にも依存しています。EVMが担うのは、計算と状態遷移に特化した処理です。EVMの役割
EVMはトランザクションの指示を読み取り、スマートコントラクトのバイトコードを実行し、ガス消費量を計算して、Ethereumの状態をどのように変更するかを決定します。ETHの送金、コントラクト関数の呼び出し、新しいコントラクトのデプロイ、コントラクトストレージの更新、イベントログの作成、要求されたデータの返却などを実行できます。トランザクションを適用する前に、Ethereumの実行システムは送信者の署名、nonce、利用可能残高、ガスリミット、トランザクション形式などの要件を確認します。トランザクションがスマートコントラクトを呼び出す場合、EVMはバイトコードで定義された順序に従ってコントラクトの命令を実行します。同じトランザクション内で、EVMがほかのコントラクトを呼び出すこともあります。この機能により、分散型アプリケーションは複数のプロトコルやトークンシステムを1つのアトミックな処理に組み合わせられます。実行後、EVMは状態変更を成功させるか、失敗を報告します。実行がリバートされた場合、意図されたコントラクトの状態変更は通常取り消されます。ただし、送信者は一般に、すでに行われた計算処理の費用を支払います。最終的な実行結果には、残高の更新、ストレージの変更、出力されたログ、返却データ、トランザクションレシートなどが含まれる場合があります。暗号資産におけるEVMの重要性
EVMは、Ethereumを単なる暗号資産の送金ネットワークから、プログラム可能なブロックチェーンプラットフォームへと発展させる役割を果たしています。プログラム可能な実行環境がなければ、ブロックチェーンの主な用途はネイティブ資産の送金記録に限られる可能性があります。EVMにより、開発者はトークン、レンディング市場、分散型取引プロトコル、ステーブルコインシステム、ブロックチェーンゲーム、ガバナンスツール、IDアプリケーションなど、さまざまなオンチェーンサービスを構築できます。EVM上で動作するスマートコントラクトは、すべての操作に従来型の中央管理者の承認を必要とせずに、資産を保有し、ルールを適用できます。有効なトランザクションを送信し、必要な手数料を支払えるユーザーなら、誰でも同じ実行ルールを利用できます。このパーミッションレスな仕組みは、相互に連携できるオープンな暗号資産アプリケーションを支えています。また、多くのほかのブロックチェーンネットワークがEVM互換またはEVM同等の実行環境を採用しているため、EVMはEthereum以外でも重要な技術標準となっています。こうした普及により、開発者は複数のネットワーク間でスマートコントラクト、ウォレット、プログラミング言語、トークン標準、開発ツールを再利用できます。EVMはブロックチェーンですか?
EVM自体はブロックチェーンではありません。ブロックチェーントランザクションの影響を計算する仮想実行システムです。Ethereumはブロックを記録し、コンセンサスを維持し、データを配布するとともに、EVMを使ってプログラム可能な処理を実行するブロックチェーンネットワークです。Ethereum全体をネットワークとするなら、EVMはその実行レイヤーにある計算エンジンと考えるとよいでしょう。ほかのブロックチェーンネットワークもEVMを実装できますが、Ethereumのブロックチェーン履歴、バリデーター、残高、セキュリティ予算、ネイティブ資産を共有するとは限りません。そのため、EVMベースの2つのチェーンが似たスマートコントラクトコードを実行できても、完全に別個のネットワークとして存在することがあります。EVMによるトランザクション処理の流れ
EVMトランザクションは通常、ユーザーが暗号資産ウォレットや分散型アプリケーションで操作を選択すると開始されます。ウォレットは、送信先アドレス、送金額、入力データ、nonce、ガスリミット、手数料設定などを含むトランザクションを作成します。ユーザーは秘密鍵でトランザクションに署名します。署名により、送信元アカウントの管理者がトランザクションを承認したことが証明されます。署名済みトランザクションはEthereumノードに送信され、保留中トランザクションのプールに入る場合があります。ブロック生成者はトランザクションを選択し、順序を付けてブロックのペイロードに含めます。EVMは、同じブロック内の先行するすべてのトランザクションによって作成された状態を基に、各トランザクションを処理します。トランザクションによって、別のトランザクションが利用する残高、価格、承認、ストレージ値が変わることがあるため、処理順序は重要です。ブロック全体を処理した後、実行クライアントはその結果となるEthereumの状態を計算します。ほかのノードも同じ処理を繰り返し、提案されたブロックがEthereumのルールに従っていることを確認します。公式のEthereumトランザクションのドキュメントでは、署名済みの指示によって価値を移転し、コントラクトを作成し、既存のコントラクトを呼び出す方法が説明されています。
EVMの状態遷移
状態遷移とは、ある有効なEthereumの状態から別の有効な状態への変化です。Ethereumの状態には、アカウント、ETH残高、スマートコントラクトのコード、コントラクトストレージ、アカウントのnonceが含まれます。EVMは現在の状態と順序付けられたトランザクションを入力として受け取ります。その後、Ethereumの実行ルールを適用して次の状態を計算します。基本的なETH送金では、状態遷移によって送信者の残高が減り、受信者の残高が増えます。トークン交換では、トークン残高、使用許可、流動性プールの準備金、手数料記録、イベントログなどが更新される場合があります。レンディングのトランザクションでは、担保額、債務残高、金利インデックス、アカウントのリスク指標などが更新される場合があります。正当な実行クライアントであれば、同じ開始条件から同じ状態遷移を計算する必要があります。ノードが中央コンピューターを信頼せずに同じ結果へ合意するには、この決定論的な動作が不可欠です。EthereumアカウントとEVM
Ethereumには、外部所有アカウントとコントラクトアカウントがあります。外部所有アカウントは秘密鍵によって管理されます。コントラクトアカウントはスマートコントラクトのコードによって制御されます。どちらのアカウントもETHを保有できますが、その動作は異なります。外部所有アカウントは、管理者が署名するとトランザクションを開始できます。コントラクトアカウントは、秘密鍵を使って通常のトランザクションに独自に署名することはありません。別のトランザクションやコントラクトとのやり取りを通じて有効な呼び出しを受けると、そのコードが実行されます。公式のEthereumアカウントのドキュメントでは、アカウントにはユーザーが管理するものと、スマートコントラクトとしてデプロイされるものがあると説明されています。
EVMは、トランザクションの検証、価値の移転、コントラクトコードの読み込み、ストレージの更新時にアカウント情報を参照します。スマートコントラクトとEVM
スマートコントラクトとは、Ethereumアドレスに保存されたプログラムです。トランザクションまたは別のコントラクトが関数を呼び出すと、EVMがそのプログラムを実行します。スマートコントラクトには、変数、関数、権限、イベント、エラー、デジタル資産を扱うルールなどを含められます。Ethereumのスマートコントラクトは、主にSolidityまたはVyperで記述されます。ソースコードはデプロイ前に、より低水準のEVMバイトコードへコンパイルされます。公式のEthereumスマートコントラクトガイドでは、コントラクトのデプロイや操作にはトランザクションとガスが必要だと説明されています。
デプロイ後、実行時のバイトコードはコントラクトアカウントの一部として保存されます。EVMは元のSolidityやVyperのソースコードを直接理解するのではなく、そのバイトコードを読み取り、実行します。実際にオンチェーンの動作を制御するのはデプロイ済みのバイトコードであるため、この違いは重要です。EVMバイトコードとは?
EVMバイトコードは、Ethereum Virtual Machineが実行する機械可読形式の命令列です。一般に、長い16進数の値として表示されます。バイトコードの各部分は、オペコード、データ値、またはその他の実行情報を表します。スマートコントラクトのソースコードは人間が読みやすいように設計されていますが、バイトコードはEVMが処理するためのものです。デプロイされるコントラクトには通常、作成コードと実行時コードがあります。作成コードはデプロイ時に一度実行され、コントラクトアドレスに残る実行時コードを返します。実行時コードは、ユーザーやほかのコントラクトがデプロイ済みコントラクトを操作するたびに実行されます。Solidityのスマートコントラクト入門では、EVMがコントラクトのコード領域に保存されたバイト列を読み取り、解釈し、実行すると説明されています。
開発者は、ユーザーが読みやすいコントラクトとデプロイ済みのバイトコードを比較できるよう、ソースコードを公開して検証することがあります。EVMオペコードとは?
オペコードは、EVMが理解する低水準の個別命令です。各オペコードは特定の処理を実行します。算術演算、比較、ビット演算を行うオペコードもあります。トランザクションデータの読み取り、アドレスの確認、メモリの読み込み、コントラクトストレージへのアクセス、ログの作成、別のコントラクトの呼び出しなどを行うものもあります。例として、加算を行うADD、コントラクトストレージを読み取るSLOAD、ストレージを変更するSSTORE、別のアカウントを呼び出すCALL、エラーを返して実行を停止するREVERTがあります。公式のEthereum EVMオペコードのリファレンスには、利用可能な命令とガスコストが記載されています。
プログラムカウンターを変更する命令や実行を終了する命令がない限り、オペコードは順番に実行されます。Ethereumのアップグレードによって、新しい命令が追加されたり、ガスコストが変更されたり、特定の操作の動作が変わったりする場合があります。そのため、コンパイラーの設定では、デプロイ先ネットワークがサポートするEVMバージョンを指定する必要があります。EVMのスタックの仕組み
EVMは一般に、スタックベースの仮想マシンと説明されます。スタックは、後入れ先出しの順序に従う一時的なデータ構造です。EVMオペコードは通常、スタックの先頭から値を取り出し、結果をスタックの先頭に戻します。たとえば加算命令は、スタックから2つの値を取り出して加算し、その結果をスタックに戻します。EVMは多くの演算で256ビットワードを使用します。このワードサイズは、Ethereumの暗号計算やアカウント値に適しています。スタックの深さには上限があるため、コンパイラーや開発者は複雑な計算を慎重に構成する必要があります。スタックエラーが発生すると、実行に失敗することがあります。EVMメモリ
EVMメモリは、コントラクト呼び出しの実行中に使用できる一時的なバイトアドレス指定領域です。関数の引数、返却データ、一時配列、エンコードされた値、中間計算結果などを保持できます。現在の実行コンテキストが終了すると、メモリは消去されます。永続的なオンチェーンストレージとしては使用されません。コントラクトがより大きなメモリ範囲にアクセスすると、メモリのガスコストが増加する場合があります。そのため、メモリを効率的に使うことで、複雑なトランザクションのコストを抑えられる可能性があります。メモリとストレージは存続期間、目的、ガスコストが異なるため、開発者は区別する必要があります。EVMストレージ
EVMストレージは、スマートコントラクトに関連付けられた永続データ領域です。ストレージの値はトランザクションの終了後もEthereumの状態の一部として残ります。コントラクトは、トークン残高、所有権記録、プロトコル設定、アカウントの債務、ガバナンス投票など、長期的な情報をストレージに保存します。検証するすべてのノードが状態変更を保持し、処理する必要があるため、ストレージへの書き込みは一時的なメモリの読み取りより一般に高コストです。ストレージは256ビットのスロット単位で構成されます。Solidityでは、定められたレイアウトルールに従って、高水準の変数、配列、構造体、マッピングがこれらのスロットに割り当てられます。アップグレード可能なコントラクトのストレージレイアウトを安全に変更しないと、既存データが破損するおそれがあります。そのため、ストレージ設計はスマートコントラクトのセキュリティとガス最適化における重要な要素です。Calldataと返却データ
Calldataは、外部コントラクト呼び出しに渡される読み取り専用の入力データです。通常、関数セレクターと、それに続くエンコード済みの関数引数が含まれます。EVMはこの情報を使って、実行する関数と渡す値を判断します。Calldataは、受信側のコントラクトが直接変更できない点でメモリと異なります。コントラクトは、呼び出し元のアカウントやコントラクトにデータを返すこともできます。返却データには、トークン残高、計算済みの見積もり、トランザクション結果、エンコードされたエラーなどが含まれる場合があります。外部アプリケーションは、読み取り専用の呼び出しを使い、オンチェーントランザクションを作成せずにコントラクト関数をシミュレーションして返却データを取得できます。ガスとEVM
ガスは、EVMが行う計算処理の量を測定する単位です。各オペコードには、定められたガスコストがあります。単純なETH送金は通常、複数のスマートコントラクトとストレージ変更を伴う複雑なトランザクションより少ないガスで済みます。送信者はガスリミットを設定し、トランザクションが消費できるガスの上限を定めます。実行完了前に利用可能なガスをすべて使い切ると、ガス不足となり、意図された状態変更はリバートされます。送信者は、すでに行われた計算処理の費用を支払います。公式のEthereumのガスと手数料に関するドキュメントでは、複雑なスマートコントラクトのトランザクションほど多くの計算処理が必要となり、より高いガスリミットが必要になると説明されています。
ガスは、プログラムがネットワーク資源を無制限に使用するのを防ぎます。ガスがなければ、誤ったコードや悪意のあるコードが、すべての実行クライアントに無限の計算負荷をかける可能性があります。ガスリミットとガス価格
ガスリミットは、トランザクションが使用できる計算用ガスの最大量です。ガス価格は、適用される手数料ルールのもとで、送信者がガス1単位あたりに支払う意思のある額を示します。ガスリミットを高く設定しても、必ずその分のガスをすべて消費するわけではありません。通常、送信者が支払う額は、現在のトランザクション手数料ルールに基づく実際のガス使用量によって決まります。ガスリミットが低すぎると、実行完了前にトランザクションが失敗する場合があります。手数料設定が低すぎると、ブロックスペースの需要が高いときにトランザクションが保留されたままになる可能性があります。ウォレットは通常、両方の値を推定しますが、トランザクションがブロックに含まれるまでにEthereumの状態やネットワーク需要が変化するため、推定値が変わる場合があります。プリコンパイル済みコントラクト
プリコンパイル済みコントラクトは、予約されたEthereumアドレスで利用できるプロトコルレベルの特別な関数です。通常のスマートコントラクト呼び出しと同様の方法で呼び出せます。ただし、その動作はアドレスに保存された通常のEVMバイトコードではなく、実行クライアントに直接実装されています。通常のオペコード列で実行すると非効率になる暗号演算に、プリコンパイル済みコントラクトがよく使われます。プリコンパイル済みコントラクトに関するSolidityドキュメントでは、その動作とガス使用量がEVM実行環境内に実装されていると説明されています。
ネットワークで効率的かつ標準化された処理が必要になった場合、Ethereumのアップグレードによってプリコンパイルが追加されることがあります。メッセージコール
メッセージコールとは、あるアカウントが別のアカウントを呼び出すEVM上のやり取りです。外部所有アカウントは、署名済みトランザクションを送信して処理を開始できます。その後、スマートコントラクトが実行中に別のコントラクトを呼び出すことがあります。メッセージコールでは、ETHの送金、入力データの提供、ガスの割り当て、コントラクトコードの実行要求が可能です。ネストされた呼び出しにより、1つのトランザクション内で複数のアプリケーションが連携できます。一方、外部コントラクトが予期しない動作や悪意のある動作をする可能性があるため、ネストされた呼び出しにはセキュリティ上の懸念もあります。安全なコントラクトでは、外部呼び出しを慎重に管理し、リエントランシーなどの相互作用に伴うリスクから重要な状態を保護する必要があります。コントラクトの作成
EVMは、コントラクト作成トランザクションまたはコントラクト作成オペコードを処理すると、新しいスマートコントラクトを作成できます。デプロイは初期化コードから始まります。初期化コードは、コンストラクター引数を処理し、初期ストレージ値を設定して、実行時バイトコードを返すことができます。その後、実行時バイトコードは新しいコントラクトアドレスに保存されます。EVMは作成コードを実行し、Ethereumに永続的なコードと状態を追加するため、コントラクトのデプロイにはガスが必要です。一般に、サイズの大きいコントラクトや複雑なコンストラクターほど、デプロイコストが高くなります。ガス不足、実行ルール違反、初期化中のリバートなどが発生すると、デプロイに失敗する場合があります。イベントとログ
スマートコントラクトは、EVMの実行中にログを作成できます。開発者は通常、Solidityのイベントを通じてこれらのログを公開します。イベントには、トークンの送金、交換、入金、ガバナンス投票、権限変更、その他のコントラクト上の動作を記録できます。ログはトランザクションレシートに保存され、外部アプリケーションでインデックス化できます。ウォレット、ブロックチェーンエクスプローラー、分析システム、分散型アプリケーションのインターフェースなどで役立ちます。コントラクトは、ストレージを読むのと同じ方法で過去のイベントログを直接読み取ることはできません。そのため、将来のコントラクト実行に必要な情報をイベントだけに依存させるべきではありません。EVMトランザクションのリバートと失敗
EVMトランザクションは、いくつかの理由で失敗する場合があります。署名が無効、nonceが不正、残高不足、ガス不足、または形式が未対応である可能性があります。また、必要な条件が満たされない場合、スマートコントラクトが意図的にリバートすることもあります。たとえば、送信者のトークン残高が不足していると、トークン送金がリバートされる場合があります。ユーザーが設定した最低受取額を下回る場合、分散型取引での交換がリバートされることがあります。呼び出し元に権限がない場合、コントラクトの権限チェックによってリバートされることがあります。リバートされると、失敗した実行経路で行われた状態変更は通常取り消されます。実行クライアントが要求された処理をすでに行っているため、消費済みのガスは一般に返金されません。トランザクションの失敗は、必ずしもEthereumやEVMの障害を意味するものではありません。多くの場合、現在の状態において、そのトランザクションがコントラクトやプロトコルのルールを満たせなかったことを意味します。アトミックな実行
EVMトランザクションはアトミックです。つまり、トランザクションの実行範囲内で、状態変更はすべて成功するか、すべて失敗します。この特性により、複雑なトランザクションでも、意図した処理の一部だけが残る事態を避けながら、複数の関連手順を実行できます。たとえば、分散型金融のトランザクションでは、資産を借り入れ、交換し、別の債務を返済し、担保を更新する処理を1回の実行で行う場合があります。必要な手順が失敗してトランザクションがリバートされると、そのトランザクション内で先に行われた状態変更も取り消されます。アトミック性は一部の決済リスクを軽減しますが、トランザクションが経済的に有利または安全であることを保証するものではありません。ユーザーが承認した資産を悪意のあるコントラクトが移転するアトミックなトランザクションも、正常に完了する可能性があります。決定論的な実行
EVMは決定論的です。同じ有効な入力と開始状態であれば、正当な実行クライアントはすべて同じ結果を生成する必要があります。分散型の検証には決定論が不可欠です。同じトランザクションからノードごとに異なる結果が計算されると、残高やコントラクトの状態に合意できなくなります。そのため、スマートコントラクトはEVM実行中に通常のウェブサイトやプライベートデータベースから変化する外部情報を直接取得できません。外部データは通常、オラクルまたは別のオンチェーントランザクションを通じて取り込まれます。その後、すべてのノードが同じルールのもとで、提出された同じ値を処理できます。EVMとコンセンサス
EVMが実行を担う一方、Ethereumのコンセンサスシステムは、バリデーターがブロックの順序と確定性について合意するのを支援します。実行では、トランザクションと状態変更がEthereumのルールに従っているかを判断します。コンセンサスでは、ネットワークがどの有効なチェーン履歴を採用するかを決定します。EthereumがProof of Stakeへ移行した後、フルノードは実行クライアントとコンセンサスクライアントの両方を使用します。実行クライアントはトランザクションを実行し、Ethereumの実行状態を維持します。コンセンサスクライアントは、バリデーターの活動、ブロック提案、アテステーション、フォーク選択、ファイナリティを追跡します。公式のEthereumノードとクライアントのドキュメントでは、これらのクライアント要素が連携する仕組みが説明されています。
EVMだけで、提案されたブロックのうちどれが正規のブロックになるかを独自に決定することはできません。コンセンサスレイヤーも、実行レイヤーなしに複雑なスマートコントラクトの結果を独自に計算することはできません。EVM実行クライアント
実行クライアントは、Ethereumの実行ルールを実装するソフトウェアです。トランザクションを検証し、EVMバイトコードを処理し、ブロックチェーンの状態を維持し、ピアと通信して、アプリケーション向けのインターフェースを提供します。異なる実行クライアントは、それぞれ別のプログラミング言語で開発されても、同じプロトコル仕様に従うことができます。Ethereumが1つのソフトウェアコードベースに完全に依存しないため、クライアントの多様性はレジリエンスの向上につながります。ただし、互換性のある実行クライアントは、すべて同じ有効な結果を計算しなければなりません。Ethereum Execution Layer Specificationsは、Ethereumの実行動作とネットワークアップグレードに関する、読みやすく実行可能なリファレンスを提供します。
実行仕様のテストは、異なるクライアントが特殊な状況を一貫して処理することを開発者が確認するのに役立ちます。EVMとJSON-RPC
ウォレットや分散型アプリケーションは通常、JSON-RPCメソッドを通じて実行クライアントと通信します。これらのメソッドでは、アカウント残高の読み取り、ガスの推定、コントラクト呼び出しのシミュレーション、ログの取得、ブロックの確認、署名済みトランザクションの送信などを行えます。Ethereum Execution API仕様では、JSON-RPCをユーザー、インフラストラクチャ、実行クライアント間の標準インターフェースと説明しています。
読み取り専用のRPC呼び出しでは、トランザクションをブロックチェーンに追加せずに、実行クライアントへEVMの動作をシミュレーションするよう要求できます。署名済みトランザクションの送信メソッドは、後にブロックへ含まれる可能性があるトランザクションをブロードキャストします。RPCプロバイダーはアプリケーションを使いやすくしますが、リモートプロバイダーを利用するユーザーは、正確で利用可能なデータを返すことをそのプロバイダーに依存します。自分でノードを運用すれば、Ethereumの実行情報により直接的かつ独立してアクセスできます。EVM互換チェーンとEVM同等チェーン
EVM互換チェーンは、Ethereum Virtual Machine向けに構築されたスマートコントラクトやツールをサポートします。EVM同等チェーンは一般に、Ethereumの実行動作をより忠実に再現することを目指します。どちらの方式でも、開発者はSolidity、Ethereum形式のアドレス、使い慣れたウォレット、一般的なトークン標準を利用できる場合があります。ただし、ほかのEVMネットワークでは、バリデーター、手数料、ファイナリティのルール、ブロック時間、ブリッジ、システムコントラクト、セキュリティ上の前提が異なることがあります。Ethereumで動作するコントラクトでも、別のEVMネットワークにデプロイする前にテストが必要となる場合があります。コンパイラーのターゲット、対応オペコード、プリコンパイル、トランザクション形式、ガスの動作、外部依存関係などが異なる可能性があります。Solidityコンパイラーのドキュメントでは、誤ったEVMバージョンをターゲットにコンパイルすると、予期しない動作や実行失敗につながる可能性があると注意を促しています。
EVM互換性は移植性を高めますが、別々のチェーンを同一にするものではありません。EVMのアップグレード
EVMはEthereumのプロトコルアップグレードによって変更されることがあります。アップグレードでは、オペコードの導入、ガスコストの変更、新しいトランザクション形式の追加、アカウントの動作変更、新しいプリコンパイルの提供などが行われる場合があります。提案されるプロトコル変更は、一般にEthereum Improvement Proposal(EIP)に記載されます。レビュー、テスト、調整、コミュニティでの採用を経て、選定された変更がネットワークアップグレードに組み込まれることがあります。実行クライアントは、適用開始時点で新しいルールに従うようソフトウェアを更新する必要があります。新しいルールはコンパイルのターゲット、ガス見積もり、低水準アセンブリ、コントラクトの動作に影響する場合があるため、スマートコントラクト開発者はアップグレードを注視する必要があります。アップグレード後も安定しているとは限らない、文書化されていないEVMの動作にコントラクトが依存しないようにする必要があります。EVMのセキュリティリスク
EVMは有効なバイトコードを一貫して実行しますが、そのバイトコードが安全または公正であることを保証するものではありません。スマートコントラクトには、コーディングミス、弱い権限設定、安全でないアップグレードの仕組み、経済的な欠陥、または意図的に悪意のある関数が含まれる可能性があります。命令自体が有効であれば、EVMは有害なロジックでも正しく実行する場合があります。一般的なスマートコントラクトのリスクには、リエントランシー、アクセス制御の誤り、オラクル操作、算術ミス、署名の誤用、ストレージの衝突、安全でない外部呼び出しなどがあります。コンパイラーのバグがデプロイ済みバイトコードに影響することもあります。公式のSolidityの既知のコンパイラーバグ一覧は、コンパイラーのバージョンに関連するセキュリティ上重要な問題の特定に役立ちます。
監査、テスト、形式検証、コードレビュー、権限の制限、慎重なアップグレード管理によってリスクを軽減できる場合があります。監査を受けても、EVMコントラクトが今後一切失敗したり、悪用されたりしないと保証されるわけではありません。暗号資産ユーザーにとってのEVMリスク
暗号資産ユーザーは、トークンの承認、トランザクションへの署名、Ethereumスマートコントラクトの利用時にEVMとやり取りします。ウォレットの署名は、単純な送金以上の操作を承認する場合があります。トークンの使用許可、コントラクトの呼び出し、権限の委任、その他の権限付与を承認する可能性があります。署名する前に、ユーザーはトランザクションの確認画面を読み、送信先のコントラクトを検証する必要があります。EVMでの実行が成功したことから分かるのは、そのトランザクションがコードとプロトコルのルールに従ったということだけです。ユーザーが結果を意図していたことや、アプリケーションが信頼できることを証明するものではありません。悪意のある分散型アプリケーションは、有効なEVM呼び出しを使って承認済みの資産を移転する場合があります。不明なリンクを避け、コントラクトアドレスを確認し、トークン承認を必要最小限にし、長期保有資産は実験的なアプリケーションに使用するウォレットと分けて管理してください。暗号資産トレーダーにとってのEVMリスク
暗号資産トレーダーは、分散型取引、レンディング、ステーキング、ブリッジ、強制決済プロトコルを利用する際に、EVM関連のリスクに直面することがあります。EVMがトランザクションを実行する前に価格が変わり、取引が失敗する場合があります。スリッページ許容幅を広く設定すると、スワップの受取額が不利になることがあります。同じブロック内で、ほかのトランザクションとの順序を変更される場合があります。この順序によって、プール価格、強制決済の結果、トークンの利用可能性が変わる可能性があります。市場が不安定なときには、高いガス代によってオンチェーンポジションの決済や調整に費用がかかることもあります。トレーダーが十分なトークン担保を持っていても、実行に必要なネイティブETHが不足する場合があります。そのため、ガス残高を確保し、トランザクション設定を確認することは、オンチェーン取引のリスク管理の一部です。EVMと最大抽出可能価値(MEV)
最大抽出可能価値とは、トランザクションの組み込みや順序を制御または左右することで得られる価値を指します。EVMはブロック内で指定された順番にトランザクションを処理します。2つのトランザクションが同じ流動性プールを利用する場合、先のトランザクションが後のトランザクションの受取結果を変えることがあります。サーチャーやブロック構築システムは、この性質を裁定取引、強制決済、その他の戦略に利用する場合があります。価格の整合性を高める戦略もあれば、ユーザーにとって不利な約定を招く戦略もあります。サンドイッチ攻撃では、ユーザーのスワップによる価格への影響から利益を得るため、その前後にトランザクションを配置します。公式の最大抽出可能価値に関するEthereumドキュメントでは、トランザクションの組み込み、除外、順序付けが経済的価値を生み出す仕組みが説明されています。
適切なスリッページ上限の設定、流動性の薄い市場の回避、利用可能な場合は保護された実行オプションの確認などによって、一部のリスクを軽減できます。EVMとトークン標準
EVMにより、開発者はスマートコントラクトを通じて共通のトークンインターフェースを実装できます。ERC-20は、代替可能トークンの共通インターフェースを定めています。ERC-721とERC-1155は、固有の資産や複数トークン資産の一般的な構造をサポートします。共通標準により、ウォレット、取引インターフェース、ブロックチェーンエクスプローラー、分散型アプリケーションは、使い慣れた関数を通じて多くのトークンと連携できます。公式のEthereumトークン標準のドキュメントでは、共通インターフェースが相互運用性を高める仕組みが説明されています。
トークン標準は想定される関数やイベントを定めますが、すべてのトークンコントラクトが安全で、誠実に管理されていることを保証するものではありません。トークンコントラクトに独自の送金ルール、手数料、ブラックリスト、ミント権限、アップグレード権限などが含まれる場合もあります。EVMとLayer 2ネットワーク
多くのEthereum Layer 2ネットワークは、EVM互換またはEVM同等の実行環境を提供します。これらのネットワークはEthereumの主要な実行環境の外でトランザクションを処理し、決済、データ可用性、セキュリティモデルの一部にEthereumを利用します。これにより、トランザクションコストの削減や処理能力の向上につながる場合があります。公式のEthereum Layer 2の概要では、ロールアップがEthereum Layer 1の外で処理を行い、Ethereumを決済基盤として利用する仕組みが説明されています。
Layer 2のEVMは似たスマートコントラクトのバイトコードを実行していても、ブロック生成、手数料計算、出金、ファイナリティのプロセスが異なる場合があります。ユーザーは、利用するLayer 2ネットワークのシーケンサー、ブリッジ、証明システム、データ公開方式、アップグレード管理を理解する必要があります。EVMが似ているからといって、Layer 2インフラに伴う追加リスクがなくなるわけではありません。EVMのメリット
EVMは、プログラム可能な暗号資産アプリケーション向けに標準化された環境を提供します。独立したノードが同じスマートコントラクトの結果を検証できます。一般に、開発者は中央運営者の許可を得なくてもコントラクトを公開できるため、オープンなデプロイが可能です。あるスマートコントラクトが別のスマートコントラクトと連携できるため、コンポーザビリティが実現します。広く利用されているトークン標準や開発ツールにも対応しています。また、ほかのブロックチェーンネットワークに共通の実行モデルを提供し、開発者の移行コストを抑えられる場合があります。EVM向けツール、ドキュメント、テストの知見、セキュリティ研究が豊富にあることで、アプリケーション開発に取り組みやすくなる可能性があります。EVMの制約
多くのノードが結果を検証する必要があるため、EVMの計算は中央集権型サーバーでの通常の計算より高コストです。永続ストレージも、実行クライアントが維持するブロックチェーンの状態に追加されるため、コストがかかります。Ethereumのブロックスペースには限りがあるため、多くのユーザーが実行枠を競い合うとトランザクション手数料が上がる場合があります。EVMは順序付けされた状態遷移を処理するため、多数のトランザクションが同じ状態にアクセスすると処理能力が制限される場合があります。事前にアップグレードシステムを設計していない限り、デプロイ後のスマートコントラクトを簡単に変更することはできません。アップグレード可能にすると柔軟性が高まる一方、管理者権限やストレージレイアウトに関するリスクも生じます。また、オラクルや別の信頼できるプロセスを通じてデータを取り込まない限り、外部情報が真実かどうかをEVMが判断することはできません。EVMによるトークンスワップの例
ユーザーが分散型流動性プールを通じて、あるERC-20トークンを別のトークンに交換するとします。ウォレットは、プールまたはルーティングコントラクトを呼び出すトランザクションデータを作成します。ユーザーはトランザクションに署名し、Ethereumネットワークに送信します。トランザクションがブロックに含まれると、EVMはユーザーのトークン使用許可を確認し、必要なコントラクトを呼び出します。コントラクトは現在の交換結果を計算し、プロトコル手数料を適用して、受取額がユーザーの最低受取額を下回らないか確認します。条件を満たせば、EVMはトークン残高と流動性プールのストレージを更新します。外部アプリケーションが読み取れるイベントログも作成します。受取額がユーザーの最低額を下回る場合や、別の条件が満たされない場合、トランザクションはリバートされます。リバート前に消費したガスは、一般にユーザーが支払います。この例は、EVMの実行によってウォレットの署名、トークン承認、スマートコントラクト、ガス、状態変更、トランザクションレシートがどのように結び付くかを示しています。EVMトランザクションの確認方法
まず、トランザクションを実行するネットワークを確認します。次に、送信先のアドレスまたはスマートコントラクトを検証します。続いて、送金する資産と数量を確認します。トランザクションがトークン承認や継続的な権限を要求していないか確認します。ガスの見積もりと最大手数料の設定を確認します。分散型取引の場合は、予想受取額、最低受取額、取引期限を確認します。適切な場合は、信頼できるブロックチェーンエクスプローラーやシミュレーションツールを使ってトランザクションを確認します。ウォレットが操作内容を説明できない場合や、トランザクションの送信元が不明な場合は、署名しないでください。オンチェーンポジションから緊急に退出する場合も含め、今後のトランザクションに必要なETHを十分に確保します。確定したEVMトランザクションは、通常、取り消すことが困難または不可能であることを忘れないでください。EVMに関するよくある誤解
よくある誤解の1つは、EVMが1つの組織によって所有される物理コンピューターだというものです。実際には、多数の独立したクライアントが実装する共有型の実行モデルです。別の誤解は、すべての暗号資産がスマートコントラクト内に保存されているというものです。EVMが状態を処理し、所有権はブロックチェーンのアカウント記録やコントラクト記録によって表されます。3つ目の誤解は、EVMとEthereumが同じものだというものです。EVMは、より広範なEthereumプロトコルを構成する重要な要素の1つです。4つ目の誤解は、有効なEVM実行であればトランザクションも安全だというものです。EVMは、悪意のあるロジックや経済的な損害をもたらすロジックも正しく実行する場合があります。5つ目の誤解は、すべてのEVMネットワークがEthereumと同じセキュリティを備えているというものです。ほかのEVMベースのネットワークでは、バリデーター、ブリッジ、ガバナンスシステム、信頼に関する前提が異なる場合があります。6つ目の誤解は、トランザクションに失敗してもコストがかからないというものです。EVMでの実行に失敗した場合も、通常、すでに行われた処理に応じてガスを消費します。FAQ
EVMは何の略ですか?
EVMはEthereum Virtual Machineの略です。EVMを簡単に説明すると?
EVMは、Ethereumのスマートコントラクトを実行し、オンチェーントランザクションの結果を計算する仮想計算環境です。EVMは実在するコンピューターですか?
いいえ。多数の独立したコンピューター上で動作するEthereum実行クライアントが実装する、仮想実行モデルです。EVMとEthereumは同じものですか?
いいえ。EVMはEthereumのスマートコントラクト実行環境です。Ethereumには、コンセンサス、ネットワーク、バリデーター、ブロックなど、ほかのプロトコル要素も含まれます。EVMで使えるプログラミング言語は何ですか?
SolidityとVyperは広く使われているスマートコントラクト言語で、EVMバイトコードにコンパイルされます。EVMバイトコードとは何ですか?
EVMバイトコードは、Ethereum Virtual Machineが実行する低水準の機械可読命令列です。EVMオペコードとは何ですか?
オペコードは、算術演算、ストレージへのアクセス、コントラクト呼び出し、エラー処理などを行う個別のEVM命令です。EVMがガスを使うのはなぜですか?
ガスは計算処理を測定し、限られた実行資源の利用に価格を設定するとともに、プログラムによる無制限の処理能力の消費を防ぎます。EVMトランザクションがガス不足になるとどうなりますか?
意図された状態変更はリバートされますが、送信者は一般に、実行停止までに消費したガスを支払います。EVMは悪意のあるコントラクトも実行しますか?
はい。コントラクトに有害、不誠実、または安全でないロジックが含まれていても、技術的に有効なバイトコードであればEVMは実行します。すべてのEVMチェーンは接続されていますか?
いいえ。EVMチェーンは似た実行技術を使っていても、残高、ブロック、バリデーター、コントラクト、トランザクション履歴は別々の場合があります。同じウォレットアドレスはすべてのEVMチェーンで使えますか?
通常、同じ秘密鍵から同じ形式のアドレスを生成できますが、そのアドレスの資産や活動は各チェーンで別々に管理されます。EVMトランザクションは取り消せますか?
通常、確定したEVMトランザクションは取り消せません。ただし、受信側のコントラクトに、修正トランザクションを実行できる有効な関数が含まれている場合は例外です。ウォレットのシミュレーションが成功したのにEVMトランザクションが失敗するのはなぜですか?
実際にトランザクションが実行されるまでに、ブロックチェーンの状態、ガスの状況、価格、流動性、コントラクトストレージが変化する場合があるためです。EVMと実行クライアントの違いは何ですか?
EVMはスマートコントラクトの計算に関する仮想マシンとルールセットです。実行クライアントは、そのルールを実装し、Ethereumの実行データを管理するソフトウェアです。Layer 2ネットワークはEVMを使いますか?
多くのLayer 2ネットワークは、Ethereumのスマートコントラクトやツールを再利用できるよう、EVM互換またはEVM同等の環境を採用しています。まとめ
EVM(Ethereum Virtual Machine)は、Ethereumのスマートコントラクトシステムの中核を担う、プログラム可能な実行環境です。トランザクションの指示を処理し、バイトコードを実行し、ガス消費量を計算し、ブロックチェーンの状態を更新して、トランザクション結果を生成します。EVMによって、Ethereumはトークン、分散型金融、NFT、ガバナンスシステム、ブロックチェーンゲームなど、さまざまな暗号資産アプリケーションをサポートできます。決定論的なルールにより、独立した実行クライアントが中央コンピューターを信頼せずに同じ結果を検証できます。スマートコントラクトは人間が読みやすい言語で記述され、低水準のオペコードで構成されるEVMバイトコードにコンパイルされます。実行中、EVMはスタック、メモリ、calldata、永続ストレージ、メッセージコール、ログなどを使ってコントラクトのロジックを処理します。ガスは計算処理に上限を設け、トランザクションが消費するネットワーク資源に対する支払いをユーザーに求めます。EVMはEthereumのコンセンサスレイヤーと連携しますが、実行とコンセンサスは異なる役割を担います。EVM互換チェーンやLayer 2ネットワークではEthereumの技術を再利用できますが、セキュリティ、手数料、ファイナリティ、インフラは異なる場合があります。EVMを理解すると、暗号資産ユーザーはガス代、スマートコントラクトの承認、失敗したトランザクション、トークン標準、分散型アプリケーション、オンチェーン取引のリスクをより把握しやすくなります。EVMは透明性のあるプログラム可能なルールを実行できる強力な仕組みですが、そのルールが安全か、経済的に有利かを判断するものではありません。ユーザーと開発者は、コントラクトの検証、権限の管理、コードのテスト、ネットワーク間の違いの確認を行い、署名するすべてのトランザクションを重要な承認として扱う必要があります。関連コンテンツ
WhatsMiner M30S++
Web3ドメイン
Web3プロジェクト
ホット
現在、市場で大きな注目を集めているトレンドの暗号資産
トップ取引高
取引高が最も多い暗号資産

