题目
用户第一次使用聚合器需要先 approve Permit2,再签名。用户随后点击“撤销”,页面把内部 allowance 设为零,却发现之前签出的 permit 仍能重新设置额度。请解释 Permit2 的两种模型,以及如何分别撤销已生效权限和未使用签名。
考察目标
- 分清 token allowance 与 Permit2 内部权限。
- 理解两种 nonce 模型和权限生命周期。
- 设计不会让用户误解的撤销与签名确认流程。
区分原生额度、可复用权限、一次性签名及 nonce 失效,避免撤销后旧签名重新生效。
用户第一次使用聚合器需要先 approve Permit2,再签名。用户随后点击“撤销”,页面把内部 allowance 设为零,却发现之前签出的 permit 仍能重新设置额度。请解释 Permit2 的两种模型,以及如何分别撤销已生效权限和未使用签名。
Permit2 是独立合约,先获得 token 的原生 allowance,才能替用户转移。AllowanceTransfer 保存按 owner/token/spender 的带过期额度,SignatureTransfer 使用一次性签名和无序 nonce。清额度不等于作废旧签名;还要按模型使 nonce 失效,必要时撤销 token 对 Permit2 的原生额度。签名与授权两步都要展示对象、金额和期限。
token 合约保存 owner 到 Permit2 的 allowance。AllowanceTransfer 在内部再保存 token/spender 对应的 amount、expiration 和 nonce;签名 permit 只有被提交执行后才改变链上权限。SignatureTransfer 不保存相同的长期 spender allowance,签名消费一次 nonce 后完成受限转移,但仍依赖 token 的原生授权与余额。非标准 token 的转账行为仍需验证兼容性。
与 ERC-2612 不同,Permit2 不要求 token 自身实现 permit。首次 approve 可以给有限额度,较大额度减少重复操作但增加原生授权暴露面;“免 gas 签名”不能被解释为无风险。
AllowanceTransfer 的 approve 到零或 lockdown 可以清当前额度,但不自动取消仍持有当前 nonce 的未过期 permit。使用 invalidateNonces(token, spender, newNonce) 前移相应 nonce,需要遵守合约的递增及跳跃约束;与其他并发签名协调,避免误失效新签名。
SignatureTransfer 用 invalidateUnorderedNonces(wordPos, mask) 作废位图中的指定 nonce,位位置按 nonce 拆分,不能把它当全局顺序计数器。若还要阻断 Permit2 对 token 的调用,在 token 上执行 approve 到零。以后恢复原生授权时,未失效且未过期的签名仍可能可用,因此只撤销 token allowance 也不等于永久销毁全部签名。
AllowanceTransfer 的 expiration 与签名提交 deadline 是不同时间边界。SignatureTransfer 的实际收款方、请求金额与业务操作需要路由验证;不能因为签名合法就允许任意调用方把资产转给自己。按协议使用 caller 校验、受控路由或 witness 绑定额外意图,不假设所有参数都天然被基础签名覆盖。
页面分别展示 token 授权、内部 spender 权限和未使用签名状态。撤销交易要等回执再重读,用户拒绝、RPC 失败与抢先消费签名的竞态分开提示;切链或换 owner 后放弃旧读数。
发现这道题有问题? 反馈此题