ABI 文件
在 FIBOS 中,支持使用 JavaScript 开发区块链智能合约。在之前的文章 快速入门 中,我们所编写发布的 JS 智能合约,除了合约代码的 JS 文件外,还有一份合约 ABI 文件,在当时我们并未给出详细的解读,这篇文章将带大家进行了解。
ABI 是什么
ABI 全称 Application Binary Interface,中文名“应用程序二进制接口”,顾名思义是一个接口文件,描述了智能合约与上层应用之间的数据交换格式。ABI 文件格式类似 JSON,具备很好的可读性,有利于智能合约工程师与上层应用工程师之间的工作衔接。
对于 JavaScript 合约来说,需要使用 ABI 文件来定义 actions
以及 tables
。
智能合约 ABI 文件由 5 部分组成:
1 | { |
我们将按照 actions
-> tables
-> structs
-> types
的顺序了解 FIBOS 智能合约 ABI 的开发方法。
ABI 开发
actions
action 部分的作用是声明智能合约有哪些可以调用的 action。如下所示。
1 | "actions": [{ |
其中每一项的 name
就是 action 的名字,type
用来在 structs
中查找数据结构,ricardian_contract
是李嘉图合约。
李嘉图合约是一种特殊的结构化文本,主要用作交易中明确双方的意图。在 FIBOS 上,你所发送的每一条action,都是可以附加上合约。这种合约很特殊,有着固定的格式,既能够被程序读取,也能为人类阅读。这一合约,就叫做李嘉图合约。
注意: 目前 action 中 name 命名规则约束:只支持数字1~5和小写英文字母;字符长度最大为12。
后期如果改动,我们会及时修改文档的。
tables
tables
列出了智能合约中需要建立的数据表名称,以及数据表中所储存的结构体名称。
1 | "tables": [{ |
上述代码构造了一个 table 名是 players,结构体类型是 player,主键名称是 id,类型是 int64 的数据表。
structs
structs
部分的内容与 actions
部分的内容存在一一对应的关系,刚才我们在上方 actions
中,声明了一个 action 的名称,我们还要在 structs
里声明各个 action 需要传入的参数,如下所示。
1 | "structs": [{ |
1 | "structs": [{ |
通过 base
字段继承相当于:
1 | "structs": [{ |
FIBOS 系统会根据 actions
部分中声明的 type
,在 structs
部分寻找对应的数据结构,每个数据结构的 fields
中,会列出每个参数的名称和类型。
除此以外,不光是 actions
里的项目需要在 structs
里列出详细的数据结构,tables
中的项目也需要。
1 | "structs": [{ |
这样,在 structs
中,我们就定义了一个名为 player 的 struct,用来列出数据表 player 包含两个字段 nickname
和 age
,类型分别是 my_account_name
和 int32
。
types
types
用于自定义数据的类型:
1 | { |
这样在这个 ABI 文件里就自定义了一个类型名称为 my_account_name
的类型,类型是 name
,new_type_name
和 type
是关键字,类型 name
是系统定义的数据类型。
总结
这样,一个完整的 ABI 文件就编写完成。
1 | { |
通过该 ABI 文件,我们就定义了一个有 id 、 nickname 、 age 三个字段,类型分别是 int64 、my_account_name 、 int32 ,主键是 id 的数据表 player 和一个传递参数名是 nickname ,类型是 my_account_name 的名为 hi 的 action 方法。