雖然智能合約(Smart Contract)這個詞現在已經很流行了,但如果你問我到底什麼是智能合約?我還真不能馬上給出準確的答案,為此,我查看了 wikipedia 上關於 Smart Contract 的詞條:
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.
可以看到,所謂智能合約中的智能,其實和人工智慧中的智能(Intelligence)還是有很大的區別,之所以稱之為智能合約,也許是因為它比傳統的合約要先進,主要體現在以下幾個方面
- 你相信合約就行了,不需要第三方參與
- 它是可追蹤的,無法復原的
- 它是可以自動執行的
不要小看這幾點特性,智能合約的普及,可以讓人們在交易過程中更為透明,你和一個陌生人交易,不會再是一次博弈的關係,而是多次博弈,因為所有的交易記錄都是可追蹤的,試想以下,如果你在和別人交易時,事先就知道今後還會和這個人交易,你會選擇合作還是背叛?當然是合作。所以,相比於傳統的合約,智能合約可以減少交易成本(Transaction cost),從而整體的提升社會效率。
什麼是 EOS 智能合約
在 EOSIO 開發人員文檔中,有這麼一段描述
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).
真實世界的合約,簡單來說,是一組協議,給予其輸入一定的行為,它會產生相應的結果。從正規的法律合約(如金融交易)到簡單的遊戲「規則」都屬於合約的範疇。典型的行為可以是轉賬(金融合約)或玩家的移動(遊戲合約)。
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 智能合約軟體註冊在區塊鏈上,並在 EOSIO 節點上執行,它實現了「合約」的語義,並將合約的請求行為儲存在區塊鏈上,即請求賬本。
EOS 定義的智能合約包含兩個要素:代表合約的程式和執行合約時的行為。同時,閱讀上面這段文字時,你很可能會把它和比特幣系統對應起來,其實比特幣是智能合約的一個特例:它只定義了轉賬合約,即接收 UTXO(Unspent Transaction Output)、驗證簽名及建立新的 UTXO;而該合約也只有一個行為——轉賬(發送UTXO)。
和比特幣把 UTXO 記錄在區塊鏈上一樣,EOS 也把所有的行為資料記錄在了區塊鏈上,唯一不同的是,EOS 是一個智能合約平台,它不僅支援轉賬合約,現在你能看到的 CPU、Bandwidth 抵押、RAM 人機交易市場、投票等都在其範疇之內,可以看到智能合約平台是非常具有想象力的,它提供了多樣性,即便如此,它仍然由最基本的因素組成:代表合約的程式和執行合約的行為。從這個角度來看,EOS 仍然只是比特幣的擴充,所以在學習中,牢記這兩個要素,有助於在學習的過程中不至於迷失。
如何開發 EOS 智能合約
開發 EOS 智能合約,你需要完成該合約對應的程式,並將其上傳到 EOS 平台上,電腦語言方面,目前智能合約只能用 C++
開發,並將其編譯成 WebAssembly
相容的可執行程式,因為 Go
語言將支援 WebAssembly
,所以未來你也可以使用 Golang
來寫智能合約,除此之外,也有開發人員正在將 EOS 接入 JavaScript
虛擬機器和 Python
虛擬機器,所以在不久的將來,開發智能合約將不再受 C++
這座大山的限制。
即便現在只能使用 C++
語言開發,要實現一個 EOS 智能合約也並不複雜,實際上你只需要開發該合約所提供的行為即可,從這個角度來講,合約和行為的關係,就好比 WebService 和其提供的 Interface 之間的關係。假設目前 eosio.token
這個合約不存在,需要你來實現它,你會怎麼做?eosio.token
這個合約主要完成了 EOSIO 平台中各種 token 的建立、發行和轉賬功能,所以你應該首先定義其具備的3個行為:
create
:用於建立新的 token
issue
:用於發行 token,有點像銀行印鈔的功能
transfer
:讓使用者之間可以進行轉賬
同時,和應用程式提供的介面(interface)一樣,你需要將所有的行為暴露出去,這樣使用者才可以進行調用。EOSIO 為每個合約提供了統一的行為入口——apply
函數,你可以把它理解為 WebService 中的路由(routing),同時,為了方便開發,EOSIO 提供了一個宏,你只需要添加一行代碼,就可以實現 apply
功能,如下:
EOSIO_ABI( eosio::token, (create)(issue)(transfer) )
以上代碼將 create
、issue
和 transfer
三個行為都暴露到了外部。也就是說,使用者要執行該合約,首先進入的是 apply
函數,然後根據具體的行為,再進入到不同的 create
、issue
或 transfer
中運行。
為了完成 eosio.token
智能合約,我們已經實現了其所具備的行為,以及將這些行為通過 apply
函數暴露到外部,根據 EOSIO 對智能合約的定義,這裡似乎少了點什麼,的確,在實現的過程中,我們遺漏了最為關鍵的步驟:將使用者請求智能合約的行為儲存到區塊鏈上。
大家都知道區塊鏈是一種時間序列的鏈表式資料庫,即它是一種以交易為單位、按照時間的順序、以鏈表形式儲存的資料結構,鏈表的特點是檢索困難,所以通常區塊鏈系統都會配備一個 KV 資料庫來加速檢索,EOSIO 也不例外,它提供一個仿 boost::multi_index
(Boost
是擴充 C++
的強大的功能庫) 的資料結構,也叫 multi_index
資料庫,這種資料庫相比傳統的 KV 資料庫來說,優勢在於它可以對同一份資料建多級索引,檢索效率更高。
在 EOSIO 中,multi_index
資料庫除了協助加速檢索外,它還是智能合約寫區塊鏈的橋樑,所以要寫好智能合約,對 multi_index
的學習是必不可少的,相信你也猜到了,multi_index
使用的資源就是 EOSIO 系統中最重要的——RAM,更加說明了它的重要性。
下面這張圖很好的說明了 EOS 處理智能合約的流程,從上至下,系統會依次執行每個合約,從左至右,對每個合約,系統會為其分配一個 apply
上下文,不同合約之間的上下文是隔離的,不會互相影響。
img
以上,是你寫一個 EOS 智能合約的要點,如果你讀了這些內容後,覺得寫一個智能合約不是什麼難事兒,那麼這篇文章的目的就達到了,下一步,你應該就可以閱讀 contracts/eosio.token
下的代碼了。
總結一下,這篇文章主要講述了什麼是智能合約,EOS 智能合約具體又指什麼,以及寫一個 EOS 智能合約的關鍵,它們是:
- 實現既定合約中包含的行為,將行為暴露給外部
- 學會使用
multi_index
資料庫介面
相關文章:
- 手把手教你使用EOS多重簽名 - 保護你的資產
- EOS.IO中的外掛程式布局 | 源碼解讀
- 5行代碼幫你梳理EOS.IO的脈絡
歡迎加入我的知識星球,一起學習: