# EIP 1014: CREATE2 指令

作者 类型 分类 状态 创建时间
Vitalik Buterin Standards Track Core Final 2018-04-20

# 规范

添加了一个新的0xf5 操作码指令CREATE2 ,它使用4个栈参数:endowment, memory_start, memory_length, salt 。 0xf5 指令的行为和CREATE相同,只不过它使用keccak256( 0xff ++ address ++ salt ++ keccak256(init_code))[12:] 而不是 发送者+nonce hash来计算出合约地址。

CREATE2CREATEgas 模式一样,但是有一个额外的 GSHA3WORD * ceil(len(init_code) / 32) hash 计算消耗(hashcost),在计算出地址和执行 init_code代码之前,hashcost 与内存扩展 及 CreateGas 一起被扣除。

  • 0xff 为一个字节
  • address20 字节
  • salt32 直接 (占用一个栈).

因此,最后一次哈希keccak256( 0xff ++ address ++ salt ++ keccak256(init_code))[12:] 的内容始终正好是85字节长, 在2018-08-10进行的核心开发者会议上决定使用上述公式。

# 动机

允许使用链上尚不存在但可以依赖的地址进行交互,对于像 counterfactually 类似的状态通道中非常有用。地址由特定初始化代码及可控的salt控制。

# 原理阐述

# Address 计算公式

  • 确保使用此方案创建的地址不会与使用传统的 keccak256(rlp([sender, nonce])) 公式创建的地址冲突,而0xff 只可能是很长字节的 RLP编码前缀。

  • 确保hash 的转载内容是 固定字节大小

# Gas 消耗

由于地址计算依赖于对 init_code 的hash ,因此如果反复对大块 init_code 执行 hash,可能使网络客户端容易受到DoS攻击,因为内存扩展仅支付一次。 该EIP使用与 SHA3 操作码相同的每字成本。

# 澄清

init_code 是执行后会生成运行时字节码(存入链状态)的代码,通常由高级语言用来实现构造函数。合约

此EIP可能产生冲突。 冲突行为EIP 684有指出:

如果使用创建交易或CREATE(或将来的CREATE2)操作码去尝试创建合约,并且目标地址已经具有非零 nonce 或非空代码,则该创建将立即抛出,如果初始化代码中的第一个字节是无效的操作码,则同样会抛出此错误。 适用与从创世纪块开始追溯。

具体来说,如果 noncecode 非零,则创建操作将失败。

以及 EIP 161

在执行初始化代码之前,帐户创建交易和CREATE操作应随机数增加1。

这意味着,如果在交易中创建合约,则 nonce 立即为非零,其副作用是,同一交易中的冲突将始终失败-即使是通过 init_code 本身执行 。

还应注意,SELFDESTRUCTnoncecode 没有立即生效,因此不能在一次交易中销毁和重新创建合约。

# 示例

示例 0

  • address 0x0000000000000000000000000000000000000000
  • salt 0x0000000000000000000000000000000000000000000000000000000000000000
  • init_code 0x00
  • gas (assuming no mem expansion): 32006
  • result: 0x4D1A2e2bB4F88F0250f26Ffff098B0b30B26BF38

示例 1

  • address 0xdeadbeef00000000000000000000000000000000
  • salt 0x0000000000000000000000000000000000000000000000000000000000000000
  • init_code 0x00
  • gas (assuming no mem expansion): 32006
  • result: 0xB928f69Bb1D91Cd65274e3c79d8986362984fDA3

示例 2

  • address 0xdeadbeef00000000000000000000000000000000
  • salt 0x000000000000000000000000feed000000000000000000000000000000000000
  • init_code 0x00
  • gas (assuming no mem expansion): 32006
  • result: 0xD04116cDd17beBE565EB2422F2497E06cC1C9833

示例 3

  • address 0x0000000000000000000000000000000000000000
  • salt 0x0000000000000000000000000000000000000000000000000000000000000000
  • init_code 0xdeadbeef
  • gas (assuming no mem expansion): 32006
  • result: 0x70f2b2914A2a4b783FaEFb75f459A580616Fcb5e

示例 4

  • address 0x00000000000000000000000000000000deadbeef
  • salt 0x00000000000000000000000000000000000000000000000000000000cafebabe
  • init_code 0xdeadbeef
  • gas (assuming no mem expansion): 32006
  • result: 0x60f3f640a8508fC6a86d45DF051962668E1e8AC7

示例 5

  • address 0x00000000000000000000000000000000deadbeef
  • salt 0x00000000000000000000000000000000000000000000000000000000cafebabe
  • init_code 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef
  • gas (assuming no mem expansion): 32012
  • result: 0x1d8bfDC5D46DC4f61D6b6115972536eBE6A8854C

示例 6

  • address 0x0000000000000000000000000000000000000000
  • salt 0x0000000000000000000000000000000000000000000000000000000000000000
  • init_code 0x
  • gas (assuming no mem expansion): 32000
  • result: 0xE33C0C7F7df4809055C3ebA6c09CFe4BaF1BD9e0

本翻译采用BY-NC-ND许可协议,译者:深入浅出区块链 Tiny熊。