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. 自己紹介 中村龍矢(りゅうや) - LayerX Inc. - ブロックチェーンの研究開発 - 東京大学工学部(休学中) -

    略歴 - Coubic Inc. (2015/10~) - Gunosy Inc. データ分析部 (2017/2~) - LayerX Inc. R&D (2018/8~) Twitter: @veryNR
  2. ブロックチェーンとは ▪ 冗長なステートマシン – 数千~数万ノードが一定間隔で同じ状態遷移をする ▪ Bitcoinの「状態」 – bitcoinを使った過去の取引一覧 (誰が何BTC持っているか)

    ▪ Ethereumの「状態」 – 誰が何ether持っているか – ストレージ • 任意のデータ – コード • チューリング完全なプログラム • ether送金やストレージの変更が可能 http://takenobu-hs.github.io/downloads/ethereum_evm_ill ustrated.pdf
  3. トランザクションとブロック ▪ トランザクション: 状態遷移を依頼するチケット – 「Bobに5ETH送金」「transfer関数を実行して猫AをCarolに送る」 – 処理できる状態遷移にはキャパがある • 手数料高いチケットから順に選ばれる

    ▪ ブロック: 今回の状態遷移で実行するトランザクションが詰め込まれたもの – どのノードがつくったブロックに従うのか? • このルールがコンセンサスアルゴリズム http://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf
  4. Ethereum Virtual Machine (EVM) ▪ スタックマシン ▪ 各クライアントのネイティブ言語で個別に実装 – go-ethereum

    (core/vmディレクトリ) – Parity (ethcoreディレクトリ) – cpp-ethereum (libevm/VM.cpp) ▪ EVMコードと呼ばれるバイトコードを実行する Ethereumのスマートコントラクトの実行環境
  5. ©Gunosy Inc. EVMの問題点 その1: ランタイムでのgas計算 interpreter.go Run() のコードの雰囲気 while (停止系の命令が来ていない)

    バイトコードから対応する命令を取得 命令のgasコストを取得 if gasが不足 error 命令を実行 gas消費 「0x60」→ PUSH1 PUSH1: 3gas - EVMでは、プログラムの実行に手数料 (gas)がかかる - 命令実行ごとに消費し、使い切ったらリバート
  6. ©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独自の命令
  7. ©Gunosy Inc. EVMの問題点 その3: 256ビットのスタックアイテム ▪ 256bitのread/write – 多くの演算では256bitも必要ない ▪

    EVMを動かす物理CPUの命令とEVMの命令が対応しない – CPUは大抵64ビット – 実装によって命令ごとの処理の重さが変わる → gasコスト当たりの処理の重さも変わる ▪ EVMの命令セットが複雑に stack top : 1024個 256bits Stack
  8. ©Gunosy Inc. eWASMとは “Ethereum flavored WebAssembly”: WebAssemblyのサブセット ▪ eWASM ⊂

    WASM – WebAssemblyに変更は加えず、Ethereumの仕様に合わせ制約を加えた – eWASM自体は言語で、EVMコードに代わるもの ▪ EVMに代わるのはeWASM VM ▪ LLVM IRなども代案としてあった – 不安定性などが問題 – JVMなどは論外
  9. ©Gunosy Inc. eWASMコントラクト eWASMで書かれたスマートコントラクト Ethereumの仕様に合うように制約を加える - 浮動小数点を使わない - EEIのモジュールのみをimport -

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

    ▪ WebAssemblyのModuleとして実装し、eWASMコントラクトのコード中で import – ex: useGas, getAddress, call, storageStore, create, etc.
  11. ©Gunosy Inc. eWASM開発状況 数年後のEthereumの大規模アップデートのためテスト中 ▪ 数年後のEthereumの大規模アップデート(Eth2.0, Serenity)で導入予定 ▪ 現在はeWASMはテストネットで動いている ▪

    現状はgo-ethereumというGoクライアントでC++製のeWASM VMを利用 – WASMバックエンドはBinaryenをサポート – wabtとWAVMは”limited support”
  12. ©Gunosy Inc. その他のブロックチェーンでのWASM ▪ 独自VM系 – Bitcoin (Bitcoin script) –

    Ethereum (EVM) – NEO ▪ WebAssembly – Ethereum (eWASM) (アップデート予定) – EOS – Ontology ▪ LLVM – Cardano (IELE)