Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
WebAssembly in Blockchain
Search
Ryuya Nakamura
December 14, 2018
Programming
2
510
WebAssembly in Blockchain
@Emscripten & WebAssembly night !! #6
Ryuya Nakamura
December 14, 2018
Tweet
Share
More Decks by Ryuya Nakamura
See All by Ryuya Nakamura
20240130 エンプラDXにおける2024年の生成AIトレンド予測 @生成AI新年会2024
nrryuya
2
1.7k
20240125 開発側・ビジネス側という壁を作らない LLMアプリ開発 @生成AI Conf
nrryuya
7
3.4k
抜擢されるには
nrryuya
18
13k
キャッチアップ速度が速い #とは
nrryuya
68
35k
LLMアプリケーションの安定性を高めるための精度評価・改善
nrryuya
4
2.2k
20230425 PRIVACY TECH NIGHT #02 「統計化すれば安全」の罠 ──差分プライバシーの背景
nrryuya
0
720
20230222 フィンテック養成勉強会#28 金融に活かすデータの開拓と利活用(技術編) データ活用とプライバシー
nrryuya
1
130
20221206 プライバシーエンジニアの仕事 @PRIVACY TECH NIGHT #01 LayerX 中村龍矢
nrryuya
1
550
State Channel 最前線
nrryuya
7
600
Other Decks in Programming
See All in Programming
単体テストを書かない技術 #phpcon_odawara
o0h
PRO
26
7.9k
二郎系ラーメンのコールで学ぶ AST 解析
memory1994
PRO
7
1.7k
はてなにおける CSS Modules、及び CSS Modules に足りないもの / CSS Modules in Hatena, and CSS Modules missing parts
mizdra
5
710
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
2
330
FigmaとPHPで作る1ミリたりとも表示崩れしない最強の帳票印刷ソリューション
ttskch
39
18k
大規模Reactアプリのリアーキテクチャ~8万行のTanStack Query移行の軌跡~
kj455
3
800
Changed Rules: Architectures with Lightweight Stores
manfredsteyer
PRO
0
230
1BRC--Nerd Sniping the Java Community
gunnarmorling
0
320
MetricKitで予期せぬ終了を検知する話 / Detect unexpected termination with MetricKit
nekowen
0
110
チーム力を高めるスクラム実践法:カンバン公開と課題攻略について - ニフティのスクラムトーク Vol. 2 - NIFTY Tech Talk #18
niftycorp
PRO
1
110
データアナリストが行うDatabricksを活用したETLの自動化事例
shinoa
0
260
Azure OpenAI Serviceのプロンプトエンジニアリング入門
tomokusaba
3
160
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
501
140k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3k
VelocityConf: Rendering Performance Case Studies
addyosmani
320
23k
How STYLIGHT went responsive
nonsquared
92
4.8k
Navigating Team Friction
lara
177
13k
Thoughts on Productivity
jonyablonski
57
3.8k
Practical Orchestrator
shlominoach
181
9.7k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
226
51k
Docker and Python
trallard
33
2.7k
A Philosophy of Restraint
colly
196
16k
Build The Right Thing And Hit Your Dates
maggiecrowley
23
2k
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
Transcript
ブロックチェーンにおける WebAssembly @veryNR 2018/12/14
自己紹介 中村龍矢(りゅうや) - LayerX Inc. - ブロックチェーンの研究開発 - 東京大学工学部(休学中) -
略歴 - Coubic Inc. (2015/10~) - Gunosy Inc. データ分析部 (2017/2~) - LayerX Inc. R&D (2018/8~) Twitter: @veryNR
研究内容: プログラムの安全性を高める https://github.com/LayerXcom/verified-vyper-contracts コントラクト言語Vyperコントリビュータ - Pythonライクな言語 - 可読性を重視
研究内容: プログラムの安全性を高める https://github.com/LayerXcom/verified-vyper-contracts FVyperプロジェクト - Vyperのライブラリ集 - 形式的検証も行う
研究内容: プロトコルの安全性を高める LayerXのScrapbox(https://scrapbox.io/layerx)に色々書いてるよ - コンセンサスアルゴリズム - オフチェーンプロトコル - Plasma -
State channel
研究内容: ゼロ知識証明 LayerXのScrapbox(https://scrapbox.io/layerx)に色々書いてるよ ブロックチェーン界隈でのニーズにより暗号 学の諸分野が発展 特に非対話的なゼロ知識証明 (zk-S[NT]ARKs) →色々な計算の検証に使える
ブロックチェーンにおけるWebAssembly ▪ そもそもブロックチェーンとは ▪ ブロックチェーンにおけるvirtual machine ▪ WebAssemblyがどのように使われているか
ブロックチェーンにおける バーチャルマシン
ブロックチェーンとは ▪ 冗長なステートマシン – 数千~数万ノードが一定間隔で同じ状態遷移をする ▪ Bitcoinの「状態」 – bitcoinを使った過去の取引一覧 (誰が何BTC持っているか)
▪ Ethereumの「状態」 – 誰が何ether持っているか – ストレージ • 任意のデータ – コード • チューリング完全なプログラム • ether送金やストレージの変更が可能 http://takenobu-hs.github.io/downloads/ethereum_evm_ill ustrated.pdf
コードとストレージの例 Cryptokitties 猫を売買したり繁殖させるゲー ム
コードとストレージの例 猫の実体 分散型アプリと言ってもブロックチェーン上に載せるのは一部のビジネスロジックだけ
トランザクションとブロック ▪ トランザクション: 状態遷移を依頼するチケット – 「Bobに5ETH送金」「transfer関数を実行して猫AをCarolに送る」 – 処理できる状態遷移にはキャパがある • 手数料高いチケットから順に選ばれる
▪ ブロック: 今回の状態遷移で実行するトランザクションが詰め込まれたもの – どのノードがつくったブロックに従うのか? • このルールがコンセンサスアルゴリズム http://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf
スマートコントラクトの実行 - トランザクションを送ってプログラムをデプロイ - ステートの一部に書き込まれる - トランザクションを送ってプログラムを実行 - ステートの一部を書き換える http://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf
Ethereum Virtual Machine (EVM) ▪ スタックマシン ▪ 各クライアントのネイティブ言語で個別に実装 – go-ethereum
(core/vmディレクトリ) – Parity (ethcoreディレクトリ) – cpp-ethereum (libevm/VM.cpp) ▪ EVMコードと呼ばれるバイトコードを実行する Ethereumのスマートコントラクトの実行環境
Ethereum Virtual Machine (EVM) interpreter.go go-ethereumでの実装(core/vm ディレクトリ) memory.go stack.go
コントラクト開発の流れ 6060604052600080fd00a 165627a7a72305820c30 84ab8aacb65862cf8898f 2e1d6abfe2600746527b1 f067748f83724fa6d68002 9 - プログラムを書く→コンパイル→デプロイする -
トランザクションを発行してデプロイします Tx
実はEVMが WASMに変わろうとしています
EVMの課題 ▪ 遅い ▪ 独自仕様すぎる
©Gunosy Inc. EVMの問題点 その1: ランタイムでのgas計算 interpreter.go Run() のコードの雰囲気 while (停止系の命令が来ていない)
バイトコードから対応する命令を取得 命令のgasコストを取得 if gasが不足 error 命令を実行 gas消費 「0x60」→ PUSH1 PUSH1: 3gas - EVMでは、プログラムの実行に手数料 (gas)がかかる - 命令実行ごとに消費し、使い切ったらリバート
©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独自の命令
©Gunosy Inc. EVMの問題点 その3: 256ビットのスタックアイテム ▪ 256bitのread/write – 多くの演算では256bitも必要ない ▪
EVMを動かす物理CPUの命令とEVMの命令が対応しない – CPUは大抵64ビット – 実装によって命令ごとの処理の重さが変わる → gasコスト当たりの処理の重さも変わる ▪ EVMの命令セットが複雑に stack top : 1024個 256bits Stack
EVMは遅い ▪ ハッシュ関数・楕円曲線関数などはどうしていたのか? – “precompiled contracts” • 各クライアントにあらかじめ中身が実装されたコントラクト – 追加するにはハードフォークが必要(一種のプロトコル変更のため)
▪ 一方、早いVMが求められている – S[NT]ARKsブーム – Sharding, PoS, etc. → 新しいVMが求められている
eWASM Ethereum flavored WebAssembly
©Gunosy Inc. eWASMとは “Ethereum flavored WebAssembly”: WebAssemblyのサブセット ▪ eWASM ⊂
WASM – WebAssemblyに変更は加えず、Ethereumの仕様に合わせ制約を加えた – eWASM自体は言語で、EVMコードに代わるもの ▪ EVMに代わるのはeWASM VM ▪ LLVM IRなども代案としてあった – 不安定性などが問題 – JVMなどは論外
©Gunosy Inc. eWASMコントラクト eWASMで書かれたスマートコントラクト Ethereumの仕様に合うように制約を加える - 浮動小数点を使わない - EEIのモジュールのみをimport -
他のモジュールはimportしない ※import・exportはWebAssemblyの仕様 mainとmemoryという二つのシンボルをexport - main: - VMが実行する関数 - memory: - EEIのモジュールが書き込むメモリスペース
©Gunosy Inc. Ethereum Environment Interface (EEI) eWASMコントラクトがEthereumにアクセスするためのAPI ▪ EVMで高級な命令として用意されていたものは当然 WebAssemblyの命令にはない
▪ WebAssemblyのModuleとして実装し、eWASMコントラクトのコード中で import – ex: useGas, getAddress, call, storageStore, create, etc.
©Gunosy Inc. eWASM開発状況 数年後のEthereumの大規模アップデートのためテスト中 ▪ 数年後のEthereumの大規模アップデート(Eth2.0, Serenity)で導入予定 ▪ 現在はeWASMはテストネットで動いている ▪
現状はgo-ethereumというGoクライアントでC++製のeWASM VMを利用 – WASMバックエンドはBinaryenをサポート – wabtとWAVMは”limited support”
©Gunosy Inc. その他のブロックチェーンでのWASM ▪ 独自VM系 – Bitcoin (Bitcoin script) –
Ethereum (EVM) – NEO ▪ WebAssembly – Ethereum (eWASM) (アップデート予定) – EOS – Ontology ▪ LLVM – Cardano (IELE)
おしまい Twitter: @veryNR