详解 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