要約:
- EVMとは、スマートコントラクトのプログラムの実行環境です。全てのトランザクションはスマートコントラクトによって実行されるため、EVMはトランザクションの実行環境でもあります。
- EVMは、イーサリアムバーチャルマシンとも呼ばれます。
- バーチャルマシンとは、物理コンピューターと同じ機能を、ソフトウェアで実現したものです。コンピュータの中のコンピュータとも説明されます。EVMは、イーサリアム上に存在する「仮想的なコンピュータ」です。
そもそもバーチャルマシンとは
バーチャルマシン(仮想マシン)とは、物理コンピューターと同じ機能を、ソフトウェアで実現したものです。コンピュータの中のコンピュータとも説明されます。
出典:「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
物理マシンと同じように、バーチャルマシンも独自のオペレーティング・システム(OS)、ストレージ、ソフトウェアなどを備えています。
また、単一の物理コンピュータ上で、複数のバーチャルマシンを動かすことも可能で、このときバーチャルマシン同士は互いに分離されています。

分離されているので、1つのバーチャルマシンで何かをやっても、他のバーチャルマシンは影響されません。
このバーチャルマシンを活用すると、1台のコンピュータをより効率的に、より安全に利用できます。具体的なメリットは以下の通りです。
コンピュータ1台で複数のOSを使える
バーチャルマシンを使うと、1台のコンピュータ上で複数のOSを同時に動かせます。
例えば、普段Windowsを使っているとします。でも、あるプログラムを試すためにはLinuxが必要だとします。その場合、Windows上でLinuxのバーチャルマシンを作れば、コンピュータを新たに購入する必要なく、そのプログラムを試せます。
ソフトウェアのテストが可能
バーチャルマシンは新しいソフトウェアやアップデートをテストするのに便利です。
新しいソフトウェアが本番環境のコンピュータシステムを壊すリスクを減らすために、開発者はソフトウェアをバーチャルマシン上でテストします。もし問題が起きても、バーチャルマシンだけが影響を受け、本物のコンピュータシステムは安全です。
サーバの仮想化で効率アップが可能
企業は通常、複数サーバを必要とします。しかし、それぞれのサーバに対して、それぞれ物理的なマシンを用意するのはスペースやコストの観点から非効率的です。
バーチャルマシンを使うと、1台の物理的なマシン上に複数の仮想的なサーバ(バーチャルマシン)を設置することができ、これによりスペースとコストを大幅に節約することができます。
EVM(イーサリアムバーチャルマシン)とは
EVM(イーサリアムバーチャルマシン)は、スマートコントラクトが確実に、予想通りに、そして安全に実行されることを保証するための実行環境です。
また、イーサリアムブロックチェーン上でスマートコントラクトを実行するための「仮想的なコンピュータ」のようなものです。
EVMの役割
EVMは以下の役割を持ちます。
- プログラムの実行
- スマートコントラクトの状態の保存
- ネットワークの一貫性の保持
- 翻訳機
- セキュリティの保証
プログラム(トランザクション)の実行
EVMは、スマートコントラクトが含むEVMコード(プログラム)を実行する環境です。イーサリアムのトランザクションは全て、スマートコントラクトで処理されるので、EVMはトランザクションの実行環境ともいえます。
スマートコントラクトが存在するアドレス(コントラクトアドレス)は、プログラム(EVMコード)のほかに、MemoryやStackを含んでいます。MemoryやStackは一時的なデータの保存場所で、プログラムを処理する際に使われています。
スマートコントラクトの状態の保持
EVMはコントラクトアドレスごとに、そのスマートコントラクトの状態を保持してくれます。
コントラクトアドレスとは、スマートコントラクトのアドレスのことです。トークンのスマートコントラクトアドレスは特に、トークンコントラクトと呼ばれます。
スマートコントラクトの状態とは、そのスマートコントラクトの利用者が与えたApprove(トークン承認)状況や、利用者のアカウント残高、スマートコントラクトの所有者などが保存される状態です。
イーサリアムはネットワーク全体の状態(ワールドステート)を保存します。ワールドステートは当然、スマートコントラクトの状態を含みます。そのため、EVMのStorageに保存されるスマートコントラクト単位の状態は、ワールドステートの構成要素です。

