ABI是什么
ABI全称 Application Binary Interface,字面意思是应用程序二进制接口,可以通俗的理解为合约的接口说明,当合约被编译后,它对应的abi也就确定了。
abi有点类似于程序中的接口文档,描述了字段名称、字段类型、方法名称、参数名称、参数类型、方法返回值类型等
为什么需要ABI
我们编写智能合约的流程是:
- 编写合约代码(一般使用solidity语言)
- 编译合约,将solidity编写的代码编译成EVM可识别的bytecode,这一步生成abi
- 部署合约,将合约部署到区块链上,生成合约地址,将合约内容(即上一步生成的bytecode)作为input date输入。部署合约是一个交易过程,所以也会生成一个交易Has
- 执行合约,获取合约地址,然后传入参数调用合约中的方法,获得执行结果
从上面的步骤可以看出,abi对于EVM来说,其实是不需要的。但是对于调用者来说,就需要知道合约有哪些方法,方法的参数是什么,返回值是什么,而这些信息就记录在智能合约的abi中。所以abi其实就相当于开发者的接口文档,方便开发者调用执行合约
ABI有哪些内容
我们来编写一个最简单的合约,然后编译生成abi看下内容
1 | pragma solidity ^0.4.24; |
执行 truffle compile
编译合约,就会生成对应的文件Demo.json
,内容如下。由于json太长,删除了一些不重要的内容,完整内容可以自己手动执行看看。
1 | { |
大部分参数通过名称就可以看出来含义,这里我们主要介绍abi中各参数的含义和调用函数时生成ABI编码的过程
abi各参数的含义
name
:函数名称type
:方法类型,包括function
,constructor
,fallback
(缺省方法)可以缺省,默认为function
constant
:布尔值,如果为true指明方法不会修改合约字段的状态变量payable
:布尔值,标明方法是否可以接收etherstateMutability
:状态类型,包括pure
(不读取区块链状态),view
(和constant类型,只能查看,不会修改合约字段),nonpayable
(和payable含义一样),payable
(和payable含义一样)。其实保留payable
和constant
是为了向后兼容inputs
:数组,描述参数的名称和类型name
:参数名称type
:参数类型
outputs
:和inputs
一样,如果没有返回值,缺省是一个空数组
这里要说明一点的是,由于示例中的x
字段类型为private
,所以没有生成一个和参数名称一样的函数,如果x
字段类型为public
,生成的abi就如下,会多一个和参数名称一样的函数
1 | "abi": [ |
未完待续,以太坊ABI介绍(二)