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
create-my-own-smart-contract-languages-using-ll...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
akht
November 18, 2021
320
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
520
What is a DAO ?
akht
0
320
create AkhToken
akht
0
85
おうちでKMP法
akht
2
660
Evaluate PHP mail in Go
akht
0
410
ソートアルゴリズム101/Sorting Algorithms 101
akht
1
470
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
Code Review Best Practice
trishagee
74
20k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
250
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
240
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
180
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で進捗をお話しできれば!
ご清聴ありがとうございました!