區塊鏈EOS 智慧型合約入門3 解析abi檔案

2021-10-05 10:45:34 字數 2878 閱讀 8513

系列文章:

1. hello world!

2. 部署token合約並發行、交易幣

3. 解析abi檔案(本文)

通過eosio.cdt提供的eosin-cpp 工具可以生成abi檔案。為什麼要理解abi,因為在開發的時候,自定義型別等可能會導致生成的abi檔案錯誤,為了能夠修復錯誤,我們需要先理解abi。

注:abi只是乙個說明檔案,傳遞給合約的訊息或action不一定得完全符合它。

為了更好理解abi,現在,自己來寫乙個abi檔案。

在任意乙個位置,建立乙個空白檔案,叫eosio.token.abi,寫入下列**。

接下來會逐個解釋每一行。

這裡的types是對於自定義型別的說明。在編寫**時,有些型別的名字可能比較長,或者我們想要讓型別名稱更加具體,我們給這樣的型別起乙個別名。舉乙個例子,我們在編寫hello world的時候,用到了eosio中的型別name,我們現在想讓它更具體一點,我們給它起個別名叫username。修改完的**如下。

#include

using

namespace eosio;

typedef name username;

//給name取個別名叫username

class

[[eosio::contract]

] helloworld :

public contract

};

編譯該檔案(eosio-cpp helloworld.cpp -o helloworld.wasm)。開啟abi檔案,會發現types變變成了如下。

"types":[

],

很直觀,new_type_name是我們新起型別別名,type是型別原本的名稱。

需要注意的是,eosio內建的型別不會在abi檔案中顯示出來。那什麼是內建型別呢,就是eosio已經幫我們定義好了的型別,上面用到到name就是乙個內建型別。具體的內建型別可以在此檢視。

顯然,這裡的struct是對於合約中結構體的說明。舉個例子說明。在之前eosio.token合約的hpp檔案中,在**的一百多行的位置,可以看到以下**。

struct

[[eosio::table]

] account

};

這就是其中的乙個結構體。同時,開啟該合同的abi檔案,可以看到對應的說明,如下。name是結構體名,base是該結構體的基類(這裡沒有,所以為空),fields是結構體內變數的名稱及其型別。

"structs":[

]},...]

但是你會發現,eosio.token.hpp裡明明只定義了兩個結構體,abi檔案裡structs卻寫著很多個。這是因為還有一種叫做隱性結構體(implicit struct)的東西,它們對應著合約action及其引數。

同樣用eosio.token合約舉例。對比abi檔案的structs和eosio.token.hpp檔案的action方法名跟引數,可以發現,name就是action方法的名稱,fields裡邊則是action方法的引數及引數對應的型別。

action這一塊用於描述該合約中可供外部呼叫的動作。同樣,舉例eosio.token合約。

hpp檔案中action內容如下。

[

[eosio::action]

]void

close

(const name& owner,

const symbol& symbol );[

[eosio::action]

]void

create

(const name& issuer,

const asset& maximum_supply);[

[eosio::action]

]void

issue

(const name& to,

const asset& quantity,

const string& memo );.

..

abi檔案對應內容如下。

"actions":[

, ,

,...

]

name明顯就是action的名稱了,type則是該方法對應的隱性結構體的名稱(上面有講到),richardian_contract是李嘉圖合約(後續會解釋)。

同樣用eosio.token合約舉例。hpp檔案中對於表account的定義如下。

struct

[[eosio::table]

] account };

typedef eosio::multi_index<

"accounts"_n, account > accounts;

abi的table內容如下。

(1) name:表的名稱為accounts。官方開發文件的說法是「***the eosio.token contract instantiates two tables, accounts and stat.***」(關於multi_index的具體解釋請看這裡 )。意思是上面hpp部分的最後一行**例項化了乙個叫accounts的表。

(2) type:這個accounts的表是基於account結構體的,所以type為account。

(3) index_type: 索引型別為i64。

(4) key_names:欄位為"[primary_key]"。上面hpp部分的第三行決定了乙個型別為uint64主鍵。

(5) key_type:字段型別為[「uint64」]。同上。

EOS區塊鏈技術開發(二)智慧型合約

強烈建議直接去看eosio官網上的教程 不要看我的?博文了,以下博文就是我當時隨便寫寫的,現在也沒有什麼時間詳細修改。如果有問題可以提問。注 由於eosio仍在不斷更新,所以以下內容的一些步驟可能會在將來某天失效。本開發手冊編寫時間是在2018.10至2018.11.可能會不斷更新。說一下eosio...

EOS智慧型合約開發(十七)EOS架構解析

官方文件中,清晰的描述了以下原圖。這張圖,是eos未來發發展藍圖,bm早期的想法就是為使用者提供百萬級tps體驗而設計的基礎設設施。仔細閱讀源 發現目前還與很多沒有實現。這個是我們對eos的期待。從eos的系統架構,我們可以清晰看到系統主要由以下幾個部分組成 cleos cli eos cleos ...

CS 區塊鏈 智慧型合約

和雲計算相似,占用區塊鏈的資源 不管是簡單的轉賬交易,還是合約的部署和執行 同樣需要付出相應的費用。以太坊上用gas機制來計費,gas也可以認為是乙個工作量單位,智慧型合約越複雜 計算步驟的數量和型別,占用的記憶體等 用來完成執行就需要越多gas。gas 由執行合約的人在提交執行合約請求的時候規定,...