詳解 EOS 智能合約的 abi 文件
此次向你們介紹 eosio.token 智能合約的最後一個文件 —— abi文件。ABI 全稱 Application Binary Interface,中文名「應用程序二進制接口」,顧名思義是一個接口文件,描述了智能合約與上層應用之間的數據交換格式。abi 文件格式相似 JSON,具有很好的可讀性,有利於智能合約工程師與上層應用工程師之間的工做銜接。eosio.token.abi 文件地址: https://github.com/EOSIO/eos/...git
EOS 智能合約 abi 文件由 5 部分組成:github
{ "types":[...], //定義類型的別名 "structs":[...], //各個類型的數據結構 "actions":[...], //智能合約的 action "tables":[...], //數據結構體 "ricardian_clauses":[...] //李嘉圖條款 }
注:JSON 格式不支持註釋,上面的雙斜線你們理解就好。segmentfault
咱們將按照 actions
-> structs
-> tables
-> structs
-> types
-> ricardian_clauses
的順序瞭解 EOS 智能合約 abi 的開發方法。數據結構
action 部分的做用是聲明智能合約有哪些能夠調用的 action。以下所示。區塊鏈
"actions": [{ "name": "transfer", "type": "transfer", "ricardian_contract": "" },{ "name": "issue", "type": "issue", "ricardian_contract": "" }, { "name": "create", "type": "create", "ricardian_contract": "" } ]
其中每一項的 name
就是 action 的名字,type
用來在 structs
中查找數據結構。ricardian_contract
是李嘉圖合約,剛剛被加入到 EOS 智能合約中,官方尚未進一步說明。ui
剛纔的只聲明瞭三個 action 的名稱,咱們還要在 structs
裏聲明各個 action 須要傳入的參數,以下所示。code
"structs": [{ "name": "transfer", "base": "", "fields": [ {"name":"from", "type":"account_name"}, {"name":"to", "type":"account_name"}, {"name":"quantity", "type":"asset"}, {"name":"memo", "type":"string"} ] },{ "name": "create", "base": "", "fields": [ {"name":"issuer", "type":"account_name"}, {"name":"maximum_supply", "type":"asset"}, {"name":"can_freeze", "type":"uint8"}, {"name":"can_recall", "type":"uint8"}, {"name":"can_whitelist", "type":"uint8"} ] },{ "name": "issue", "base": "", "fields": [ {"name":"to", "type":"account_name"}, {"name":"quantity", "type":"asset"}, {"name":"memo", "type":"string"} ] } ]
EOS 系統會根據 actions
部分中聲明的 type
,在 structs
部分尋找對應的數據結構,每一個數據結構的 fields
中,會列出每一個參數的名稱和類型。視頻
tables
列出了 智能合約中須要創建的數據表名稱,以及數據表中所儲存的結構體名稱。token
"tables": [{ "name": "accounts", "type": "account", "index_type": "i64", "key_names" : ["currency"], "key_types" : ["uint64"] },{ "name": "stat", "type": "currency_stats", "index_type": "i64", "key_names" : ["currency"], "key_types" : ["uint64"] } ]
其中的 type
就是數據表中所儲存的結構體名稱。接口
爲何又回到 structs
了呢,由於不光是 action
裏的項目須要在 structs
裏列出詳細的數據結構,tables
中的項目也須要。
"structs": [{ "name": "account", "base": "", "fields": [ {"name":"balance", "type":"asset"}, {"name":"frozen", "type":"uint8"}, {"name":"whitelist", "type":"uint8"} ] },{ "name": "currency_stats", "base": "", "fields": [ {"name":"supply", "type":"asset"}, {"name":"max_supply", "type":"asset"}, {"name":"issuer", "type":"account_name"}, {"name":"can_freeze", "type":"uint8"}, {"name":"can_recall", "type":"uint8"}, {"name":"can_whitelist", "type":"uint8"}, {"name":"is_frozen", "type":"uint8"}, {"name":"enforce_whitelist", "type":"uint8"} ] } ]
types 部分用來創建類型的別名,好比你想給 account_name
類型創建一個別名:
"types": [{ "new_type_name": "account_name", "type": "name" } ]
這樣在這個 abi 文件裏就能夠用 name
來代替 account_name
了。
有關李嘉圖條款的部分 EOS 官方還在開發中。
【許曉笛】 EOS智能合約案例解析(1)
【許曉笛】 EOS智能合約案例解析(2)
圓方圓學院聚集大批區塊鏈名師,打造精品的區塊鏈技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。
公開課地址:https://ke.qq.com/course/345101