返回博客
Solana

如何撤销 Solana 上的代币权限

S
Sol Slugs Team
Sol Incinerator

Rent 更新已于 2026年9月3日核查: 本旧文章中每个账户的固定 Rent 或到账金额,都是基于旧版每字节 6,960 lamports 设置的历史示例,并非当前报价。账户大小、当前启用的 Rent 阶段、此前的提取、操作费用和网络成本都会改变结果。请阅读 Solana 2026 Rent 下调,并以钱包的实时交易预览为准。

在以太坊上,撤销权限已是老生常谈,无限额的 ERC-20 授权已经掏空了许多钱包。Solana 也有类似的机制,但运作方式不同,因此值得了解它能对你做什么,不能做什么。

如何撤销 Solana 上的代币权限?

连接到撤销工具。它会扫描你拥有的每个代币账户,显示你已授权哪些地址从中转出代币,并一次性批量清除这些授权。此操作无服务费——撤销授权不会回收任何租金,因此你只需支付网络费。在命令行(CLI)中,命令为 spl-token revoke <TOKEN_ACCOUNT_ADDRESS>

Solana 委托方究竟是什么

当你在 Solana 上批准某项操作时,你实际上是在一个特定的代币账户上设置一个委托方(delegate)。Approve 指令会在该账户上记录两项内容:委托方的地址和委托额度。

之后,委托方无需再次征求你的同意,即可从该账户转移或销毁不超过该额度的代币。它无法触及你的其他代币账户,无法超出委托额度,也无法转移你的 SOL。

这是一项真正的权限,值得认真对待——对你的代币账户拥有额度的委托方可以转移这些代币。但由于三个结构性原因,其破坏范围明显小于以太坊的同类机制。

为什么 Solana 授权的范围比以太坊授权更窄

以太坊授权Solana 委托方
适用范围你持有的该合约下的所有代币单个代币账户
额度通常无上限由你设置的固定上限
可同时存在多个是,按支出方累积否——每个账户只能有一个委托方
清除方式明确的撤销交易撤销授权,或关闭账户

第三行最为重要。在以太坊上,授权会不断堆积:你可以针对同一种代币向十几个合约授予额度,每项授权都会悄然持续存在,直到被撤销。多年的 DeFi 使用会留下大量被遗忘的无上限授权,这正是撤销工具在以太坊变得不可或缺的原因。

在 Solana 上,每个代币账户最多只能有一个委托方。设置新的委托方会覆盖旧的委托方。这里没有不断累积的列表——一个代币账户现在要么只有一个委托方,要么没有。

这就是为什么 Solana 从未像以太坊那样形成撤销工具文化。风险敞口确实存在,但范围有限,而且在正常使用钱包的过程中通常会自行清除。

委托权限从何而来

你账户上的大多数委托方都没有恶意——它们是 Solana 正常功能的运作方式:

  • NFT 市场挂单。 上架 NFT 通常会将其委托给市场程序,以便在买家出现时执行出售。这也是为什么已上架的 NFT 必须先下架才能销毁:你的钱包不再拥有对它的单方面控制权。
  • 质押和金库程序。 向协议存入资产通常使用委托,而不是转移托管权。
  • 可编程 NFT。 作为强制执行版税的一部分,pNFT 会在设置委托权限的情况下保持冻结状态。
  • 恶意授权。 真正需要担心的是:钓鱼网站向你展示一笔看似领取的交易,而你实际签署的是一条 Approve 指令,将代币的控制权交给了委托方。

撤销授权无法清除的一种权限

以上内容讨论的都是账户级委托方——这是你自己代币账户上的一个字段,由于账户归你所有,因此你可以将其清除。

Token-2022 引入了一种独立且更强大的权限:永久委托方(permanent delegate),它设置在铸币账户(mint)上,而不是你的账户上。设有永久委托方的铸币账户会授予该地址转移和销毁每个持有该代币的账户的权限,且没有额度上限,持有者对此无能为力。这是代币本身的属性,并非你授予的权限,因此 Revoke 指令无法触及它,任何工具也无法做到。

