僅供教育用途,不構成投資建議。投資可能導致損失。
直接答案
Permit2 結合兩套不同的授權系統。AllowanceTransfer 儲存可重複使用的所有者-代幣-支出者額度,包括金額、到期時間和有序交易序號。SignatureTransfer 使用無序位元圖交易序號,耗用一次性簽章上限,不會建立持續存在的下游額度。兩者仍依賴 ERC-20 代幣從所有者至 Permit2 的額度。
無燃料費簽章仍可能在支出者或中繼者支付執行費用時轉移資產。必須查核正確的鏈、已部署 Permit2 程式碼、EIP-712 網域、模組、代幣、支出者、簽章上限、收款呼叫資料、交易序號和時限。合法的 Permit2 合約並不會讓惡意的支出者、收款方、路由器或見證資料變得安全。
0 / 5
0 項已核查; 5 項仍未解決
完成核查不代表資產、交易或系統已經安全。
運作機制
- 鎖定
chainId、網路、Permit2verifyingContract、已部署的執行階段程式碼、代幣位址及小數位、所有者錢包類型和預期應用。應使用官方部署記錄;熟悉的位址或標籤並不足夠。 - 讀取上游 ERC-20 所有者至 Permit2 的額度和餘額。識別有限或無限核准以及代幣特有的轉帳行為;這套帳本不會因 Permit2 簽章或已儲存下游額度到期而消失。
- 識別正確路徑和已簽署的主要類型:AllowanceTransfer 的
PermitSingle或PermitBatch,或 SignatureTransfer 的PermitTransferFrom及其批次和見證資料變體。不得將transferFrom當成簽章類型。 - 解碼 EIP-712 網域和每筆訊息。對 AllowanceTransfer,查核代幣、
uint160 amount、expiration、有序交易序號、支出者和sigDeadline。對 SignatureTransfer,查核獲准代幣及金額、無序交易序號、截止時間,以及從呼叫者情境綁定的支出者。 - 分別解碼執行呼叫資料。在基本 SignatureTransfer 中,
SignatureTransferDetails.to和requestedAmount是執行參數,而不是基本簽章許可中的欄位;請求金額只須不超過簽章上限。查核每個批次索引,以及任何正確的見證雜湊和類型字串。 - 查詢目前有序額度交易序號,或無序位元圖的字與位元,再模擬正確的呼叫者、呼叫資料、鏈和狀態。核對收款方、路由器操作、代幣特性、餘額及兩套額度帳本;模擬結果可能隨狀態、排序或重組而改變。
- 盡量縮小金額和有效期間。發現可疑情況時,保存類型化資料,並透過可信路徑送出正確的上游核准撤銷、下游額度撤銷或交易序號失效操作;應將其視為記憶體池競態,等待確認後再核對轉帳、餘額、額度和位元圖位元。
AllowanceTransfer 的 sigDeadline 限制簽章許可建立或更新已儲存權限的最晚時間;expiration 限制該權限可被使用的期間。SignatureTransfer 的截止時間限制一次性執行。EIP-712 提供類型化雜湊和網域分隔,而不提供重放保護或意圖安全;Permit2 的交易序號和截止時間規則才劃定這些邊界。
對合約錢包而言,ERC-1271 的有效性取決於錢包目前的 isValidSignature 政策、模組、門檻和程式碼。錢包標籤、硬體錢包被截斷的畫面顯示和成功的模擬只是證據輸入,並非保證。中斷前端連線不會撤銷任何核准或簽章。
範例
- 兩套額度帳本。 代幣對 Permit2 的有限額度初始為
1,000 USDC;一個PermitSingle為支出者 S 儲存600 USDC。S 轉移225 USDC後,已儲存金額為600 - 225 = 375 USDC,而標準有限上游代幣額度變為1,000 - 225 = 775 USDC。讓 375 到期或將其撤銷,並不會自動清除 775;非標準代幣可能有所不同。 - 一次性收款方和金額。 SignatureTransfer 簽署的上限為
250 USDC;呼叫資料請求向商家轉移180 USDC。在餘額和上游額度充足時,可以執行 180 的轉移。交易序號隨後被耗用,因此未使用的70 USDC不可重複使用。如果呼叫資料將攻擊者指定為收款方,基本許可本身無法阻止已綁定支出者進行這種重新導向。 - 無序交易序號位元圖。 對交易序號
513,wordPos = 513 >> 8 = 2、bitPos = 513 & 255 = 1,且mask = 1 << 1 = 2。執行會設定第 2 個字的第 1 位元;重放 513 將失敗,而位於第 0 位元的交易序號512保持獨立。 - 撤銷競態。 已儲存額度為
400 USDC。所有者廣播歸零撤銷,但一筆300 USDC轉帳先執行,剩餘100 USDC;之後的撤銷再將餘額設為0。最終額度為零並不會撤銷已實現的300 USDC損失,因此必須核對交易排序和餘額。
風險
- 鏈 ID、部署或執行階段程式碼錯誤
- 假冒或非預期的驗證合約
- 混淆 AllowanceTransfer 與 SignatureTransfer
- 惡意或錯誤的支出者和呼叫者
- 透過執行呼叫資料選擇收款方
- 請求金額接近簽章上限
- 代幣位址、符號、小數位或原始單位錯誤
- 持續或無限的上游 ERC-20 核准
- 下游金額或到期時間過大
- 混淆截止時間、簽章截止時間與額度到期時間
- 有序交易序號陳舊或發生競態
- 重複使用位元圖位元或失效遮罩範圍過大
- 見證雜湊或正確類型字串不符
- 批次項目被隱藏、重複或索引錯誤
- 前端顯示或呼叫資料與意圖不同
- 撤銷在記憶體池或 MEV 競態中失敗
- ERC-1271 模組、簽署者、門檻或升級發生變化
- 收費轉帳、變基、暫停、封鎖或帶回呼的代幣
- 模擬狀態漂移、失敗或發生重組
- 將硬體錢包確認或中斷連線誤認為安全
常見誤解
- 沒有燃料費提示的簽章無法轉移代幣。 其他參與者可以支付執行燃料費。
- 官方 Permit2 位址能證明支出者和收款方安全。 Permit2 也可能忠實執行惡意權限。
- SignatureTransfer 和 AllowanceTransfer 建立相同的持續權限。 前者僅使用一次;後者儲存可重複使用的額度。
- 中斷連線或撤銷一層會取消所有路徑和待執行簽章。 上游、下游和交易序號狀態彼此獨立,競態仍然存在。
- EIP-712、硬體錢包或成功模擬能證明意圖和最終性。 它們改善可見性或測試,卻不能取代欄位、呼叫資料和已確認狀態的查核。
相關主題
來源
- Overview - Uniswap Developers(查閱日期:2026-08-13)
- Allowance Transfer - Uniswap Developers(查閱日期:2026-08-13)
- Signature Transfer - Uniswap Developers(查閱日期:2026-08-13)
- Deployments - Uniswap Developers(查閱日期:2026-08-13)
- PermitHash.sol - Uniswap Permit2(查閱日期:2026-08-13)
- EIP-712: Typed structured data hashing and signing - Ethereum Improvement Proposals(查閱日期:2026-08-13)
- ERC-1271: Standard Signature Validation Method for Contracts - Ethereum Improvement Proposals(查閱日期:2026-08-13)
- ERC-20: Token Standard - Ethereum Improvement Proposals(查閱日期:2026-08-13)