同じアドレスの残高が変わったときなどは、状態が上書き保存されます
ネットワークにおける一貫性の維持
イーサリアムの各ノードは、それぞれEVMを稼働させており、それぞれのEVMが同じ様に処理を実行しています。これにより、各ノードがお互いの結果を照会でき、ネットワーク全体で一貫性と分散性を保つことができます。
つまり、ネットワーク上のノードは互いに信頼し合うことなく、共通した情報を保有できます。
翻訳機
EVMは「翻訳機」と表現されることがあります。これは僕のような文系人間にとっては、ミスリーディングな説明な気がします。

なぜ翻訳機とされるか、買いてみたいと思います!
まず前提として、開発者はSolidityなどの人間が認識しやすい言葉で書かれます。しかし、Solidityなどは機械が認識できないので、機械語(バイトコード)に翻訳(コンパイル)される必要があります。
EVMが「翻訳機」と説明されていると、このコンパイルをEVMがやるように思ってしまいがちですが、コンパイル作業はそれ用のツールを使って開発者が行います。
では、EVMは何を何に翻訳するのでしょうか。
EVMはバイトコードを計算命令に翻訳(変換)しています。計算命令とは、バイトコードが表す内容を実現するために必要な計算処理のことです。
セキュリティ保証
EVMはスマートコントラクトの実行を管理し、ネットワークを攻撃や乱用から保護します。
例えば、ガスという仕組みを通じて、スマートコントラクトが無限ループに陥ったり、計算量が増えすぎてネットワークに過大な負担をかけるのを防いだりします。
EVMに関する処理の流れ
EVM(イーサリアムバーチャルマシン)に関する処理の具体的な流れを書きます。
開発者がスマートコントラクトを実装する流れ
はじめに開発者がスマートコントラクトを、イーサリアムで使える状態にしなければいけません。この作業は実装やデプロイと呼ばれていています。
その手順は以下の通りです。
①スマートコントラクトの作成
まず開発者がスマートコントラクトを、特定のプログラミング言語(Solidityなど)で書きます。書き終えたら、開発者は「solc」などのコンパイラ(翻訳機)を使い、書いたコードをコンパイル(翻訳)します。
スマートコントラクトはEVMで実行されますが、EVMはSolidityなどを理解できないため、EVMが理解できるバイトコード(機械語)に翻訳する必要があるのです。
②トランザクションのデプロイ
続いて、用意できたバイトコードをイーサリアムネットワークに「デプロイ」します。
「デプロイ」とは、一般的にはソフトウェアを実際の運用環境に配布・設置する行為を指します。ブロックチェーンの世界では、スマートコントラクトをブロックチェーンネットワークに配布・設置することを指すことが多いです。
イーサリアムにおいて「スマートコントラクトをデプロイする」とは、イーサリアムネットワークにスマートコントラクトを配布するためのトランザクション送信を意味します。
別の言い方では、イーサリアムネットワークに配置することで、プログラムが利用可能な状態とすることがデプロイです。