一些正规代币会有意使用这种机制——例如需要保留追回途径的受监管稳定币。但这意味着,任何 Solana 撤销工具(包括我们的工具)的有效范围仅限于你在自己账户上授予的权限

如果某代币的铸币账户设有永久委托方,消除这种风险敞口的唯一方法就是不再持有该代币。在认定干净的撤销意味着无人能转移特定余额之前,请先在区块浏览器上检查该铸币账户。

如何检查哪些账户设有委托方

钱包不会显示这些信息。Phantom 和 Solflare 只显示余额,而不显示每个代币账户上的委托方字段,因此你两年前授予的授权在你每天使用的界面中是不可见的。

有三种方法可以查看:

  • 撤销工具 连接你的钱包,它会扫描 SPL Token 和 Token-2022 程序下的所有代币账户,列出每个委托方、其适用的铸币账户以及授权额度。扫描是只读的——无需签名,无需为了查看而批准任何操作。
  • 区块浏览器。 查询你的钱包地址,打开各个代币账户,并检查委托方字段。如果设置了委托方,该字段就会显示。检查一个账户还行,检查一百个账户就太繁琐了。
  • spl-token CLI。 spl-token account-info <TOKEN_ACCOUNT_ADDRESS> 会报告委托方及委托额度。

如果委托方是你认识的市场,并且 NFT 当前已上架,这是符合预期的——将其下架,委托权限就会清除。

留意授权额度一栏。授权通常会将其设置为可能的最大值,而不是实际所需的数量,工具会将其显示为无限(Unlimited)。正规的上架通常只会委托一个 NFT;如果你大量持有的某种代币设有无限额度授权,就值得仔细检查。

如何撤销授权

通过工具,在 sol-incinerator.com/revoke 连接钱包,查看列表并签名。所有选中项会被尽可能打包到最少数量的交易中,因此一个拥有三十个过期委托方的钱包不需要签名三十次。

无服务费。撤销授权不会释放租金,因此没有任何费用可扣除——你只需支付网络交易费,别无其他。

通过 CLI,针对特定的代币账户:

spl-token revoke <TOKEN_ACCOUNT_ADDRESS>

这会调用 SPL Token 程序的 Revoke 指令,该指令只需要代币账户以及你作为所有者的签名。它会直接清除委托方字段。它不会部分失败,也不会影响你的余额。

通过钱包 UI,常规途径是间接的:取消或下架最初创建该委托权限的项目。从你上架 NFT 的市场将其下架,会作为取消指令的一部分移除该市场的委托权限。

撤销市场对已上架 NFT 的委托权限,实际上等同于将其下架——市场将无法再完成出售。这是正确的行为,但如果你打算保留上架状态,请不要动它的委托权限。

为什么无法撤销已冻结账户的授权?

因为 Solana 不允许。SPL Token 程序会直接拒绝对已冻结代币账户的撤销操作,并返回 AccountFrozen 错误——冻结不仅会阻止转账,还会阻止权限变更。

这一点比听起来更重要,因为冻结和委托往往形影不离。作为强制执行版税的一部分,可编程 NFT 会在设置委托方的情况下保持冻结,许多质押程序也会冻结它们持有的资产。因此,你最有可能发现的委托权限,往往正是那些无法直接清除的权限。

该工具会将这些账户排除在列表之外,因为在实际情况中,一个已冻结且设有委托方的账户通常是在按预期运作——执行版税的 pNFT,或你故意质押的资产——而不是你需要采取行动的对象。

如果你确实想清除其中一个,该账户必须先解冻。解除质押、下架,或完成任何导致其冻结的操作;一旦解冻,委托权限即可正常撤销。

销毁不是变通方法。已冻结账户拒绝销毁的原因与拒绝撤销相同——冻结会阻止该操作,而不仅仅是转账——因此,当资产仍在其中时,你无法通过销毁来摆脱已冻结的委托权限。只有冻结权限(freeze authority)持有者才能将其解冻。

