株式会社 proof ninja 技術顧問の池渕です.
この記事はこちらの記事
OCamlでEthereumのスマートコントラクトを開発できるようにするプロジェクトの紹介
の続きです.今回は,新しく bool 値や if 式の実装を行ったのでその紹介をします.
ソースコードはこちら:
具体的には今回,ocaml2evm に以下のような値や式が追加されました.
- bool 値
true
,false
- bool 演算
&&
,||
,not
- sint 型の整数の比較演算
<
,>
,<=
,>=
if ... then ... else ...
具体例として,サンプルコードである ocaml2evm/sample/src/simple_storage.ml
の中身を見てみましょう.
open OCamYul.Primitives
module SimpleStorageIf : sig
type storage
val set : sint -> storage -> unit * storage
val get : unit -> storage -> sint * storage
val lt : sint * sint -> storage -> bool * storage
val gt : sint * sint -> storage -> bool * storage
val lte : sint * sint -> storage -> bool * storage
val gte : sint * sint -> storage -> bool * storage
val xor : bool * bool -> storage -> bool * storage
val xor2 : bool * bool -> storage -> bool * storage
val max : sint * sint -> storage -> sint * storage
end = struct
type storage = sint
let set n _ = ((), n)
let get () s = (s, s)
let lt (x, y) s = (x < y, s)
let gt (x, y) s = (x > y, s)
let lte (x, y) s = (x <= y, s)
let gte (x, y) s = (x >= y, s)
let xor (x, y) s =
let b = (x || y) && not (x && y) in
(b, s)
let xor2 (x, y) s =
let b = if x then (if y then false else true) else (if y then true else false) in
(b, s)
let max (n, m) s =
let b = n > m in
((if b then n else m), s)
end
ここで定義している xor
や xor2
は,上記のブール値演算や if 式を使って xor を(あえて複雑に)実装してみています.
OCaml の if は式なので,let b = if x then ... else ...
のように代入の =
の右側に if が書けます.C 言語などでいう三項条件演算子と同じです.
また,>
を使って,整数の max
関数も定義しています.
このファイルをコンパイルするには,前回の記事と同様に,
$ dune exec ocamyulc sample/src/simple_storage_if.ml
を実行します.また,その結果は sample/contracts/SimpleStorageIf.json
として出力されます.
bool 演算や if 式が使えるようになったことにより,前回よりいろいろなコントラクトが実装できるようになったと期待できます.
今後はこの機能の範囲でもう少し実用的なコントラクトを定義し,さらには簡単な形式検証を行っていくことが目標です.