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

WebAssembly in Blockchain

WebAssembly in Blockchain

@Emscripten & WebAssembly night !! #6

Ryuya Nakamura

December 14, 2018
Tweet

More Decks by Ryuya Nakamura

Other Decks in Programming

Transcript

  1. ブロックチェーンにおける
    WebAssembly
    @veryNR
    2018/12/14

    View Slide

  2. 自己紹介
    中村龍矢(りゅうや)
    - LayerX Inc.
    - ブロックチェーンの研究開発
    - 東京大学工学部(休学中)
    - 略歴
    - Coubic Inc. (2015/10~)
    - Gunosy Inc. データ分析部 (2017/2~)
    - LayerX Inc. R&D (2018/8~)
    Twitter: @veryNR

    View Slide

  3. 研究内容: プログラムの安全性を高める
    https://github.com/LayerXcom/verified-vyper-contracts
    コントラクト言語Vyperコントリビュータ
    - Pythonライクな言語
    - 可読性を重視

    View Slide

  4. 研究内容: プログラムの安全性を高める
    https://github.com/LayerXcom/verified-vyper-contracts
    FVyperプロジェクト
    - Vyperのライブラリ集
    - 形式的検証も行う

    View Slide

  5. 研究内容: プロトコルの安全性を高める
    LayerXのScrapbox(https://scrapbox.io/layerx)に色々書いてるよ
    - コンセンサスアルゴリズム
    - オフチェーンプロトコル
    - Plasma
    - State channel

    View Slide

  6. 研究内容: ゼロ知識証明
    LayerXのScrapbox(https://scrapbox.io/layerx)に色々書いてるよ
    ブロックチェーン界隈でのニーズにより暗号
    学の諸分野が発展
    特に非対話的なゼロ知識証明
    (zk-S[NT]ARKs)
    →色々な計算の検証に使える

    View Slide

  7. ブロックチェーンにおけるWebAssembly
    ■ そもそもブロックチェーンとは
    ■ ブロックチェーンにおけるvirtual machine
    ■ WebAssemblyがどのように使われているか

    View Slide

  8. ブロックチェーンにおける
    バーチャルマシン

    View Slide

  9. ブロックチェーンとは
    ■ 冗長なステートマシン
    – 数千~数万ノードが一定間隔で同じ状態遷移をする
    ■ Bitcoinの「状態」
    – bitcoinを使った過去の取引一覧
    (誰が何BTC持っているか)
    ■ Ethereumの「状態」
    – 誰が何ether持っているか
    – ストレージ
    ● 任意のデータ
    – コード
    ● チューリング完全なプログラム
    ● ether送金やストレージの変更が可能
    http://takenobu-hs.github.io/downloads/ethereum_evm_ill
    ustrated.pdf

    View Slide

  10. コードとストレージの例
    Cryptokitties
    猫を売買したり繁殖させるゲー

    View Slide

  11. コードとストレージの例
    猫の実体
    分散型アプリと言ってもブロックチェーン上に載せるのは一部のビジネスロジックだけ

    View Slide

  12. トランザクションとブロック
    ■ トランザクション: 状態遷移を依頼するチケット
    – 「Bobに5ETH送金」「transfer関数を実行して猫AをCarolに送る」
    – 処理できる状態遷移にはキャパがある
    ● 手数料高いチケットから順に選ばれる
    ■ ブロック: 今回の状態遷移で実行するトランザクションが詰め込まれたもの
    – どのノードがつくったブロックに従うのか?
    ● このルールがコンセンサスアルゴリズム
    http://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf

    View Slide

  13. スマートコントラクトの実行
    - トランザクションを送ってプログラムをデプロイ
    - ステートの一部に書き込まれる
    - トランザクションを送ってプログラムを実行
    - ステートの一部を書き換える
    http://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf

    View Slide

  14. Ethereum Virtual Machine (EVM)
    ■ スタックマシン
    ■ 各クライアントのネイティブ言語で個別に実装
    – go-ethereum (core/vmディレクトリ)
    – Parity (ethcoreディレクトリ)
    – cpp-ethereum (libevm/VM.cpp)
    ■ EVMコードと呼ばれるバイトコードを実行する
    Ethereumのスマートコントラクトの実行環境

    View Slide

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

    View Slide

  16. コントラクト開発の流れ
    6060604052600080fd00a
    165627a7a72305820c30
    84ab8aacb65862cf8898f
    2e1d6abfe2600746527b1
    f067748f83724fa6d68002
    9
    - プログラムを書く→コンパイル→デプロイする
    - トランザクションを発行してデプロイします
    Tx

    View Slide

  17. 実はEVMが
    WASMに変わろうとしています

    View Slide

  18. EVMの課題
    ■ 遅い
    ■ 独自仕様すぎる

    View Slide

  19. ©Gunosy Inc.
    EVMの問題点
    その1: ランタイムでのgas計算
    interpreter.go Run() のコードの雰囲気
    while (停止系の命令が来ていない)
    バイトコードから対応する命令を取得
    命令のgasコストを取得
    if gasが不足
    error
    命令を実行
    gas消費
    「0x60」→ PUSH1
    PUSH1: 3gas
    - EVMでは、プログラムの実行に手数料
    (gas)がかかる
    - 命令実行ごとに消費し、使い切ったらリバート

    View Slide

  20. ©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.
    ハッシュ関数SHA3 (0x20)
    一般的な命令 EVM独自の命令

    View Slide

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

    View Slide

  22. EVMは遅い
    ■ ハッシュ関数・楕円曲線関数などはどうしていたのか?
    – “precompiled contracts”
    ● 各クライアントにあらかじめ中身が実装されたコントラクト
    – 追加するにはハードフォークが必要(一種のプロトコル変更のため)
    ■ 一方、早いVMが求められている
    – S[NT]ARKsブーム
    – Sharding, PoS, etc.
    → 新しいVMが求められている

    View Slide

  23. eWASM
    Ethereum flavored WebAssembly

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  27. ©Gunosy Inc.
    eWASM開発状況
    数年後のEthereumの大規模アップデートのためテスト中
    ■ 数年後のEthereumの大規模アップデート(Eth2.0, Serenity)で導入予定
    ■ 現在はeWASMはテストネットで動いている
    ■ 現状はgo-ethereumというGoクライアントでC++製のeWASM VMを利用
    – WASMバックエンドはBinaryenをサポート
    – wabtとWAVMは”limited support”

    View Slide

  28. ©Gunosy Inc.
    その他のブロックチェーンでのWASM
    ■ 独自VM系
    – Bitcoin (Bitcoin script)
    – Ethereum (EVM)
    – NEO
    ■ WebAssembly
    – Ethereum (eWASM) (アップデート予定)
    – EOS
    – Ontology
    ■ LLVM
    – Cardano (IELE)

    View Slide

  29. おしまい
    Twitter: @veryNR

    View Slide