1. 程式人生 > >第6課 用SI編寫"Hello World"智慧合約,開啟EOS之旅

第6課 用SI編寫"Hello World"智慧合約,開啟EOS之旅

1,摘要

【本文目標】 通過本文實踐,能夠使用SI(Source Insight)編輯EOS的智慧合約程式碼,並通過編譯,執行來測試"Hello World"程式碼。 【前置條件】 1) 已完成了EOS編譯,編譯測試成功; 2) 錢包,賬號已建立完畢; 錢包名字: duncanwang 開啟密碼: “PW5K8vabia4Gba7Tos8wVH6XFc7bKYcR9uTfuaPqcNsPyg2HduFou” 錢包已匯入系統金鑰對: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV :5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 已建立賬號:

wangdenghui 【說明】這個錢包,賬號為測試使用,學習者建立自己的賬號資源即可。

【技術收穫】 1)Source Insight的安裝和使用 2)最簡EOS智慧合約寫作 3) 合約程式碼的編譯和執行

2,實踐內容

2.1 Source Insight的安裝和配置

1)source insight 介紹

EOSIO的智慧合約程式碼採用C++程式語言完成,目前有多款編輯器或者整合IDE環境例如Visual Studio 2017/ Source Insight / Visual Studio Code / UtraEdit等多款 軟體支援。對通訊背景的人來說,大家特別習慣使用 Source Insight,其關聯檢視功能確實比其他軟體更方便。

Source Insight是如今最好用的語言編輯器之一,支援幾乎所有的語言, 如C、C++、ASM、PAS、ASP、HTML,PHP,JSON,Python等常見的,也可以通過匯入配置檔案的方式支援GO語言(下載地址:https://www.sourceinsight.com/download/), 還支援自己定義關鍵字,Source Insight提供了可快速訪問原始碼和源資訊的功能。

2)Source Insight安裝

3) Source Insight配置

如果要使Source Insight支援Go語言和ABI檔案的參考,讓字型和背景顏色更適合眼睛,需要做一定的配置。 不願意自己配置的同學,可以加入知識星球后下載該配置檔案,在選單"Options/Load Configuration"匯入"wangdenghui SI 配置.xml"檔案,即可快速完成配置工作。

2.2 編寫最簡智慧合約程式

1)建立工程

選單Project / New Project建立一個命名為Hello的工程。

2)選單File / New 建立一個"Hello.cpp"的檔案

3)編寫程式

建立檔案後,輸入最簡程式的內容。本文不解釋C++語法和內容,我們的目標是先跑通程式碼。

#include <eosiolib/eosio.hpp>
#include <string>

using namespace eosio;

class hello : public eosio::contract {
  public:
      using contract::contract;

      /// @abi action 
      void hi( std::string strContent ) {
         print( "Hello ", strContent);
      }
};

EOSIO_ABI( hello, (hi) )

2.3 編譯和部署執行

1)Hello.cpp檔案上傳到EOS編譯環境目錄下

2)編譯合約

eosiocpp -o表示在該目錄下產生一個hello的智慧合約程式碼。

eosiocpp -o hello.wast hello.cpp

操作輸出,增加了hello.wast檔案:

[email protected]:~/eos/build/contracts/hello$ eosiocpp -o hello.wast hello.cpp
[email protected]:~/eos/build/contracts/hello$ ls
CMakeLists.txt  hello.cpp  hello.hi_rc.md  hello_rc.md  hello.wasm  hello.wast

eosiocpp -g hello.abi hello.cpp 輸出結果:

[email protected]:~/eos/build/contracts/hello$ eosiocpp -g hello.abi hello.cpp
Generated hello.abi ...

eosiocpp -g產生"hello.abi"檔案。 ABI(Application Binary Interface): 應用程式二進位制介面 描述了應用程式和作業系統之間,一個應用和它的庫之間,或者應用的組成部分之間的低介面。ABI涵蓋了各種細節,如:

  • 資料型別的大小、佈局和對齊;
  • 呼叫約定(控制著函式的引數如何傳送以及如何接受返回值),例如,是所有的引數都通過棧傳遞,還是部分引數通過暫存器傳遞;哪個暫存器用於哪個函式引數;通過棧傳遞的第一個函式引數是最先push到棧上還是最後;
  • 系統呼叫的編碼和一個應用如何向作業系統進行系統呼叫;
  • 以及在一個完整的作業系統ABI中[目標檔案的二進位制格式、程式庫等等。 [1] ABI不同於API ,API定義了原始碼和庫之間的介面,因此同樣的程式碼可以在支援這個API的任何系統中編譯 ,然而ABI允許編譯好的目的碼在使用相容ABI的系統中無需改動就能執行。 ABI掩蓋了各種細節。

2.4 部署智慧合約

cleos set contract wangdenghui …/hello -p wangdenghui

[email protected]:~/eos/build/contracts/hello$ cleos set contract wangdenghui ../hello -p wangdenghui
Reading WAST/WASM from ../hello/hello.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 79830b81c90a22ab42b427ac70ff0c764441d92ea128999712e3376ae6b2460d  4168 bytes  741 us
#         eosio <= eosio::setcode               {"account":"wangdenghui","vmtype":0,"vmversion":0,"code":"0061736d01000000013b0c60027f7e006000017e60...
#         eosio <= eosio::setabi                {"account":"wangdenghui","abi":"0e656f73696f3a3a6162692f312e30000102686900010475736572046e616d650100...
warning: transaction executed locally, but may not be confirmed by the network yet

這個命令序列的結果是,cleos發起一個包含兩個操作(actions)的交易(transaction):eosio::setcode和eosio::setabi。 程式碼定義了合約如何執行,abi描述了引數如何在二進位制和json表示之間進行轉換。 這個命令最後一個引數是-p wangdenghui。該引數告訴cleos,用wangdenghui賬戶的active許可權簽署此操作,就是使用我們先前匯入錢包的wangdenghui賬戶私鑰對操作進行簽名。

2.5 執行智慧合約

cleos push action wangdenghui hi ‘[“World!”]’ -p wangdenghui

輸出結果有>> “Hello World!”

[email protected]:~/eos/build/contracts/hello$ cleos push action wangdenghui hi '["World!"]' -p wangdenghui
executed transaction: d10de21ee792c4997ae697e5db00ad571cfd67c374e9e9fcb741a2a7046c9e49  104 bytes  830 us
#   wangdenghui <= wangdenghui::hi              {"strContent":"World!"}
>> Hello World!
warning: transaction executed locally, but may not be confirmed by the network yet

【問題】 合約執行並沒有輸出"hello, World!的內容"

[email protected]:~/eos/build/contracts/hello$ cleos push action wangdenghui hi '["wangdenghui"]' -p wangdenghui
executed transaction: 51ff4e32f556cedfc1a36f79a156a4dce7a5f93aa9037c83e149164189f57ea1  104 bytes  658 us
#   wangdenghui <= wangdenghui::hi              {"user":"wangdenghui"}
warning: transaction executed locally, but may not be confirmed by the network yet

【解決方法】 如果要在終端現實print的結果,需要在配置檔案config.ini中,將contracts-console 設為 true,即: contracts-console = true 該配置檔案的位置在~/.local/share/eosio/nodeos/config,修改後重啟節點。

3,參考