詳解 EOS 智慧合約的 abi 檔案
這次向大家介紹 eosio.token 智慧合約的最後一個檔案 —— abi檔案。ABI 全稱 Application Binary Interface,中文名“應用程式二進位制介面”,顧名思義是一個介面檔案,描述了智慧合約與上層應用之間的資料交換格式。abi 檔案格式類似 JSON,具備很好的可讀性,有利於智慧合約工程師與上層應用工程師之間的工作銜接。eosio.token.abi 檔案地址: https://github.com/EOSIO/eos/…
EOS 智慧合約 abi 檔案由 5 部分組成:
{
"types":[...], //定義型別的別名
"structs":[...], //各個型別的資料結構
"actions":[...], //智慧合約的 action
"tables":[...], //資料結構體
"ricardian_clauses":[...] //李嘉圖條款
}
注:JSON 格式不支援註釋,上面的雙斜線大家理解就好。
我們將按照 actions
-> structs
-> tables
-> structs
-> types
-> ricardian_clauses
的順序瞭解 EOS 智慧合約 abi 的開發方法。
actions
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 智慧合約中,官方還沒有進一步說明。
structs
剛才的只宣告瞭三個 action 的名稱,我們還要在 structs
裡宣告各個 action 需要傳入的引數,如下所示。
"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
tables
列出了 智慧合約中需要建立的資料表名稱,以及資料表中所儲存的結構體名稱。
"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
為什麼又回到 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
types 部分用來建立型別的別名,比如你想給 account_name
型別建立一個別名:
"types": [{
"new_type_name": "account_name",
"type": "name"
}
]
這樣在這個 abi 檔案裡就可以用 name
來代替 account_name
了。
ricardian_clauses
有關李嘉圖條款的部分 EOS 官方還在開發中。
相關文章和視訊推薦
【許曉笛】 EOS智慧合約案例解析(1)
【許曉笛】 EOS智慧合約案例解析(2)
圓方圓學院彙集大批區塊鏈名師,打造精品的區塊鏈技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。
公開課地址:https://ke.qq.com/course/345101