CREATE2 操作码的阴暗面

本文详细探讨了CREATE和CREATE2操作码的区别及其潜在的危险性,尤其是在结合自毁操作码时的安全隐患。通过提供示例代码和步骤说明,作者展示了如何利用CREATE2与自毁机制重新创建智能合约的地址,提醒读者对于智能合约安全的关注。文章结构清晰,有理论分析、实例代码和实测地址的综合展示。

CREATE2 和 self-destruct 的组合是致命的

我们将在本文中探讨这个问题。

CREATE 和 CREATE2 操作码的区别:

CREATE:

  • 哈希创建它的账户地址。
  • 哈希“账户 nonce”,这相当于该账户迄今完成的交易数量。
new_address = keccak256(sender, nonce);

CREATE2 :

  • 0xFF,一个常量。
  • 部署者的地址,即发送 CREATE2 的智能合约地址。
  • 一个随机盐值。
  • 将在特定地址部署的哈希 Bytecode。
new_address = keccak256(0xFF, sender, salt, bytecode);

有关 CREATE2 的更广泛背景和逐步教程,请访问 链接 .

让我们讨论当 CREATE2 与 self-destruct 操作码配对时的阴暗面。

  1. 合约是否可以根据创建时使用的操作码(即 CREATE 或 CREATE2 操作码)进行区分?
  • 是的,但可以通过使用 create2 操作码来规避,这也使 create 不安全。
  • 示例:合约 A 使用 CREATE2 创建合约 B,然后合约 B 使用标准 CREATE 操作码创建合约 C。然后如果我们销毁合约 B 和 C,我们可以使用与之前相同的地址 再次 创建合约 B 和 C。
  • 换句话说,合约 B 可以通过 CREATE2 重新创建,合约 C 可以使用相同的地址重新创建,因为可以重复使用相同的 “账户 nonce”。

代码?→ 来吧!!!

// 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 并按照以下步骤操作:

  • 部署 CreatorFactoryContract 并验证它。
  • 使用 CreatorFactoryContract 中的 deployCreator 函数部署 CreatorContract,并保持一个固定的盐值,比如 1。
  • 使用 CreatorContract 中的 deploy Target 函数部署 Target 合约,并记录下 Target 和 CreatorContract 的地址。
  • 使用 Destroy 函数销毁 Target 合约,然后随之销毁 CreatorContract。
  • 使用步骤 2 和 3 重新部署这两个合约。
  • 对这两个合约的地址感到惊讶。

测试网凭证 — 来吧

合约状态过程中的图片

这仅仅是 create2 操作码可能性的冰山一角。

我将在下一篇文章中进一步扩展这个话题,因为这篇文章已经相当长了。

接下来的主题:使用上述方法更改变量的值并涉及变形。

等不及想看下一个了吗?请阅读此处以获取有关下一个主题的更多内容 → 链接 .

创作者笔记:这是我的第一篇文章,欢迎对文档格式和内容提出建议。请耐心等待,直到我在这个平台上提速。

联系我 → 邮件。→ LinkedIn

加入 Coinmonks 电报频道Youtube频道 学习加密交易和投资。

另外阅读

  • 原文链接: medium.com/coinmonks/dar...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
jayakumargowtham2812
jayakumargowtham2812
江湖只有他的大名,没有他的介绍。