スマートコントラクトがあるのはネットワーク上で、実行されるのがEVMです。
③トランザクションが承認される
一般的なトランザクションと同じく、デプロイのトランザクションもノードに送信され、バリデータによって承認されます。承認されるとスマートコントラクトは、全ノードに知られます。
そして、利用可能な状態になります。つまり、スマートコントラクトはユーザーに働きかけられると、EVM上で実行されます。
スマートコントラクトが作動する流れ
デプロイ後は、ユーザーがスマートコントラクトを使えるようになります。どのようにスマートコントラクトが利用されるかを記載します。
①トランザクションの作成
ユーザーがスマートコントラクトを実行したいとき、まずトランザクションを作成します。
このトランザクションには、実行したいスマートコントラクトのアドレスと、そのスマートコントラクトの関数に渡すパラメータが含まれます。また、トランザクションを作成するユーザー(送信者)のデジタル署名も含まれます。
②トランザクションの送信
作成したトランザクションは、イーサリアムネットワークに送信されます。トランザクションを受け取ったノードは、トランザクションを検証します。
ノードの検証に合格した場合のみ、次のステップに進めます。
③トランザクションの選択・実行
バリデータはブロックに含めるトランザクションを選びます。バリデータがスマートコントラクト実行のためのトランザクションを選んだ場合、バリデータはそれをEVM上で実行します。
スマートコントラクトのコードは、トランザクションに指定されたパラメータを入力として受け取り、定義されたルールに従って処理を行います。
④ブロック生成
バリデータが新たなブロックを作成し、そのブロックにトランザクションとスマートコントラクトの実行結果を含めます。
このブロックはネットワークにブロードキャストされ、他のノードによって検証された後、ブロックチェーンに追加されます。
⑤結果の反映
ブロックチェーンに追加されると、ユーザーはトランザクションの完了を確認できます。
イーサリアムはネットワーク全体の状態を表します。そのため、スマートコントラクト単位で状態を記録するStorageは、その一部という位置づけです。
ちなみに
単純なトークン送付のトランザクションも、スマートコントラクトに含まれるプログラム(EVMコード)によって実行されています。
トークン送付に使われるスマートコントラクトは「トークンコントラクト」と呼ばれ、「transfer」や「transferFrom」などの関数を定義するEVMコードを含んでいます。
このように、トークン送付もスマートコントラクトのプログラムによって実行されています。しかし、「トークン送付のトランザクション」と呼ばれ、「スマートコントラクトの実行」と区別されることも少なくないかと思います。
なぜ、トークン送付をスマートコントラクトの実行と区別するのでしょうか。
トークン送付とスマートコントラクトの実行を区別する理由
トークン送付は、単純なプログラムの実行によって処理できるため区別されるようです。また、「transfer」や「transferFrom」のような標準的な関数を持つため、これらの操作を「トークン送付」と一般化して説明されることも要因です。
一方、スワップなどのスマートコントラクトの実行は、より複雑な操作を含みます。例えばスワップ操作では、複数のトークンコントラクトを関与させ、複数の状態変更を引き起こします。また、市場価格、流動性提供者の情報など、より多くの情報を考慮する必要もあります。
これらの操作は、単純な送金操作と比べて、より多くのガスを消費し、より高度なロジックを含むため、一般的にはスマートコントラクトの「実行」と区別されます。
EVMに関する補足
EVM(イーサリアムバーチャルマシン)に関する補足です。
EVM互換とは
EVM互換性は、開発者がイーサリアム上で作成したスマートコントラクトを、その他のブロックチェーンネットワーク上でも実行できるという意味です。
EVM互換のウォレットという使われ方もします。EVM互換は、イーサリアムネットワークとEVM互換ブロックチェーンネットワークに対応しているという意味です。
EVMの課題
EVMには以下のような課題があります。
スケーラビリティ
EVMのスループット(処理能力)には限界があります。
スループットとは、一定時間内に処理できるトランザクションの数のことです。ちなみに、システムが1秒間に処理できるトランザクション数は、TPSという指標で表されます。
スループットの限界の問題は特に、複数のスマートコントラクトを実行する大規模な分散アプリ(dApps)のパフォーマンスに影響を及ぼす可能性があります。
ガス代
スマートコントラクトを実行したいなら、ユーザーはガス代(手数料)を払う必要があります。このガス代は、実行されるトランザクションが多かったり、複雑だったりすると高くなる傾向にあります。
通常時に単純な取引を行う際でも、数百円もします。これはユーザーにとって負担です。
開発者の利便性
EVMで実行可能なスマートコントラクトを開発するには、SolidityやVyperといった特定のプログラミング言語を学ぶ必要があります。
一般的な言語でプログラムを書けないので、開発者にとっての負担となります。
イーサリアムのトランザクションは全て、「EVM」という環境で実行されます。EVMにはスマートコントラクトのコードがあります。またスマートコントラクトごとにMemoryやStack、Storageがあり、それらを使ってトランザクションを処理しています。
より具体的には、MemoryとStackを使ってトランザクションを処理します。これらはどちらも一時的なデータ保管場所ですが、違いもあります。Memoryは順序や位置に関係なくデータにアクセスしたり、複数の計算を同時に行ったりもできます。これに対し、Stackは一連の計算を順序正しく行うのに適しています。
EVMの中身
EVMの構成を図解すると以下のようになります。
EVM中にあるスマートコントラクトは、MemoryやStack、Storageをそれぞれ保有しており、それらを使って処理・データ保管をしています。
Memoryとは、Stackとは
MemoryもStackも、トランザクション処理の際に利用される、データの一時保管場所です。1つのトランザクションが処理されるごとにクリアされます。
これらはどちらも一時的なデータ保管場所ですが、違いもあります。Memoryは順序や位置に関係なくデータにアクセスしたり、複数の計算を同時に行ったりもできます。これに対し、Stackは一連の計算を順序正しく行うのに適しています。
Storageとは
Storageは、MemoryやStackとは違って一時的なデータ保管場所ではなく、永続的にデータを保管できる場所です。
また、MemoryとStackがトランザクションの処理のために使われていたのに対して、Storageは以下のようなスマートコントラクトの状態を保存するために使われます。
- トークンの承認の状態
- 利用者のアカウントの残高
- スマートコントラクトの所有者
- dAppsの状態
イーサリアムはネットワーク全体の状態を表します。そのため、スマートコントラクト単位で状態を記録するStorageは、その一部という位置づけです。
その他の関連用語
EVM(イーサリアムバーチャルマシン)の補足として、関連用語について確認してみたいと思います。
ステートマシン
ステートマシン(または有限ステートマシン)は、いくつかの「状態(ステート)」を持ち、それらが互いに移り変わるようなシステムのことを指します。
例えばストップウォッチには、「計測待ち」「計測中」「表示中」という状態があり、これらはボタン押下によって切り替わります。
エレベーターもステートマシンとして考えることができます。
エレベーターには、以下のような様々な「状態」があります。
- 1階にいる状態
- 2階にいる状態
- 移動中の状態
エレベーターはボタンが押されたときに、これらの状態間を移動します。この場合、ボタンが押されるという「イベント」が状態の変化を引き起こします。
ステートマシンは、このようにして、システムの現在の「状態」を管理し、「イベント」によって次の「状態」に移るという流れを表現します。
EVMもステートマシン
イーサリアムバーチャルマシンもステートマシンと考えることができます。
より詳しくすると以下の通りです。
EVMの「状態」はイーサリアムのブロックチェーン全体の状態(つまり、全てのアカウントのバランス、スマートコントラクトの状態など)を指します。そしてEVMは取引を実行することでこれらの状態間を移動します。
イーサリアム上の取引(トランザクション)は「イベント」であり、それによってEVM(そしてブロックチェーン全体)の状態が更新される仕組みです。
台帳からステートマシンへ
イーサリアムは「分散型台帳というよりもステートマシンだ」と説明されています。この意味について補足したいと思います。
ビットコインは「分散型台帳」とたとえて説明されます。ブロックチェーンは中央管理者不在で(分散的)、ビットコインのルールを満たす取引情報が記録されている帳簿(台帳)のように機能するからです。
イーサリアムも分散型台帳です。ビットコインのようにトークンの送付などができ、送付などの取引情報は帳簿に記録されています。
しかし、イーサリアムではスマートコントラクトの実行も可能であり、アカウントや各アカウントの残高だけでなく、マシンの状態(ステート)も記録されています。そこで、「分散型台帳」よりも「分散的なステートマシン」が適切だと考えられているようです。
スタック
EVMは、「スタックマシン 」と説明されることもあります。このスタックとは、「後に入れた要素が先に取り出される」という性質のデータ構造のことです。

