本文详细解释了以太坊上的字节码类型及其术语,主要包括创建字节码和运行字节码,并介绍了如何在链上和链下检索这些字节码。
tl;dr — 以太坊上只有两种类型的字节码,但有五种不同的名称来描述它们。
BytecodeTable.csv – Medium
名称 | 描述 | 链上检索 | 链下检索 | |
---|---|---|---|---|
创建字节码 | 生成运行时字节码的代码 | type(ContractName).creationCode | getTransactionByHash | |
运行时字节码 | 存储链上描述智能合约的代码 | extcodecopy(a) 或 type(ContractName).runtimeCode | getCode | |
字节码 | 包含运行时字节码和创建字节码的统称 | NA | NA | |
部署字节码 | 与运行时字节码相同 | extcodecopy(a) 或 type(ContractName).runtimeCode | getCode | |
初始化代码 | 与创建字节码相同 | type(ContractName).creationCode | getTransactionByHash |
查看原始文件 BytecodeTable.csv 由 GitHub 托管并带有 ❤
tl;dr 字节码区别
以太坊开发者在编写智能合约时无疑会处理字节码。幸运的是,对于大多数人来说,这段代码仅由 EVM 使用,因此不需要人类完全理解。然而,有一小部分人了解这个层次的细节,并可以利用它来获得优势。一个例子是 Authereum 的识别系统,用于识别由 Authereum 代理工厂创建的合约。
以太坊社区中围绕字节码的命名规则只会增加复杂性。不同类型的字节码有不同的名称。本文并不试图详细描述 EVM 中使用的字节码,而是解释以太坊社区成员在提及智能合约字节码时使用的术语。
本文描述的代码类型如下:
这是大多数人在提到字节码时所指的代码。这是生成运行时字节码的代码——它包括智能合约的构造函数逻辑和构造函数参数。创建字节码相当于创建合约的交易输入数据,前提是该交易的唯一目的是创建合约。
当你编译一个合约时,创建字节码会为你生成。由 Truffle 生成的 ABI 将创建字节码称为字节码。这也是在 Remix 上点击“编译详情”时显示的字节码。
运行时字节码也可以通过使用 Solidity 的类型信息在链上检索。用于检索此代码的 Solidity 代码是 type(ContractName).creationCode
。
创建字节码可以通过 getTransactionByHash
JSON RPC 调用来链下检索。
这是存储链上描述智能合约的代码。这段代码不包括合约的构造函数逻辑或构造函数参数,因为它们与用于实际创建合约的代码无关。
合约的运行时字节码可以通过使用汇编块并调用 extcodecopy(a)
在链上检索。运行时字节码的哈希值从 extcodehash(a)
返回。此操作码由 EIP 1052 引入,并包含在 Constantinople 硬分叉中。
这段代码可以使用 type(ContractName).runtimeCode
在链上检索。
最后,这段代码可以通过 JSON RPC 调用 getCode
链下检索。
这应该用作包含运行时字节码和创建字节码的统称,但它更常用于描述运行时字节码。
此术语仅由 Truffle 生成的 ABI 使用,指的是合约的运行时字节码。我还没有在除这些文件之外的地方看到它被使用。
这段代码与创建字节码相同。它是创建存储链上的字节码的代码。
此术语通常用于指代使用 create2
操作码时所需的字节码。
我认为应该使用的唯一术语是运行时字节码和创建字节码,因为它们明确描述了代码的内容。我认为字节码应该是一个包含上述两个术语的统称。
- 原文链接: medium.com/authereum/byt...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!