Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
create-my-own-smart-contract-languages-using-ll...
Search
akht
November 18, 2021
350
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
create-my-own-smart-contract-languages-using-llvm-1
akht
November 18, 2021
More Decks by akht
See All by akht
NFT tsukutte asobo
akht
1
540
What is a DAO ?
akht
0
340
create AkhToken
akht
0
98
おうちでKMP法
akht
2
710
Evaluate PHP mail in Go
akht
0
430
ソートアルゴリズム101/Sorting Algorithms 101
akht
1
480
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
97
6.8k
Navigating Weather and Climate Data
rabernat
0
520
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Speed Design
sergeychernyshev
33
2.1k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
Agile that works and the tools we love
rasmusluckow
331
22k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
690
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
300
Transcript
EVMで動くスマートコントラクト 記述言語を作りたい その最初の一歩 @akht_ikd / 2021.11.18 K-Ruby #27
池田 昭仁 (イケダ アキヒト) GMO Pepabo, Inc. エンジニア Twitter /
@akht_ikd https://akhtikd.com
やりたいこと - EVM(Ethereum Virtual Machine)で動くスマートコントラクト記述言語 を自作したい - e.g. Solidity, Vyper
- 自作言語で書いたスマートコントラクトがブロックチェーン(Ethereum)上 でずっと動いている...ってなんかイイ - Ethereumに興味があるのでEVMのことを知りたい
きっかけ WEB+DB PRESS Vol.125 特集1:作って学ぶプログラミング言語のしくみ これをきっかけに周りで言語実装が盛り上がる
きっかけ
言語実装の経験 - むかし「Go言語でつくるインタプリタ」を読んだ - Monkeyという独自言語の実装 - マークダウンのパーサ(toy)を書いた - コード生成はしたことない -
やりたいことに対してわからないことだらけ
どうやってEVMターゲットの独自言語を作 るんだ...?
どうやって作る...? - Lexer, Parser, Code Generatorなどを用意して - 独自言語 -> EVMアセンブリ
-> EVMバイナリ -> EVMバイトコード に変換する - 最終的にEVMバイトコードを吐ければいい - いきなり全部やるのは大変そう(最終的にはやりたいけど) - まずはさっと試せる何かがないものか... => ありました
https://github.com/etclabscore/evm_llvm
EVM LLVM - LLVMをバックエンドにしてスマートコントラクト言語を書ける - 字句解析・構文解析などをしてLLVM IRを生成すれば そこからのコード生成はLLVMに任せることができる - ひとまず動くものを作ってみるのによさそう
- wikiもあり解説記事もある https://medium.com/@lonelydove/creating-your-own-smart-contract-languages-using-llvm-a83a9aa1e0c1
- こういう普通のレキサー・パーサーを用意 - (今回はKaleidoscopeがベース)
- ASTからLLVM IRを生成するコードを用意 - LLVM IRについてはまだよくわかってなくて 解説やサンプルコードを参考にして なんとなく雰囲気を掴んだ程度 ...
- EVMで動かすための処理を追加 - function dispatcher (main関数)の挿入 - フレームポインタの初期化 - ブロックチェーンへの引数を展開
- EVMからの戻り値を受け取る (このあたりまだ全然理解ができていない ...)
LLVM IRに変換できた
$ 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バイナリ
申し訳程度のRuby要素 EVMバイナリ -> EVMバイトコード
5b60806040526020803560008035610045808483600051806 0600152600051608001806000526020526004580192565b60 00516020900351600052915092509150908152f35b019056 def hoge(a b) a + b; ↓
LLVM IR ↓ EVMバイナリ ↓ EVMバイトコード
❯ 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; が元のコードなので ちゃんと動いていそう!すごい!!
🎉これで準備が整った🎉 しかし残念ながら今回はここまで... 今回は他人の成果を紹介するだけになってしまいました...😇
これから - EVM LLVMを使いつつブロックチェーン独自の操作を実装する - アドレスに関する操作(balance, transferなど) - EVM LLVMからの脱却
- EVMについて知りたいというのがきっかけだったので EVM LLVMに頼りぱなしだとあまり意味がない... - 次回のK-Rubyで進捗をお話しできれば!
ご清聴ありがとうございました!