如何撤回治理委托

2026-09-03

如何撤回治理委托

你曾经把投票权委托了出去,现在想把它拿回来。合约里没有一条单独的“撤回”指令,也不需要有——委托只是一个字段,你把它覆盖掉就行。你做不到的,是让它追溯生效。

如何撤回治理委托: 要点一览图

一次委托到底移动了什么

持有治理代币与持有投票权不是一回事。OpenZeppelin 的治理文档写得很明确:承载投票权的是受托人——想参与的持有者,可以把一个自己信任的代表设为受托人,也可以通过自我委托让自己成为受托人。Compound 的文档描述的是同一个动作:代币持有者把投票权委托给自己,或者委托给一个自己选定的地址。

那一刻并没有任何东西离开你的钱包。Compound 把真正被移动的量写得很直白:加进受托人票数里的票数,等于该用户账户里持有的余额。你的代币还在原处,它们旁边被记下了一个去向,而另一个地址上的票数按你的余额涨了上去。

这样设计的理由是成本。OpenZeppelin 指出,代币余额默认并不计入投票权,这让转账更便宜;而这个选择的代价,是它要求用户先把票委托给自己,才能把追踪激活起来。投票权是挂在余额旁边的一套可选机制,而不是余额本身的属性。

所以你要撤回的是一个指向,不是一笔转账。问题不在于怎么把代币拿回来,因为它们从来没有去过别处。问题在于那个指向接下来该写成什么。

撤回是再委托一次,不是删掉一条记录

Compound 的文档写明:投票权从当前区块起向后生效,直到发送方再次委托、或把代币转走为止。把这句话倒过来读,就是撤回的做法:你再委托一次。

这个字段只放得下一个去向,所以没有一个“空档”可以回到,也没有第二条指令要发。写进一个新去向,就在同一个动作里把旧的覆盖掉了。因此,一个给你撤回按钮的界面和一个只给你委托按钮的界面,底下做的是同一件事,而钱包让你签的那条提示,两种情况下写的都是委托。

由此有两个后果。撤回要花一笔交易和一笔手续费,跟当初那次委托一样。撤回也是公开的:新的去向被写在链上,任何人读受托人名册都能看见。

你动手之后,权重去了哪里

撤回一次委托,是在选一个去向,而不同去向留给你的位置并不一样。

你做了什么 原受托人的票数 你自己的投票权
委托给自己 按你的余额减少 等于你的余额
委托给另一个地址 按你的余额减少 仍然是零,现在由别人承载
把代币转走 按你转走的余额减少 随代币一起没了
什么都不做 不变

只有第一行让你成为投票者。第二行是换了个代表,不是退出这套体系。第三行确实有效,但它是个糟糕的路径,因为它为了调一个字段而处置掉了资产。第四行值得单独点出来:一个不再信任受托人、然后什么都不做的持有者,并没有表达异议——他的权重还在被人代为投出。

为什么一个已经开着的提案不会跟着动

撤回给人一种失灵的感觉,正是在这里,而它并没有失灵。OpenZeppelin 的治理扩展会保留历史余额,使投票权取自过去的快照而不是当前余额,它的文档把这称为一项防止重复投票的重要保护。Compound 读取权重的方式是一样的:能提交投票的,是在提案开始时持有投票权的那些地址。

因此,一次撤回在它被打包的那个区块生效,并从那里向后适用。如果一个提案的快照区块已经过去了,这个提案的计票读的就是当时那份名册——即便你已经把委托收了回来,原受托人仍然可以在它上面投出你的权重。

真正管用的规则是一个截止时间,不是一个按钮。要让受托人不能在某个具体提案上投出你的权重,撤回必须记录在那个提案的快照之前。在一次有争议的投票开始之后第二天才发出的撤回,本身没有错、对之后的一切都及时,但对你正在反应的那次投票一文不值。

撤回做不到的事

