4

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

 2 years ago
source link: https://learnblockchain.cn/question/3052
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

最佳答案 1天前

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

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操作码时需要的字节码。

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

Tiny熊 - 布道者
擅长:智能合约,以太坊 | 采纳率 40% | 回答于 1天前

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK