{"content":{"title":"CREATE2 操作码的阴暗面","body":"## CREATE2 和 self-destruct 的组合是致命的\r\n\r\n我们将在本文中探讨这个问题。\r\n\r\nCREATE 和 CREATE2 操作码的区别：\r\n\r\n**CREATE:**\r\n\r\n- 哈希创建它的账户地址。\r\n- 哈希“账户 nonce”，这相当于该账户迄今完成的交易数量。\r\n\r\n```\r\nnew_address = keccak256(sender, nonce);\r\n```\r\n\r\n**CREATE2 :**\r\n\r\n- 0xFF，一个常量。\r\n- 部署者的地址，即发送 CREATE2 的智能合约地址。\r\n- 一个随机盐值。\r\n- 将在特定地址部署的哈希 Bytecode。\r\n\r\n```\r\nnew_address = keccak256(0xFF, sender, salt, bytecode);\r\n```\r\n\r\n有关 CREATE2 的更广泛背景和逐步教程，请访问 [链接](https://ethereum-blockchain-developer.com/110-upgrade-smart-contracts/12-metamorphosis-create2/) .\r\n\r\n让我们讨论当 CREATE2 与 self-destruct 操作码配对时的阴暗面。\r\n\r\n1. **合约是否可以根据创建时使用的操作码（即 CREATE 或 CREATE2 操作码）进行区分？**\r\n\r\n- **是的，但可以通过使用 create2 操作码来规避，这也使 create 不安全。**\r\n- 示例：合约 A 使用 CREATE2 创建合约 B，然后合约 B 使用标准 CREATE 操作码创建合约 C。然后如果我们销毁合约 B 和 C，我们可以使用与之前相同的地址 **再次** 创建合约 B 和 C。\r\n- 换句话说，合约 B 可以通过 CREATE2 重新创建，合约 C 可以使用相同的地址重新创建，因为可以重复使用相同的 “账户 nonce”。\r\n\r\n**代码**？→ 来吧！！！\r\n\r\n```\r\n// SPDX-License-Identifier: UNLICENSED\r\npragma solidity ^0.8.12;\r\n\r\ncontract Target {\r\n    address public owner;\r\n    constructor() {\r\n        owner = msg.sender;\r\n    }\r\n    function destroy() public {\r\n        selfdestruct(payable(msg.sender));\r\n    }\r\n}\r\n\r\ncontract CreatorContract {\r\n    event CreatorDeploy (address addr);\r\n    address public _targetaddr;\r\n    function deployTarget() external {\r\n        Target _contract = new Target();\r\n        emit CreatorDeploy(address(_contract));\r\n        _targetaddr = address (_contract);\r\n    }\r\n    function destroy() public {\r\n        selfdestruct(payable(msg.sender));\r\n    }\r\n}\r\n\r\ncontract CreatorFactoryContract {\r\n    event CreatorFactoryDeploy(address addrofc);\r\n    address public _creatorContractaddr;\r\n    function deployCreator(uint _salt) external {\r\n        CreatorContract _creatorcontract = new CreatorContract{salt:bytes32(_salt)}();\r\n        emit CreatorFactoryDeploy(address(_creatorcontract));\r\n        _creatorContractaddr = address(_creatorcontract);\r\n    }\r\n}\r\n```\r\n\r\n将以下内容复制到 remix 并按照以下步骤操作：\r\n\r\n- 部署 CreatorFactoryContract 并验证它。\r\n- 使用 CreatorFactoryContract 中的 deployCreator 函数部署 CreatorContract，并保持一个固定的盐值，比如 1。\r\n- 使用 CreatorContract 中的 deploy Target 函数部署 Target 合约，并记录下 Target 和 CreatorContract 的地址。\r\n- 使用 Destroy 函数销毁 Target 合约，然后随之销毁 CreatorContract。\r\n- 使用步骤 2 和 3 重新部署这两个合约。\r\n- 对这两个合约的地址感到惊讶。\r\n\r\n测试网凭证 — 来吧\r\n\r\n- 按照这些链接和图片进行链上分析\r\n- **CreatorFactoryContract 地址 →** [**https://mumbai.polygonscan.com/address/0x59b836ce6a1e08652a4ac0c5564f2cc313c44602#writeContract**](https://mumbai.polygonscan.com/address/0x59b836ce6a1e08652a4ac0c5564f2cc313c44602#writeContract)\r\n- **CreatorContract 地址 →** [**https://mumbai.polygonscan.com/address/0x50eacbf80fc5d7be88e043c663578db4789f1370#code**](https://mumbai.polygonscan.com/address/0x50eacbf80fc5d7be88e043c663578db4789f1370#code)\r\n- **Target 合约地址 →** [**https://mumbai.polygonscan.com/address/0xdC7cB816f8D7dD4e1CE40867c6bc65831CF6fF49#code**](https://mumbai.polygonscan.com/address/0xdC7cB816f8D7dD4e1CE40867c6bc65831CF6fF49#code)\r\n- **部署者地址 → 0x700E9Da3270aAcB3042Dc25dA677bA517CcDC4f7**\r\n\r\n**合约状态过程中的图片**\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/1ns3e5BwjwIluQ8LW-XIC2A.png)\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/1xFyro9_e1AQktbNOlYJKnw.png)\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/1BBdVOtMs0lga7_1LQ3qcMA.png)\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/1_aRK4G8WllFMD5MC42Elvg.png)\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/1OCToi0W9fTcO8S4Xcdkb4g.png)\r\n\r\n这仅仅是 create2 操作码可能性的冰山一角。\r\n\r\n我将在下一篇文章中进一步扩展这个话题，因为这篇文章已经相当长了。\r\n\r\n**接下来的主题：使用上述方法更改变量的值并涉及变形。**\r\n\r\n等不及想看下一个了吗？请阅读此处以获取有关下一个主题的更多内容 → [**链接**](https://ethereum-blockchain-developer.com/110-upgrade-smart-contracts/12-metamorphosis-create2/) .\r\n\r\n**创作者笔记：这是我的第一篇文章，欢迎对文档格式和内容提出建议。请耐心等待，直到我在这个平台上提速。**\r\n\r\n联系我 → [**邮件**](http://jayakumargowtham2812@gmail.com/)。→ [**LinkedIn**](https://www.linkedin.com/in/jayakumar-sathayadhran-8b70a819b/)。\r\n\r\n> 加入 Coinmonks [电报频道](https://t.me/coincodecap) 和 [Youtube频道](https://www.youtube.com/c/coinmonks/videos) 学习加密交易和投资。\r\n\r\n## 另外阅读\r\n\r\n- [BigONE 交易所评测](https://medium.com/coinmonks/bigone-exchange-review-64705d85a1d4) \\| [网格交易机器人](https://coincodecap.com/grid-trading)\r\n- [Anny Trade 评测](https://coincodecap.com/anny-trade-review) \\| [CoinSpot 评测](https://coincodecap.com/coinspot-review)\r\n- [新加坡十大最佳加密交易所](https://coincodecap.com/crypto-exchange-in-singapore) \\| [购买 AXS](https://coincodecap.com/buy-axs-token)\r\n- [印度最佳投资加密货币](https://coincodecap.com/best-crypto-to-invest-in-india-in-2021) \\| [WazirX P2P](https://coincodecap.com/wazirx-p2p)\r\n- [西班牙五大最佳复制交易平台](https://coincodecap.com/copy-trading-spain)\r\n- [Pionex 双投资](https://coincodecap.com/pionex-dual-investment) \\| [AdvCash 评测](https://coincodecap.com/advcash-review) \\| [Uphold 评测](https://coincodecap.com/uphold-review)\r\n\r\n>- 原文链接： [medium.com/coinmonks/dar...](https://medium.com/coinmonks/dark-side-of-create2-opcode-6b6838a42d71)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/26964","address":null},"history":null,"timestamp":1741499275,"version":1}