Contract
Contract
code:HelloWorld.scilla
(**************************************)
(* The contract definition *)
(**************************************)
contract HelloWorld
(* immutable変数 *)
(owner: Address)
‍
(* mutable変数 *)
field welcome_msg : String = ""
解説
Scillaコントラクトには、mutable(変更可)とimmutable(変更不可)の2種類の状態変数があります。
‍変更不可な変数は、コントラクトのデプロイ時に初期化されます。一度初期化されるとそれらの値は変更できません。
※Solidityや他言語におけるコンストラクタと同じ扱い
HelloWorldには、ownerというAddress型の変更不可の変数があります。
変更可な変数は、コントラクトが作成された後でも値は変更できます。
HelloWorldには、welcome_msgというString型の変更可な変数があります。
code:HelloWorld.scilla
(* setHello関数(引数は文字列) *)
transition setHello (msg : String)
is_owner = builtin eq owner _sender;
match is_owner with
| False =>
msg = {_tag : "Main"; _recipient : _sender; _amount : Uint128 0; code : not_owner_code};
msgs = one_msg msg;
send msgs
| True =>
welcome_msg := msg;
msg = {_tag : "Main"; _recipient : _sender; _amount : Uint128 0; code : set_hello_code};
msgs = one_msg msg;
send msgs
end
end
‍
(* getHello関数(引数は無し) *)
transition getHello ()
r <- welcome_msg;
msg = {_tag : "Main"; _recipient : _sender; _amount : Uint128 0; msg : r};
msgs = one_msg msg;
send msgs
end
解説
Scillaにおけるコントラクト内の関数は、トランジションと呼びます。トランジションは、mutable変数の値を変更し、他のコントラクトと通信する関数です。
1つ目のトランジションsetHelloは、msgというString引数を入力として受け取り、呼び出し元がオーナーかチェックします。オーナーの場合はwelcome_msgを更新し成功を、異なる場合は更新せずに失敗を呼び出し元のアドレスにメッセージ送信します。
オーナーチェックは、is_owner = builtin eq owner _sender;で行われます。
eqはScillaに搭載されたbuiltin関数となり、関数の結果はmatch式にて検証する必要があります。
code:match式
is_owner = builtin eq owner _sender;
match is_owner with
| False =>
失敗の場合の処理
| True =>
成功の場合の処理
Scilla言語では処理結果である戻り値をmatch式にて検証し、例外まで含めた記述が求められています。
mutable変数への代入はwelcome_msg := msg;となります。
メッセージの送信はLibraryにて定義した関数one_msgを利用します。
code:msg送信
msg = {_tag : "Main"; _recipient : _sender; _amount : Uint128 0; code : set_hello_code};
msgs = one_msg msg;
send msgs
2つ目のトランジションであるgetHelloは、welcome_msgの値を呼び出し元のアドレスにメッセージ送信します。
code:msg送信
r <- welcome_msg;
msg = {_tag : "Main"; _recipient : _sender; _amount : Uint128 0; msg : r};
msgs = one_msg msg;
send msgs
mutable変数の取得は、r <- welcome_msg;ように受け取り変数 <- immutable変数と記述します。
msgのパラメータは、_tag, _recipient, _amountの3つが必須パラメータとなりますが、それより後ろは任意のパラメータを設定できます。今回の場合、msgが任意パラメータとなります。
引用元:scilla-lang.org