Upgrade to Pro — share decks privately, control downloads, hide ads and more …

eWASM

Ryuya Nakamura
June 22, 2018
1.3k

 eWASM

Ethereum Virtual Machine & eWASM

Ryuya Nakamura

June 22, 2018
Tweet

More Decks by Ryuya Nakamura

Transcript

  1. ©Gunosy Inc. 自己紹介 中村龍矢 @veryNR ▪ Gunosy Inc. – データ分析部

    2017年2月~ • 動画配信ロジックの開発など • Python, Go, SQL – 新規事業開発室 2018年6月~ • ブロックチェーン技術の研究 ▪ 経歴 – Coubic株式会社 • 営業をやっていました – 日本ヒューマンビートボックス協会 • お手伝い – 東京大学工学部システム創成学科 • 休学中
  2. ©Gunosy Inc. 今回話すこと ▪ Ethereumのスマートコントラクトの実行基盤が変わるよ! EVMコードをEVMで実行 ↓ eWASMを + WebAssemblyエンジンで実行

    ▪ いいことたくさん – 処理性能が上がる – gasが安くなる(?) – 汎用言語で開発できる!
  3. ©Gunosy Inc. アジェンダ 前提知識 – WebAssembly – EVMの概要と問題点 eWASM –

    EVMに対するメリット – 具体的な仕様 – 開発状況 eWASMについて知りつつEVMの理解を深めよう
  4. ©Gunosy Inc. WebAssembly (WASM) ▪ 2015年に発表、主要なブラウザ(Chrome, Firefox, Safari, Edge)全てでサポート ▪

    JavaScriptより高速, asm.jsよりコンパクト ▪ ブラウザ以外の実行環境もある – node.jsでも動く ▪ 様々な言語からコンパイルできる – LLVMフロントエンドがWASMにも対応す るため – C/C++, Go, Rust Webブラウザで実行可能なバイナリ
  5. ©Gunosy Inc. Ethereum Virtual Machine (EVM) ▪ スタックマシン ▪ 各クライアントのネイティブ言語で個別に実装

    – go-ethereum (core/vmディレクトリ) – Parity (ethcoreディレクトリ) – cpp-ethereum (libevm/VM.cpp) ▪ EVMコードと呼ばれるバイトコードを実行する スマートコントラクトの実行環境 分かりやすいイラストつき資料 http://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf
  6. ©Gunosy Inc. Ethereum Virtual Machine (EVM) PUSH1 0x60 PUSH1 0x40

    MSTORE CALLVALUE ISZERO PUSH1 0xE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 (以下略) 6060604052600080fd00 a165627a7a72305820c3 084ab8aacb65862cf8898 f2e1d6abfe2600746527b 1f067748f83724fa6d680 029 バイトコードへのコンパイル
  7. ©Gunosy Inc. EVMの問題点 その1: ランタイムでのgas計算 命令実行のたびにgas関連の処理が走り実行速度低下 interpreter.go Run() のコードの雰囲気 while

    (停止系の命令が来ていない) バイトコードから対応する命令を取得 命令のgasコストを取得 if gasが不足 error 命令を実行 gas消費 「0x60」→ PUSH1 PUSH1: 3gas
  8. ©Gunosy Inc. EVMの問題点 その2: EVM独自の高級な命令 基本演算/実行停止系(0x0~) STOP, ADD, MUL, SUB,

    etc. 比較/論理演算系(0x10~) LT, GT, AND, OR, etc. スタックアイテム系(0x60~) PUSH1, DUP1, SWAP1, etc. 環境情報系(0x30~) ADDRESS, BALANCE, CALLER, GASPRICE, etc. ブロック系(0x40~) BLOCKHASH, COINVASE, TIMESTAMP, etc. メモリ/ストレージ系(0x50~) MSTORE, MLOAD, SSTORE, SLOAD, etc. コントラクト系(0xf0~) CALL, CREATE, SELFDESTRUCT, etc. EVM独自の命令が多く汎用言語からのコンパイルが困難 一般的な命令 EVM独自の命令 ※ もある
  9. ©Gunosy Inc. EVMの問題点 その3: 256ビットのスタックアイテム ▪ 256bitのread/write – 多くの演算では256bitも必要ない ▪

    EVMを動かす物理CPUの命令とEVMの命令が対応しない – CPUは大抵64ビット – 実装によって命令ごとの処理の重さが変わる → gasコスト当たりの処理の重さも変わる ▪ EVMの命令セットが複雑に stack top : 1024個 256bits Stack 物理CPUの命令と単純に対応せず命令の処理コストが定まらない
  10. ©Gunosy Inc. ▪ 命令の実行ごとにガス計 算 ▪ 実行速度が遅くなる ランタイムのガス計算 EVM: 問題点まとめ

    ▪ 物理CPUの命令との対応 の悪さ ▪ 命令セットが複雑に ▪ gasコストに対して処理の 重さが固定しない 256bit スタックアイテム ▪ CALL, CREATE, SHA3... ▪ Solidityなど独自言語が 必要 EVM独自の高級な命令 EVMの独自仕様がパフォーマンスのボトルネックに 他にもあるが、主な問題は3つ
  11. ©Gunosy Inc. eWASMとは “Ethereum flavored WebAssembly”: WebAssemblyのサブセット ▪ eWASM ⊂

    WASM – WebAssemblyに変更は加えず、Ethereumの仕様に合わせ制約を 加えた – eWASM自体は言語で、EVMコードに代わるもの ▪ EVMに代わるのはeWASM VM ▪ LLVM IRなども代案としてあった – 不安定性などが問題 – JVMなどは論外
  12. ©Gunosy Inc. eWASMのメリット その1: パフォーマンスの向上 ▪ WebAssembly自体の高いスペック ▪ gas計算をバイトコードにあらかじめ挿入 する方式に(後述)

    ▪ 命令ごとのgasコストが安くなるかも – 元々処理の重さに応じてDoS攻撃を 防ぐため設定されているので ▪ shardingやPoSなどの基盤に (module (type (func)) (type (func (param i64))) (import "ethereum" "useGas" (func $meter (type 1))) (func (type 0) i64.const 5 ;; 3 + 2 the cost of metering call $meter i64.const 1 drop end ) )
  13. ©Gunosy Inc. eWASMのメリット その2: WebAssemblyエコシステム ▪ 開発基盤の安定 – Mozilla, Google,

    Microsoft, Apple等が開発に参加 – Ethereumコミュニティだけで仮想マシンをメンテするのは大変だった ▪ C/C++, rust, Goなど他言語での開発が可能に – これらの言語のコード資産が活用できる – 開発者の増加 – SolidityもeWASMにコンパイル可能(予定)
  14. ©Gunosy Inc. eWASMの具体的仕様 要点まとめ ▪ コントラクトコードはEVMコードからeWASMに ▪ EVMの代わりにeWASM VM –

    デプロイとコントラクトの実行 ▪ Ethereum Environment Interface (EEI) – ブロックチェーンと疎通するためのWebAssemblyモジュール ▪ System Contract – VMが使うロジックを持つ「コントラクトとして定義されたインターフェー ス」
  15. ©Gunosy Inc. eWASMコントラクト eWASMで書かれたスマートコントラクト Ethereumの仕様に合うように制約を加える - 浮動小数点を使わない - EEIのモジュールのみを import

    - 他のモジュールはimportしない ※import・exportはWebAssemblyの仕様 mainとmemoryという二つのシンボルを export - main: - VMが実行する関数 - memory: - EEIのモジュールが書き込むメモリス ペース
  16. ©Gunosy Inc. Ethereum Environment Interface (EEI) eWASMコントラクトがEthereumにアクセスするためのAPI ▪ EVMで高級な命令として用意されていたものは当然 WebAssemblyの命令にはない

    ▪ WebAssemblyのModuleとして実装し、eWASMコントラクトのコード中でimport – ex: useGas, getAddress, call, storageStore, create, etc. ▪ Moduleの仕組みを利用して機能追加も簡単に
  17. ©Gunosy Inc. System Contract ▪ 厳密には、「コントラクトとして定義されたインターフェース」 – 仮想マシンの外で実装したいロジックをコントラクトの形で定義してお き、仮想マシンがcallして使う ▪

    EVMでのPrecompiled Contractもこれに含まれる – ecrecoverなどの暗号学的で複雑な処理を事前にコンパイル – 該当するアドレスのコントラクトはブロックチェーンからではなくクライア ントの実装を見に行く • ex: 0x0000000000000000000000000000000000000001 eWASM VMが使うロジックを持つコントラクト
  18. ©Gunosy Inc. System Contract ▪ Sentinel Contract – コントラクトをデプロイするときにVMが呼び出し、以下の処理を行う 1.

    eWASMの仕様にあっているかをチェック 2. gas計算のロジックを挿入する 3. デプロイ準備OKの目印をつける ▪ EVM Transcompiler – EVMのバイトコードをeWASMにトランスパイルする – EVMをサポートしていない場合にVMが呼び出す • これにより、今後のクライアントはeWASMだけサポートしておけ ば、既存のEVMコードのコントラクトも実行可能 eWASM VM用に2種類追加
  19. ©Gunosy Inc. eWASM VM ▪ コントラクトの実行 – コントラクトがeWASMの時はWebAssemblyエンジンで実行 – EVMコードの時

    • EVM実行環境あればそれを使う • なければTranscompiler Contractを呼び出すなどして実行 ▪ eWASMコントラクトのデプロイ – Sentinel Contractでバイトコードをバリデーション&アノテーションする eWASMコントラクトのデプロイ・実行を行う
  20. ©Gunosy Inc. コントラクトの実行 eWASM VM WASM Engine EEI (World State

    との疎通) eWASM Contract WASM code EOA / Contract EOA / Contract EOA / Contract client message call input data World State callDataCopy create, call, etc. Storage storageStore EVMコードの 場合はcall System Contract Sentinel Contract EVM Transcompiler コード実行 import
  21. ©Gunosy Inc. eWASM開発状況 ▪ 現在はHeraというC++によるeWASM VMの開発 に注力 – EVM-CというABI経由でcpp-ethereumから Heraを動かす

    – WebAssemblyエンジンはBinaryenを使用 – プロトタイプ動いている – go-ethereumからもHeraを動かせる様にな る予定 ▪ テストネット準備中 – メインネットは少なくとも来年以降になりそう テストネットに向けて開発が進む https://www.youtube.com/watch?v=Nt3L5 dPmv2o