# ABI文件解析
abi文件是调用智能合约action的外部接口,定义了action的参数和table的字段,(注:没有abi文件也可以调用合约中的action,只是需要修改一下钱包客户端)。我们正常调用action时,经常会因为abi文件某些项的缺失,导致action调用失败。所以本节教程解析abi文件,当您开发合约过程中,遇到abi文件错误时,也可以定位到出问题的原因。
abi文件主要包含四个重要字段:types、structs、actions、tables。
# types
types字段定义了合约开发过程中,类型的自定义别名,示例:
// 合约中有如下定义
typedef std::string mystring;
// @abi action
void appyourcom(mystring comname,std::string compub);
...
// 生成的abi中定义如下
"types": [{
"new_type_name": "mystring",
"type": "string"
}
],
# structs
structs字段定义了table名称、包含的字段类型以及action名称、包含的参数类型
// 以红包合约abi文件为例,structs包含了table的定义和字段、action的定义和字段等详细定义
"structs": [{
.......
{
"name": "record",
"base": "",
"fields": [{
"name": "packet_issuer",
"type": "uint64"
},{
"name": "accounts",
"type": "account[]"
}
]
},{
"name": "issue",
"base": "",
"fields": [{
"name": "pubkey",
"type": "string"
},{
"name": "number",
"type": "uint64"
}
]
}
......
}
# actions
actions字段包括定义的对外接口的name、type(同name)、payable(bool类型,调用action是否附加资产)
"actions": [{
"name": "issue",
"type": "issue",
"payable": true
},
.....
{
"name": "close",
"type": "close",
"payable": false
}
],
# tables
table字段包括定义的多索引表,name(表名,与合约中定义的table名称一致)、index_type(主键索引类型,为i64)、key_names(主键成员名称)、key_types(主键成员类型)、type(同表名)
"tables": [{
"name": "packet",
"index_type": "i64",
"key_names": [
"issuer"
],
"key_types": [
"uint64"
],
"type": "packet"
}
.....
],