Zilliqa官方文檔(四)- Scilla合約架構(gòu)

本系列文檔翻譯版權(quán)歸FireStack團(tuán)隊(duì)所有,轉(zhuǎn)載請(qǐng)注明來(lái)源播急。

Scilla合約架構(gòu)

Scilla合約的一般結(jié)構(gòu)如下代碼所示燎含。開(kāi)頭是引用純數(shù)學(xué)函數(shù)的library的聲明饶囚,例如計(jì)算兩個(gè)比特?cái)?shù)據(jù)的AND 布爾值伏伐,或計(jì)算某個(gè)自然數(shù)的階乘。在庫(kù)聲明代碼塊后面晕拆,是使用contract聲明的合約內(nèi)容藐翎。合約有三個(gè)部分,第一部分聲明合約的不可變參數(shù)实幕,第二部分聲明可變字段吝镣,第三部分為所有transition定義。

(* Scilla contract structure *)


(***************************************************)
(*               Associated library                *)
(***************************************************)

library MyContractLib


(* Library code block follows *)



(***************************************************)
(*             Contract definition                 *)
(***************************************************)

contract MyContract

(* Immutable fields declaration *)

(vname_1 : vtype_1,
 vname_2 : vtype_2)

(* Mutable fields declaration *)

field vname_1 : vtype_1 = init_val_1
field vname_2 : vtype_2 = init_val_2

(* Transitions *)


(* Transition signature *)
transition firstTransition (param_1 : type_1, param_2 : type_2)
  (* Transition body *)

 end

transition secondTransition (param_1: type_1)
  (* Transition body *)

end

不可變變量

不可變變量昆庇,或稱為合約參數(shù)末贾,在創(chuàng)建合約時(shí)就定義了值,并且不能被修改整吆。合約中的不可變變量組需在合約開(kāi)頭的合約名稱定義之后聲明拱撵。

不可變變量聲明格式如下:

(vname1 : type1,
 vname2 : type2,
  ...  )

每個(gè)聲明都包含一個(gè)變量名(標(biāo)識(shí)符)及其類(lèi)型,用:分隔表蝙。多個(gè)變量聲明用,分隔拴测。變量的初始值在合約創(chuàng)建時(shí)就要指定。

可變變量

可變變量代表著合約的可變狀態(tài)府蛇。它們也被稱為字段集索。它們會(huì)在不可變變量之后聲明,每個(gè)聲明都以field為前綴。

field name1 : type1 = expr1
field name2 : type2 = expr2
...

這里的每個(gè)表達(dá)式都是相應(yīng)字段的初始值务荆。變量的定義在創(chuàng)建就完成了初始化妆距。隨著合約履行transition,這些字段的值會(huì)被修改函匕。

轉(zhuǎn)換(Transitions)

Transitions決定了合約狀態(tài)的變化娱据。這些是使用transition定義的,后面寫(xiě)要傳遞的名稱和參數(shù)浦箱,以end結(jié)尾吸耿。

transition foo (name1 : type1, name2 : type2, ...)
  ...
end

name : type指定參數(shù)名和類(lèi)型,多個(gè)參數(shù)時(shí)用,分隔酷窥。除了顯式聲明的參數(shù)之外咽安,還可以使用以下transition隱式參數(shù)。

  • _sender : Address :觸發(fā)此transition的帳戶(消息發(fā)送人)蓬推。
  • _amount : Uint128:入庫(kù)金額(ZILs)妆棒。必須使用accept語(yǔ)句明確接收過(guò)程。如果transition沒(méi)有執(zhí)行沸伏,則不會(huì)執(zhí)行accept糕珊。

表達(dá)式(Expressions)

