智能合約是一種旨在以信息化方式傳播、驗(yàn)證或執(zhí)行合同的計(jì)算機(jī)協(xié)議?;趨^(qū)塊鏈技術(shù)實(shí)現(xiàn)的智能合約,支持可編程合約,具有去中心化、不可篡
智能合約是一種旨在以信息化方式傳播、驗(yàn)證或執(zhí)行合同的計(jì)算機(jī)協(xié)議?;趨^(qū)塊鏈技術(shù)實(shí)現(xiàn)的智能合約,支持可編程合約,具有去中心化、不可篡改、過(guò)程透明可追蹤等優(yōu)點(diǎn),是由合約制定者在鏈下構(gòu)建的一套以數(shù)字形式定義的共識(shí),發(fā)布至鏈上存儲(chǔ),并于鏈上執(zhí)行。任意用戶通過(guò)私鑰簽名以提供必要的身份證明成為共識(shí)參與者,其執(zhí)行的過(guò)程是原子性的,獲得的結(jié)果也是冥等的。
實(shí)現(xiàn)合約框架的方式
作為承載DApp的最重要基石,維基鏈智能合約框架采用Lua語(yǔ)言作為合約的編碼語(yǔ)言。Lua語(yǔ)言具有輕量、可拓展等特性,在游戲開(kāi)發(fā)、獨(dú)立應(yīng)用腳本和數(shù)據(jù)庫(kù)插件方面都已被大量地應(yīng)用。維基鏈核心功能均由C/C++開(kāi)發(fā),而Lua代碼可以很容易的被C/C++ 代碼調(diào)用,也可以反過(guò)來(lái)調(diào)用C/C++的函數(shù)。所以這款學(xué)習(xí)成本低、兼容性好又具備高性能和安全的語(yǔ)言是構(gòu)建智能合約框架很好的編程語(yǔ)言。
框架使用的Lua5.3版本的虛擬機(jī),在虛擬機(jī)層設(shè)計(jì)了一個(gè)mylib函數(shù)庫(kù)以開(kāi)放接口給合約層調(diào)用,其遵循了Lua標(biāo)準(zhǔn)函數(shù)庫(kù)的設(shè)計(jì)方式。與常見(jiàn)的Lua虛擬機(jī)不同,智能合約的代碼會(huì)在鏈上所有的節(jié)點(diǎn)包括礦工節(jié)點(diǎn)和觀察者節(jié)點(diǎn)上執(zhí)行,因此智能合約虛擬機(jī)不支持大部分Lua標(biāo)準(zhǔn)函數(shù)庫(kù):
維基鏈智能合約框架在具備區(qū)塊鏈特性的基礎(chǔ)上,還有以下特點(diǎn):內(nèi)部貨幣系統(tǒng)、去中心化部署及運(yùn)行、代碼風(fēng)格自由且透明,通過(guò)JsonRpc接口或區(qū)塊瀏覽器還可以查看每筆合約交易的輸入、輸出信息。
mylib庫(kù)的功能
mylib庫(kù)是合約與外部環(huán)境交互的唯一接口,包含計(jì)算、驗(yàn)證、查詢、資產(chǎn)管理及數(shù)據(jù)存儲(chǔ)等基礎(chǔ)功能,主要由以下這些接口實(shí)現(xiàn):
具體的使用方法,大家可以在維基鏈開(kāi)發(fā)者中心文檔(見(jiàn)文末)內(nèi)查詢到。
如何開(kāi)發(fā)智能合約
開(kāi)始開(kāi)發(fā)前,你需要學(xué)習(xí)Lua的基本語(yǔ)法,錢(qián)包節(jié)點(diǎn)的搭建和JsonRpc的使用以及mylib的各函數(shù)的使用方式,還需要注意智能合約框架存在以下限制:
a. 每個(gè)合約代碼需要在合約代碼頭部引入mylib庫(kù);
b. 合約代碼總長(zhǎng)度限制在64KB;
c. 合約參數(shù)總長(zhǎng)度限制在4096字節(jié);
d. 合約數(shù)據(jù)庫(kù)存儲(chǔ)的Key和Value長(zhǎng)度均限制在500字節(jié)。
對(duì)于合約參數(shù),在虛擬機(jī)啟動(dòng)后會(huì)以Byte數(shù)組(表)的方式存放在全局變量contract中。目前的最佳實(shí)踐是將合約參數(shù)進(jìn)行類(lèi)似Protobuf方式的編碼,你可以參考在開(kāi)發(fā)者文檔中心里WRC20代幣的智能合約。不管是以何種方式傳遞參數(shù)給智能合約,你都需要自行設(shè)計(jì)編碼工具和合約代碼內(nèi)的解碼函數(shù)。
現(xiàn)在,維基鏈官方提供了在線合約編輯器,你可以很方便地在瀏覽器中開(kāi)發(fā)、調(diào)試和發(fā)布你的智能合約。社區(qū)也有一些編解碼的工具和優(yōu)秀的合約模板庫(kù)供使用參考。
優(yōu)化升級(jí)
維基鏈核心開(kāi)發(fā)團(tuán)隊(duì)仍持續(xù)地優(yōu)化智能合約框架,將Gas計(jì)算的范圍和價(jià)格調(diào)整的更合理,豐富鏈上mylib庫(kù)的功能,增加鏈下的智能合約調(diào)試開(kāi)發(fā)工具,也有對(duì)其他的語(yǔ)言如Solidity和WebAsambly進(jìn)行兼容的計(jì)劃。(維基鏈)