一项可执行的提案需要什么?
把一句“改手续费”拆成目标、动作、参数和执行前状态,理解提案为何必须可重放。
- 区分提案描述和可执行动作
- 指出提案在执行前为什么不能直接改变协议状态
- 用目标、动作和参数描述一个可审计的变更
- 上一章课程开始
- 本章一项可执行的提案需要什么?
把一句“改手续费”拆成目标、动作、参数和执行前状态,理解提案为何必须可重放。
- 下一章一票代表多少投票权?
先想一想这几个问题
展开答案前,可以先在心里做个判断。与预期不同的内容可以加入复习列表。
Q01提案 99% 赞成,为什么协议仍然可能完全不变?+
它可能没达到法定人数、还没排队、时间锁未结束,或执行调用失败。投票结果只是状态机中的一次授权,不是目标合约已经改变的证明。
治理不是一场把意见数成百分比的投票,而是一条把“有人想改变协议”变成“协议状态真的改变了”的状态链。提案先描述目标和参数,之后才可能被投票、排队和执行。
从一句话到一条状态转换
“把手续费降到 0.20%”听起来像一项决定,但机器需要知道目标合约、动作类型和参数。没有这些字段,节点无法验证每个人是否在投同一件事,也无法重放执行结果。
谁有权改变协议?
跟着一项提案从意图走到可执行状态,再检查投票权、时间锁和金库守恒。
- 01草稿→
- 02投票中→
- 03已通过→
- 04时间锁→
- 05可执行→
- 06已执行
创建提案,冻结一份投票权快照。
先创建一项提案。先读清楚动作,再看票数,治理才不会退化成情绪百分比。
- 02
投票窗口 3 天,法定人数 60%,时间锁 2 天。
- 01
治理模块创建:1,000,000 治理代币、1,000,000 积分金库,提案需要投票和时间锁。
拖动滑块可以回到此前的步骤。从那里继续操作时,后续记录会替换为新的操作序列。
实验室里创建提案后,右侧的手续费仍然是 0.30%。这不是延迟,而是边界:投票记录的是许可,执行动作才会写入协议状态。
展开:这一步如何实现
draft
→ voting(snapshot power)
→ succeeded / defeated
→ queued(timelock)
→ ready
→ execute(target, action, parameters)
链上实现通常把动作编码为目标地址、函数选择器和 calldata。教育模拟把它们压缩成目标、动作和值,但保留同一个原则:每一步都是可验证、可重放的状态转换。
为什么投票通过后协议手续费仍然没有立刻改变?
留下审计问题
看到任何“治理已通过”的新闻时,继续追问:提案的精确 calldata 是什么?现在处于排队还是可执行?执行者是谁?这些问题比标题更接近真实的权限边界。