init code, creation bytecode 和 runtime bytecode 的区别是啥?

以太坊中的各种字节码有什么区别?

请先 登录 后评论

最佳答案 2022-02-04 17:47

没仔细研究,找到了一篇问答:

https://ethereum.stackexchange.com/questions/76334/what-is-the-difference-between-bytecode-init-code-deployed-bytedcode-creation

我翻译一下:

以太坊上只有两种类型的字节码,但有五种不同的名称来描述它们。

Creation Bytecode(创建字节码)

这是大多数人在说字节码时所指的代码。这是生成Runtime Bytecode(运行时字节码)的代码,它包括智能合约的构造函数逻辑和构造器参数。创建字节码是创建合约的交易的输入数据,该交易的唯一目的是创建合约。

当你编译一个合约时,创建字节码就会生成。truffle生成的ABI文件中把创建字节码称为bytecode(*)。这也是在Remix上点击合约的 "compilation details"时显示的字节码。

(*) 由Truffle生成的字节码对应于减去构造器参数的创建字节码(因为Truffle在编译时不知道它们)。因此,创建字节码等于Truffle字节码与包含构造器参数信息的一些字节相连接。例如,如果构造器将uint256"123 "和bool "true "作为参数,那么作为部署交易的数据参数传递的创建代码将是: Truffle生成的字节码+"00000000000000000000000000000000000000007b "+"000000000000000000000000000000000000000001"。对于动态类型,如字符串、字节和数组,其编码更为复杂。

该代码可以通过type(ContractName).creationCode在链上进行检索。

在链下,则可以 JSON RPC调用 getTransactionByHash 获得创建字节码。

Runtime Bytecode(运行时字节码)

这是存储在链上的代码,描述了一个智能合约。这段代码不包括合约的构造函数逻辑或构造器参数,因为它们与用于实际创建的合约代码无关。

合约的运行时字节码可以通过使用汇编代码调用extcodecopy(a)在链上检索到。extcodehash(a)返回运行时字节码的哈希值。这个操作码是在EIP 1052中引入的,并包含在君士坦丁堡硬分叉中。

运行时字节码还可以通过使用 Solidity 的类型信息在链上进行检索。获取字节码的 Solidity 代码是 type(ContractName).runtimeCode。

运行时字节代码可以通过 JSON RPC 调用 getCode 返回。

字节码

它被用作包含运行时字节码和创建字节码等术语的总称,但它更常用于描述运行时字节码。

Deployed Bytecode(部署的字节码)

这个术语在truffle生成的ABI 使用过,指的是合约的运行时字节码。我没有看到truffle abi文件之外使用过这个术语。

Init Code

Init Code与创建字节码相同。它是创建"存储在链上的字节码"的代码。 这个术语通常在文章中使用,指的是使用create2操作码时需要的字节码。

总结

我认为,唯一应该使用的术语是运行时字节码和创建字节码,因为它们明确地描述了代码是什么。我认为字节码应该是一个总括性术语,包括上述两个术语。

请先 登录 后评论

其它 0 个回答

  • 1 关注
  • 2 收藏,4020 浏览
  • 张小雨 提出于 2022-02-04 17:26