系列文章:
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 由執行合約的人在提交執行合約請求的時候規定,...