上一篇我們介紹了如何搭建本地測試節點,它提供了一個智能合約的運行環境。我們還介紹如何使用超級賬戶
eosio
來創建新賬戶以及載入系統級別的智能合約。通過上一章的學習,大家可能已經對智能合約有了一個比較模糊的概念。這一章將繼續為大家講解,開發智能合約之前,你還需要知道的事。
摘要
這一章,我們將自己上手部署調用一個簡單的智能合約hello
,中間會穿插講解一些相關概念,這些概念雖然很基礎,但是對初學者而言,也很重要。
什么是WebAssembly
之前如果大家簡單地瀏覽過eos項目文件夾,就會看到很多.wasm
文件,而wasm就是WebASseMbly的縮寫。這里讓我們略過Flash、JavaScript和WebAssembly的愛恨情仇(發展演化),直接一句話概括一下:
WebAssembly是一種新的編碼方式,可以在現代的網絡瀏覽器中運行。
想象它是一種可以把底層語言文件變得像JS那樣,可以直接在瀏覽器中運行。而且比JS更輕量、更快速、更安全。過程如下圖:
還有一個大家在build
eos的過程中看過一百遍的詞:LLVM
。
LLVM是一些分模塊、可重用的編譯工具鏈。它提供了一種代碼編寫良好的中間表示(IR)。
它在上圖中的位置大概是介于第一步和第二步之間。
如果想把C/C++變成WASM文件,就需要先把C/C++代碼先變成LLVM中間代碼。一旦變換成了LLVM IR之后,就說明LLVM已經理解了代碼并會對代碼自動地做出一些優化。
而WebAssembly也并不是只有wasm
一種格式,它還有wast
格式。這兩者作用是等價的,最大的區別就是wast
是可讀文本格式的,而wast
是二進制格式的,他們可以通過工具相互轉換。
讓我們高度總結一下WebAssembly:
可以讓瀏覽器識別底層語言的神器。
(筆者感覺和以太坊中的編譯器作用差不多)。
什么是ABI
玩過以太坊的同學可能對ABI并不陌生,在EOS中ABI的作用也和以太坊中大致類似:
它定義了函數被調用的規則;定義了參數在調用者和被調用者之間是如何傳遞的。
如果說wasm
文件是產品的話,要想順利使用這件產品,你還需要一本操作說明書,而ABI
就是這份說明書。
土味智能合約入門:hello
一說入門就要說<hello world>,這種感覺很low,同時也很“程序員”。感謝雷佳音讓我找到了一個并不尷尬的小標題:土味hello。
0. 準備工作
進度保持在我們上一章結束的地方:我們已經學會使用操作eosio賬戶、創建了新賬戶testeosio
。
在正文開始之前,請啟動nodeos
,相關錢包處于unlock狀態。
1. 修改config.ini
找到位于vi ~/Library/Application\ Support/eosio/nodeos/config/
中的config.ini
文件,打開找到下面這句話:
# print contract's output to console (eosio::chain_plugin)
contracts-console = false
把上面的false
改成true
,保存修改退出。這樣我們就可以在終端直接看到智能合約的執行情況。
(這里筆者重新啟動了nodeos)
2. 創建hello
合約
這里我們用到了一個小工具叫eosiocpp
。eosiocpp是一個c++生成wasm和ABI文件的工具。
eos項目中自帶了一個hello合約,為了區分,這里我們創建一個合約叫做hello1
。執行以下語句創建新合約:
eosiocpp -n hello1
它會以樣例合約為基礎創建一個最簡單的合約。看到下圖即表示創建成功:
[圖片上傳失敗...(image-5029e2-1533719914534)]
這時在當前文件夾下就可以看到有一個hello1
的文件夾。
進入hello1
文件夾,可以看到里面有兩個文件:
? hello1 git:(master) ? ls
hello1.cpp hello1.hpp
-
hello1.hpp
是智能合約的頭文件,可以包含一些變量,常量和函數的聲明。 -
hello1.cpp
是合約的源碼文件,包含合約的具體實現。
3. 生成wasm和abi文件
進入hello1
文件夾下執行以下命令:
#使用 -o 生成wast文件和wasm文件
eosiocpp -o ./hello1.wast ./hello1.cpp
#使用 -g 生成abi文件
eosiocpp -g ./hello1.abi ./hello1.cpp
這時可以看到在當前文件夾下生成了hello1.wast
、hello1.wasm
和hello1.abi
文件。
4. 部署智能合約
使用我們剛剛生成的文件部署智能合約。輸入如下命令:
cleos set contract eosio ./ ./hello1.wast hello1.abi -p eosio@active
這行命令有五個參數:eosio
表示部署合約的賬戶,./
表示合約所在的文件夾,后面兩個參數依次是.wast
和.abi
文件的路徑,最后的-p eosio@active
表示權限。
執行成功如下圖所示:
調用hello合約
在執行調用命令之前,我們先簡單地了解EOS中的一個概念:transaction
和action
。
Action表示單個操作,而transaction是一個或多個action的集合。Action是合約和賬戶之間進行通信的方式。Action可以單獨執行,或者組合組合起來作為一個整體執行。
在官網中我們也可以看到包含一個action和多個action的transaction的例子。
對比來看的話,EOS中的action就相當于以太坊中的transaction。
執行以下命令來調用hello1合約中的hi
方法:(執行的賬戶是testeosio)
cleos push action eosio hi '["hammer"]' -p testeosio
執行成功就可以看到如下界面:
這時如果我們去看運行nodeos
的終端窗口,可以看到下面的提示:
同樣打印出了Hello, hammer
。
總結
這一章我們學習了EOS智能合約在生成、部署以及調用的過程中涉及的相關概念和操作。了解了:
- 什么是webAssembly:翻譯C/C++讓瀏覽器也看得懂的神器;
- 什么是ABI:代碼的“產品說明書”;
- 如何生成和操作一個簡單的智能合約
- 生成wast和abi文件
- 部署合約
- push action調用合約方法
下面一章,我們依然會一邊介紹智能合約的相關必備知識,一邊帶著大家來看一看簡單的智能合約語法。