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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Ryuya Nakamura
December 14, 2018
Programming
2
700
WebAssembly in Blockchain
@Emscripten & WebAssembly night !! #6
Ryuya Nakamura
December 14, 2018
Tweet
Share
More Decks by Ryuya Nakamura
See All by Ryuya Nakamura
「弁護士バイアス」とその対処法
nrryuya
2
1.6k
AIオンボーディングとAIプロセスマイニング
nrryuya
5
2.8k
アルファを作る人になる
nrryuya
0
440
学生時代のキャリア探索の心がけ
nrryuya
0
330
フィードバックされやすい人になろう
nrryuya
35
24k
間違いが許されなくてもLLMが使えるユースケースとは @GenAI Playground Meetup #01
nrryuya
13
6.3k
20240725 LLMによるDXのビジョンと、今何からやるべきか @Azure OpenAI Service Dev Day
nrryuya
4
2.7k
「知的単純作業」を自動化する、地に足の着いた大規模言語モデル (LLM) の活用
nrryuya
9
13k
20240130 エンプラDXにおける2024年の生成AIトレンド予測 @生成AI新年会2024
nrryuya
2
2.6k
Other Decks in Programming
See All in Programming
encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善
kurakura0916
0
190
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
1.4k
New in Go 1.26 Implementing go fix in product development
sunecosuri
0
210
Beyond the Basics: Signal Forms
manfredsteyer
PRO
0
110
AI活用のコスパを最大化する方法
ochtum
0
120
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
370
CSC307 Lecture 15
javiergs
PRO
0
210
オブザーバビリティ駆動開発って実際どうなの?
yohfee
3
660
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
390
RubyとGoでゼロから作る証券システム: 高信頼性が求められるシステムのコードの外側にある設計と運用のリアル
free_world21
0
170
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
230
クライアントワークでSREをするということ。あるいは事業会社におけるSREと同じこと・違うこと
nnaka2992
1
290
Featured
See All Featured
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
200
Utilizing Notion as your number one productivity tool
mfonobong
4
240
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
240
Why Our Code Smells
bkeepers
PRO
340
58k
Thoughts on Productivity
jonyablonski
75
5.1k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.4k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
The Language of Interfaces
destraynor
162
26k
Context Engineering - Making Every Token Count
addyosmani
9
730
A Modern Web Designer's Workflow
chriscoyier
698
190k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
140
The Limits of Empathy - UXLibs8
cassininazir
1
240
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