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
590
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
0
130
フィードバックされやすい人になろう
nrryuya
22
15k
間違いが許されなくてもLLMが使えるユースケースとは @GenAI Playground Meetup #01
nrryuya
13
6k
20240725 LLMによるDXのビジョンと、今何からやるべきか @Azure OpenAI Service Dev Day
nrryuya
4
2.4k
「知的単純作業」を自動化する、地に足の着いた大規模言語モデル (LLM) の活用
nrryuya
9
12k
20240130 エンプラDXにおける2024年の生成AIトレンド予測 @生成AI新年会2024
nrryuya
2
2.2k
20240125 開発側・ビジネス側という壁を作らない LLMアプリ開発 @生成AI Conf
nrryuya
8
3.9k
抜擢されるには
nrryuya
19
14k
キャッチアップ速度が速い #とは
nrryuya
76
39k
Other Decks in Programming
See All in Programming
時計仕掛けのCompose
mkeeda
1
300
Multi Step Form, Decentralized Autonomous Organization
pumpkiinbell
1
740
データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る
nnaka2992
0
150
sappoRo.R #12 初心者セッション
kosugitti
0
250
クリーンアーキテクチャから見る依存の向きの大切さ
shimabox
2
340
『品質』という言葉が嫌いな理由
korimu
0
160
SwiftUIで単方向アーキテクチャを導入して得られた成果
takuyaosawa
0
270
2024年のkintone API振り返りと2025年 / kintone API look back in 2024
tasshi
0
220
Pulsar2 を雰囲気で使ってみよう
anoken
0
240
AWS Organizations で実現する、 マルチ AWS アカウントのルートユーザー管理からの脱却
atpons
0
150
データの整合性を保つ非同期処理アーキテクチャパターン / Async Architecture Patterns
mokuo
47
17k
CDK開発におけるコーディング規約の運用
yamanashi_ren01
2
120
Featured
See All Featured
Building Applications with DynamoDB
mza
93
6.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
How to Ace a Technical Interview
jacobian
276
23k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
330
Building Your Own Lightsaber
phodgson
104
6.2k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
Faster Mobile Websites
deanohume
306
31k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
27
1.9k
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