账本
所有权是一台状态机,而不是数据库的承诺。每一笔余额都是按顺序应用有效状态转换的结果。
是什么阻止代币凭空产生,或被花费两次?
QLYP 余额不是某个人手动输入的数字。它是这样得来的:从一个固定的起点读取链的历史,按发布的规则,依次应用每一个有效操作。明天在另一台机器上再运行一次,你会得到同一个账本。
单位从不凭空增加
对于每一种资产,下面这个等式在每个区块之后都成立:
守恒
可用 + 已预留 = 已铸造 ≤ 最大供应量
铸造会同时增加供应量和持有者的余额。一次转账从一个余额中扣除,并记入另一个余额。一次报价把单位从可用余额移入预留;出售把它们交付给买家,释放则把它们退回卖家。这些路径都不会创造任何单位。
- 01 / 05
Alice 铸造 1,000
一次铸造会同时增加已发行供应量和 Alice 的可用余额。除此之外,没有任何方式能创建单位:不存在能修改余额的管理员。
- 02 / 05
她向 Bob 报价 400
创建一笔有效的报价会把 400 个单位从她的可用余额移入预留。这些单位仍然存在,也仍计入供应量,但她不能再花费它们。
- 03 / 05
她尝试发送 700
可用的只有 600,因此转账被拒绝。日志记下判定结果,没有任何东西移动:没有部分转账,序列号也不推进。已预留的单位不能花费两次。
- 04 / 05
Bob 买下这笔报价
Bob 的规范购买结算了这笔预留:400 个单位归他。交付是作用于链上历史的一条规则,而不是由服务器决定是否发送。
- 05 / 05
清理不改变任何东西
之后清理已用的提案,也无法再给 Alice 记入一次,因为凭证已经结算。每一步中,可用加已预留都等于已铸造的 1,000。
状态记录了什么
| 部分 | 记录内容 |
|---|---|
| 资产 | 创建者、不可更改的定义,以及迄今已铸造的供应量 |
| 余额 | 每个账户、每种资产的可花费数量 |
| 序列号 | 每个账户下一个会被接受的 QLYP 序列号 |
| 预留 | 每笔报价的那份代币,从创建一直到出售、取消或到期 |
| 代币符号 | 最先认领每个符号的有效代币 |
| 日志 | 每个操作的判定结果(被接受或被拒绝),供查验 |
除了上面的等式,规则还会检查:余额永不为负,每个符号都指向其资产,各部分之间彼此一致。这些检查捕捉的不只是超额花费:同一个账本内部出现的任何不一致,都会被发现。
按顺序重放,仅在有效时提交
每个已最终确认的区块都应用在上一个状态的副本上。被拒绝的操作只会在日志中留下一条判定结果,别无其他影响:不会出现部分转账,序列号也不会前进。只有当整个区块都已应用、且每项检查依然成立时,新状态才会替换旧状态。
格式错误或未经授权的操作会被直接拒绝。链上区块之间的链接断裂、收据不一致或未知的运行时则不同:那是完整性问题,索引器会停止运行,而不是编造一个看似合理的账本。
没有管理员
规则中没有余额编辑器,没有可更改的发行策略,也没有自动跨链桥。任何在被接受的状态转换之外插入余额的实现,计算的都不是 QLYP 账本。