スタックマシンとは、データを一時的に保存するスタックというデータ構造を用いて計算を行うコンピュータの一種です。
後に加えた要素が先に取り出されるというのは、積み重なった皿をイメージするとわかりやすいです。以下の写真について、一番最初に積まれたのは底にある皿で、一番最後に積まれたのは一番上の皿のはずですよね。

出典:Wikipedia
積まれた皿を取っていくとき、最初に手に取られるのは一番上の皿になります。これは、「最後に加えられた要素が最初に取り出される」というスタックと同じ性質と言えます。

stackは英語で「積み上げる」という意味です。
スタックはコンピュータがプログラムを動かすときに重要になります。スタックのおかげで、コンピュータは複数の作業を順番に処理することが可能になるためです。
例えば、ある作業を一時停止して別の作業を始めるとき、一時停止した作業の情報をスタックに保存しておきます。その後、別の作業が終わったら、スタックから一時停止した作業の情報を取り出して、その作業を再開します。
スタックのたとえ
スタックがどのように役立つかをイメージするために、会社員のAさんの業務を使って説明します。
Aさんは出社し終え、これからデスクで仕事をはじめます。やるべき業務がいくつかあり、机の上には各業務のための資料が積まれています(スタック)。
まずAさんは一番上の資料を取り、その業務に取り掛かりました。
しばらくすると、部長から急ぎの業務を依頼されます。
Aさんは取り組み中の業務を中断し、部長案件に着手することにしました。そこで、さっきまで見ていた資料を机の上に戻します(スタックに保存)。そして部長案件の資料を手に取り、その業務に取り組みます。
部長案件を終わらせたAさんは、中段していた業務の資料を取り戻し(スタックから取り出す)、その業務を再開します(一時停止した作業を再開する)。
このようにしてAさんは、複数の業務を1つずつ順番に処理していきました。
コンピュータもAさんのように、いくつかの作業を一つずつ順番に処理していきます。
これがスタックが存在している理由で、コンピュータが複数の作業を順序良く行うことを可能にしています。スタックがなければ、コンピュータは一度に1つの作業しかできず、新しい作業を始めるときは前の作業を完全に忘れてしまうことになります。
マークルツリー
マークルツリーとは、大量のデータを組織だった順序に並べるプロセスや考え方のことです。以下のような構造をしていて、以下画像の下側にある複数のデータが画像上の1つのデータに集約される形になっています。
出典:Wikipedia
上の図を逆さまにしてみると、下のイラストのようになります。木(ツリー)に似ていますね。
また、マークルツリーを発明したのはラルフマークル(Ralph Merkle)氏なので、「マークルツリー」と呼ばれます。
マークルツリーを利用すると、大量のデータを効率的かつ安全に検証しやすくなります。二つのデータが同じかどうかを検証する際、マークルツリーのTOP HASHが一致しているかを見るだけで済みます。
マークルパトリシアツリー(MPT)とは
ブロック内の情報を効率的に検証するため、ビットコインはマークルツリーを使ってトランザクションを整理しています。一方でイーサリアムは、マークルツリーではなく、マークルパトリシアツリー(MPT)というデータ構造を用いています。
マークルパトリシアツリーは、マークルツリーとパトリシアツリーを合わせた概念です。参考までにパトリシアツリーとは、以下のような構造です。
マークルパトリシアツリーの構造は、スマートコントラクトの状態管理も行うイーサリアムに向いているとされています。
スマートコントラクトの状態管理をする上では、特定のコントラクトアドレスや関連情報を、頻繁に取得したり情報を更新したりするようです。マークルツリーでは、このような特定の情報の取得や変更がしづらいみたいです。
一方でマークルパトリシアツリーは、情報検索がしやすい構造らしく、検索がしやすいことにより特定情報の取得・変更もしやすいみたいです。

