Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

©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独自の命令

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

eWASM Ethereum flavored WebAssembly

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

おしまい Twitter: @veryNR