前言
- 智能合约生成合约地址的第二种方式
Create2
- 以一道例题解释
计算地址有两种方式
Create
:keccak256(rlp.encode(deployingAddress, nonce))[12:]
Create2
:keccak256(0xff ++ deployingAddr ++ salt ++ keccak256(bytecode))[12:]
关于
Create2
,这里就不介绍了,可以参考 EIP 1014: CREATE2 指令
1 | pragma solidity ^0.4.21; |
- 很简单,要求
name
是smarx
,并且msg.sender
包含badc0de
,可通过下面合约解决,只需要合约地址包括badc0de
即可
1 | pragma solidity ^0.5.12; |
- 用
Create2
方法解决,如下,我们只需要计算出相对应的salt
即可,Deployer
被部署在0xca4dfd86a86c48c5d9c228bedbeb7f218a29c94b
1 | contract Deployer { |
- 写了一个脚本爆破
salt
, 只要包含badc0de
即可
1 | from web3 import Web3 |
- 结果如下
最后调用
Deployer.deploy(0x00...005b2bfe)
即可把BadCodeSmarx
合约部署到地址0xa905a3922a4ebfbc7d257cecdb1df04a3badc0de
上也有大佬通过
Create
方式解决的,有兴趣的可以参考 https://www.anquanke.com/post/id/154104#h3-11 , 带佬自行验证
,我没有验证