TOP HASHが一致しているかを見るだけでブロック情報が検証できる点は、マークルパトリシアツリーもマークルツリーも同じです。
補足
(正直マークルパトリシアツリーに関して、あまり理解できなかったのですが、メモとして記録します。)
マークルパトリシアツリーは、「キーと値のペア」という形式で、各情報を保管します。これにより情報検索がしやすくなります。
「キーと値のペア」とは、何かを特定するための名前(キー)と、その名前に関連付けられた情報(値)の組み合わせのことを指します。多くの図書館は本を管理するため、本という「値」に書籍番号という「キー」を割り当てていますね。
そのようにイーサリアムでも、アカウントやスマートコントラクトの状態が「キーと値のペア」になっています。とある値を探したいときは、キーで検索を掛けられるので簡単にみつけられるようです。
チューリング完全性
EVMには「チューリング完全」的な性質があると説明されることがあります。
このチューリング完全は、数学者のアラン・チューリングが提唱した概念です。あるマシンがチューリング完全である場合、そのマシンが理論上、どんな計算でも実行できるということを意味します。
EVMはどんなスマートコントラクトでも実行できるので、チューリング完全だと言われたりするみたいです。ただし、完全に「チューリング完全」ではないと補足されることが多いです。

EVMでプログラムを実行するには、燃料(gas)が必要になります。gasは複雑な処理ほどたくさん必要なので、実質的には複雑な処理が制限されるためです。
その他関連用語
バイト(Byte)
バイト(Byte、またはB)とは、データの情報量の単位であり、コンピュータ上にある情報を表すために使います。例えば、ホームページやPDFなどは500KBや4MBといったように、Byteを使って表すことができます。
なお、KBやMBもバイトの仲間の単位です。
出典:Wikipedia
上の画像にもある通り、1バイトのデータ量は基本的に8ビットです。
ビット(Bit)とは
ビット(Bit、またはb)も、データの情報量を表す単位です。
1ビットは「0」か「1」かを表せます。1つのスイッチで「ON」と「OFF」の2通りの情報を表せるように、1ビットでは2種類のデータを表せます。
2ビットは「00」「01」「10」「11」の4種類のデータを表せます。これは2つのスイッチで「OFF&OFF」「OFF&ON」「ON&OF」「ON&ON」の4種類の情報を表現できるのと似ていますね。
1バイトは基本的に8ビットでした。上記をふまえて、1バイトはスイッチ8個分の情報量(2の8乗 = 256通り)を表せるということになりますね。
メモリ
メモリは、コンピュータに搭載されているデバイスの1つです。CPUが処理を実行するための作業スペースであり、データの一時的な保管場所です。 アプリを開いたときに容量が使われます。
以下のような見た目をしています。
出典:IODATA
メモリやCPUの関係・役割は、人間が勉強するシーンを思い浮かべると理解しやすくなります。勉強するとしたら、まず脳みそで考えて机に教科書や問題集を広げ、脳みそがその問題を解きますよね。
このときの脳みそはコンピュータのCPU、机はメモリに置き換えてイメージできます。CPUは脳みそと同様に計算や様々な処理を実行し、メモリは机と同じで処理に必要なデータを保管できるためです。

