这篇文章深入探讨了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 编译器,也称为 solc,将基于 Solidity 的智能合约编译成 EVM 可理解的字节码和** 应用程序二进制接口 (ABI)**。字节码和 Solidity 合约 ABI 是与以太坊智能合约交互的主要组件。
字节码是在以太坊虚拟机上的智能合约信息的二进制格式。 字节码不是人类可读的,只能被机器(EVM)读取。换句话说,Solidity 被编译并转换为机器可读取的字节码,以便 EVM 能够执行必要的功能。
字节码包含一系列机器可理解的指令,称为操作码,每个操作码一字节(八位)。因此,字节码是由一字节操作码的组合。
字节码分为两种类型:
创建字节码
运行时字节码
智能合约编译生成创建字节码,其中包含智能合约的构造函数逻辑和构造函数参数。 创建字节码负责生成运行时字节码。
当你在任何 集成开发环境 (IDE) 平台 上单击智能合约的“编译详情”时,你会看到创建字节码。创建字节码在部署期间只执行一次。
要检索链上创建字节码,请使用:
type (ContractName). creationCode
要通过 JSON RPC 调用检索链外创建字节码,请使用此方法:getTransactionByHash
.
运行时字节码是编译后的智能合约数据,它在链上以永久可执行代码的形式存储。 与创建字节码不同,运行时字节码不包含构造函数逻辑和构造函数参数。
要检索链上运行时字节码,请使用:
type (ContractName). runtimeCode
要通过 JSON RPC 调用检索链外运行时字节码,请使用此方法:getCode
智能合约数据以机器可读取的字节码格式存储在 EVM 中,而在外部应用程序和其他智能合约中存储为人类可阅读的 Solidity 语言,因为它们无法与字节码进行通信。这就是智能合约编译的第二个组件,应用程序二进制接口 (ABI) 使得交互成为可能。
应用程序二进制接口 (ABI) 是一种解释器,它促进与 EVM 字节码的通信。 Solidity ABI 是一个人类可读的方法列表,用于执行智能合约中的特定功能。你可以与像 ethers.js 这样的库一起使用 ABI 来与智能合约交互。
Solidity 中的 ABI 与 API(应用程序编程接口)相似,但也有所不同。
在 web2 中,API 促进 Web 应用程序与中心化服务器之间的交互,而 Solidity ABI 提供智能合约数据给应用程序和其他合约。 当应用程序使用 API 从服务器请求数据时,API 会提供数据,而 ABIs 则使用人类可读的 Solidity 二进制格式访问智能合约数据。
在下一部分,我们解释什么是 Solidity 二进制。
Solidity 二进制是以太坊生态系统中智能合约的一种独特数据存储基础设施。
开发者无法在以太坊区块链上部署可读的 Solidity 代码。相反,Solidity 智能合约数据以原始字节码的二进制格式(即一长串十六进制字符)存储。这被称为 Solidity 二进制,使得在区块链上存储数据成本高效。
但 ABI 如何访问 Solidity 二进制?它是通过一种称为 ABI 编码的过程来实现的。
ABI 以 EVM 基于字节码可以理解的函数签名和变量声明调用智能合约。 这称为 ABI 编码,其中 ABI 编码了机器可读取的字节码处理所需的信息。在大多数情况下,ABI 编码是自动化的,由智能合约编译器完成。
当 EVM 字节码执行指令并返回结果时,结果是以原始十六进制格式表示的, ABI 将十六进制格式解码为人类可读的语言。 这称为 ABI 解码。
你可以从 ABI 得到 Solidity 代码,基本上 ABI 充当编码/解码数据的接口,进出机器代码。
EVM 字节码由多个 操作码 组成。当 ABI 编码调用一个函数时,它会引用一个特定的操作码。 处理完交易后,操作码会返回结果,ABI 为用户解码该结果。
ABI 指定要调用哪个函数(编码),并执行此函数以将数据返回给用户(解码)。 一个智能合约包含多个函数,这些函数作为字节码部署在 EVM 上,每个智能合约都有自己的 ABI,这是获取结果所必需的。
由于智能合约以二进制格式存储,因此 ABI 定义了与二进制合约交互的结构和方法。编译后的智能合约生成一种以 Solidity JSON ABI 格式表示的 ABI。
某些 IDE(例如 Remix)会自动生成合约 ABI。然而,你也可以使用 Solidity 编译器 NPM 包 手动创建 ABI。
Solidity JSON ABI 生成以下组件:
Type - 定义 函数 的性质(接收,回调,构造函数)
Name - 定义函数的名称
Inputs - 具有名称、类型、组件的对象数组
Outputs - 与输入类似的对象数组
stateMutability - 定义函数的可变性(纯,查看,非支付或支付)
交易通过 Solidity ABI 文件以 3 个步骤进行:
智能合约的 ABI 提供给像 EtherJS 这样的前端库。
前端库将方法调用和参数转换为 calldata,作为交易的一部分提供给以太坊节点。
交易验证后,生成一个包含详细日志和消耗的 gas(交易费用)的证明树。
以太坊交易生成一个称为“证明树”的回执,记录成功交易的结果。 证明树由四种类型的信息组成:
交易的状态
累计使用的 gas
执行过程中创建的日志集
从日志组成的布隆过滤器
要更好地理解交易如何工作,请考虑以下示例。
例如,你想将一个 ERC-20 代币 从一个钱包转移动到另一个钱包。以下代码指示 ABI 向 EVM 基于字节码发送消息。

transfer (address to, uint amount) external;
ABI 编码确保字节码识别该函数并执行该交易。在生成结果后,ABI 解码将结果转换为人类可读的格式。用户收到一份收据,表明 ERC-20 代币已经从一个地址转移到另一个地址。
在 学习 Solidity 时,你将了解 ABI 是以太坊智能合约的基石。ABIs 促进了区块链生态系统中的交易。尽管 ABIs 在智能合约技术中非常重要,但它们在开发者教程中常常被忽视。虽然超出了本文的范围,但了解 Solidity 接口 将会进一步帮助你理解合约如何相互交互。
对 ABI 的深入理解是开发强大智能合约和 dApps 的基石,并 成为一名 Solidity 开发者。
- 原文链接: alchemy.com/overviews/so...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!