當(dāng)你說(shuō)智能合約,你說(shuō)的到底是什么(EOS篇)區(qū)塊鏈
和比特幣把UTXO記錄在區(qū)塊鏈上一樣,EOS也把所有的行為數(shù)據(jù)記錄在了區(qū)塊鏈上,唯一不同的是,EOS是一個(gè)智能合約平臺(tái),它不僅支持轉(zhuǎn)賬合約,現(xiàn)在你能看到的CPU、Bandwidth抵押、RAM人機(jī)交易市場(chǎng)、投票等都在其范疇之內(nèi)。
雖然智能合約(Smart Contract)這個(gè)詞現(xiàn)在已經(jīng)很流行了,但如果你問(wèn)我到底什么是智能合約?我還真不能馬上給出準(zhǔn)確的答案,為此,我查看了 wikipedia 上關(guān)于 Smart Contract 的詞條 (http://t.cn/RVQQ1Ja):
A smart contract is a computer protocol intended to digitally facilitate, verify, or enforce the negotiation or performance of a contract. Smart contracts allow the performance of credible transactions without third parties. These transactions are trackable and irreversible.
Proponents of smart contracts claim that many kinds of contractual clauses may be made partially or fully self-executing, self-enforcing, or both. The aim of smart contracts is to provide security that is superior to traditional contract law and to reduce other transaction costs associated with contracting.
可以看到,所謂智能合約中的智能,其實(shí)和人工智能中的智能(Intelligence)還是有很大的區(qū)別,之所以稱(chēng)之為智能合約,也許是因?yàn)樗葌鹘y(tǒng)的合約要先進(jìn),主要體現(xiàn)在以下幾個(gè)方面
你相信合約就行了,不需要第三方參與
它是可追蹤的,不可逆的
它是可以自動(dòng)執(zhí)行的
不要小看這幾點(diǎn)特性,智能合約的普及,可以讓人們?cè)诮灰走^(guò)程中更為透明,你和一個(gè)陌生人交易,不會(huì)再是一次博弈的關(guān)系,而是多次博弈,因?yàn)樗械慕灰子涗浂际强勺粉櫟模囅胍韵拢绻阍诤蛣e人交易時(shí),事先就知道今后還會(huì)和這個(gè)人交易,你會(huì)選擇合作還是背叛?當(dāng)然是合作。所以,相比于傳統(tǒng)的合約,智能合約可以減少交易成本(Transaction cost (http://t.cn/RDjUw0D)),從而整體的提升社會(huì)效率。
什么是 EOS 智能合約
在 EOSIO 開(kāi)發(fā)者文檔 (http://t.cn/RDjUT09) 中,有這么一段描述
A real-world contract, simply stated, is an agreement governing outcomes for actions, given a set of inputs. A contract can range from formal legal contracts (e.g., a financial transaction) to something as simple as the “rules” of a game. Typical actions can be things such as fund transfers (in the case of a financial contract) or game moves (in the case of a game contract).
真實(shí)世界的合約,簡(jiǎn)單來(lái)說(shuō),是一組協(xié)議,給予其輸入一定的行為,它會(huì)產(chǎn)生相應(yīng)的結(jié)果。從正規(guī)的法律合同(如金融交易)到簡(jiǎn)單的游戲「規(guī)則」都屬于合約的范疇。典型的行為可以是轉(zhuǎn)賬(金融合約)或玩家的移動(dòng)(游戲合約)。
An EOSIO Smart Contract is software registered on the blockchain and executed on EOSIO nodes, that implements the semantics of a “contract” whose ledger of action requests are being stored on the blockchain.
EOSIO 智能合約軟件注冊(cè)在區(qū)塊鏈上,并在 EOSIO 節(jié)點(diǎn)上執(zhí)行,它實(shí)現(xiàn)了「合約」的語(yǔ)義,并將合約的請(qǐng)求行為存儲(chǔ)在區(qū)塊鏈上,即請(qǐng)求賬本。
EOS 定義的智能合約包含兩個(gè)要素:代表合約的程序和執(zhí)行合約時(shí)的行為。同時(shí),閱讀上面這段文字時(shí),你很可能會(huì)把它和比特幣系統(tǒng)對(duì)應(yīng)起來(lái),其實(shí)比特幣是智能合約的一個(gè)特例:它只定義了轉(zhuǎn)賬合約,即接收 UTXO(Unspent Transaction Output)、驗(yàn)證簽名及創(chuàng)建新的 UTXO;而該合約也只有一個(gè)行為——轉(zhuǎn)賬(發(fā)送UTXO)。
和比特幣把 UTXO 記錄在區(qū)塊鏈上一樣,EOS 也把所有的行為數(shù)據(jù)記錄在了區(qū)塊鏈上,唯一不同的是,EOS 是一個(gè)智能合約平臺(tái),它不僅支持轉(zhuǎn)賬合約,現(xiàn)在你能看到的 CPU、Bandwidth 抵押、RAM 人機(jī)交易市場(chǎng)、投票等都在其范疇之內(nèi),可以看到智能合約平臺(tái)是非常具有想象力的,它提供了多樣性,即便如此,它仍然由最基本的因素組成:代表合約的程序和執(zhí)行合約的行為。從這個(gè)角度來(lái)看,EOS 仍然只是比特幣的擴(kuò)展,所以在學(xué)習(xí)中,牢記這兩個(gè)要素,有助于在學(xué)習(xí)的過(guò)程中不至于迷失。
如何開(kāi)發(fā) EOS 智能合約
開(kāi)發(fā) EOS 智能合約,你需要完成該合約對(duì)應(yīng)的程序,并將其上傳到 EOS 平臺(tái)上,計(jì)算機(jī)語(yǔ)言方面,目前智能合約只能用 C 開(kāi)發(fā),并將其編譯成 WebAssembly 兼容的可執(zhí)行程序,因?yàn)?nbsp;Go 語(yǔ)言將支持 WebAssembly,所以未來(lái)你也可以使用 Golang 來(lái)寫(xiě)智能合約,除此之外,也有開(kāi)發(fā)者正在將 EOS 接入 JavaScript 虛擬機(jī)和 Python 虛擬機(jī),所以在不久的將來(lái),開(kāi)發(fā)智能合約將不再受 C 這座大山的限制。
即便現(xiàn)在只能使用 C 語(yǔ)言開(kāi)發(fā),要實(shí)現(xiàn)一個(gè) EOS 智能合約也并不復(fù)雜,實(shí)際上你只需要開(kāi)發(fā)該合約所提供的行為即可,從這個(gè)角度來(lái)講,合約和行為的關(guān)系,就好比 WebService 和其提供的 Interface 之間的關(guān)系。假設(shè)目前 eosio.token 這個(gè)合約不存在,需要你來(lái)實(shí)現(xiàn)它,你會(huì)怎么做?eosio.token 這個(gè)合約主要完成了 EOSIO 平臺(tái)中各種 token 的創(chuàng)建、發(fā)行和轉(zhuǎn)賬功能,所以你應(yīng)該首先定義其具備的3個(gè)行為:
create:用于創(chuàng)建新的 token
issue:用于發(fā)行 token,有點(diǎn)像銀行印鈔的功能
transfer:讓用戶(hù)之間可以進(jìn)行轉(zhuǎn)賬
同時(shí),和應(yīng)用程序提供的接口(interface)一樣,你需要將所有的行為暴露出去,這樣使用者才可以進(jìn)行調(diào)用。EOSIO 為每個(gè)合約提供了統(tǒng)一的行為入口——apply 函數(shù),你可以把它理解為 WebService 中的路由(routing),同時(shí),為了方便開(kāi)發(fā),EOSIO 提供了一個(gè)宏,你只需要添加一行代碼,就可以實(shí)現(xiàn) apply 功能。
以上代碼將 create、issue 和 transfer 三個(gè)行為都暴露到了外部。也就是說(shuō),使用者要執(zhí)行該合約,首先進(jìn)入的是 apply 函數(shù),然后根據(jù)具體的行為,再進(jìn)入到不同的 create、issue 或 transfer 中運(yùn)行。
為了完成 eosio.token 智能合約,我們已經(jīng)實(shí)現(xiàn)了其所具備的行為,以及將這些行為通過(guò) apply 函數(shù)暴露到外部,根據(jù) EOSIO 對(duì)智能合約的定義,這里似乎少了點(diǎn)什么,的確,在實(shí)現(xiàn)的過(guò)程中,我們遺漏了最為關(guān)鍵的步驟:將用戶(hù)請(qǐng)求智能合約的行為存儲(chǔ)到區(qū)塊鏈上。
大家都知道區(qū)塊鏈?zhǔn)且环N時(shí)間序列的鏈表式數(shù)據(jù)庫(kù),即它是一種以交易為單位、按照時(shí)間的順序、以鏈表形式存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),鏈表的特點(diǎn)是檢索困難,所以通常區(qū)塊鏈系統(tǒng)都會(huì)配備一個(gè) KV 數(shù)據(jù)庫(kù)來(lái)加速檢索,EOSIO 也不例外,它提供一個(gè)仿 boost::multi_index(Boost 是擴(kuò)展 C 的強(qiáng)大的功能庫(kù)) 的數(shù)據(jù)結(jié)構(gòu),也叫 multi_index 數(shù)據(jù)庫(kù),這種數(shù)據(jù)庫(kù)相比傳統(tǒng)的 KV 數(shù)據(jù)庫(kù)來(lái)說(shuō),優(yōu)勢(shì)在于它可以對(duì)同一份數(shù)據(jù)建多級(jí)索引,檢索效率更高。
在 EOSIO 中,multi_index 數(shù)據(jù)庫(kù)除了幫助加速檢索外,它還是智能合約寫(xiě)區(qū)塊鏈的橋梁,所以要寫(xiě)好智能合約,對(duì) multi_index 的學(xué)習(xí)是必不可少的,相信你也猜到了,multi_index 使用的資源就是 EOSIO 系統(tǒng)中最重要的——RAM,更加說(shuō)明了它的重要性。
下面這張圖很好的說(shuō)明了 EOS 處理智能合約的流程,從上至下,系統(tǒng)會(huì)依次執(zhí)行每個(gè)合約,從左至右,對(duì)每個(gè)合約,系統(tǒng)會(huì)為其分配一個(gè) apply 上下文,不同合約之間的上下文是隔離的,不會(huì)互相影響。
以上,是你寫(xiě)一個(gè) EOS 智能合約的要點(diǎn),如果你讀了這些內(nèi)容后,覺(jué)得寫(xiě)一個(gè)智能合約不是什么難事兒,那么這篇文章的目的就達(dá)到了,下一步,你應(yīng)該就可以閱讀 contracts/eosio.token 下的代碼了。
總結(jié)一下,這篇文章主要講述了什么是智能合約,EOS 智能合約具體又指什么,以及寫(xiě)一個(gè) EOS 智能合約的關(guān)鍵,它們是:
實(shí)現(xiàn)既定合約中包含的行為,將行為暴露給外部;
學(xué)會(huì)使用 multi_index 數(shù)據(jù)庫(kù)接口。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來(lái)源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來(lái)源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為T(mén)MT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。