# 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来计算出合约地址。
CREATE2
和 CREATE
的 gas
模式一样,但是有一个额外的 GSHA3WORD * ceil(len(init_code) / 32)
hash 计算消耗(hashcost
),在计算出地址和执行 init_code
代码之前,hashcost
与内存扩展 及 CreateGas
一起被扣除。
0xff
为一个字节address
是20
字节salt
是32
直接 (占用一个栈).
因此,最后一次哈希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 或非空代码,则该创建将立即抛出,如果初始化代码中的第一个字节是无效的操作码,则同样会抛出此错误。 适用与从创世纪块开始追溯。
具体来说,如果 nonce
或 code
非零,则创建操作将失败。
以及 EIP 161
在执行初始化代码之前,帐户创建交易和CREATE操作应随机数增加1。
这意味着,如果在交易中创建合约,则 nonce
立即为非零,其副作用是,同一交易中的冲突将始终失败-即使是通过 init_code
本身执行 。
还应注意,SELFDESTRUCT
对 nonce
或 code
没有立即生效,因此不能在一次交易中销毁和重新创建合约。
# 示例
示例 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熊。