为什么“清授权”常常清不干净
很多人撤销过一次授权就以为安全了,但钱包能给你的资产造成的授权不止一种。撤销工具或钱包的授权管理页通常只显示链上最常见的代币额度授权,另外两类很容易被漏掉:一类是对整批 NFT 的批量操作授权,另一类是根本不落链、只存在于你签过名的离线授权。盘点授权要一类一类查,而不是一把梭撤销。
第一类:代币花费额度(allowance)
ERC-20 代币合约里每个地址都有一个可花费额度字段,你调用过 approve 之后,被授权合约就有权在你下次操作时直接转走不超过额度的代币。它记录在代币合约的状态里,所以可以在代币合约的 Read Contract 里按“持有人地址 + 被授权地址”查询 allowance 字段直接核对;批量查各协议授权,可以照链上授权与取消授权:先查清单、再按需撤销的安全习惯的清单方法做。撤销就是把额度改成零,确认生效以链上交易成功为准。
第二类:NFT 的批量授权(setApprovalForAll)
ERC-721 和 ERC-1155 的授权模型和代币不同:setApprovalForAll 是对某个运营方开放你名下所有该系列藏品(或该系列某类代币)的操作权,单笔级别的 approve 只覆盖一件。市场挂单、铸造平台经常申请前者。查法是在对应 NFT 合约上逐个查询 setApprovalForAll(你的地址, 被授权方) 的布尔结果,或在授权管理工具里切到 NFT 类别核对——只看代币额度时,这条最容易被漏。
第三类:没上链的签名授权(Permit 类)
EIP-2612 的 permit 和 Permit2 这类离线授权是签名而不是交易:你签了名,额度不会立刻改变,但签名可以被任何人代为提交而生效。它在链上没有对应记录,撤销工具自然列不出来。防线只能是签名前的习惯:核对签名请求里的合约域名、到期时间(deadline)、额度上限和 nonce;看到“离线签名”弹窗却显示不了内容时,宁可不签。EIP-712 的结构化签名要逐项核对字段,别只看弹窗标题。
一个常见的疑问是:为什么钱包不直接告诉我这三类授权的完整清单?因为链上只能索引公开事件——ERC-20 的 Approval 事件、ERC-721 的 SetApprovalForAll 事件都能被扫描,但 Permit 类签名的内容在提交之前根本没有上链;而且很多代币的 allowance 变更不总是发满事件,工具只能靠近似方法还原。也就是说,工具给的清单是“证据的下界”而不是“全部真相”,越重要的资产越值得回到合约本身直查一次。
撤销时的三个操作细节
第一,撤销本身是一笔链上交易,要付 Gas,也要等确认。判断“撤销生效”的唯一依据是撤销交易在浏览器里状态为成功,而不是工具页面转圈结束或提示“已提交”。批量撤销工具会把多笔撤销打包或排队,中途失败的条目需要单独补做。
第二,把额度改零不等于解除所有关系。approve 归零只影响该代币、该被授权方的额度;同一协议如果在别的代币上也有额度,需要各自处理。NFT 的批量授权撤销要调用 setApprovalForAll 并把参数设为 false,单件 approve 归零不会影响批量授权,反之亦然。
第三,优先按“最小权限”重建。与其保留一个巨大的无限额度长期用某个协议,不如在下次需要时重新授权刚好够用的数量。频繁交互的协议可以放宽这一点,但对只用过一次的协议,长期保留高额授权没有任何好处。硬件钱包签名前的显示核对仍是最后一道闸,任何撤销工具都替代不了它。
盘点的合理节奏
不必天天查。可执行的做法是:每次与陌生协议完成一次交互后顺手核对本次申请了哪类授权;每季度用授权管理页加代币合约直查做一次全量对账,把不再使用的协议额度清零。遇到协议被曝漏洞或合约被攻击的公告时,先做撤销再做研究,不要赌它一定没事。
授权涉及资产控制权,请按本文方法逐项核实后再操作;本文不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。