代币智能合约包含一个 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。