$30 off During Our Annual Pro Sale. View Details »

eWASM

Ryuya Nakamura
June 22, 2018
1.2k

 eWASM

Ethereum Virtual Machine & eWASM

Ryuya Nakamura

June 22, 2018
Tweet

More Decks by Ryuya Nakamura

Transcript

  1. 次世代のEVM 「eWASM VM」
    @veryNR
    2018.6

    View Slide

  2. ©Gunosy Inc.
    自己紹介
    中村龍矢 @veryNR
    ■ Gunosy Inc.
    – データ分析部 2017年2月~
    ● 動画配信ロジックの開発など
    ● Python, Go, SQL
    – 新規事業開発室 2018年6月~
    ● ブロックチェーン技術の研究
    ■ 経歴
    – Coubic株式会社
    ● 営業をやっていました
    – 日本ヒューマンビートボックス協会
    ● お手伝い
    – 東京大学工学部システム創成学科
    ● 休学中

    View Slide

  3. ©Gunosy Inc.
    今回話すこと
    ■ Ethereumのスマートコントラクトの実行基盤が変わるよ!
    EVMコードをEVMで実行

    eWASMを + WebAssemblyエンジンで実行
    ■ いいことたくさん
    – 処理性能が上がる
    – gasが安くなる(?)
    – 汎用言語で開発できる!

    View Slide

  4. ©Gunosy Inc.
    アジェンダ
    前提知識
    – WebAssembly
    – EVMの概要と問題点
    eWASM
    – EVMに対するメリット
    – 具体的な仕様
    – 開発状況
    eWASMについて知りつつEVMの理解を深めよう

    View Slide

  5. ©Gunosy Inc.
    WebAssembly

    View Slide

  6. ©Gunosy Inc.
    WebAssembly (WASM)
    ■ 2015年に発表、主要なブラウザ(Chrome,
    Firefox, Safari, Edge)全てでサポート
    ■ JavaScriptより高速, asm.jsよりコンパクト
    ■ ブラウザ以外の実行環境もある
    – node.jsでも動く
    ■ 様々な言語からコンパイルできる
    – LLVMフロントエンドがWASMにも対応す
    るため
    – C/C++, Go, Rust
    Webブラウザで実行可能なバイナリ

    View Slide

  7. ©Gunosy Inc.
    WebAssembly (WASM)
    Unity 3Dのゲーム
    https://gigazine.net/news/20160316-chrome-start-webassembly/

    View Slide

  8. ©Gunosy Inc.
    Ethereum Virtual Machine

    View Slide

  9. ©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

    View Slide

  10. ©Gunosy Inc.
    Ethereum Virtual Machine (EVM)
    interpreter.go
    go-ethereumでの実装(core/vm ディレクトリ)
    memory.go
    stack.go

    View Slide

  11. ©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
    バイトコードへのコンパイル

    View Slide

  12. ©Gunosy Inc.
    EVMの問題点

    View Slide

  13. ©Gunosy Inc.
    EVMの問題点
    その1: ランタイムでのgas計算
    命令実行のたびにgas関連の処理が走り実行速度低下
    interpreter.go Run() のコードの雰囲気
    while (停止系の命令が来ていない)
    バイトコードから対応する命令を取得
    命令のgasコストを取得
    if gasが不足
    error
    命令を実行
    gas消費
    「0x60」→ PUSH1
    PUSH1: 3gas

    View Slide

  14. ©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独自の命令
    ※ もある

    View Slide

  15. ©Gunosy Inc.
    EVMの問題点
    その3: 256ビットのスタックアイテム
    ■ 256bitのread/write
    – 多くの演算では256bitも必要ない
    ■ EVMを動かす物理CPUの命令とEVMの命令が対応しない
    – CPUは大抵64ビット
    – 実装によって命令ごとの処理の重さが変わる
    → gasコスト当たりの処理の重さも変わる
    ■ EVMの命令セットが複雑に
    stack top
    :
    1024個
    256bits
    Stack
    物理CPUの命令と単純に対応せず命令の処理コストが定まらない

    View Slide

  16. ©Gunosy Inc.
    ■ 命令の実行ごとにガス計

    ■ 実行速度が遅くなる
    ランタイムのガス計算
    EVM: 問題点まとめ
    ■ 物理CPUの命令との対応
    の悪さ
    ■ 命令セットが複雑に
    ■ gasコストに対して処理の
    重さが固定しない
    256bit スタックアイテム
    ■ CALL, CREATE,
    SHA3...
    ■ Solidityなど独自言語が
    必要
    EVM独自の高級な命令
    EVMの独自仕様がパフォーマンスのボトルネックに
    他にもあるが、主な問題は3つ

    View Slide

  17. ©Gunosy Inc.
    eWASM

    View Slide

  18. ©Gunosy Inc.
    eWASMとは
    “Ethereum flavored WebAssembly”: WebAssemblyのサブセット
    ■ eWASM ⊂ WASM
    – WebAssemblyに変更は加えず、Ethereumの仕様に合わせ制約を
    加えた
    – eWASM自体は言語で、EVMコードに代わるもの
    ■ EVMに代わるのはeWASM VM
    ■ LLVM IRなども代案としてあった
    – 不安定性などが問題
    – JVMなどは論外

    View Slide

  19. ©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
    )
    )

    View Slide

  20. ©Gunosy Inc.
    eWASMのメリット
    その2: WebAssemblyエコシステム
    ■ 開発基盤の安定
    – Mozilla, Google, Microsoft, Apple等が開発に参加
    – Ethereumコミュニティだけで仮想マシンをメンテするのは大変だった
    ■ C/C++, rust, Goなど他言語での開発が可能に
    – これらの言語のコード資産が活用できる
    – 開発者の増加
    – SolidityもeWASMにコンパイル可能(予定)

    View Slide

  21. ©Gunosy Inc.
    eWASMの具体的仕様

    View Slide

  22. ©Gunosy Inc.
    eWASMの具体的仕様
    要点まとめ
    ■ コントラクトコードはEVMコードからeWASMに
    ■ EVMの代わりにeWASM VM
    – デプロイとコントラクトの実行
    ■ Ethereum Environment Interface (EEI)
    – ブロックチェーンと疎通するためのWebAssemblyモジュール
    ■ System Contract
    – VMが使うロジックを持つ「コントラクトとして定義されたインターフェー
    ス」

    View Slide

  23. ©Gunosy Inc.
    eWASMコントラクト
    eWASMで書かれたスマートコントラクト
    Ethereumの仕様に合うように制約を加える
    - 浮動小数点を使わない
    - EEIのモジュールのみを import
    - 他のモジュールはimportしない
    ※import・exportはWebAssemblyの仕様
    mainとmemoryという二つのシンボルを export
    - main:
    - VMが実行する関数
    - memory:
    - EEIのモジュールが書き込むメモリス
    ペース

    View Slide

  24. ©Gunosy Inc.
    Ethereum Environment Interface (EEI)
    eWASMコントラクトがEthereumにアクセスするためのAPI
    ■ EVMで高級な命令として用意されていたものは当然
    WebAssemblyの命令にはない
    ■ WebAssemblyのModuleとして実装し、eWASMコントラクトのコード中でimport
    – ex: useGas, getAddress, call, storageStore, create, etc.
    ■ Moduleの仕組みを利用して機能追加も簡単に

    View Slide

  25. ©Gunosy Inc.
    System Contract
    ■ 厳密には、「コントラクトとして定義されたインターフェース」
    – 仮想マシンの外で実装したいロジックをコントラクトの形で定義してお
    き、仮想マシンがcallして使う
    ■ EVMでのPrecompiled Contractもこれに含まれる
    – ecrecoverなどの暗号学的で複雑な処理を事前にコンパイル
    – 該当するアドレスのコントラクトはブロックチェーンからではなくクライア
    ントの実装を見に行く
    ● ex: 0x0000000000000000000000000000000000000001
    eWASM VMが使うロジックを持つコントラクト

    View Slide

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

    View Slide

  27. ©Gunosy Inc.
    eWASM VM
    ■ コントラクトの実行
    – コントラクトがeWASMの時はWebAssemblyエンジンで実行
    – EVMコードの時
    ● EVM実行環境あればそれを使う
    ● なければTranscompiler Contractを呼び出すなどして実行
    ■ eWASMコントラクトのデプロイ
    – Sentinel Contractでバイトコードをバリデーション&アノテーションする
    eWASMコントラクトのデプロイ・実行を行う

    View Slide

  28. ©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

    View Slide

  29. ©Gunosy Inc.
    開発状況

    View Slide

  30. ©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

    View Slide

  31. ©Gunosy Inc.
    所感

    View Slide

  32. ©Gunosy Inc.
    所感
    ■ EVMを独自で開発するのは大変だったのだろう
    – EOSは初めからWebAssemblyを採用(eWASMと近いアプローチ)
    ■ EVM周りはgo-ethereumの実装を見るのが一番理解しやすい
    間違い等あれば是非@veryNRまでお知らせください

    View Slide