表達(dá)式處理純操作。Scilla中支持的表達(dá)式是:

  • let x = f in e :在表達(dá)式e中給出名稱x毅糟。 這里ef的結(jié)合是局部的红选,因此限于e。 下面的示例將表達(dá)式builitin add one Int32 5中的one綁定為1 姆另,它將5添加到1喇肋,因此計(jì)算結(jié)果為6。

    let one = 1 in builtin add one Int32 5
    
  • let x = f:在合約中注明 f名稱x迹辐。xto 的綁定 f是全局的蝶防,并延伸到合約的末尾。請(qǐng)注意缺失in明吩,這意味著綁定適用于整個(gè)合約而不是特定表達(dá)式间学。以下代碼片段定義了一個(gè)常量,one其值1貫穿整個(gè)契約印荔。

    let one = 1
    
  • {<entry> _1; <entry> _2 ...}:消息表達(dá)式(請(qǐng)參閱下面的Message類(lèi)型)低葫,其中每個(gè)條目具有以下形式:b:x。這里b是標(biāo)識(shí)符躏鱼,x是變量氮采,其值綁定到消息中的標(biāo)識(shí)符。以下代碼定義了一個(gè)帶有四個(gè)條目_tag染苛,_recipient鹊漠,_amountcode的msg主到。

    msg = { _tag : "Main"; _recipient : sender; _amount : Uint128 0; code : Uint32 0 };
    
  • fun (x : T) => e:一個(gè)接受x類(lèi)型輸入T并返回表達(dá)式e求值的值的函數(shù)。

  • tfun T => e:一種類(lèi)型函數(shù)躯概,它T作為參數(shù)類(lèi)型并返回表達(dá)式e求值的值登钥。有關(guān)Pair示例,請(qǐng)參閱下面的部分 娶靡。

  • @x Tx使用類(lèi)型實(shí)例化變量T牧牢。

  • f x:應(yīng)用fx

  • builtin f x:應(yīng)用builtin功能fx姿锭。

  • matchexpression:將綁定變量與模式匹配并執(zhí)行該子句中的語(yǔ)句塔鳍。該match表達(dá)式類(lèi)似于matchOCaml中的表達(dá)式 。要匹配的模式可以是變量綁定呻此,ADT構(gòu)造函數(shù)(請(qǐng)參閱ADT)或通配符_以匹配任何內(nèi)容轮纫。

match x with
| pattern1 =>
   statements ...
| pattern2 =>
   statements ...
end

聲明(Statements)

Scilla中的聲明是實(shí)際生效的操作,即這些操作不是純數(shù)學(xué)意義上的焚鲜。此類(lèi)操作包括從可變智能合約變量讀取或向其寫(xiě)入掌唾。

  • x <- fx從可變字段f讀取值。
  • f := x:可變字段f的值更新為 x忿磅。

還可以從區(qū)塊鏈狀態(tài)中讀取糯彬。區(qū)塊鏈狀態(tài)由與區(qū)塊相關(guān)聯(lián)的某些值組成,如BLOCKNUMBER葱她。

  • x <- &Bx從區(qū)塊鏈狀態(tài)變量B讀取值撩扒。

每當(dāng)通過(guò)transition發(fā)送ZIL令牌時(shí),轉(zhuǎn)換必須明確接收這筆轉(zhuǎn)賬吨些,可通過(guò)accept聲明完成却舀。

  • accept :接收來(lái)款。

通信(Communication)

合約可以通過(guò)send聲明與其他合約(或非合約)賬戶進(jìn)行通信:

  • send ms:發(fā)送消息列表ms锤灿。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辆脸,隨后出現(xiàn)的幾起案子但校,更是在濱河造成了極大的恐慌,老刑警劉巖啡氢,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件状囱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡倘是,警方通過(guò)查閱死者的電腦和手機(jī)亭枷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搀崭,“玉大人叨粘,你說(shuō)我怎么就攤上這事猾编。” “怎么了升敲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵答倡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我驴党,道長(zhǎng)瘪撇,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任港庄,我火速辦了婚禮倔既,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鹏氧。我一直安慰自己渤涌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布度帮。 她就那樣靜靜地躺著歼捏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笨篷。 梳的紋絲不亂的頭發(fā)上瞳秽,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音率翅,去河邊找鬼练俐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冕臭,可吹牛的內(nèi)容都是我干的腺晾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辜贵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悯蝉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起托慨,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鼻由,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后厚棵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蕉世,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年婆硬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狠轻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彬犯,死狀恐怖向楼,靈堂內(nèi)的尸體忽然破棺而出查吊,到底是詐尸還是另有隱情,我是刑警寧澤蜜自,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布菩貌,位于F島的核電站,受9級(jí)特大地震影響重荠,放射性物質(zhì)發(fā)生泄漏箭阶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一戈鲁、第九天 我趴在偏房一處隱蔽的房頂上張望仇参。 院中可真熱鬧,春花似錦婆殿、人聲如沸诈乒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)怕磨。三九已至,卻和暖如春消约,著一層夾襖步出監(jiān)牢的瞬間肠鲫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工或粮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留导饲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓氯材,卻偏偏與公主長(zhǎng)得像渣锦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氢哮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354