generated at
13章 イーサリアム仮想マシン(EVM)
P.311〜

イーサリアム仮想マシン (Ethereum Virtual Machine)
まっさきに思い浮かぶのは Java Virtual Machine だな june29

13.1 EVMとは何か

イーサリアムの構成要素のひとつ
スマートコントラクトをデプロイする、実行する
グローバル分散コンピュータ
準チューリング完全状態マシン
ガスによる制限があるので「準」
スタックベースのアーキテクチャ

アドレスを指定してアクセス可能なデータコンポーネント
実行されるスマートコントラクトのバイトコードが読み込まれた、不変のプログラムコードROM
すべての領域が明示的にゼロに初期化された揮発性のメモリ
メモリと同様にゼロに初期化されたイーサリアムの状態の一部である永続ストレージ


13.1.1 既存の技術との比較

EVM は単なる計算処理エンジン
スケジューリング機能を持たない
シングルスレッド
「システムインターフェイス」の処理や「ハードウェアのサポート」はない
ワールドコンピュータ」とは言っても、物理的なコンピュータがあるわけではない

13.1.2 EVM命令セット (バイトコード演算)

操作
算術演算とビット単位の論理演算
実行コンテクストに関する問い合わせ
スタック、メモリ、ストレージへのアクセス
制御フローに関する操作
ロギング、関数コール、その他の演算子
オペコードの種類
算術演算
スタック操作
処理フロー操作
システムに関連する操作
論理演算
環境に対する操作
ブロックに関連する操作
オペコードの実例
コピペしづらいしスクショも撮りにくかったので、いっしょに書籍を見ましょう june29

13.1.3 イーサリアムのステート (状態)

ワールドステート (world state)
イーサリアムアドレスからアカウント account へのマッピング
イーサリアムアドレス
イーサ残高 balance
ナンス nonce
ストレージ storage
プログラムコード program code

トランザクションの途中でガス切れになると
ステートに変化は起こらない
送信者ナンスはインクリメントされる
送信者の残高は減る
ここを見ると EVM は、ワールドステートのサンドボックスと言える

13.1.4 SolidityのEVMバイトコードへのコンパイル

2章 イーサリアムの基礎では Remix を使ってコンパイルした
この章では solc コマンドを使う
example
$ solc --help $ solc -o BytecodeDir --opcodes Example.sol $ solc -o BytecodeDir --asm Example.sol $ solc -o BytecodeDir --bin Example.sol
--asm オプションをつけてコンパイルすると .evm ファイルが生成される
「13.1.2 EVM命令セット」にあった一覧と突き合わせていけば

13.1.5 コントラクトのデプロイを行うコード

読んだけどよくわからんかった… june29

デプロイメントバイトコード deployment bytecode
実行時バイトコード runtime bytecode

13.1.6 バイトコードの逆アセンブル

逆アセンブラいろいろ
Porosity
広く使われているオープンソースの逆コンパ イラ
Ethersplay
逆アセンブラ「Binary Ninja」の EVM プラグイン
IDA-Evm
逆アセンブラ「IDA」のEVMプラグイン

実際の処理をひとつずつ追っていく解説がある june29

13.2 チューリング完全性とガス

チューリング完全な言語、ときに無限ループに陥る
イーサリアムには「スケジューラを持たず」「シングルスレッド」という性質がある
無限ループに陥ったらイーサリアム全体が利用不能になるということ

この停止性問題 halting problem を解決するのがガス
ガスによって EVM は準チューリング完全となっている

13.3 ガス

計算リソースとストレージリソースを測定するためのもの

イエローペーパーに記載されている例からいくつか紹介
2 つの数値を加算すると 3 ガスかかる
Keccak-256 ハッシュの計算には「30 ガス」+「ハッシュされる 256 ビットごとに 6 ガス」がかかる
トランザクションの送信には 21,000 ガスかかる

ガスの持つ二重の役割
「イーサリアムの変わりやすい価格」と「マイナーへの仕事の対価としての報酬」との間の緩衝
DoS 攻撃に対する防御策

13.3.1 実行中のガス会計

トランザクションの処理を進めながらガスを消費していく
途中で足りなくなったらトランザクションは停止し、ステートは元のままになる
そこまでにかかった費用は徴収される
トランザクションが完了したら、ガスは費用として徴収され、マイナーに支払われる
トランザクションが消費しきらずに余ったガスはトランザクションの送信者に払い戻される

13.3.2 ガス会計に関する考察

付録C EVMオペコードとガス消費の「表C-1」に各種オペコードのガス費用がある
2016 年のハードフォーク (コードネーム Tangerine Whisle) は、コストの不一致を悪用する攻撃が原因
「現実世界のコスト」と「ガス費用」を連動させておかないと攻撃が成功してしまう

13.3.3 ガス費用対ガス価格

>ガス費用は EVM 上の計算と利用されたストレージの計測単位であり、ガス自体はイーサを尺度とする価格を持っています。

トランザクション手数料 = 使用された総ガス量 * 支払いガス価格 (単位はイーサ)

ガス費用
特定の操作を実行するために必要なガスの単位数
ガス価格
トランザクションを送信する際に、ガスの単位当たりに支払う予定のイーサの量

13.3.3.1 ネガティブガス費用

コントラクトの削除 SELFDESTRUCT は 24,000 ガスが払い戻される
ストレージアドレスをゼロ以外の値からゼロ SSTORE [x] = 0 に変更すると 15,000 ガスが払い戻される

13.3.4 ブロックガス上限

メインネットのブロックガス上限は、
原著執筆時点で 8,000,000 ガス
日本語翻訳時点で 10,000,000 ガス
2020-04-05 に https://ethstats.net/ を見ると 10,000,000 弱だった june29

13.3.4.1 ブロックガスの上限は誰が決定するのか?

マイナーが投票できる仕組みになっている

13.4 まとめ

>この章では、さまざまなスマートコントラクトの実行を追い、EVM がどのようにバイトコードを実行するかを見て、イーサリアム仮想マシンについて詳しく調べました。私たちはまた、EVM の会計メカニズムであるガスを見て、停止性問題をどのように解決し、イーサリアムを DoS 攻撃からどのように保護しているかを見ました。続く14 章では、イーサリアムが分散化されたコンセンサスを達成するために用いている仕組みを見ていきます。


参考資料
Ethereum EVM illustrated (exploring some mental models and implementations)
hr

次章!