Solidity ABI(应用程序二进制接口)是什么?

  • Alchemy
  • 发布于 2022-10-25 19:51
  • 阅读 15

这篇文章深入探讨了Solidity编程语言及其在以太坊网络中智能合约编译的重要性。文章详细解释了智能合约编译的过程,Solidity ABI的工作原理,以及如何通过字节码与EVM进行交互。

Ethereum 开发者使用 Solidity 编程语言为 Ethereum 网络编写 智能合约代码。Solidity 如何工作并与以太坊虚拟机 (EVM) 进行交互?这一切始于编译智能合约。

本文解释以下内容:

  • 什么是 Solidity ABI,通过介绍智能合约编译的必要性

  • ABI 如何作为 Solidity 编译器工作

  • 什么是字节码及其在编译过程中的功能

  • 什么是 Solidity ABI,它与 API 的不同之处。

  • ABIs 如何工作(以及示例)

什么是智能合约编译?

智能合约编译是将 Solidity 智能合约代码转换为与以太坊虚拟机语言兼容的语言的过程。

开发者使用 Solidity 编写智能合约,这是一种高级编程语言,仅供人类阅读和理解。EVM 无法理解 Solidity。由于虚拟机无法理解 Solidity,因此编译将人类可理解的 Solidity 代码转换为机器可读取的语言。以太坊生态系统使用 Solidity 编译器来编译其智能合约。

什么是 Solidity 编译器?

Solidity 编译器,也称为 solc,将基于 Solidity 的智能合约编译成 EVM 可理解的字节码和** 应用程序二进制接口 (ABI)**。字节码和 Solidity 合约 ABI 是与以太坊智能合约交互的主要组件。

什么是字节码?

字节码是在以太坊虚拟机上的智能合约信息的二进制格式。 字节码不是人类可读的,只能被机器(EVM)读取。换句话说,Solidity 被编译并转换为机器可读取的字节码,以便 EVM 能够执行必要的功能。

字节码包含一系列机器可理解的指令,称为操作码,每个操作码一字节(八位)。因此,字节码是由一字节操作码的组合。

字节码分为两种类型:

  1. 创建字节码

  2. 运行时字节码

什么是创建字节码?

智能合约编译生成创建字节码,其中包含智能合约的构造函数逻辑和构造函数参数。 创建字节码负责生成运行时字节码。

当你在任何 集成开发环境 (IDE) 平台 上单击智能合约的“编译详情”时,你会看到创建字节码。创建字节码在部署期间只执行一次。

要检索链上创建字节码,请使用:

type (ContractName). creationCode

要通过 JSON RPC 调用检索链外创建字节码,请使用此方法:getTransactionByHash .

什么是运行时字节码?

运行时字节码是编译后的智能合约数据,它在链上以永久可执行代码的形式存储。 与创建字节码不同,运行时字节码不包含构造函数逻辑和构造函数参数。

要检索链上运行时字节码,请使用:

type (ContractName). runtimeCode

要通过 JSON RPC 调用检索链外运行时字节码,请使用此方法:getCode

如何与字节码交互

智能合约数据以机器可读取的字节码格式存储在 EVM 中,而在外部应用程序和其他智能合约中存储为人类可阅读的 Solidity 语言,因为它们无法与字节码进行通信。这就是智能合约编译的第二个组件,应用程序二进制接口 (ABI) 使得交互成为可能。

Solidity 中的应用程序二进制接口 (ABI) 是什么?

应用程序二进制接口 (ABI) 是一种解释器,它促进与 EVM 字节码的通信。 Solidity ABI 是一个人类可读的方法列表,用于执行智能合约中的特定功能。你可以与像 ethers.js 这样的库一起使用 ABI 来与智能合约交互。

Solidity 中的 ABI 与 API(应用程序编程接口)相似,但也有所不同。

Solidity ABI 和 API 之间有什么区别?

在 web2 中,API 促进 Web 应用程序与中心化服务器之间的交互,而 Solidity ABI 提供智能合约数据给应用程序和其他合约。 当应用程序使用 API 从服务器请求数据时,API 会提供数据,而 ABIs 则使用人类可读的 Solidity 二进制格式访问智能合约数据。

