没仔细研究,找到了一篇问答:
我翻译一下:
以太坊上只有两种类型的字节码,但有五种不同的名称来描述它们。
这是大多数人在说字节码时所指的代码。这是生成Runtime Bytecode(运行时字节码)的代码,它包括智能合约的构造函数逻辑和构造器参数。创建字节码是创建合约的交易的输入数据,该交易的唯一目的是创建合约。
当你编译一个合约时,创建字节码就会生成。truffle生成的ABI文件中把创建字节码称为bytecode(*)。这也是在Remix上点击合约的 "compilation details"时显示的字节码。
(*) 由Truffle生成的字节码对应于减去构造器参数的创建字节码(因为Truffle在编译时不知道它们)。因此,创建字节码等于Truffle字节码与包含构造器参数信息的一些字节相连接。例如,如果构造器将uint256"123 "和bool "true "作为参数,那么作为部署交易的数据参数传递的创建代码将是: Truffle生成的字节码+"00000000000000000000000000000000000000007b "+"000000000000000000000000000000000000000001"。对于动态类型,如字符串、字节和数组,其编码更为复杂。
该代码可以通过type(ContractName).creationCode在链上进行检索。
在链下,则可以 JSON RPC调用 getTransactionByHash 获得创建字节码。
这是存储在链上的代码,描述了一个智能合约。这段代码不包括合约的构造函数逻辑或构造器参数,因为它们与用于实际创建的合约代码无关。
合约的运行时字节码可以通过使用汇编代码调用extcodecopy(a)在链上检索到。extcodehash(a)返回运行时字节码的哈希值。这个操作码是在EIP 1052中引入的,并包含在君士坦丁堡硬分叉中。
运行时字节码还可以通过使用 Solidity 的类型信息在链上进行检索。获取字节码的 Solidity 代码是 type(ContractName).runtimeCode。
运行时字节代码可以通过 JSON RPC 调用 getCode 返回。
它被用作包含运行时字节码和创建字节码等术语的总称,但它更常用于描述运行时字节码。
这个术语在truffle生成的ABI 使用过,指的是合约的运行时字节码。我没有看到truffle abi文件之外使用过这个术语。
Init Code与创建字节码相同。它是创建"存储在链上的字节码"的代码。 这个术语通常在文章中使用,指的是使用create2操作码时需要的字节码。
我认为,唯一应该使用的术语是运行时字节码和创建字节码,因为它们明确地描述了代码是什么。我认为字节码应该是一个总括性术语,包括上述两个术语。