12 ABI协议规范

12.1 规范概述

ABI协议规范更官方的叫法是应用程序二进制接口,是外部各种类型客户端同以太坊链上智能合约进行交互时的一种通信标准,主要包括函数签名的计算以及对参数的编解码。外部客户端将请求按照合约对应的ABI协议规格说明进行参数打包编码,并把智能合约的处理结果按照合约对应的ABI协议规格说明进行返回值解码得到结果值。现实世界中可以类比不同国家的人在进行国际业务交流时都会才用英语进行沟通和交流,ABI协议规范也是外部各种实体同链上智能合约通信的标准语言约定。

一个链上智能合约从构思到编码到部署到链上,并最终能被外界所感知和交互要完成的整个流程大致如下:首先分析要解决的业务问题并用solidity完成智能合约源码的编写;其次对智能合约源码进行编译和调试,调试通过后得到智能合约对应的虚拟机字节码和ABI规格描述;然后将智能合约虚拟机字节码部署到对应的区块链网络上并得到该合约的链上部署地址;外部实体要同智能合约进行交互时首先要取得智能合约的ABI规格描述说明,这通常是一个json格式的数组,然后将请求按照规格说明进行函数和参数打包编码,现在通常都利用第三方功能库自动完成,然后通过其所连接的以太节点将请求发送到链上的目标智能合约。客户端收到返回值后对智能合约的返回值也按照ABI规范说明进行返回值解码得到具体返回值。整个流程示意图如下:


image.png

由处理流程图可以看出智能合约的ABI协议规范是外界同链上合约交互的唯一途径。虽然现在以太坊的生态系统相对早期已经比较完善,也提供了各种工具和库来封装智能合约的ABI规范协议的底层处理细节,来方便和简化外部实体同智能合约的交互。但理解和明白ABI协议规范的原理与细节后在进行智能合约交互相关问题的处理时会快速定位问题并找到解决办法,同时在智能合约中的一些底层交互指令也会用到ABI协议规范内容。

12.2 规范组成元素

ABI协议规范其内容表现形式为以JSON数组格式存储的文本串。内容包含一系列对目标智能合约函数和事件的描述,其中对函数的描述包括名称、类型、输入参数与返回值等;对事件的描述包括名称、类型、输入参数以及是否匿名等。用正则文法描述大致如下:

ABIcontent = '[' ABIitem* ']'
ABIitem = funcItem | eventItem

funcItem = '{' type, name, inputs, [outputs], 
    payable, StateMutability, Constant '}'

eventItem = '{' type, name, inputs, Anonymous, ‘}’

通过解析这个JSON字符串内容外界客户端实体可以知道目标智能合约提供那些可以交互的函数以及函数需要的参数和返回值数量和类型,还包括这些函数是否支持eth接收;同时可以知道目标合约可以触发那些事件以及这些事件的参数,包括索引参数和非索引参数。

12.2.1 函数规范

你可能感兴趣的:(12 ABI协议规范)