在下一部分,我们解释什么是 Solidity 二进制。

什么是 Solidity 二进制?

Solidity 二进制是以太坊生态系统中智能合约的一种独特数据存储基础设施。

开发者无法在以太坊区块链上部署可读的 Solidity 代码。相反,Solidity 智能合约数据以原始字节码的二进制格式(即一长串十六进制字符)存储。这被称为 Solidity 二进制,使得在区块链上存储数据成本高效。

但 ABI 如何访问 Solidity 二进制?它是通过一种称为 ABI 编码的过程来实现的。

什么是 Solidity ABI 编码?

ABI 以 EVM 基于字节码可以理解的函数签名和变量声明调用智能合约。 这称为 ABI 编码,其中 ABI 编码了机器可读取的字节码处理所需的信息。在大多数情况下,ABI 编码是自动化的,由智能合约编译器完成。

什么是 ABI 解码?

当 EVM 字节码执行指令并返回结果时,结果是以原始十六进制格式表示的, ABI 将十六进制格式解码为人类可读的语言。 这称为 ABI 解码。

你可以从 ABI 得到 Solidity 代码,基本上 ABI 充当编码/解码数据的接口,进出机器代码。

Solidity 代码如何映射到 EVM 操作码?

EVM 字节码由多个 操作码 组成。当 ABI 编码调用一个函数时,它会引用一个特定的操作码。 处理完交易后,操作码会返回结果,ABI 为用户解码该结果。

ABIs 在 Solidity 中如何工作?

ABI 指定要调用哪个函数(编码),并执行此函数以将数据返回给用户(解码)。 一个智能合约包含多个函数,这些函数作为字节码部署在 EVM 上,每个智能合约都有自己的 ABI,这是获取结果所必需的。

由于智能合约以二进制格式存储,因此 ABI 定义了与二进制合约交互的结构和方法。编译后的智能合约生成一种以 Solidity JSON ABI 格式表示的 ABI。

某些 IDE(例如 Remix)会自动生成合约 ABI。然而,你也可以使用 Solidity 编译器 NPM 包 手动创建 ABI。

Solidity JSON ABI 生成以下组件:

  • Type - 定义 函数 的性质(接收,回调,构造函数)

  • Name - 定义函数的名称

  • Inputs - 具有名称、类型、组件的对象数组

  • Outputs - 与输入类似的对象数组

  • stateMutability - 定义函数的可变性(纯,查看,非支付或支付

交易如何与 ABI 配合工作?

交易通过 Solidity ABI 文件以 3 个步骤进行:

  1. 智能合约的 ABI 提供给像 EtherJS 这样的前端库。

  2. 前端库将方法调用和参数转换为 calldata,作为交易的一部分提供给以太坊节点。

  3. 交易验证后,生成一个包含详细日志和消耗的 gas(交易费用)的证明树。

什么是证明树?

以太坊交易生成一个称为“证明树”的回执,记录成功交易的结果。 证明树由四种类型的信息组成:

  1. 交易的状态

  2. 累计使用的 gas

  3. 执行过程中创建的日志集

  4. 从日志组成的布隆过滤器

要更好地理解交易如何工作,请考虑以下示例。

ERC-20 代币转账示例

例如,你想将一个 ERC-20 代币 从一个钱包转移动到另一个钱包。以下代码指示 ABI 向 EVM 基于字节码发送消息。

transfer (address to, uint amount) external;

ABI 编码确保字节码识别该函数并执行该交易。在生成结果后,ABI 解码将结果转换为人类可读的格式。用户收到一份收据,表明 ERC-20 代币已经从一个地址转移到另一个地址。

深入了解 Solidity 的 ABI

学习 Solidity 时,你将了解 ABI 是以太坊智能合约的基石。ABIs 促进了区块链生态系统中的交易。尽管 ABIs 在智能合约技术中非常重要,但它们在开发者教程中常常被忽视。虽然超出了本文的范围,但了解 Solidity 接口 将会进一步帮助你理解合约如何相互交互。

对 ABI 的深入理解是开发强大智能合约和 dApps 的基石,并 成为一名 Solidity 开发者

  • 原文链接: alchemy.com/overviews/so...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论