什么是以太坊合约ABI(Application Binary Interface)

文章目录

什么是以太坊合约ABI

一、背景

以太坊的智能合约程序,是在以太坊虚拟机(Ethereum Virtual Machine,EVM)上运行的。

合约账户不能自己启动运行自己的智能合约。要运行一个智能合约,需要由外部账户对合约账户发起交易,从而启动其中的代码的执行

二、ABI(Application Binary Interface)

ABI(Application Binary Interface)是合约的接口描述,描述了字段名称、字段类型、方法名称、参数名称、参数类型、方法返回值类型等。

当合约被编译后,对应的abi也就确定了。

编译合约,将solidity编写的代码编译成EVM可识别的bytecode,同时生成abi。

部署合约,将合约部署到区块链上,生成合约地址,将合约内容(即上一步生成的bytecode)作为input data输入。部署合约是一个交易过程,所以也会生成一个交易Hash

对于调用者来说,就需要知道合约有哪些方法,方法的参数是什么,返回值是什么,而这些信息就记录在智能合约的abi中。所以abi其实就相当于开发者的接口文档,方便开发者调用执行合约。
因此要想和合约交互,就离不开ABI数据。

三、怎么生成ABI

如果你使用truffle,truffle编译部署后,build目录下会有一个 合约.json abi

如果你使用hardcat,hardhat生成的 JSON 文件通常不仅包含 ABI,还包括字节码和其他元数据。为了使用 abigen,你需要手工从生成的 JSON 文件中提取出 ABI 部分

对于hardcat,你也可以使用Hardhat 三方插件 Hardhat ABI Exporter

官方链接: https://learnblockchain.cn/docs/hardhat/plugins/hardhat-abi-exporter.html

可以参考本人文章:使用golang与智能合约进行交互

solc命令

我们看看如何用solc命令生成合约 ABI 和 EVM 字节码。solc命令是最常用的编译器之一。用 npm 包管理器安装它:

bash 复制代码
$ npm install -g solc

四、abi内容

官方ABI合约规范:https://docs.soliditylang.org/en/latest/abi-spec.html

合约 ABI 的 JSON 格式由各种函数或事件描述组成。

合约 ABI 定义函数名称和参数数据类型,用于对 EVM 的合约调用进行编码并从交易中读取数据。

Ethereum 智能合约 ABI 用一个 array 表示,其中会包含数个用 JSON 格式表示的 Function 或 Event。

Function

共有 7 个参数:

  • name:a string,定义函数的名称
  • type:a string,"function", "constructor", or "fallback" 定义函数类型。可以是 function ,constructor, receive(对于 receive ether 函数),或者 fallback(对于 default 函数)
  • inputs:an array,function 输入的参数,包含:
    • name:a string,参数名
    • type:a string,参数的规范类型。例如 uint256
    • components:an array,如果输入的参数是 tuple(struct) type 才会有这个参数。描述 struct 中包含的参数类型
  • outputs:an array,function 的返回值,和 inputs 使用相同表示方式。如果沒有返回值可忽略,值为 []
  • payable:true,function 是否可收 Ether,预设为 false
  • constant:true,function 是否会改写区块链状态,反之为 false
  • stateMutability:a string,其值可能为以下其中之一:"pure"(不会读写区块链状态)、"view"(只读不写区块链状态)、"payable" and "nonpayable"(会改区块链状态,且如可收 Ether 为 "payable",反之为 "nonpayable")
Event

共有 4 个参数:

  • name: a string,event 的名称
  • type: a string,always "event"
  • inputs: an array,输入参数,包含:
    • name: a string,参数名称
    • type: a string,参数的 data type(e.g. uint256)
    • components: an array,如果输入参数是 tuple(struct) type 才会有这个参数。描述 struct 中包含的信息类型
    • indexed: true,如果这个参数被定义为 indexed ,反之为 false
  • anonymous: true,如果 event 被定义为 anonymous

Event 的参数分为:有 indexed,和其他没有 indexed 的。有 indexed 的参数可以使用 filter。

函数选择器

函数选择器值 实际是对函数签名字符串进行sha3(keccak256)哈希运算之后,取前4个字节。

五、参考

如何理解以太坊ABI - 应用程序二进制接口

参考URL: https://learnblockchain.cn/2018/08/09/understand-abi/

相关推荐
CESS_Cloud18 小时前
CESS 出席华盛顿区块链政策峰会:参与国家安全与数据隐私保护专题讨论
安全·阿里云·web3·去中心化·区块链
TianXuan_Chain2 天前
web3跨链桥协议-Nomad
web3·区块链·智能合约·跨链桥
CertiK2 天前
Web3.0安全开发实践:探索比特币DeFi生态中的PSBT
区块链
选择不变2 天前
慢牛提速经典K线形态-突破下跌起始位和回档三五线,以及徐徐上升三种形态
区块链·通达信指标公式·炒股技巧·短线指标·炒股指标
飞天阁2 天前
Hyperledger Fabric 2.x 环境搭建
运维·区块链·fabric
Sui_Network2 天前
Sui 基金会任命 Christian Thompson 为新任负责人
大数据·人工智能·物联网·区块链·智能合约
howard20052 天前
搭建私有链
以太坊·私有链
电报号dapp1192 天前
NFT交易所开发攻略:打造未来数字艺术品交易新平台
人工智能·去中心化·区块链·智能合约
Q8137574602 天前
中阳动态分散投资策略:构建多元化投资组合的科学路径
人工智能·区块链
BlockOne112 天前
如何用发链框架,快速构建一条区块链?
区块链