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
eWASM
Search
Ryuya Nakamura
June 22, 2018
5
1.3k
eWASM
Ethereum Virtual Machine & eWASM
Ryuya Nakamura
June 22, 2018
Tweet
Share
More Decks by Ryuya Nakamura
See All by Ryuya Nakamura
フィードバックされやすい人になろう
nrryuya
22
15k
間違いが許されなくてもLLMが使えるユースケースとは @GenAI Playground Meetup #01
nrryuya
13
5.9k
20240725 LLMによるDXのビジョンと、今何からやるべきか @Azure OpenAI Service Dev Day
nrryuya
4
2.3k
「知的単純作業」を自動化する、地に足の着いた大規模言語モデル (LLM) の活用
nrryuya
9
12k
20240130 エンプラDXにおける2024年の生成AIトレンド予測 @生成AI新年会2024
nrryuya
2
2.1k
20240125 開発側・ビジネス側という壁を作らない LLMアプリ開発 @生成AI Conf
nrryuya
8
3.8k
抜擢されるには
nrryuya
19
13k
キャッチアップ速度が速い #とは
nrryuya
75
38k
LLMアプリケーションの安定性を高めるための精度評価・改善
nrryuya
4
2.5k
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
45
7k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
Fireside Chat
paigeccino
34
3.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
Rails Girls Zürich Keynote
gr2m
94
13k
Designing for humans not robots
tammielis
250
25k
Agile that works and the tools we love
rasmusluckow
328
21k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
Producing Creativity
orderedlist
PRO
341
39k
How to Think Like a Performance Engineer
csswizardry
22
1.2k
Side Projects
sachag
452
42k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Transcript
次世代のEVM 「eWASM VM」 @veryNR 2018.6
©Gunosy Inc. 自己紹介 中村龍矢 @veryNR ▪ Gunosy Inc. – データ分析部
2017年2月~ • 動画配信ロジックの開発など • Python, Go, SQL – 新規事業開発室 2018年6月~ • ブロックチェーン技術の研究 ▪ 経歴 – Coubic株式会社 • 営業をやっていました – 日本ヒューマンビートボックス協会 • お手伝い – 東京大学工学部システム創成学科 • 休学中
©Gunosy Inc. 今回話すこと ▪ Ethereumのスマートコントラクトの実行基盤が変わるよ! EVMコードをEVMで実行 ↓ eWASMを + WebAssemblyエンジンで実行
▪ いいことたくさん – 処理性能が上がる – gasが安くなる(?) – 汎用言語で開発できる!
©Gunosy Inc. アジェンダ 前提知識 – WebAssembly – EVMの概要と問題点 eWASM –
EVMに対するメリット – 具体的な仕様 – 開発状況 eWASMについて知りつつEVMの理解を深めよう
©Gunosy Inc. WebAssembly
©Gunosy Inc. WebAssembly (WASM) ▪ 2015年に発表、主要なブラウザ(Chrome, Firefox, Safari, Edge)全てでサポート ▪
JavaScriptより高速, asm.jsよりコンパクト ▪ ブラウザ以外の実行環境もある – node.jsでも動く ▪ 様々な言語からコンパイルできる – LLVMフロントエンドがWASMにも対応す るため – C/C++, Go, Rust Webブラウザで実行可能なバイナリ
©Gunosy Inc. WebAssembly (WASM) Unity 3Dのゲーム https://gigazine.net/news/20160316-chrome-start-webassembly/
©Gunosy Inc. Ethereum Virtual Machine
©Gunosy Inc. Ethereum Virtual Machine (EVM) ▪ スタックマシン ▪ 各クライアントのネイティブ言語で個別に実装
– go-ethereum (core/vmディレクトリ) – Parity (ethcoreディレクトリ) – cpp-ethereum (libevm/VM.cpp) ▪ EVMコードと呼ばれるバイトコードを実行する スマートコントラクトの実行環境 分かりやすいイラストつき資料 http://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf
©Gunosy Inc. Ethereum Virtual Machine (EVM) interpreter.go go-ethereumでの実装(core/vm ディレクトリ) memory.go
stack.go
©Gunosy Inc. Ethereum Virtual Machine (EVM) PUSH1 0x60 PUSH1 0x40
MSTORE CALLVALUE ISZERO PUSH1 0xE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 (以下略) 6060604052600080fd00 a165627a7a72305820c3 084ab8aacb65862cf8898 f2e1d6abfe2600746527b 1f067748f83724fa6d680 029 バイトコードへのコンパイル
©Gunosy Inc. EVMの問題点
©Gunosy Inc. EVMの問題点 その1: ランタイムでのgas計算 命令実行のたびにgas関連の処理が走り実行速度低下 interpreter.go Run() のコードの雰囲気 while
(停止系の命令が来ていない) バイトコードから対応する命令を取得 命令のgasコストを取得 if gasが不足 error 命令を実行 gas消費 「0x60」→ PUSH1 PUSH1: 3gas
©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. EVM独自の命令が多く汎用言語からのコンパイルが困難 一般的な命令 EVM独自の命令 ※ もある
©Gunosy Inc. EVMの問題点 その3: 256ビットのスタックアイテム ▪ 256bitのread/write – 多くの演算では256bitも必要ない ▪
EVMを動かす物理CPUの命令とEVMの命令が対応しない – CPUは大抵64ビット – 実装によって命令ごとの処理の重さが変わる → gasコスト当たりの処理の重さも変わる ▪ EVMの命令セットが複雑に stack top : 1024個 256bits Stack 物理CPUの命令と単純に対応せず命令の処理コストが定まらない
©Gunosy Inc. ▪ 命令の実行ごとにガス計 算 ▪ 実行速度が遅くなる ランタイムのガス計算 EVM: 問題点まとめ
▪ 物理CPUの命令との対応 の悪さ ▪ 命令セットが複雑に ▪ gasコストに対して処理の 重さが固定しない 256bit スタックアイテム ▪ CALL, CREATE, SHA3... ▪ Solidityなど独自言語が 必要 EVM独自の高級な命令 EVMの独自仕様がパフォーマンスのボトルネックに 他にもあるが、主な問題は3つ
©Gunosy Inc. eWASM
©Gunosy Inc. eWASMとは “Ethereum flavored WebAssembly”: WebAssemblyのサブセット ▪ eWASM ⊂
WASM – WebAssemblyに変更は加えず、Ethereumの仕様に合わせ制約を 加えた – eWASM自体は言語で、EVMコードに代わるもの ▪ EVMに代わるのはeWASM VM ▪ LLVM IRなども代案としてあった – 不安定性などが問題 – JVMなどは論外
©Gunosy Inc. eWASMのメリット その1: パフォーマンスの向上 ▪ WebAssembly自体の高いスペック ▪ gas計算をバイトコードにあらかじめ挿入 する方式に(後述)
▪ 命令ごとのgasコストが安くなるかも – 元々処理の重さに応じてDoS攻撃を 防ぐため設定されているので ▪ shardingやPoSなどの基盤に (module (type (func)) (type (func (param i64))) (import "ethereum" "useGas" (func $meter (type 1))) (func (type 0) i64.const 5 ;; 3 + 2 the cost of metering call $meter i64.const 1 drop end ) )
©Gunosy Inc. eWASMのメリット その2: WebAssemblyエコシステム ▪ 開発基盤の安定 – Mozilla, Google,
Microsoft, Apple等が開発に参加 – Ethereumコミュニティだけで仮想マシンをメンテするのは大変だった ▪ C/C++, rust, Goなど他言語での開発が可能に – これらの言語のコード資産が活用できる – 開発者の増加 – SolidityもeWASMにコンパイル可能(予定)
©Gunosy Inc. eWASMの具体的仕様
©Gunosy Inc. eWASMの具体的仕様 要点まとめ ▪ コントラクトコードはEVMコードからeWASMに ▪ EVMの代わりにeWASM VM –
デプロイとコントラクトの実行 ▪ Ethereum Environment Interface (EEI) – ブロックチェーンと疎通するためのWebAssemblyモジュール ▪ System Contract – VMが使うロジックを持つ「コントラクトとして定義されたインターフェー ス」
©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. ▪ Moduleの仕組みを利用して機能追加も簡単に
©Gunosy Inc. System Contract ▪ 厳密には、「コントラクトとして定義されたインターフェース」 – 仮想マシンの外で実装したいロジックをコントラクトの形で定義してお き、仮想マシンがcallして使う ▪
EVMでのPrecompiled Contractもこれに含まれる – ecrecoverなどの暗号学的で複雑な処理を事前にコンパイル – 該当するアドレスのコントラクトはブロックチェーンからではなくクライア ントの実装を見に行く • ex: 0x0000000000000000000000000000000000000001 eWASM VMが使うロジックを持つコントラクト
©Gunosy Inc. System Contract ▪ Sentinel Contract – コントラクトをデプロイするときにVMが呼び出し、以下の処理を行う 1.
eWASMの仕様にあっているかをチェック 2. gas計算のロジックを挿入する 3. デプロイ準備OKの目印をつける ▪ EVM Transcompiler – EVMのバイトコードをeWASMにトランスパイルする – EVMをサポートしていない場合にVMが呼び出す • これにより、今後のクライアントはeWASMだけサポートしておけ ば、既存のEVMコードのコントラクトも実行可能 eWASM VM用に2種類追加
©Gunosy Inc. eWASM VM ▪ コントラクトの実行 – コントラクトがeWASMの時はWebAssemblyエンジンで実行 – EVMコードの時
• EVM実行環境あればそれを使う • なければTranscompiler Contractを呼び出すなどして実行 ▪ eWASMコントラクトのデプロイ – Sentinel Contractでバイトコードをバリデーション&アノテーションする eWASMコントラクトのデプロイ・実行を行う
©Gunosy Inc. コントラクトの実行 eWASM VM WASM Engine EEI (World State
との疎通) eWASM Contract WASM code EOA / Contract EOA / Contract EOA / Contract client message call input data World State callDataCopy create, call, etc. Storage storageStore EVMコードの 場合はcall System Contract Sentinel Contract EVM Transcompiler コード実行 import
©Gunosy Inc. 開発状況
©Gunosy Inc. eWASM開発状況 ▪ 現在はHeraというC++によるeWASM VMの開発 に注力 – EVM-CというABI経由でcpp-ethereumから Heraを動かす
– WebAssemblyエンジンはBinaryenを使用 – プロトタイプ動いている – go-ethereumからもHeraを動かせる様にな る予定 ▪ テストネット準備中 – メインネットは少なくとも来年以降になりそう テストネットに向けて開発が進む https://www.youtube.com/watch?v=Nt3L5 dPmv2o
©Gunosy Inc. 所感
©Gunosy Inc. 所感 ▪ EVMを独自で開発するのは大変だったのだろう – EOSは初めからWebAssemblyを採用(eWASMと近いアプローチ) ▪ EVM周りはgo-ethereumの実装を見るのが一番理解しやすい 間違い等あれば是非@veryNRまでお知らせください