State 转换
共识 State 是由 UTXO 记录组成的稀疏 Merkle 向量。当前槽位域包含 2^log_slots 个叶子,其中 log_slots 取值 24 至 32。每个区块完成后,区块头承诺 State 根、已占用记录数与分配计数器。
State 叶子
叶子要么是规范空值,要么包含:
{amount: u64, creation_id: u64, owner: 32 bytes}
承诺计算把金额与创建标识压入一个 GF(2^128) 域元素通道,再与所有者一起在 UTXO 叶节点域下哈希。
转换顺序
共识从区块推导唯一有序转换:
- 验证并分配主要奖励;
- 到期时验证并分配计划中的开发付款;
- 按区块顺序处理用户
PagedSpend组; - 清除所有已消费输入;
- 分配新的创建标识并安装输出;
- 更新分段根、已占用记录数与分配计数器;
- 重建全局 State 根。
虽然逻辑交易的物理页是连续的区块记录,其原子性仍然完整保留。
输入规则
每个有效用户输入必须:
- 位于父 State 域内;
- 标识当前被占用的槽;
- 匹配所声明的金额与共同所有者;
- 匹配当前
creation_id; - 在区块中只出现一次;
- 由交易组的钱包证明授权。
奖励与开发记录没有输入,按系统计划验证。
输出规则
每个有效用户输出必须:
- 位于子 State 域内;
- 在计入区块内更早动作后,目标槽仍为空;
- 金额非零;
- 在区块中只出现一次。
分配器选择新的单调 creation_id。输出槽提示只用于辅助构造;区块仍须针对精确的父 State 证明这些槽为空。
价值守恒
在每个逻辑用户组中:
sum(inputs) = sum(outputs) + fee
整个区块可创建的价值限于协议补贴。主要奖励上限包含矿工份额和可领取交易手续费,不包含已销毁的 State 增长费。
所有聚合金额计算都使用足够宽的类型,避免有效 u64 字段之和静默饱和。
分段
叶子按每个 State 分段 2^16 个槽位分组。一个区块最多触及 256 个不同分段。这是共识可用性限制,节点在加载分段数据前即进行检查。
空段使用规范空子树根,不需要原始 MDBX 列。最后一个未花费 UTXO 被花费后,该段会被删除。
扩展规则
对于父高度为 H 的候选子区块,使用结束于高度 H - 18、已经具备硬最终性的 18 个区块头。首个完整窗口在父高度 35 时可用,覆盖高度 0 至 17。
统计满足以下条件的区块头:
active_slot_count × 4 >= 2^log_slots × 3
若 18 个区块头中至少 10 个满足条件,且 log_slots < 32,子区块必须设置 log_slots = parent.log_slots + 1;否则必须保留父值。
扩展把原根作为新根的左子树,把规范空子树作为右子树。现有槽位索引和记录不移动。
重组数据
近期撤销记录保存每个受影响槽、分段根与计数器的旧值。撤销数据保留 36 个区块,而共识最多允许回滚 17 个区块。
撤销数据(undo data)是本地恢复数据,不能替代共识见证数据。替代分支仍必须提供有效区块头、累计工作量和终端证明。