我有一份工厂合同,它创造了孩子的合同。子合同继承了OpenZeppelin的可拥有,因此它有一个所有者和一个transferOwnership方法。
工厂契约使用CREATE2部署子合同,并将所有者的地址作为32字节盐传递:
bytes32 salt = keccak256(abi.encode(owner));
assembly {
proxy := create2(0, add(bytecode, 0x20), mload(bytecode), salt)
}我遇到的问题是,当所有者调用transferOwnerwship方法时,工厂契约不能为该owner部署另一个子契约。那是因为CREATE2 不允许覆盖使用特定盐类部署的合同。。
问题是:有可能把主人当作盐吗?我考虑过分叉Ownable和删除transferOwnership方法,但如果可以的话,我更愿意保留它。
我能用什么密码黑客吗?
发布于 2022-09-29 07:26:31
不要这么想,伙计,我真的不明白你的问题;如果你要使用相同的盐和相同的主副本(克隆字节码),工厂合同将永远不能部署多个合同(那么使用工厂的意义是什么)。因此,transferOwnership实际上是更改所有者并因此部署新合同的唯一方法。
我建议你把盐作为函数参数传递,不管它是随机的,增量的,还是你选择的任何uint值。此外,它将比哈希业主便宜。
https://ethereum.stackexchange.com/questions/109271
复制相似问题