狭い机で勉強するときのように、メモリ不足だと処理速度が落ちます。十分な容量でも、アプリを開きすぎると不足することも!
メモリ以外にも情報保管場所がある
コンピュータにはHD(ハードディスク)など、メモリ以外の情報保管場所もあります。ただ、同じ情報保管場所でもハードディスクとメモリでは役割が違います。
ハードディスクなどにすぐに使わない情報を保管しておき、CPUが計算に使う情報はメモリに移しておく、といったような役割分担になっています。
出典:「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
ハードディスクなどは安価で容量が大きいため、すぐに使わない情報を貯めておくのに役立ちます。よく書斎にたとえられます。一方でメモリは、容量が小さいものの反応速度が早く、CPUからのリクエストに応じられるのです。
ROMとは
EVMの説明でも出てくる「ROM」は、メモリの一種でRead-Only Memory(読み取り専用メモリ)の略です。ROMに格納されているデータは読み取り(データ取得)できますが、書き込み(情報の変更)はできません。そのため「読み取り専用」と言われます。
例えば、コンピュータのBIOS(基本入出力システム)の情報や、一部のデバイスのファームウェアなどはROMに保存されます。これらはコンピュータの基本的な操作を制御する重要なプログラムで、安全に運用するためには不変であることが望ましいです。
ハッシュ関数
ハッシュ関数とは、任意のデータを入力すると、ぐちゃぐちゃに加工したデータ(ハッシュ値)を出力する機能です。イメージとしては、関数「y = 2x + 1」に2を入力すると、「y = 5」が出力されるといったものが挙げられます。
この特殊な加工のことを「ハッシュ」「ハッシュ関数にかける」などと言います。
実際にハッシュ値に変換してみたのが以下の画像です。
出典:ラッコツールズ
「あああ」と入力したら、わけのわからない値が出力されましたね。ハッシュとはこんな感じです。
参照
EVM

https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf

バーチャルマシン

ステートマシン
スタック


MPT
バイト、ビットについて
メモリ

コメント