什么是确定性部署(CREATE2)?
确定性部署(CREATE2)是一种以太坊虚拟机方法,允许开发者在智能合约部署前计算其地址。
该方法使用 EVM 操作码
最终版 EIP-1014 CREATE2 规范定义了该操作码、地址公式、Gas 处理方式、冲突行为和最初提出反事实部署的动机。
CREATE2 不会让合约自动变得安全、永久、去中心化,也不会让合约在所有区块链上自动保持一致。它只提供一种根据指定输入确定性推导部署地址的方法。CREATE2 为什么被称为确定性?
如果相同输入始终产生相同输出,那么这一过程就是确定性的。对于 CREATE2,相关输出是智能合约地址。相关输入包括 CREATE2 部署者地址、32 字节盐值和初始化代码的哈希。任何知道这些输入的人都可以在不提交区块链交易的情况下计算未来地址。该地址不取决于部署时间、当前区块编号或工厂此前创建的合约数量。更改地址公式中的任何输入,都会产生不同的预测地址。因此,在链上尚无合约代码之前,开发者就可以规划和引用该合约、向其转入资金,或在签名消息中加入该地址。CREATE2 地址公式
CREATE2 地址使用以下公式计算。数值
什么是 CREATE2 部署者?
CREATE2 部署者是直接调用 CREATE2 操作码的智能合约。它通常被称为工厂、部署合约、确定性部署代理或单例工厂。向工厂发送交易的外部拥有账户(EOA)并不会自动成为 CREATE2 公式中的部署者地址。由于由工厂执行该操作码,通常应使用工厂地址作为部署者地址。即使盐值和初始化代码完全相同,使用不同工厂也会产生不同的预测合约地址。因此,开发者必须核实确切的工厂地址,而不能用提交交易的钱包地址计算结果。工厂可能允许任何人部署任意初始化代码,也可能仅允许获批账户和合约模板进行部署。工厂的权限和实现方式会影响预测的合约是否确实可以部署。什么是 CREATE2 盐值?
CREATE2 盐值是纳入确定性地址计算的任意 32 字节值。盐值允许工厂使用相同初始化代码部署多个合约,同时为每个合约分配不同地址。盐值可以由用户标识符、钱包地址、账户编号、代币标识符、应用版本、随机值或多个字段组合生成。盐值不需要保密。任何知道工厂、盐值和初始化代码的人都可以计算出相同地址。开发者应明确规定盐值的编码方式,因为编码不一致可能导致地址与预期不符。例如,数字
什么是初始化代码?
初始化代码通常简称 init code,是智能合约创建时执行的临时 EVM 代码。它负责执行构造函数逻辑,并返回部署后保留在新地址上的运行时字节码。初始化代码本身通常不会作为合约的永久代码保存。CREATE2 公式会将初始化代码的哈希纳入计算。在 Solidity 部署中,完整的初始化代码通常包括合约创建字节码和 ABI 编码的构造函数参数。当前 Solidity 关于带盐合约创建的文档确认,地址取决于创建字节码和构造函数参数。
更改构造函数参数会改变初始化代码哈希,因此也会改变预测地址。计算 CREATE2 地址时,开发者必须使用计划部署的确切编译器输出和构造函数编码。初始化代码与运行时字节码
初始化代码和运行时字节码彼此相关,但并不相同。初始化代码只在部署过程中运行一次。部署完成后,运行时字节码会存储在合约地址上。CREATE2 地址公式直接纳入初始化代码哈希,而非最终运行时代码哈希。这一点带来了重要的安全考量。构造函数可以读取外部区块链状态,并据此决定生成何种运行时代码或初始存储值。因此,同一初始化代码在不同外部条件下执行时,可能生成不同行为的合约。如果开发者希望获得强行为承诺,应避免依赖环境的构造函数,或在部署后核实生成的运行时代码和存储内容。构造函数参数与 CREATE2
在 Solidity 部署中,构造函数参数属于初始化代码的一部分。如果某合约构造时的所有者地址为
CREATE 与 CREATE2
CREATE 和 CREATE2 是用于创建智能合约的 EVM 操作。普通 CREATE 新地址主要根据创建者账户及其部署 nonce 推导。部署者每创建一个合约,nonce 就会增加。因此,要预测 CREATE 地址,开发者必须知道正确的部署顺序。CREATE2 则将基于 nonce 的地址公式替换为基于工厂地址、盐值和初始化代码哈希的公式。CREATE2 不会改变构造函数代码的基本执行方式,也不会改变返回的运行时字节码的存储方式。它改变的是目标地址的推导方式,并增加了计算初始化代码哈希的成本。如果目标地址违反 EVM 合约创建冲突规则,CREATE 和 CREATE2 都会失败。CREATE2 何时推出?
CREATE2 于 2018 年在 EIP-1014 中提出。它被纳入以太坊 Constantinople 网络升级。Constantinople 升级规范将 EIP-1014 列为此次升级包含的协议变更之一。
此后,CREATE2 已成为 EVM 的成熟组成部分,并得到 Solidity 和广泛使用的开发工具支持。EVM 兼容网络在启用相应协议行为后,可能支持 CREATE2。开发者应核实网络兼容性,而不要假设所有使用类似 EVM 环境的区块链都采用完全相同的规则。Solidity 中的 CREATE2
Solidity 提供了通过 CREATE2 部署合约的高级语法。工厂可以使用
可支付构造函数也可以通过
简化版 Solidity CREATE2 示例
address public owner;
constructor(address initialOwner) {
owner = initialOwner;
}
}
contract Factory {
function deploy(bytes32 salt, address initialOwner)
external
returns (address deployed)
{
Child child = new Child{salt: salt}(initialOwner);
deployed = address(child);
}
}
在此示例中,预测的子合约地址取决于工厂地址、盐值、Child 创建字节码,以及编码后的
更改
预测 CREATE2 地址
开发者可以在智能合约、部署脚本、钱包或本地应用中计算 CREATE2 地址。计算时必须使用实际执行 CREATE2 的确切工厂地址。还必须使用最终表示形式的 32 字节盐值。初始化代码哈希必须包含确切的创建字节码和编码后的构造函数参数。部署后,应将计算结果与工厂返回的地址进行比较。如果预测地址与实际地址不一致,部署工具应拒绝继续。错误预测通常是因为使用运行时字节码代替创建字节码、遗漏构造函数参数、选择错误工厂或盐值编码不正确。什么是反事实部署?
反事实部署是指在智能合约尚未部署到某地址之前,就将该未来合约地址视为有意义的地址。相关各方可以提前计算地址,并就合约预期使用的初始化代码达成一致。他们可以向该地址发送资产、在其他合约中引用该地址,或创建与该地址关联的签名授权。只有在确有需要时才部署合约。这样可以避免立即发送部署交易,并降低初始接入成本。EIP-1014 最初着重介绍了状态通道系统中的反事实交互:只有参与者发生争议时,才可能需要部署相关合约。反事实部署如今也对智能合约钱包和账户抽象十分重要。反事实智能合约账户
在账户合约部署之前,智能合约账户可以拥有一个可预测的 CREATE2 地址。用户可以分享该地址,也可能在此接收加密货币或代币。之后,账户的首次操作可以部署钱包,并在同一整体流程中执行某项操作。这样,用户在接收资产前就不必单独提交钱包创建交易。ERC-4337 账户抽象规范支持在账户尚不存在时,根据工厂初始化数据创建发送方智能合约账户。
账户工厂通常使用 CREATE2,以确保账户地址可以在部署前计算出来。并非所有账户抽象设计都必须使用 CREATE2,因为较新的授权和账户模型可能采用其他机制。向尚未部署的地址发送加密货币
尚未部署的 CREATE2 地址可以接收区块链原生加密货币,因为地址无需具有运行时代码即可持有余额。如果代币合约允许向普通地址转账,同质化和非同质化代币也可以转入预测地址。即使该地址尚无合约代码,资产仍与该地址关联。如果预期合约成功部署,这些资产之后就可能可以使用。这一机制有助于简化钱包接入和反事实应用设计。但它也带来严重风险:如果工厂、盐值或初始化代码有误,资产可能无法访问。向反事实地址发送有实际价值的资产之前,用户应确认合约确实能够部署。空的 CREATE2 地址可以持有资金吗?
可以。没有代码的地址仍可持有原生加密货币和代币余额。仅有正余额并不会阻止在该地址部署 CREATE2 合约。EVM 冲突规则关注的是目标地址的 nonce 是否非零,或代码是否非空。这一设计对于部署前接收资金的反事实账户是必要的。部署完成后,合约代码和授权规则将决定如何使用这些资产。CREATE2 冲突规则
如果目标地址已有非空代码或非零 nonce,CREATE2 部署就会失败。这可以防止工厂覆盖同一地址上的现有合约。即使新的初始化代码按公式计算出的地址正确,该规则仍然适用。如果初始化代码执行回滚、Gas 耗尽、返回无效代码或违反其他合约创建规则,部署也会失败。工厂应处理 CREATE2 操作码返回的零值结果,并尽可能提供有用的错误提示。发生冲突并不意味着 Keccak 哈希函数遭到密码学层面的破解。这通常意味着根据 EVM 账户规则,确定性目标地址已被占用。两个不同的部署能否产生相同 CREATE2 地址?
如果两次部署使用相同工厂地址、盐值和初始化代码哈希,计算出的地址就会相同。不同初始化代码理论上可能产生相同哈希,但按照当前安全假设,实际找到 Keccak-256 碰撞被认为在计算上不可行。由于地址只使用哈希的最后 20 个字节,随机地址碰撞在理论上可能发生,与其他以太坊地址一样。以当前计算能力,主动构造指定碰撞仍不现实。开发者仍不应将视觉上相似的地址视为底层部署输入正确的证明。重复使用盐值
如果初始化代码不同,工厂可以重复使用同一盐值,因为初始化代码哈希会产生不同地址。只要原始目标地址仍被占用,同一工厂就无法使用相同初始化代码和相同盐值成功部署第二次。项目可以在应用层禁止重复使用盐值,以便更容易追踪部署意图。公开工厂可能允许任何人提交之前用过的盐值,因为完整公式还包含初始化代码哈希。盐值唯一性本身并非完整的安全属性。必须检查工厂、盐值和初始化代码组成的完整组合。抢先提交 CREATE2 部署
待处理的 CREATE2 交易在被纳入区块前可能对外可见。其他用户可能复制工厂调用并尝试先部署合约。如果无许可工厂使用相同盐值和完全相同的初始化代码,复制部署应会在同一预测地址创建相同的代码承诺。原始交易随后可能因目标地址已被占用而失败。这仍可能造成时间安排问题、Gas 浪费或应用流程受阻。如果构造函数行为会读取变化中的环境信息,例如区块数据、交易发起者、外部合约状态或取决于调用者的工厂参数,风险就会更加严重。当前确定性工厂提案建议,为实现完全确定性的合约使用知名工厂,而不是依赖执行环境的部署方式。
构造函数被抢先调用的风险
CREATE2 地址会承诺初始化代码,但不会锁定构造函数可能读取的所有外部状态。控制部署时机的攻击者可能使构造函数读取到不同的价格、区块值、注册表条目或外部合约状态。因此,生成的运行时代码或初始存储可能与原用户的预期不同。在实际可行的情况下,构造函数应通过已纳入承诺的构造函数参数接收关键配置,而不是读取可变的外部状态。部署脚本应在创建后核实运行时代码、所有权、存储和发出的事件。未受保护的初始化函数风险
代理合约和最小代理通常使用初始化函数,而非构造函数。初始化函数会在部署后设置所有权、权限、实现细节或其他必要状态。预测出 CREATE2 地址并不会自动保护初始化函数。如果部署和初始化分属不同交易,攻击者可能先调用初始化函数。工厂应在部署交易中原子化初始化合约,或实施严格授权。确定性地址无法弥补不安全的初始化设计。CREATE2 工厂
CREATE2 工厂是一种可重复使用的智能合约,可接收盐值和初始化代码并执行 CREATE2 操作码。使用工厂可以通过统一接口,让外部拥有账户和其他智能合约都能进行确定性部署。简单工厂可以不设权限限制,接受任意代码。专用工厂则可能只部署经过批准的账户实现或应用模块。开发者应检查工厂的运行时代码、部署历史、权限、失败处理方式和值转移行为。恶意工厂可能更改输入、限制部署、扣留资金或执行意外代码。单例工厂
单例工厂是一种确定性工厂,旨在多个 EVM 网络上都部署在同一地址。共享工厂地址有助于开发者在每个受支持网络上推导相同的子合约地址。ERC-2470提议创建用于确定性部署的无许可 CREATE2 单例工厂。
该提案使用无密钥部署方法,使工厂可以在兼容网络上部署到已知地址。截至 2026 年 7 月,ERC-2470 在 EIP 代码库中的状态为 Stagnant(停滞),但确定性工厂这一整体概念仍广受关注。提案在代码库中的状态,与合约在现实中的部署状态是两个不同问题。多链确定性部署
CREATE2 可以帮助开发者在多个 EVM 网络上将合约部署到同一地址。要获得相同结果,每个网络上的 CREATE2 工厂地址、盐值和初始化代码哈希都必须相同。如果应用部署者钱包调用的是不同工厂地址,仅使用同一个钱包并不足以保证地址一致。编译器元数据、库链接、构造函数参数和合约源代码变更都可能改变初始化代码哈希。链 ID 不会直接纳入基本 CREATE2 公式。不过,构造函数或部署工具可能会纳入链特定数据,进而改变初始化代码或部署状态。即使各网络上的地址相同,开发者仍应分别核实部署代码。跨链部署相同地址的用途
合约地址相同,可以减少钱包、界面、软件库和其他合约需要保存的地址数量。开发者可以在多个受支持网络上使用同一个地址常量。用户不太容易从错误网络复制合约地址。智能合约账户也可以在多条链上使用一个一致的地址。这能改善易用性,但如果某条链上相同地址对应不同代码或配置,也可能造成不切实际的信任。始终应结合链标识符和已验证字节码来判断地址。当前确定性工厂提案
随着更多 EVM 网络和 Rollup 的创建,确定性工厂基础设施仍在发展。截至 2026 年 7 月,EIP-7997处于 Review(审查中)状态,提议在 EVM 链上的指定地址正式要求部署广泛使用的确定性工厂。
该提案尚未定稿,不应视为适用于所有网络的普遍保证。ERC-7955仍是一项 Draft(草案)提案,旨在通过 EIP-7702 功能无许可地引导部署通用 CREATE2 工厂。
这些提案针对的问题是:仅有 CREATE2 并不能解决如何在所有网络的相同地址部署初始工厂。依赖通用工厂之前,开发者应查看当前提案状态和实际网络状况。CREATE2 与账户抽象
账户抽象允许智能合约账户采用可编程的验证和执行规则。钱包可以支持多个签名者、通行密钥、恢复守护者、支出限额、批量操作和手续费代付。CREATE2 允许钱包工厂在部署钱包合约之前计算账户地址。用户可以先在该地址接收资金,并在处理首次操作时部署账户。当发送方账户尚不存在时,ERC-4337 可以包含用于创建账户的工厂数据。账户的反事实地址必须与工厂调用生成的地址相符。如果工厂将代码部署到其他地址,账户操作就会在该标准的验证流程中失败。CREATE2 与部署前签名
反事实合约账户可能需要在部署前签署身份验证消息。由于该地址尚无运行时代码,常规合约签名验证无法调用账户。ERC-6492定义了一种包装格式,用于验证由尚未部署的合约账户代为签署的签名。
验证过程可以模拟或执行所需的工厂部署,然后检查合约的签名逻辑。该标准建议使用 CREATE2 合约,因为其地址可预测。验证反事实账户的签名时,应使用适用的合约签名标准,而不应将其视为普通外部拥有账户签名。CREATE2 与代币绑定账户
代币绑定账户是一种与非同质化代币关联的智能合约账户。该账户可以持有加密货币、代币、NFT 和其他链上资产。ERC-6551使用 CREATE2,使代币绑定账户的地址能够在部署前以反事实形式存在。
这样,在有人支付费用部署账户合约之前,资产就可以转入该代币账户。根据该标准的规则,账户地址取决于注册表、实现、盐值、区块链标识符、代币合约和代币标识符。控制 NFT 的所有权通常决定谁能通过代币绑定账户执行操作。CREATE2 与状态通道
状态通道允许参与者在链下反复交互,同时使用区块链合约执行最终结果或解决争议。参与者可以预先就争议解决合约的代码和地址达成一致。CREATE2 允许他们在不立即部署合约的情况下计算其地址。在整个链下流程中,他们都可以引用这一反事实合约。只有在需要执行时才需部署该合约。这是 EIP-1014 最初介绍的用途之一。CREATE2 与最小代理合约
最小代理是一种将调用委托给实现合约的小型合约。工厂可以结合使用最小代理和 CREATE2,创建可预测的账户或应用地址。实现地址可能属于代理初始化代码的一部分。因此,更改实现地址可能会改变预测的代理地址。有些工厂会在同一交易中将初始化参数写入已部署代理的存储。开发者必须核实确定性承诺涵盖的是实现、初始化数据,还是仅包含通用代理框架。CREATE2 与可升级合约
CREATE2 本身不是升级系统。如果合约采用代理或其他明确的升级架构,就可以通过 CREATE2 部署为可升级合约。在这种设计中,代理保留在确定性地址,而其实现引用可以更改。代理管理员、治理规则、延迟机制和实现验证决定了升级安全性。代理地址可预测并不保证其行为不可变。用户应检查升级权限,而不要假设可预测地址意味着代码永久不变。CREATE2、SELFDESTRUCT 与重新部署
旧版 CREATE2 设计有时会使用
以太坊当前的 EIP-6780 SELFDESTRUCT 规则通常会阻止长期存在的合约删除代码和存储。
如果合约并非在当前交易中创建,则调用 SELFDESTRUCT 时只会转移余额,不会删除代码、存储或账户。因此,过去依赖销毁已部署合约并在同一 CREATE2 地址重新创建合约的常规升级模式已不再可行。EIP-6780 明确建议使用成熟的代理升级设计,而不是通过 CREATE2 重新部署实现升级。SELFDESTRUCT 已被弃用,新系统不应依赖其行为无限期保持不变。变形合约风险
变形合约旨在通过销毁和重新部署,让固定地址上的运行代码发生变化。在当前 SELFDESTRUCT 限制出台前,这种模式会使基于地址的信任尤其危险。用户可能先验证一个版本的代码,之后却在同一地址与另一套代码交互。当前以太坊规则已禁止一般性的长期合约重新部署模式,但较旧网络或其他 EVM 环境的 SELFDESTRUCT 行为可能有所不同。安全工具应根据所分析的具体区块链和区块时段评估规则。解释历史交易时,应按照交易发生时生效的协议规则进行。CREATE2 的 Gas 成本
CREATE2 的 Gas 结构与普通 CREATE 类似,但会增加一项初始化代码哈希计算成本。EIP-1014 根据初始化代码中 32 字节字的数量定义了额外哈希成本。因此,较大的初始化代码不仅需要更多 Gas 来推导地址,也需要更多 Gas 来处理内存和执行构造函数。部署还需支付存储最终运行时代码以及执行构造函数操作的成本。网络 Gas 计量规则可能随协议升级而改变,因此固定 Gas 估算不应被视为永久有效。已预充值的反事实账户最终部署时,仍可能需要足够的原生加密货币或手续费代付方来支付费用。初始化代码大小限制
以太坊会对合约初始化代码实施协议限制和计量规则。EIP-3860增加了 init code 计量规则和初始化代码大小上限。
这些规则同时适用于 CREATE 和 CREATE2 部署。大型工厂不应假设可以成功提交任意大小的构造函数逻辑。开发工具应根据当前网络限制测试最终编译的初始化代码。靓号合约地址
开发者可以不断尝试不同盐值,直到预测的 CREATE2 地址包含所需前缀或模式。这一过程称为靓号合约地址挖掘。较短且易识别的前缀可以让地址在视觉上更容易辨认。这不会提升智能合约的安全性或权限。用户应核实完整地址,因为诈骗者可以生成前缀和后缀相似的地址。靓号地址绝不能替代字节码验证和可信的部署记录。CREATE2 与地址投毒
地址投毒试图让欺诈地址出现在用户的交易历史或钱包界面中,使其看起来像可信地址。攻击者可能生成一个字符与可信地址相似的地址。通过改变盐值,CREATE2 可以帮助搜索出具有指定视觉模式的合约地址。这种攻击不需要破解 CREATE2 或 Keccak-256。它依赖的是用户只检查地址开头或结尾的习惯。发送加密货币前,用户应核实完整地址,或使用可信的地址簿系统。跨链地址混淆
相同的十六进制地址可能存在于多个 EVM 网络上。根据网络不同,该地址可能包含相同代码、不同代码,也可能没有代码。确定性部署计划可以生成相同地址,但区块链标识符仍然至关重要。如果资产被发送到错误网络上的正确地址,可能无法通过预期应用访问。钱包和界面应清楚显示合约地址和所选网络。开发者应在每条受支持的链上核实代码哈希和配置。工厂信任风险
确定性地址计算以所选工厂按预期运行作为前提。工厂可能修改盐值、更改初始化代码、实施访问控制、收取费用,或以意外方式转移部署资金。可升级工厂可能在开发者最初审查之后发生变化。由单个私钥控制的工厂,可能在密钥丢失或泄露后无法使用或被恶意控制。无许可工厂可以降低部分控制风险,但可能带来抢先交易和垃圾信息问题。依赖预测地址之前,开发者应核实工厂运行时代码和部署机制。编译器和元数据风险
不同版本的 Solidity 编译器可能会根据相同源代码生成不同的创建字节码。优化运行次数、元数据配置、链接库和目标 EVM 版本等编译器设置也可能改变字节码。字节码的细微差异会导致初始化代码哈希和 CREATE2 地址不同。开发者应固定确定性部署所使用的编译器版本和构建配置。可复现的构建流程有助于独立用户确认已发布的源代码能够生成部署字节码。如果只复制 Solidity 源代码而不包含构建设置,可能不足以复现预测地址。库链接
Solidity 合约可能包含占位符,部署前必须替换为已部署的库地址。链接后的创建字节码会成为 CREATE2 初始化代码的一部分。更改库地址会改变预测的合约地址。因此,如果跨链部署时链接库位于不同地址,就可能无法生成相同地址。希望在多条链上生成相同地址的项目,可能需要先确定性部署库,再部署依赖这些库的合约。CREATE2 验证清单
计算预测目标地址之前,先核实区块链和工厂地址。确认盐值采用准确的 32 字节编码。使用创建字节码,而不是运行时字节码。在初始化代码中包含 ABI 编码的构造函数参数。固定编译器版本、优化设置、链接库和元数据配置。检查预测地址是否已有代码或非零 nonce。模拟工厂调用,并查看构造函数是否依赖外部状态。部署后,将实际地址、运行时代码、存储配置、所有者、实现合约和发出的事件与预期结果进行比较。CREATE2 的优势
CREATE2 允许在合约部署前获知其地址。它支持反事实钱包和合约,使其能够在代码创建前接收资产。它消除了对工厂不断变化的部署 nonce 的依赖。如果所有必要输入都相同,它可以在兼容的 EVM 网络上生成一致的应用地址。它支持高效的状态通道和争议解决合约设计。它可以简化钱包、软件库、智能合约和多链界面的地址管理。它还支持可复现的部署系统,让用户能够独立验证预期目标地址。CREATE2 的局限
CREATE2 不保证合约最终一定会部署。它不保证工厂可信,也不保证工厂在每个网络上都可用。它不保证不同链上相同地址包含相同的运行时代码或状态。它无法保护未初始化的代理、不安全的构造函数、已泄露的管理员权限或有漏洞的智能合约。如果目标地址已有代码或非零 nonce,它不允许覆盖现有合约。当前 SELFDESTRUCT 规则阻止了基于长期合约销毁和重新部署的一般升级模式。如果用户在未充分核实部署输入之前,就向预测地址发送资金,也会产生操作风险。常见问题
用简单的话说,CREATE2 是什么?
CREATE2 是一种 EVM 指令,开发者可以用它在智能合约部署前计算合约地址。确定性部署是什么意思?
确定性部署是指相同的指定部署输入会产生相同的计算合约地址。哪个 EIP 引入了 CREATE2?
CREATE2 通过 EIP-1014 引入。CREATE2 操作码是什么?
CREATE2 操作码是
哪些输入决定 CREATE2 地址?
地址取决于 CREATE2 工厂地址、32 字节盐值和初始化代码哈希。CREATE2 使用 nonce 吗?
CREATE2 地址公式不使用工厂不断变化的合约创建 nonce。交易发送方会纳入 CREATE2 公式吗?
公式中纳入的是直接执行 CREATE2 的合约,通常是工厂,而不是调用工厂的外部钱包。什么是 CREATE2 盐值?
盐值是一个 32 字节值,用于区分确定性部署并生成不同地址。CREATE2 盐值需要保密吗?
不需要。盐值通常无需保密。什么是 init code?
init code 是临时创建代码,负责运行构造函数并返回存储在新地址上的运行时字节码。CREATE2 会对运行时字节码进行哈希吗?
地址公式会对初始化代码进行哈希,而不是只对最终运行时字节码直接哈希。构造函数参数会改变 CREATE2 地址吗?
会。Solidity 构造函数参数包含在初始化代码中,通常会改变预测地址。可以在链下预测 CREATE2 地址吗?
可以。无需提交区块链交易,即可在本地计算地址。尚未部署的 CREATE2 地址可以接收加密货币吗?
可以。在合约部署前,预测地址可以接收原生加密货币和兼容代币。向尚未部署的地址发送资金安全吗?
如果尚未核实工厂、盐值、初始化代码、部署可行性和未来授权规则,就存在风险。CREATE2 可以覆盖现有合约吗?
不可以。如果目标地址已有非空代码或非零 nonce,部署就会失败。CREATE2 可以两次部署同一个合约吗?
只要原目标地址仍被占用,同一工厂、盐值和初始化代码就无法成功部署两次。可以重复使用同一个盐值吗?
可以。如果工厂或初始化代码哈希不同,同一个盐值可以生成不同地址。有人可以抢先提交 CREATE2 部署吗?
有人可能复制公开的工厂调用并抢先部署,从而打乱时间安排;如果构造函数行为依赖不断变化的外部数据,这种做法还可能带来危险。CREATE2 能保证跨链代码相同吗?
不能。相同地址需要相同输入,但构造函数环境、初始化、配置和网络状态仍可能造成重要差异。CREATE2 如何在多个网络上生成相同地址?
每个兼容网络上都必须使用相同的工厂地址、盐值和初始化代码哈希。链 ID 是 CREATE2 公式的一部分吗?
基本公式不会直接纳入链 ID,但部署代码或构造函数输入可能包含链特定信息。什么是 CREATE2 工厂?
CREATE2 工厂是一个智能合约,可为用户或其他合约执行确定性部署。什么是单例工厂?
单例工厂是一种 CREATE2 部署合约,旨在多个网络上都部署在已知的同一地址。什么是反事实部署?
反事实部署是指在合约尚未部署前使用或引用可预测的合约地址。CREATE2 如何帮助智能合约钱包?
它使钱包地址能够在钱包合约创建前被计算并接收资金。CREATE2 与 ERC-4337 有什么关系?
ERC-4337 账户工厂通常使用 CREATE2 推导并部署可预测的智能合约账户地址。尚未部署的合约可以签署消息吗?
ERC-6492 提供了一种在部署前验证与某些反事实合约账户关联的签名的方法。CREATE2 是升级机制吗?
不是。可升级性需要单独的代理或治理设计。SELFDESTRUCT 可以清除合约以便 CREATE2 重新部署吗?
当前以太坊规则通常会保留已建立合约的代码和存储,因此长期合约销毁后重新部署的升级模式已不再可行。什么是变形合约?
变形合约是一种旧式设计,旨在通过销毁和确定性重新部署来改变同一地址上的代码。CREATE2 比 CREATE 消耗更多 Gas 吗?
除常规创建、内存、构造函数和代码存储成本外,CREATE2 还会增加初始化代码哈希计算成本。CREATE2 可以生成靓号地址吗?
可以。开发者可以反复尝试不同盐值,直到预测地址中出现所需的视觉模式。CREATE2 靓号地址能提高安全性吗?
不能。易识别的前缀或后缀不能证明代码安全、所有权或真实性。为什么我预测的 CREATE2 地址与部署结果不同?
常见原因包括工厂错误、盐值编码错误、编译器输出不同、链接库不同、构造函数参数错误,或混淆了创建字节码和运行时字节码。如何验证 CREATE2 部署?
根据确切输入重新计算地址,并将已部署的运行时代码、存储、所有者、实现合约和事件与预期值进行比较。结论
通过 CREATE2 实现的确定性部署,能够在兼容以太坊的智能合约尚未上链之前计算其地址。该地址由固定前缀、CREATE2 工厂地址、32 字节盐值和初始化代码哈希推导而来。构造函数参数、编译器输出、链接库和构建设置都可能改变初始化代码,进而改变地址。CREATE2 支持反事实智能账户、状态通道、代币绑定账户、可预测的应用组件,以及多链同地址部署。预测地址可以在部署前接收加密货币,但如果无法创建预期合约,这些资产可能无法访问。要在不同网络上获得相同地址,必须使用相同的工厂、盐值和初始化代码哈希;但这并不会自动保证代码、状态或安全性相同。开发者还必须保护初始化函数、避免依赖环境的构造函数、核实工厂行为,并考虑抢先交易风险。当前以太坊 SELFDESTRUCT 规则不允许通过销毁长期存在的合约并在同一地址重新创建合约来实现通用升级。因此,CREATE2 应被视为一种地址推导和部署工具,而非自动提供安全保障或升级能力的解决方案。仔细核实输入、工厂、字节码和初始化流程后,CREATE2 可以为可预测且易于使用的加密货币应用提供强大基础。您可能也喜欢
反恐融资(CTF)
框架
波动性爆发
热门
目前热门备受市场关注的加密货币
最高成交量
按交易量计算交易量最大的加密货币

