僅供教育參考,不構成投資或資安建議。預測位址、空帳戶、校驗和或工廠標籤,都不能證明部署、程式碼、控制權、所有權或安全性。
直接答案
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)