仅供教育参考,不构成投资或安全建议。预测地址、空账户、校验和或工厂标签,都不能证明部署、代码、控制权、所有权或安全性。
直接答案
CREATE2 根据特定部署合约、32-byte salt 和精确 init_code 的哈希预测创建出的地址。协议公式是 address = keccak256(0xff || deployer(20 bytes) || salt(32 bytes) || keccak256(init_code))[12:]:对 85-byte preimage 做哈希并保留最后 20 bytes。这里的 deployer 是执行 CREATE2 的工厂,不一定是调用工厂的钱包。
init_code 是创建字节码加上 ABI 编码的构造器参数;它只执行一次并生成运行时字节码。编译器版本、优化器设置、链接库、元数据、构造器参数或工厂入口都可能改变哈希。运行时代码是输出,不是 CREATE2 输入。只有部署者、salt、初始化代码、EVM 规则和链状态都相同,地址才具有可比性。
反事实地址在代码存在前可以收款,但尚无经过验证的控制逻辑。预测不等于部署、所有权、授权、最终性或安全性。应在目标链和区块上核验工厂字节码与 calldata、回执和事件、eth_getCode、nonce、存储、余额、代理实现、初始化器和所有者。
运作机制
锁定链或域、分叉规则、RPC 与区块、工厂地址及运行时哈希、原始 salt、精确初始化字节、构造器编码、编译器和链接库。重新计算 keccak256(init_code) 与 85-byte preimage,核对 ABI 填充、字节序、校验和以及最后 20 字节的提取。
然后解码工厂调用和 value,确认预期工厂、入口、salt 域、构造器、所有者和初始化器都已绑定。对最小代理,应哈希包含实现地址的克隆创建字节码,而不是实现的运行时字节码。对代理,应分别验证实现、管理员、存储槽和升级策略。
EIP-684 规定目标 nonce 非零或代码非空时创建必须回退。构造器失败也不会留下成功部署。之后的 SELFDESTRUCT 与重新部署语义取决于分叉规则;不要依赖“代码总能随意替换”的旧说法。
部署证据分层包括:交易纳入与状态、发出事件、代码与 nonce、存储与余额,最后是安全或最终确定的链状态。RPC 成功响应或预测校验和不能替代回执和状态验证。跨链复制的地址可能有不同代码、所有者、存储和资产。
按以下流程执行:
- 固定链、分叉、RPC 和区块;工厂或部署者地址与运行时哈希;salt 字节;初始化代码、构造器参数、编译器和链接库。
- 计算初始化代码哈希和精确 CREATE2 前像,检查宽度、填充、
0xff、最后 20 字节和校验和。 - 解码工厂 calldata 和 value;比较预测地址、所有者、初始化器、代理目标和预期权限。
- 在正确链上核验回执、状态、事件、
eth_getCode、nonce、余额和存储;记录未部署与碰撞状态。 - 检查工厂、代理、实现、管理员、初始化器、升级和单例工厂假设,包括 ERC-1167 目标。
- 测试构造器失败、nonce/代码碰撞、分叉敏感的重新部署、嵌套工厂以及链域或重放假设。
- 在注资或签名前核对人类可读金额与原始金额;部署后监控代码哈希、所有者、实现、角色、事件和最终性。
示例
- EIP-1014 向量: 部署者
0x0000000000000000000000000000000000000000、全零 salt、初始化代码0x00得到0x4D1A2e2bB4F88F0250f26Ffff098B0b30B26BF38。 - 构造器绑定: 部署者和 salt 固定时,改变一个 ABI 编码的构造器参数会改变
keccak256(init_code),从而改变预测地址;哈希运行时字节码会验证错误对象。 - 碰撞: 若目标 nonce 大于
0或代码非空,依据 EIP-684,CREATE2 必须回退。代码为零、nonce 为零但已有资金的地址只是反事实地址,仍未验证。 - 最小代理: ERC-1167 克隆地址哈希包含实现地址的克隆创建字节码。改为哈希实现运行时字节码会得到无关的预测结果。
风险
- 使用了错误的工厂或部署者。
- salt 宽度、填充、字节序或域编码错误。
- 将初始化代码与运行时字节码混淆。
- 构造器参数遗漏或顺序错误。
- 工厂入口、value 或 calldata 不一致。
- 代理或 delegate 目标不是预期实现。
- 链、分叉或 EVM 域不同。
- 现有 nonce 导致碰撞。
- 现有代码导致碰撞。
- 采用过时的 SELFDESTRUCT 重新部署假设。
- 嵌套 CREATE2 改变有效部署者。
- 混淆 CREATE 与 CREATE2 公式。
- 未核验 ERC-1167 的实现目标。
- 未验证单例工厂地址或部署假设。
- 实现升级或管理员控制改变行为。
- 编译器、元数据、库或源制品不同。
- 混淆回执、内存池、失败和最终性状态。
- 校验和或 UI 污染隐藏错误地址。
- 预充值反事实资金没有所有权证明。
- EIP-7702、重放、gas、拒绝服务或陈旧监控假设错误。
常见误区
- “空地址就是安全或已拥有。” 它可能没有代码或经过验证的控制者。
- “地址由 salt 单独决定。” 部署者和初始化代码哈希同样是绑定条件。
- “CREATE2 哈希运行时字节码。” 它哈希的是包含构造器参数的创建代码。
- “两条链上的相同地址意味着代码和控制权相同。” 必须分别核验链状态和部署。
- “成功预测证明了部署和安全。” 只有回执、代码、状态、权限和最终性才能确定已存在的对象。
相关主题
来源
- EIP-1014: Skinny CREATE2 - Ethereum Improvement Proposals (查阅日期: 2026-08-13)
- EIP-684: Revert creation in case of collision - Ethereum Improvement Proposals (查阅日期: 2026-08-13)
- Salted contract creations / CREATE2 - Solidity (查阅日期: 2026-08-13)
- ERC-1167: Minimal Proxy Contract - Ethereum Improvement Proposals (查阅日期: 2026-08-13)
- ERC-2470: Singleton Factory - Ethereum Improvement Proposals (查阅日期: 2026-08-13)
- Create2 - OpenZeppelin (查阅日期: 2026-08-13)
- EIP-155: Simple replay attack protection - Ethereum Improvement Proposals (查阅日期: 2026-08-13)
- Contract Metadata - Solidity (查阅日期: 2026-08-13)