该工具不会直接尝试撤销还有一个实际原因:撤销操作会被尽可能打包到最少数量的交易中,因此一个已冻结账户会导致共享同一笔交易的其他所有委托权限撤销失败。将其排除在外才能让其余操作成功。

完整做法:关闭账户

这里是经常被忽略的部分。委托方是存储在代币账户本身的一个字段。 没有账户,就没有委托方。

因此,如果相关代币本来就是你不想要的——垃圾代币、死掉的模因币、诱导你签署交易的诈骗空投——那么销毁它并关闭其账户,就会作为副作用永久移除委托方。与其说你是在撤销权限,不如说你是在删除该权限适用的对象。而且与单纯的撤销不同,关闭账户会退还其持有的 ~0.00204 SOL 租金押金。

这使得清理成为对任何你无意保留的代币更彻底的应对方式:

操作清除委托方保留代币退还 SOL
撤销授权
销毁并关闭账户0.002 SOL

当你想保留代币时,请撤销授权。当你不想保留时,请销毁并关闭账户。

如果你认为自己签署了恶意交易,仅靠撤销授权是不够的。委托权限只是攻击者可能获取的多种权限之一,如果你的助记词已经泄露,任何链上操作都无济于事。请先将贵重资产转移到一个全新的钱包,然后再处理受损的钱包。

实际的威胁模型

对大多数人来说,诚实的总结是:如果你签署了令你后悔的交易,请检查你的委托权限;将你不再希望上架的任何资产下架;并清理恶意授权往往会依附的垃圾代币。

Solana 的设计意味着,你不会像以太坊钱包那样背负多年累积的无上限授权。你可能确实背负的是几百个废弃的代币账户,每个账户都持有一笔可退还的押金——这可是真金白银,而且只需大约一分钟就能找回。

撤销委托权限

撤销委托权限

扫描钱包中你已批准的账户级委托权限,并将其清除。无服务费——你只需支付网络费。

立即试用

相关阅读

常见问题

如何撤销 Solana 上的代币权限?

对已设置委托方的代币账户使用 SPL Token 程序的 Revoke 指令。该指令只需要代币账户以及你作为所有者的签名。在命令行中,输入 spl-token revoke,后接代币账户地址。

Solana 代币账户上的委托方是什么?

委托方是你授权的地址,可从某一个特定代币账户中转移或销毁不超过指定额度的代币。市场使用委托权限来上架 NFT,质押程序则使用它处理存入操作。每个代币账户同时只能有一个委托方。

Solana 授权的风险和以太坊授权一样高吗?

它们的范围更窄。Solana 委托权限仅限于单个代币账户,并设有固定额度上限,批准新的委托方会替换旧的委托方,而不是叠加。以太坊授权则是针对每个代币合约,通常无上限,并且会无限期累积。

关闭代币账户会移除其委托方吗?

是的,完全移除。委托方是存储在代币账户本身的一个字段,因此当账户关闭时,委托方也会随之不复存在。销毁不需要的代币并关闭其账户,会作为副作用移除任何委托权限。

如何确认代币账户是否设置了委托方?

在区块浏览器上查询你的地址并检查各个代币账户,如果设置了委托方,就会显示委托方字段。spl-token CLI 也会报告它,任何显示原始账户数据的钱包也会显示相同的字段。

为什么我无法撤销已冻结代币账户的授权?

SPL Token 程序会拒绝对已冻结账户的撤销操作并返回 AccountFrozen 错误,因为冻结不仅会阻止转账,还会阻止权限变更。可编程 NFT 和已质押资产通常处于冻结状态。必须先解冻账户才能清除其委托方,而销毁并不能绕过这一限制,因为已冻结账户同样会拒绝销毁操作。

撤销操作能移除 Token-2022 永久委托方吗?

不能。永久委托方设置在铸币账户上,而不是你的代币账户上,它授予对每个持有该代币的账户的转移和销毁权限。这是代币本身的属性,因此任何撤销指令都无法清除它。消除这种风险敞口的唯一方法是不再持有该代币。

如何撤销 Solana 上的代币权限 | Sol Incinerator