摘要

我们针对同一种旧打开证明威胁,分别实现了 256 桶重用保护与打包的 UTXO 代次标识:同一物理槽位日后可能装入可见值相同、身份却不同的新输出。代次标识能区分先后输出,允许同区块重用,拒绝旧打开证明,并移除第二个 State 根及其证明族。该标识符始终只在当前分支内解释,并与规范历史保持一致。

槽重用问题

UTXO 是未花费交易输出。ParanO(1)d 把当前 UTXO 存入有界 State,其中的物理槽是可重复使用的索引,而不是输出的永久名称。精确 State 打开证明是一条 Merkle 证明,用于认证某个槽中完整的叶节点。如果同一槽后来再次包含相同金额与所有者,旧的打开证明绝不能认证这个新输出。这是典型的 A→B→A(ABA)问题:可见值回到 A,但逻辑对象已经改变。

实验一:共识隔离期

第一种构造引入 ReuseGuard,即一套记录已释放槽何时可以再次使用的第二 State 结构。它由包含 256 个桶的环组成。释放的槽要隔离到超过协议最终性窗口一个区块后才能重用;共识还要携带独立的重用保护根、桶路径与证明关系。

Guard 阻止立即重用,却带来了与 UTXO 值本身无关的成本:

  • 额外的共识 State 根与回滚域;
  • 三个用于绑定重用保护桶与 State 根的证明组件;
  • 无法在同一区块内先花费一个物理槽,再在该槽创建新输出;
  • 两条必须以完全相同方式推进重用保护状态的 State 转换路径。

原型一致性测试会刻意执行两条 State 转换路径,并在设计选择前排除存在分歧的重用保护推进规则。两条路径可以保持一致,但这种一致性会成为第二套 State 状态机永久引入的证明义务。

实验二:把身份放进值里

另一种设计把金额与单调创建标识符打包进现有的 128 位数值通道:

packed_value = (creation_id << 64) | amount

每个新创建的输出使用该分支内的下一个 creation_id。因此,精确 State 叶节点与输入叶节点不仅承诺槽、所有者与金额,也承诺输出的逻辑代次。

对抗与边界测试

情况预期属性结果
相同槽、所有者与金额;新 ID旧的精确 State 打开证明必须失败State 叶节点与输入叶节点的哈希不同
同区块花费 → 创建新输出使用下一个 ID无歧义
同区块创建 → 花费后续输入指定新创建输出的 ID无歧义
跳号、重复或乱序 ID拒绝已拒绝
u64::MAX 计数器不得回绕共识无效

原型还验证了 creation_id = 0 会保留基线哈希调度。代次标识可以装入现有域元素通道,无需增加叶节点、区块头根或证明族。

适用范围

该标识符只在所属分支内解释。回滚会随 State 一起恢复分配计数器,因此竞争分支可能把相同数值标识符分配给不同输出。分支与 epoch 的绑定仍由规范历史负责。该构造解决单一规范分支内旧的精确 State 打开证明可能被重用的问题,并不建立全局输出点命名空间。

结果

代次标识设计取代了隔离环,并移除了相应的重用保护证明关系。更普遍地说,当一个可重用的物理位置先后表示不同逻辑对象时,直接在对象承诺中加入单调代次,要比维护第二套共识结构来记录何时允许重用该位置更简单。