本文详细探讨了CREATE和CREATE2操作码的区别及其潜在的危险性,尤其是在结合自毁操作码时的安全隐患。通过提供示例代码和步骤说明,作者展示了如何利用CREATE2与自毁机制重新创建智能合约的地址,提醒读者对于智能合约安全的关注。文章结构清晰,有理论分析、实例代码和实测地址的综合展示。
我们将在本文中探讨这个问题。
CREATE 和 CREATE2 操作码的区别:
CREATE:
new_address = keccak256(sender, nonce);
CREATE2 :
new_address = keccak256(0xFF, sender, salt, bytecode);
有关 CREATE2 的更广泛背景和逐步教程,请访问 链接 .
让我们讨论当 CREATE2 与 self-destruct 操作码配对时的阴暗面。
代码?→ 来吧!!!
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;
contract Target {
address public owner;
constructor() {
owner = msg.sender;
}
function destroy() public {
selfdestruct(payable(msg.sender));
}
}
contract CreatorContract {
event CreatorDeploy (address addr);
address public _targetaddr;
function deployTarget() external {
Target _contract = new Target();
emit CreatorDeploy(address(_contract));
_targetaddr = address (_contract);
}
function destroy() public {
selfdestruct(payable(msg.sender));
}
}
contract CreatorFactoryContract {
event CreatorFactoryDeploy(address addrofc);
address public _creatorContractaddr;
function deployCreator(uint _salt) external {
CreatorContract _creatorcontract = new CreatorContract{salt:bytes32(_salt)}();
emit CreatorFactoryDeploy(address(_creatorcontract));
_creatorContractaddr = address(_creatorcontract);
}
}
将以下内容复制到 remix 并按照以下步骤操作:
测试网凭证 — 来吧
合约状态过程中的图片
这仅仅是 create2 操作码可能性的冰山一角。
我将在下一篇文章中进一步扩展这个话题,因为这篇文章已经相当长了。
接下来的主题:使用上述方法更改变量的值并涉及变形。
等不及想看下一个了吗?请阅读此处以获取有关下一个主题的更多内容 → 链接 .
创作者笔记:这是我的第一篇文章,欢迎对文档格式和内容提出建议。请耐心等待,直到我在这个平台上提速。
- 原文链接: medium.com/coinmonks/dar...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!