跳到正文

如何驗證 CREATE2 合約位址

CREATE2 依部署者、salt 與初始化程式碼雜湊預測位址,但驗證仍需鏈特定的工廠、位元碼、部署、代理與所有權證據。

更新於

僅供教育參考,不構成投資或資安建議。預測位址、空帳戶、校驗和或工廠標籤,都不能證明部署、程式碼、控制權、所有權或安全性。

直接答案

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 成功回應或預測校驗和不能取代回執與狀態驗證。跨鏈複製的位址可能有不同程式碼、所有者、儲存與資產。

依下列流程執行:

  1. 固定鏈、分叉、RPC 與區塊;工廠或部署者位址與執行時期雜湊;salt 位元組;初始化程式碼、建構函式參數、編譯器與連結程式庫。
  2. 計算初始化程式碼雜湊和精確 CREATE2 前像,檢查寬度、填充、0xff、最後 20 位元組和校驗和。
  3. 解碼工廠 calldata 與 value;比較預測位址、所有者、初始化函式、代理目標和預期權限。
  4. 在正確鏈上核驗回執、狀態、事件、eth_getCode、nonce、餘額和儲存;記錄未部署與碰撞狀態。
  5. 檢查工廠、代理、實作、管理員、初始化函式、升級與單例工廠假設,包括 ERC-1167 目標。
  6. 測試建構函式失敗、nonce/程式碼碰撞、對分叉敏感的重新部署、巢狀工廠以及鏈網域或重播假設。
  7. 在注資或簽署前核對人類可讀金額與原始金額;部署後監控程式碼雜湊、所有者、實作、角色、事件和最終性。

範例

  • 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 雜湊執行時期位元碼。」 它雜湊的是包含建構函式參數的建立程式碼。
  • 「兩條鏈上的相同位址代表程式碼和控制權相同。」 必須分別核驗鏈狀態和部署。
  • 「成功預測證明部署和安全。」 只有回執、程式碼、狀態、權限和最終性才能確定實際存在的物件。

相關主題

來源

導覽

搜尋知識庫...