上一篇咱們介紹瞭如何搭建本地測試節點,它提供了一個智能合約的運行環境。咱們還介紹如何使用超級帳戶eosio
來建立新帳戶以及載入系統級別的智能合約。經過上一章的學習,你們可能已經對智能合約有了一個比較模糊的概念。這一章將繼續爲你們講解,開發智能合約以前,你還須要知道的事。node
這一章,咱們將本身上手部署調用一個簡單的智能合約hello
,中間會穿插講解一些相關概念,這些概念雖然很基礎,可是對初學者而言,也很重要。c++
以前若是你們簡單地瀏覽過eos項目文件夾,就會看到不少.wasm
文件,而wasm就是WebASseMbly的縮寫。這裏讓咱們略過Flash、JavaScript和WebAssembly的愛恨情仇(發展演化),直接一句話歸納一下:git
WebAssembly是一種新的編碼方式,能夠在現代的網絡瀏覽器中運行。
想象它是一種能夠把底層語言文件變得像JS那樣,能夠直接在瀏覽器中運行。並且比JS更輕量、更快速、更安全。過程以下圖:程序員
還有一個你們在build
eos的過程當中看過一百遍的詞:LLVM
。web
LLVM是一些分模塊、可重用的編譯工具鏈。它提供了一種代碼編寫良好的中間表示(IR)。它在上圖中的位置大概是介於第一步和第二步之間。瀏覽器
若是想把C/C++變成WASM文件,就須要先把C/C++代碼先變成LLVM中間代碼。一旦變換成了LLVM IR以後,就說明LLVM已經理解了代碼並會對代碼自動地作出一些優化。安全
而WebAssembly也並非只有wasm
一種格式,它還有wast
格式。這二者做用是等價的,最大的區別就是wast
是可讀文本格式的,而wast
是二進制格式的,他們能夠經過工具相互轉換。bash
讓咱們高度總結一下WebAssembly:網絡
可讓瀏覽器識別底層語言的神器。
(筆者感受和以太坊中的編譯器做用差很少)。函數
玩過以太坊的同窗可能對ABI並不陌生,在EOS中ABI的做用也和以太坊中大體相似:
它定義了函數被調用的規則;定義了參數在調用者和被調用者之間是如何傳遞的。
若是說wasm
文件是產品的話,要想順利使用這件產品,你還須要一本操做說明書,而ABI
就是這份說明書。
一說入門就要說<hello world>,這種感受很low,同時也很「程序員」。感謝雷佳音讓我找到了一個並不尷尬的小標題:土味hello。
進度保持在咱們上一章結束的地方:咱們已經學會使用操做eosio帳戶、建立了新帳戶testeosio
。
在正文開始以前,請啓動nodeos
,相關錢包處於unlock狀態。
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)
hello
合約這裏咱們用到了一個小工具叫eosiocpp
。eosiocpp是一個c++生成wasm和ABI文件的工具。
eos項目中自帶了一個hello合約,爲了區分,這裏咱們建立一個合約叫作hello1
。執行如下語句建立新合約:
eosiocpp -n hello1
它會以樣例合約爲基礎建立一個最簡單的合約。看到下圖即表示建立成功:
這時在當前文件夾下就能夠看到有一個hello1
的文件夾。
進入hello1
文件夾,能夠看到裏面有兩個文件:
➜ hello1 git:(master) ✗ ls hello1.cpp hello1.hpp
hello1.hpp
是智能合約的頭文件,能夠包含一些變量,常量和函數的聲明。hello1.cpp
是合約的源碼文件,包含合約的具體實現。進入hello1
文件夾下執行如下命令:
#使用 -o 生成wast文件和wasm文件 eosiocpp -o ./hello1.wast ./hello1.cpp #使用 -g 生成abi文件 eosiocpp -g ./hello1.abi ./hello1.cpp
這時能夠看到在當前文件夾下生成了hello1.wast
、hello1.wasm
和hello1.abi
文件。
使用咱們剛剛生成的文件部署智能合約。輸入以下命令:
cleos set contract eosio ./ ./hello1.wast hello1.abi -p eosio@active
這行命令有五個參數:eosio
表示部署合約的帳戶,./
表示合約所在的文件夾,後面兩個參數依次是.wast
和.abi
文件的路徑,最後的-p eosio@active
表示權限。
執行成功以下圖所示:
在執行調用命令以前,咱們先簡單地瞭解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智能合約在生成、部署以及調用的過程當中涉及的相關概念和操做。瞭解了:
如何生成和操做一個簡單的智能合約
下面一章,咱們依然會一邊介紹智能合約的相關必備知識,一邊帶着你們來看一看簡單的智能合約語法。