KEVM
TL;DR
K Framework自体の研究開発チーム(UIUC)とメンバー被ってたりするので大学発ベンチャー的な感じなのか?
Cardanoを開発するIOHKがKEVMとKIELEの開発を支援した模様 記事 K Framework
https://gyazo.com/9fd30b39d15bba04edb35299e409da6e
プログラミング言語・型システム・形式的検証の実行可能なセマンティクを構築するフレームワーク
CやJava, JavaScript, WebAssemblyのセマンティックなどが既に構築されている
UIUCなどが中心となって研究開発
Kを使って言語の定義を構成することで、Kの言語に依存しないデバッガや検証ツールなどが利用できる
参考
言語としてのK
ビルトインの無限精度演算
Builtin sorts: Int, String
=>: "rewrites to"
~>: "followed by"
->: "implies"(matching logic)
|->: used for getting the value of a key, e.g. the <storage> cell is implemented as a `Map
KEVM
KによるEVMの形式的なセマンティック定義
KEVMより生成されたEVMインタプリタは40,683のテストを全てパスした
ML言語での実装(つまり形式的なセマンティック定義ではない?)
参考
例: 演算
算術系の命令の定義
code: evm.k(k)
syntax BinStackOp ::= "ADD" | "MUL" | "SUB" | "DIV" | "EXP" | "MOD"
// -------------------------------------------------------------------
rule <k> ADD W0 W1 => W0 +Word W1 ~> #push ... </k> rule <k> MUL W0 W1 => W0 *Word W1 ~> #push ... </k> rule <k> SUB W0 W1 => W0 -Word W1 ~> #push ... </k> rule <k> DIV W0 W1 => W0 /Word W1 ~> #push ... </k> rule <k> EXP W0 W1 => W0 ^Word W1 ~> #push ... </k> rule <k> MOD W0 W1 => W0 %Word W1 ~> #push ... </k> +Wordは256-bitオーバーフローをチェックするrule
code: data.k(k)
// -----------------------------------------
rule W0 +Word W1 => chop( W0 +Int W1 )
rule W0 -Word W1 => chop( W0 -Int W1 ) requires W0 >=Int W1
rule W0 -Word W1 => chop( (W0 +Int pow256) -Int W1 ) requires W0 <Int W1
rule W0 *Word W1 => chop( W0 *Int W1 )
rule W0 /Word W1 => 0 requires W1 ==Int 0
rule W0 /Word W1 => chop( W0 /Int W1 ) requires W1 =/=Int 0
rule W0 %Word W1 => 0 requires W1 ==Int 0
rule W0 %Word W1 => chop( W0 modInt W1 ) requires W1 =/=Int 0
chopはIntを2^256のモジュラーにする
code: data.k(k)
// ----------------------------------------------------
例: CALL
CALLは#checkCall, #callの連続に。#callの後にCcallgasもある
code: evm.k(k)
syntax CallOp ::= "CALL"
// ------------------------
rule <k> CALL GCAP ACCTTO VALUE ARGSTART ARGWIDTH RETSTART RETWIDTH
...
</k>
<schedule> SCHED </schedule>
<id> ACCTFROM </id>
<localMem> LM </localMem>
<previousGas> GAVAIL </previousGas>
上記にマッチするrule
code: evm.k(k)
syntax InternalOp ::= "#checkCall" Int Int
| "#call" Int Int Int Exp Int Int WordStack Bool strict(4) | "#callWithCode" Int Int Map WordStack Int Int Int WordStack Bool
| "#mkCall" Int Int Map WordStack Int Int Int WordStack Bool
// --------------------------------------------------------------------------------
...
</k>
<callDepth> CD </callDepth>
<output> _ => .WordStack </output>
<account>
<acctID> ACCT </acctID>
<balance> BAL </balance>
...
</account>
requires VALUE >Int BAL orBool CD >=Int 1024
CcallgasはCgascapにrewrite
code: evm.k(k)
rule <k> Ccallgas(SCHED, ISEMPTY:Bool, GCAP, GAVAIL, VALUE)
=> Cgascap(SCHED, GCAP, GAVAIL, Cextra(SCHED, VALUE, ISEMPTY)) +Int #if VALUE ==Int 0 #then 0 #else Gcallstipend < SCHED > #fi ... </k> Gcallstipendは2300、Reentrancy対策のためのgas上限
KのReachability Logic proverをKEVMにおいて使い、EVMバイトコードを形式的に検証する
その他Kによるブロックチェーン関連PJ
Ethereum関連
"semantics by translation"
VyperからLLL、LLLからEVMの二つのtranslationの定義によって構成される
定義を作っていく過程でVyperコンパイラのバグをたくさん見つけたとのこと
Vyperのコンパイラとして使える
eWASM系
Cardano関連
IELE in K
IELEはCardanoのVMで、LLVMベースで作られている
EVMのようにスタックマシンではなくレジスタマシン
KEVM, KLLVMを参考にしたらしい
Haskellのサブセット?であるPlutusを開発中
その他