Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
EVMで動くスマートコントラクト 記述言語を作りたい その最初の一歩 @akht_ikd / 2021.11.18 K-Ruby #27
Slide 2
Slide 2 text
池田 昭仁 (イケダ アキヒト) GMO Pepabo, Inc. エンジニア Twitter / @akht_ikd https://akhtikd.com
Slide 3
Slide 3 text
やりたいこと - EVM(Ethereum Virtual Machine)で動くスマートコントラクト記述言語 を自作したい - e.g. Solidity, Vyper - 自作言語で書いたスマートコントラクトがブロックチェーン(Ethereum)上 でずっと動いている...ってなんかイイ - Ethereumに興味があるのでEVMのことを知りたい
Slide 4
Slide 4 text
きっかけ WEB+DB PRESS Vol.125 特集1:作って学ぶプログラミング言語のしくみ これをきっかけに周りで言語実装が盛り上がる
Slide 5
Slide 5 text
きっかけ
Slide 6
Slide 6 text
言語実装の経験 - むかし「Go言語でつくるインタプリタ」を読んだ - Monkeyという独自言語の実装 - マークダウンのパーサ(toy)を書いた - コード生成はしたことない - やりたいことに対してわからないことだらけ
Slide 7
Slide 7 text
どうやってEVMターゲットの独自言語を作 るんだ...?
Slide 8
Slide 8 text
どうやって作る...? - Lexer, Parser, Code Generatorなどを用意して - 独自言語 -> EVMアセンブリ -> EVMバイナリ -> EVMバイトコード に変換する - 最終的にEVMバイトコードを吐ければいい - いきなり全部やるのは大変そう(最終的にはやりたいけど) - まずはさっと試せる何かがないものか... => ありました
Slide 9
Slide 9 text
https://github.com/etclabscore/evm_llvm
Slide 10
Slide 10 text
EVM LLVM - LLVMをバックエンドにしてスマートコントラクト言語を書ける - 字句解析・構文解析などをしてLLVM IRを生成すれば そこからのコード生成はLLVMに任せることができる - ひとまず動くものを作ってみるのによさそう - wikiもあり解説記事もある https://medium.com/@lonelydove/creating-your-own-smart-contract-languages-using-llvm-a83a9aa1e0c1
Slide 11
Slide 11 text
- こういう普通のレキサー・パーサーを用意 - (今回はKaleidoscopeがベース)
Slide 12
Slide 12 text
- ASTからLLVM IRを生成するコードを用意 - LLVM IRについてはまだよくわかってなくて 解説やサンプルコードを参考にして なんとなく雰囲気を掴んだ程度 ...
Slide 13
Slide 13 text
- EVMで動かすための処理を追加 - function dispatcher (main関数)の挿入 - フレームポインタの初期化 - ブロックチェーンへの引数を展開 - EVMからの戻り値を受け取る (このあたりまだ全然理解ができていない ...)
Slide 14
Slide 14 text
LLVM IRに変換できた
Slide 15
Slide 15 text
$ build/bin/llc -print-after-all -debug -mtriple=evm -fletype=asm toy.ll $ build/bin/llc -print-after-all -debug -mtriple=evm -fletype=obj toy.ll LLVM IR -> EVMアセンブリ LLVM IR -> EVMバイナリ
Slide 16
Slide 16 text
申し訳程度のRuby要素 EVMバイナリ -> EVMバイトコード
Slide 17
Slide 17 text
5b60806040526020803560008035610045808483600051806 0600152600051608001806000526020526004580192565b60 00516020900351600052915092509150908152f35b019056 def hoge(a b) a + b; ↓ LLVM IR ↓ EVMバイナリ ↓ EVMバイトコード
Slide 18
Slide 18 text
❯ evm --input 0000000000000000000000000000000000000000000000000000000000 0000110000000000000000000000000000000000000000000000000000 000000000019 --code 5b60806040526020803560008035610045808483600051806060015260 0051608001806000526020526004580192565b60005160209003516000 52915092509150908152f35b019056 run 0x00000000000000000000000000000000000000000000000000000000 0000002a EVMバイトコードを実際に EVMで動かしてみる 0000000000000000000000000000000000000000000000000000000000000011 => 17 0000000000000000000000000000000000000000000000000000000000000019 => 25 0x000000000000000000000000000000000000000000000000000000000000002a => 42 def hoge(a b) a + b; が元のコードなので ちゃんと動いていそう!すごい!!
Slide 19
Slide 19 text
🎉これで準備が整った🎉 しかし残念ながら今回はここまで... 今回は他人の成果を紹介するだけになってしまいました...😇
Slide 20
Slide 20 text
これから - EVM LLVMを使いつつブロックチェーン独自の操作を実装する - アドレスに関する操作(balance, transferなど) - EVM LLVMからの脱却 - EVMについて知りたいというのがきっかけだったので EVM LLVMに頼りぱなしだとあまり意味がない... - 次回のK-Rubyで進捗をお話しできれば!
Slide 21
Slide 21 text
ご清聴ありがとうございました!