撤回一次委托,与撤销一次代币授权不是同一个操作,而共用的那个动词把一处真实差别藏了起来。授权是给某个合约的长期许可,让它可以动你的代币。委托不给这种许可:受托人可以投出你的权重,却碰不到你的余额。把钱包上所有授权都清掉,你的委托原封不动;把委托撤回,你的每一条授权也原封不动。

它不会撤销受托人已经做过的事。已经投出的票仍然算数,已经落定的提案仍然落定,你的权重被怎么用过的记录,不会因为这次撤回被改写。

它也不会释放被另一个合约锁着的代币。如果你的余额被锁仓、被质押、或被包进一个投票托管头寸里,附在那个头寸上的委托听的是那个合约的规则,你发给代币合约的撤回够不到它。

链下委托要到别处去撤

不是每一次投票都在链上结算,而一个把投票放在链下进行的 DAO,它的委托名册就不在代币合约里。Snapshot 的文档列出了三条委托路径:一条是受托人注册表,用于那些设置了自定义委托合约的空间;一条是 Snapshot 自己的委托页面,文档把它称作向一个已知地址委托的最快办法;还有一条是直接与合约交互。

这种多路并存,正是你在认为事情办完之前该核的东西。Snapshot 的文档还指出,向某个选定空间的直接委托,优先级高于面向全部空间的委托,所以同一个持有者可以同时在不止一处处于已委托状态,而它们之间有确定的先后。

要核的清单说起来很简单:把你的地址作为委托方出现过的每一份名册列出来,链上的和链下的,逐一清掉。代币合约里的一次撤回,对另一套系统读的那条注册表记录什么都没说。

一个算例

假设你持有 10,000 枚代币,把它们委托给了一个合计承载 250,000 投票权的地址,于是你这份余额占该受托人可投权重的 4%。提案 A 开始了,它的快照区块过去了。然后你把票委托给了自己。

从那个区块起,两句话同时成立。在提案 A 上,原受托人仍然承载 250,000,因为那份计票读的是快照,不是此刻的名册。在下一个提案上,同一个受托人承载 240,000,而你自己承载可以亲手投出的 10,000。

第二句话也正是报表变化的地方。你的权重从一个受托人挪到了一个持有者手上,这会把投票集中度读数往下拉、把参与者人数往上抬;而以已委托权重为分母的投票率,只有在你随后真的投了票时才会变好。把权重拿回来却从不使用,与把它留给一个弃权的受托人,落到的是同一个位置。

小结

委托是一个字段、里面放着一个去向,所以撤回它意味着写进一个新去向,而不是删掉一个旧的。委托给自己,你就成了投票者;委托给别处,你只是换了代表;什么都不做,你的权重就继续在没有你的情况下被投出去。

真正绊住人的是时间。投票权读自过去的快照,所以一次撤回约束的是快照晚于它的每一个提案,而不约束任何一个已经开着的提案。在你在意的那次投票之前去核受托人名册,而不是之后;并且把你的组织实际用到的每一份名册都核一遍。想系统学习更多加密基础知识,可以关注 Bitbase(币贝)学院的后续内容。

相关阅读

币贝上与本主题相关的其他文章:

- 代币迁移为什么要你在钱包里授权

- 代币迁移已完成,但新代币没有出现在钱包里

- 如何计算代币项目的金库续航

- NVT 比率详解:网络价值与链上交易额

- 空投骗局与领取前安全核对清单

风险披露:本文为 Bitbase(币贝)学院的科普内容,仅供教育与信息参考,不构成任何投资、交易、税务或财务建议。加密资产波动剧烈,请自行评估风险。本文撰写于 2026 年 9 月,请以官方最新信息为准。

参考资料

[1] OpenZeppelin Contracts 文档 5.x,Governance docs.openzeppelin.com

[2] OpenZeppelin Contracts 文档 5.x,API,ERC20(ERC20Votes) docs.openzeppelin.com

[3] Compound 文档,Governance(Compound v2) docs.compound.finance

[4] Snapshot 文档,用户指南,Delegation docs.snapshot.box

相关推荐

更多推荐