0415 分钟
AUTHORITY · MULTISIG · IRREVERSIBLE

谁可以改变代币供应?

把单签增发权限移交给多签,再测试错误的执行者为什么会被拒绝,以及撤销为何不可逆。

本章目标学完后,你应该能:
  • 解释供应上限和批准权限的区别
  • 观察单签到多签的权限移交
  • 判断撤销权限后哪些动作仍然可以改变余额
章节位置第 4 / 4 章
  1. 上一章增发会怎样改变持有人占比?
  2. 本章谁可以改变代币供应?

    把单签增发权限移交给多签,再测试错误的执行者为什么会被拒绝,以及撤销为何不可逆。

  3. 下一章自由实验室
阅读前

先想一想这几个问题

展开答案前,可以先在心里做个判断。与预期不同的内容可以加入复习列表。

Q01项目方宣布放弃所有权,就代表再也没人能改供应吗?
简要回答

不一定。增发者、代理升级、暂停者和多签可能是独立权限。判断安全要枚举每条能改变状态的调用路径,而不是只看一个 owner 标签。

和原先判断相比:

“供应上限固定”只回答数学上的最大值;它没有回答谁能修改余额、谁能改变参数、谁能批准下一次增发。权限移交和撤销,才是代币发行器真正的控制面。

从单签走向多签

SIMULATION ACTIVE虚拟资产 · LAB
ASSET 001 · SUPPLY & AUTHORITY

LAB / 虚拟代币

每个动作只改变一张公开状态表;你可以逐步追问,谁能改变供应、谁能领取、谁承担稀释。

增发权限创建者单签创建者仍可铸造
总供应1,000,000上限 1,200,000
流通供应600,00060.0% 已流通
锁仓供应400,000可领取 0
还能增发200,000供应上限空间
AUTHORITY · MULTISIG · IRREVERSIBLE

供应规则的关键不只是上限,还有批准者

把增发权限从创建者单签移交给 2/3 多签后,单个创建者的 mint 会被拒绝;只有模拟的多签执行者才能继续改变供应。撤销则不可逆。

当前批准者 创建者单签增发空间 200,000 LAB状态 守恒且可重放
分配与锁仓发行日
创建者400,000 LAB
可用 100,000 · 锁仓 300,000
社区400,000 LAB
可用 300,000 · 锁仓 100,000
国库200,000 LAB
可用 200,000 · 锁仓 0
学习者0 LAB
可用 0 · 锁仓 0
可流通锁仓

锁仓仍计入总供应,但还不能转账。颜色只是辅助,数字和标签才是状态。

观察提示

先看总供应被拆成了哪些部分:可流通余额、锁仓余额,以及创建者仍然拥有的增发权限。

供应事件2 EVENTS
  1. 02

    初始分配写入状态:创建者、社区、国库余额可用;另外 400,000 LAB 处于锁仓。

  2. 01

    LAB 创建:总供应 1,000,000,供应上限 1,200,000,创建者保留增发权限。

操作记录实验时间轴
1 个状态快照

拖动滑块可以回到此前的步骤。从那里继续操作时,后续记录会替换为新的操作序列。

初始状态
查看实验记录 →

实验室先把增发权限交给创建者单签。移交给 2/3 多签后,创建者自己的 mint 请求会失败,只有带有 actor: multisig 的模拟执行才会通过。再撤销权限,供应只能来自已有余额、锁仓领取或转账,之后不能重新恢复。

权限状态也是公开状态

一个审计者应该能从状态和事件回答:当前批准者是谁?权限何时移交?移交前后的 mint 是否被正确拒绝?撤销之后是否仍能通过隐藏入口增发?如果这些问题只能靠前端按钮颜色判断,权限设计就没有真正被验证。

展开:这一步如何实现
require(authority == msg.senderRole)
require(totalSupply + amount <= maxSupply)

transferAuthority(multisig)
revokeAuthority() // terminal state

生产系统还会使用时间锁、提案哈希、执行延迟和升级管理员。这里把复杂治理压缩成一条可重放的权限状态转换,帮助你先分清“谁能执行”和“执行内容是否合理”是两个问题。

理解检查

把增发权限移交给 2/3 多签后,创建者单独提交 mint 应该发生什么?

用四个问题审计发行器

  1. 上限、当前总供应和流通供应是否被分别记录?
  2. mint、transfer、claim、burn 是否各自留下了不同事件?
  3. 权限移交和撤销是否能被确定性重放?
  4. 多签降低的是密钥风险,还是也替你解决了经济决策?
本章小结完成练习和理解检查后,可以保存本章