Token 智能合約包含一個 approve() 函數,允許另一個地址代表代幣持有者使用代幣。這是當今智能合約生態系統的核心功能;若沒有它,許多 DeFi 應用程式將無法實現。例如,在 Uniswap 等去中心化交易所交易代幣,就需要在進行兌換前先完成代幣授權。
然而,代幣授權伴隨著重大風險。授予智能合約使用代幣的權限,意味著它可以在任何時候動用這些代幣。若合約遭到駭客攻擊或含有惡意程式碼,攻擊者便可利用這些授權竊取代幣。
現有解決方案如 Revoke.cash 可追蹤錢包授權,並支援按需撤銷。然而,這些方案依賴手動操作,必須在漏洞被利用之前或期間執行,實際上並不總是可行。Revoke.delegate——一個在 EthGlobal '24 黑客松中開發的專案,透過在漏洞發生時自動撤銷授權,提供了更有效率的解決方案,無需持續監控或手動操作。以下是該團隊的實現方式。
挑戰:在保護隱私與所有權的前提下委託錢包權限
使用者必須將特定的錢包權限委託給 Revoke.delegate,才能在漏洞發生時啟用自動代幣授權撤銷功能。在此情境下,委託是指一個智能合約帳戶(委託人)在明確規定的規則與條件下,授予另一個智能合約或外部擁有帳戶(受託人)執行特定操作的權限。
此流程讓 Revoke.delegate 能夠安全地識別受影響的代幣地址、驗證預定條件,並透過呼叫 approve() 或 setApprovalForAll() 函數將授權額度設為零,從而撤銷授權。
主要挑戰在於維護隱私與自我所有權原則,確保使用者不必分享私鑰,也不會因授予模糊的權限而失去對錢包的控制。團隊也將與現有錢包生態系統的相容性列為優先考量,以促進無縫採用。
解決方案:透過 Delegation Toolkit(DTK)安全地委託與管理錢包權限
整合 Delegation Toolkit(DTK)使 Revoke.delegate 能夠讓使用者在保持完整自我所有權的同時委託錢包權限。每當有漏洞被回報時,Revoke.delegate 會從 DTK 管理的 Delegation Storage 中安全地取得使用者的委託資訊,並用於撤銷受影響錢包的代幣授權。以下是整個流程的概覽:
使用者連接錢包以查看所有現有的代幣授權。
使用者選擇委託錢包權限。在背後,系統會呼叫 createRootDelegation() 函數,將 Revoke.delegate 智能合約指定為受託人。
使用 addCaveats() 函數定義所需權限,指定 approve() 方法,例如 .addCaveat("allowedMethods", ["approve(address,uint256)"]).build()。
使用者簽署新的委託,該委託隨後被安全地儲存在 DKT 管理的 Delegation Storage 中。
一旦發生漏洞,Revoke.delegate 會取得所有已儲存的委託、驗證條件,並透過呼叫 approve() 或 setApprovalForAll() 函數將授權額度設為零,為受影響的錢包撤銷代幣授權——全程無需使用者操作。
探索文件,深入了解 Delegation Toolkit 如何簡化這些流程。
「Delegation Toolkit 幫助我們確保使用者能夠委託錢包權限,同時不必放棄所有權。」 ——Ayush 與 Aashish,Revoke.delegate 開發者暨 EthGlobal '24 黑客松得獎者
透過運用 DTK,Revoke.delegate 團隊成功實現了代幣授權撤銷的自動化,即使在使用者離線或不知情的情況下也能運作。此外,由於該工具包原生支援 ERC-7579,團隊開發出的解決方案與生態系統中的主流錢包相容,包括 Safe、Kernel 和 Biconomy Nexus。