EOS入門指南PART5——開發智能合約以前,你還須要知道...

上一篇咱們介紹瞭如何搭建本地測試節點,它提供了一個智能合約的運行環境。咱們還介紹如何使用超級帳戶 eosio來建立新帳戶以及載入系統級別的智能合約。

經過上一章的學習,你們可能已經對智能合約有了一個比較模糊的概念。這一章將繼續爲你們講解,開發智能合約以前,你還須要知道的事。node

摘要

這一章,咱們將本身上手部署調用一個簡單的智能合約hello,中間會穿插講解一些相關概念,這些概念雖然很基礎,可是對初學者而言,也很重要。c++

什麼是WebAssembly

以前若是你們簡單地瀏覽過eos項目文件夾,就會看到不少.wasm文件,而wasm就是WebASseMbly的縮寫。這裏讓咱們略過Flash、JavaScript和WebAssembly的愛恨情仇(發展演化),直接一句話歸納一下:git

WebAssembly是一種新的編碼方式,能夠在現代的網絡瀏覽器中運行。

想象它是一種能夠把底層語言文件變得像JS那樣,能夠直接在瀏覽器中運行。並且比JS更輕量、更快速、更安全。過程以下圖:程序員

c++2wasm

還有一個你們在build eos的過程當中看過一百遍的詞:LLVMweb

LLVM是一些分模塊、可重用的編譯工具鏈。它提供了一種代碼編寫良好的中間表示(IR)。

它在上圖中的位置大概是介於第一步和第二步之間。瀏覽器

若是想把C/C++變成WASM文件,就須要先把C/C++代碼先變成LLVM中間代碼。一旦變換成了LLVM IR以後,就說明LLVM已經理解了代碼並會對代碼自動地作出一些優化。安全

而WebAssembly也並非只有wasm一種格式,它還有wast格式。這二者做用是等價的,最大的區別就是wast是可讀文本格式的,而wast是二進制格式的,他們能夠經過工具相互轉換。bash

讓咱們高度總結一下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

它會以樣例合約爲基礎建立一個最簡單的合約。看到下圖即表示建立成功:

eos-craete-contract

這時在當前文件夾下就能夠看到有一個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.wasthello1.wasmhello1.abi文件。

4. 部署智能合約

使用咱們剛剛生成的文件部署智能合約。輸入以下命令:

cleos set contract eosio ./ ./hello1.wast hello1.abi -p eosio@active

這行命令有五個參數:eosio表示部署合約的帳戶,./表示合約所在的文件夾,後面兩個參數依次是.wast.abi文件的路徑,最後的-p eosio@active表示權限。

執行成功以下圖所示:

set-hello-contract

調用hello合約

在執行調用命令以前,咱們先簡單地瞭解EOS中的一個概念:transactionaction

Action表示單個操做,而transaction是一個或多個action的集合。Action是合約和帳戶之間進行通訊的方式。Action能夠單獨執行,或者組合組合起來做爲一個總體執行。

在官網中咱們也能夠看到包含一個action和多個action的transaction的例子。

對比來看的話,EOS中的action就至關於以太坊中的transaction。

執行如下命令來調用hello1合約中的hi方法:(執行的帳戶是testeosio)

cleos push action eosio hi '["hammer"]' -p testeosio

執行成功就能夠看到以下界面:

invoke-hi

這時若是咱們去看運行nodeos的終端窗口,能夠看到下面的提示:

invoke-hi-nodeos

一樣打印出了Hello, hammer

總結

這一章咱們學習了EOS智能合約在生成、部署以及調用的過程當中涉及的相關概念和操做。瞭解了:

  • 什麼是webAssembly:翻譯C/C++讓瀏覽器也看得懂的神器;
  • 什麼是ABI:代碼的「產品說明書」;
  • 如何生成和操做一個簡單的智能合約

    • 生成wast和abi文件
    • 部署合約
    • push action調用合約方法

下面一章,咱們依然會一邊介紹智能合約的相關必備知識,一邊帶着你們來看一看簡單的智能合約語法。

相關文章
相關標籤/搜索