---
title: "Ethereum virtual machine（EVM）とは"
description: "EVMのすべてを解説"
---

## **EVM - 多くの名前を持つマシン**

The World's Computer。The Unstoppable Machine。The Heart of Ethereum。Ethereum Virtual Machine（EVM）には多くの名前があり、これはEthereumネットワークにおけるその重要性を示している。EVMは、Ethereumを単なるBitcoinのような「分散型台帳」ではなく「分散型ステートマシン」たらしめている中核機能である。

EVMにより、開発者は[Solidity](https://www.alchemy.com/overviews/solidity)というプログラミング言語でスマートコントラクトを作成できる。スマートコントラクトのよく知られた用途の一つに、トークンの生成と交換の管理がある。多くのアプリケーションやプロトコルは、その目的にとって重要な行動を行ったユーザーに報酬を与えるためにトークンを使用している。EVMがなければ、これらは実現不可能である。

EVMの機能をより深く理解するために、その中核となる要素をいくつか見ていく。

## **仮想マシン - EVMのプラットフォーム**

分散型ネットワークを停止させるのは難しい。それを行うには、現在オンラインになっているすべてのノードを取り除き、さらに新しいノードが立ち上がるのを防ぐ方法を見つける必要がある。

<ImageBlock
  src="https://media.alchemy.com/1703769963-distributed-networks.png"
  alt="集中型、分散型、非中央集権型ネットワークトポロジーの比較図"
  width={1445}
  height={420}
  caption="分散ネットワーク"
/>

分散型ネットワークをスケールさせる良い方法の一つが、仮想マシン（VM）を使用することである。VMは異なるOSやハードウェア上で、また任意の地理的な場所から実行できるためである。VMはコードとそれを実行するマシンの間の抽象化レイヤーとして機能する。

VMはストレージ、メモリ、CPUを備えた物理マシンと同様の働きをするが、純粋にコードとして動作する。理論上は誰でもVMを実行できるため、分散型ネットワークにとって非常に可搬性の高いプラットフォームとなる。EVMは、分散化されたノードのネットワークを使ってスマートコントラクトを実行する。

## **スマートコントラクト - EVMのアプリ**

スマートコントラクトは自己実行型のコード行であり、当事者間で中央の権威を必要とせずに取引を行うことを可能にする。スマートコントラクトの内部には、オンチェーンまたはオフチェーンで特定の条件が満たされたときに実行される、定義済みの操作のリストがある。操作の例としては、特定のアドレスへの資金の送金、他のコントラクトとの通信、あるいは新しいコントラクトの作成などがある。第三者が取引を実行するのではなく、送信者は誰でもスマートコントラクトのアドレスへ資金を送ることでこれらの操作をトリガーできる。

<ImageBlock
  src="https://media.alchemy.com/1703770046-how-smart-contract-works.png"
  alt="スマートコントラクトが条件成立時に自己実行する仕組みの図"
  width={820}
  height={521}
  caption="スマートコントラクトの仕組み"
/>

スマートコントラクトを安全な取引手段たらしめているのは、そのコードが改変・変更できないという事実である。スマートコントラクトからは常に予測可能な結果が得られ、これがコードに組み込まれた信頼性である。コントラクトが実行されるたびに、EVMの状態が変化するとされる。

EVMは「ステートマシン」と表現できる。それはスマートコントラクトのコードの実行によって生じる状態変化を計算する役割を担っているためである。これは具体的には、アカウントのether残高、スマートコントラクトのデータストレージ、アカウントレベルとコントラクトレベル両方の取引が完了するたびにそれらを維持するということを意味する。これらの行動すべてが、ネットワークの「状態」を変化させるものである。

<ImageBlock
  src="https://media.alchemy.com/1703770183-evm-transactions.png"
  alt="EVMトランザクションによってEthereumネットワークの状態が変化する仕組みの図"
  width={1080}
  height={607}
  caption="EVMトランザクション"
/>

スマートコントラクトは主にSolidityという言語で書かれる。EVMはSolidityを直接実行できないため、まずコードはopcodeと呼ばれる低レベルのマシン命令にコンパイルされる必要がある。

## **Opcode - EVMの言語**

EVMは広く[Turing Complete](https://en.wikipedia.org/wiki/Turing_completeness)、より正確には準Turing Completeであるとされている。これは、EVMが理論上あらゆる計算問題を解けることを意味する。これはEVM opcodeと呼ばれるマシンレベルの命令を実行することによって行われる。

EVM opcodeは、スマートコントラクトや取引の特定のタスクを完了するためにEVMを補助する。現在、EVMが実行できるopcodeはおよそ150種類ある。これらは算術演算、停止、ロギング、複製、push、メモリ操作、比較、交換など幅広い操作をカバーしている。またブロック情報や環境情報の取得にも使われる。opcodeの一覧は[こちら](https://github.com/wolflo/evm-opcodes/blob/main/gas.md)で確認できる。

<ImageBlock
  src="https://media.alchemy.com/1703770312-evm-opcodes.jpeg"
  alt="EVMが実行するマシンレベルの命令であるEVMオペコードの図"
  width={1600}
  height={916}
  caption="EVMオペコード"
/>

効率化のため、EVMはbytecodeをopcodeに変換し、各opcodeにはbytecode上で1バイト以上が割り当てられる。各opcode操作にはEVMによって実行されるために特定量のgasが必要となる。gasについては耳にしたことがあるだろうが、それは一体何なのか。

## **Gas - EVMの燃料**

Gasはおそらく、EVMに関する話題の中で最も語られていながら、最も理解されていないトピックである。本稿執筆時点では、gas価格は非常に高くなることがあるが、これを改善しようという取り組みも一部存在する。gas価格の高さは、Ethereumが一般に広く受け入れられる上での大きな障壁となり得る。しかし、なぜgas価格を支払う必要があり、なぜその価格がこれほど高くなるのか。

gasの目的は、各Ethereumノードが行うスマートコントラクトの操作の計算に対する手数料として機能することである。計算に対する手数料が必要なのは、攻撃者が長い計算時間を要する複雑なコントラクトを大量にデプロイすることでネットワークを停止させることを防ぐためである。この種のDDoS攻撃は、実行コストが非常に高くつくため抑止される。

各opcodeには[gasコスト](https://github.com/wolflo/evm-opcodes/blob/main/gas.md)が割り当てられており、より複雑なopcodeほどコストが高くなる。例えば、単純な加算は3 gaiのコストがかかり、すべての取引は21,000 gasのコストから開始される。不満の多くはgas自体についてではなく、取引を正常に完了させるために必要なgas limitに関するものである。

gas limitとは、送信者が取引の実行および検証のために支払う意思のある最大gas量のことである。gas feeを求めるには、gas cost合計（各操作の基本値）にgas price（それらの操作を完了させるコスト）を掛け合わせればよい。実際の車にガソリンを入れる際と同様に、ガソリンそのもののコストと、目的地に到達するために必要なガソリン量という考え方が存在する。

Gas Fee = Total Gas Cost x Gas Price

gas feeは、取引情報が有効であること、EVMからのエラーや例外が発生していないこと、そして送信者が計算に必要な資金を保有していることを確認する役割を担うvalidatorへの対価である。送信者が高いgas limitを設定すると、それは操作が複雑であることを示し、validatorが高い報酬を得るためにその取引を優先的に処理するインセンティブとなる。

<ImageBlock
  src="https://media.alchemy.com/1703770395-evm-gas.png"
  alt="ガス代がEVMの計算処理に対してバリデーターに支払われる仕組みの図"
  width={1080}
  height={607}
  caption="EVMガス"
/>

ネットワークの活動が活発な時には、validatorは保留中の取引プールの中から、より高いgas limitを持つものを単純に選ぶことができる。したがってgas feeは需要と供給によって左右される。良い点として、消費されなかったgasは送信者に返金される。

前払いされたgas limitに達してしまった場合、validatorはその作業に対して依然として報酬を受け取るが、取引自体は完了しない。このように、EVMが準Turing Completeであるのは、実行できる計算量が送信者が支払う意思のある額によって制限されているためである。

## **EVMのユースケース**

ここまでEVMの各要素について取り上げてきたので、次はこれらの部分がどのように組み合わさってEthereum上のプロジェクトを支えているのかを見ていく。

### **ERC-20トークン**

[ERC-20](https://www.alchemy.com/overviews/erc20-solidity)トークンとは、アドレス間で転送可能であり、固定量を持ち、ネットワーク全体でその価値が同一であるトークンである。EVM上で定義済みのデータ構造に従うスマートコントラクトが、ERC-20トークンの作成に使われる。このデータ構造は、トークンの命名、分配、供給量、および監視を制御する。

複数のアプリケーションやプロジェクトが、ユーザーへのインセンティブとしてERC-20トークンを使用している。分散型動画配信ネットワークである[Livepeer](https://www.alchemy.com/dapps/livepeer)は、ネットワークにリソースを供給するユーザーへのインセンティブとしてLivepeerトークン（LPT）を使用している。スマートコントラクト上の分散型保険である[Nexus Mutual](https://www.alchemy.com/dapps/nexus-mutual)は、ユーザーが補償を購入し請求を行えるようにするためNXMトークンを使用している。

### 分散型取引所

分散型取引所は、ユーザーがERC-20トークンを交換できるようにするためにスマートコントラクトをデプロイする。これらのスマートコントラクトはAutomated Market Makers（AMM）と呼ばれる。第三者が管理することなく、ユーザーが特定のトークンの流動性プールに貢献できるようにするためである。[Uniswap](https://www.alchemy.com/dapps/uniswap)や[SushiSwap](https://ethereum.org/en/developers/docs/standards/tokens/erc-721/)のような人気の取引所は、このAMMモデルの応用例である。

<ImageBlock
  src="https://media.alchemy.com/1703770478-automated-market-maker.png"
  alt="自動マーケットメーカーが流動性プールを通じてトークンスワップをマッチングする仕組みの図"
  width={1236}
  height={1128}
  caption="自動マーケットメーカー"
/>

### **ERC-721トークン**

もう一つの広く普及しているトークン標準は、ERC-20の非代替性を持ついとこにあたる[ERC-721](https://ethereum.org/en/developers/docs/standards/tokens/erc-721/)である。これらのスマートコントラクトは、ブロックチェーン全体で唯一の価値を持つトークンであるNFT（Non-fungible token）のミンティングに使用される。ユニークな芸術作品を作成することが、この種のトークンの最大のユースケースである。[Axie Infinity](https://www.alchemy.com/dapps/axie-infinity)やGod Unchainedといったゲーム分野の他のプロジェクトも、ゲーム内の収集品としてこれらのトークンを使用している。

### EVMのその先

EVMはEthereumを単なるブロックチェーンではなく一つのプラットフォームたらしめている。しかし、EVMは完璧なシステムではない。取引速度やネットワークのスループットには多くの課題がある。これは開発コミュニティおよび[Ethereumのロードマップ](https://ethereum.org/en/roadmap/)における注力分野である。Ethereumが互いの取引の在り方を革新するという約束を果たすとすれば、それはEVMの改善の上に成り立つことになるだろう。
