协议docs/protocol/state.md

State 转换

共识 State 是由 UTXO 记录组成的稀疏 Merkle 向量。当前槽位域包含 2^log_slots 个叶子,其中 log_slots 取值 24 至 32。每个区块完成后,区块头承诺 State 根、已占用记录数与分配计数器。

State 叶子

叶子要么是规范空值,要么包含:

text
{amount: u64, creation_id: u64, owner: 32 bytes}

承诺计算把金额与创建标识压入一个 GF(2^128) 域元素通道,再与所有者一起在 UTXO 叶节点域下哈希。

转换顺序

共识从区块推导唯一有序转换:

  1. 验证并分配主要奖励;
  2. 到期时验证并分配计划中的开发付款;
  3. 按区块顺序处理用户 PagedSpend 组;
  4. 清除所有已消费输入;
  5. 分配新的创建标识并安装输出;
  6. 更新分段根、已占用记录数与分配计数器;
  7. 重建全局 State 根。

虽然逻辑交易的物理页是连续的区块记录,其原子性仍然完整保留。

输入规则

每个有效用户输入必须:

  • 位于父 State 域内;
  • 标识当前被占用的槽;
  • 匹配所声明的金额与共同所有者;
  • 匹配当前 creation_id
  • 在区块中只出现一次;
  • 由交易组的钱包证明授权。

奖励与开发记录没有输入,按系统计划验证。

输出规则

每个有效用户输出必须:

  • 位于子 State 域内;
  • 在计入区块内更早动作后,目标槽仍为空;
  • 金额非零;
  • 在区块中只出现一次。

分配器选择新的单调 creation_id。输出槽提示只用于辅助构造;区块仍须针对精确的父 State 证明这些槽为空。

价值守恒

在每个逻辑用户组中:

text
sum(inputs) = sum(outputs) + fee

整个区块可创建的价值限于协议补贴。主要奖励上限包含矿工份额和可领取交易手续费,不包含已销毁的 State 增长费

所有聚合金额计算都使用足够宽的类型,避免有效 u64 字段之和静默饱和。

分段

叶子按每个 State 分段 2^16 个槽位分组。一个区块最多触及 256 个不同分段。这是共识可用性限制,节点在加载分段数据前即进行检查。

空段使用规范空子树根,不需要原始 MDBX 列。最后一个未花费 UTXO 被花费后,该段会被删除。

扩展规则

对于父高度为 H 的候选子区块,使用结束于高度 H - 18、已经具备硬最终性的 18 个区块头。首个完整窗口在父高度 35 时可用,覆盖高度 0 至 17。

统计满足以下条件的区块头:

text
active_slot_count × 4 >= 2^log_slots × 3

若 18 个区块头中至少 10 个满足条件,且 log_slots < 32,子区块必须设置 log_slots = parent.log_slots + 1;否则必须保留父值。

扩展把原根作为新根的左子树,把规范空子树作为右子树。现有槽位索引和记录不移动。

重组数据

近期撤销记录保存每个受影响槽、分段根与计数器的旧值。撤销数据保留 36 个区块,而共识最多允许回滚 17 个区块。

撤销数据(undo data)是本地恢复数据,不能替代共识见证数据。替代分支仍必须提供有效区块头、累计工作量和终端证明。

ParanO(1)d 技术文档共识行为以源代码为准。