首页 > 区块链 > 区块链 > 【许晓笛】 EOS 智能合约案例解析(3)
详解 EOS 智能合约的 abi 文件
这次向大家介绍 eosio.token 智能合约的最后一个文件 —— abi文件。ABI 全称 Application Binary Interface,中文名“应用程序二进制接口”,顾名思义是一个接口文件,描述了智能合约与上层应用之间的数据交换格式。abi 文件格式类似 JSON,具备很好的可读性,有利于智能合约工程师与上层应用工程师之间的工作衔接。eosio.token.abi 文件地址: https://github.com/EOSIO/eos/blob/master/contracts/eosio.token/eosio.token.abi
EOS 智能合约 abi 文件由 5 部分组成:
{
"types":[...], //定义类型的别名
"structs":[...], //各个类型的数据结构
"actions":[...], //智能合约的 action
"tables":[...], //数据结构体
"ricardian_clauses":[...] //李嘉图条款
}
注:JSON 格式不支持注释,上面的双斜线大家理解就好。
我们将按照
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 智能合约中,官方还没有进一步说明。
刚才的只声明了三个 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": [{ "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 官方还在开发中。
*圆方圆学院汇集大批区块链名师,打造精品的区块链技术课程。 在各大平台都长期有优质免费公开课,欢迎报名收看。 * 公开课地址: https://ke.qq.com/course/345101
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31522172/viewspace-2221193/ ,如需转载,请注明出处,否则将追究法律责任。