字节码与初始化代码与运行时代码,我的天哪!

本文详细解释了以太坊上的字节码类型及其术语,主要包括创建字节码和运行字节码,并介绍了如何在链上和链下检索这些字节码。

理解以太坊上的字节码

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.csvGitHub 托管并带有 ❤

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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
shanefontaine
shanefontaine
江湖只有他的大名,没有他的介绍。