跳到主要内容

分布式结算协议

1. 协议范围

本附录规定从最终确认的周期关闭事件 PeriodClosed(P)\operatorname{PeriodClosed}(P) 到已激活算力(Activated Power)的最小安全闭环。本文固定业务语义和安全不变量。ABI、Gas、容量、树结构和奖励金额仍需测量,不能作为生产常量。

2. 核心不变量

编号不变量
P-01只有最终确认的贡献事件(ContributionEvent)能进入输入
P-02LL 只来自链上生效游标(Active cursor),覆盖范围只能是 R(L,P)=[L+1,P]\mathcal{R}(L,P)=[L+1,P]
P-03每个源周期使用自己的配置、注册表(Registry)、价格身份映射和留存规则(Retention)
P-04价格值只来自计算上下文(Context)的价格读取边界(price_read_fence)所固定的最新稳定价格快照
P-05每个验证者(Validator)独立完整复算,不跟签聚合器(Aggregator)的结果
P-06QC 分母是完整验证委员会(Committee),并严格满足 3S>2W3S>2W
P-07链上不执行算力(Power)公式,只验证 QC、对象绑定和状态连续性
P-08部分交付批次(Batch)、已封存但未激活、已过期或已拒绝的结果都不改变生效算力
P-09空状态补丁(Empty Patch)也必须经过投票(Vote)、QC、封存和激活,并推进游标
P-10未达法定权重(NoQuorum)或交付失败时游标不变,下一边界完整扩大覆盖范围

全局记号:PP 是最新关闭源周期;LL 是生效游标;CCTT 是计算期和目标期;R(L,P)=[L+1,P]\mathcal{R}(L,P)=[L+1,P] 是覆盖范围;SSWW 是已签权重和完整验证委员会总权重。

3. 周期范围与自动追赶

生效游标 L 与最新关闭周期 P 唯一派生覆盖范围,逐周期执行留存与增量计算;未达法定权重时游标不变,并在下一边界扩大范围。

正常情况下:

L=P1,C=P+1,T=P+2,R(L,P)=[P,P]L=P-1,\qquad C=P+1,\qquad T=P+2,\qquad \mathcal{R}(L,P)=[P,P]

如果周期 PP 没有形成可激活结果,游标仍为 P1P-1。关闭 P+1P+1 后:

NQ(P)L=L,R(L,P+1)=[L+1,P+1]\operatorname{NQ}(P)\Longrightarrow L'=L,\qquad \mathcal{R}(L',P+1)=[L+1,P+1]

其中 NQ(P)\operatorname{NQ}(P) 表示源周期 PP 未达到法定权重,LL' 表示下一边界时的游标。节点必须从同一个生效基准重新计算完整范围。旧投票不能与新的覆盖终点混合,管理员也不能把失败周期标记为已处理。

4. 输入快照

L1 对 PeriodClosed(P)\operatorname{PeriodClosed}(P) 构造轻量且不可变的输入快照(InputSnapshot)。它不复制全部事件,而是固定:

  • 链身份、周期边界与账本边界(LedgerFence);
  • 生效状态根、版本和游标;
  • 覆盖范围 R(L,P)=[L+1,P]\mathcal{R}(L,P)=[L+1,P]
  • 每个源周期的周期事实引用(PeriodFacts)与有序根;
  • 价格读取边界;
  • 验证委员会、运营者到计算密钥的授权,以及协议套件(ProtocolSuite);
  • 投影纪元与对象数量上限。

事件采集必须按完整交易版本(transaction_version)连续推进。本批事件与下一交易版本(next_tx_version)必须在同一事务中提交。索引器(Indexer)可以加速定位,但不能单独证明事件完整。

5. 计算上下文

计算范围上下文(ComputeRangeContext)至少绑定:

Ctx=(I,A,R,C,T,Hin,Hπ,Γ)\mathrm{Ctx}=(I,A,\mathcal{R},C,T,H_{\mathrm{in}},H_{\pi},\Gamma)

其中 II 汇总链、协议与算法身份;AA 汇总生效状态根、版本和游标;R=R(L,P)\mathcal{R}=\mathcal{R}(L,P)CCTT 绑定覆盖范围以及计算期与目标期;HinH_{\mathrm{in}} 绑定周期输入数量与根;HπH_{\pi} 绑定价格读取边界、数量与根;Γ\Gamma 绑定验证委员会纪元与成员集合、计算密钥根和总投票权重。

本地任务标识、数据库 UUID、线程数、分页大小、系统时钟和链上交付责任种子(Settlement Duty Seed)不进入计算上下文。交付责任种子只决定 QC 已固定之后的交付顺序,不能反向影响算力结果。

6. Topo DEX 最新稳定价格

Topo DEX 市场样本先形成当前周期累积,在周期关闭后更新最新稳定价格;POC 在最终确认边界固化计算上下文价格快照,无稳定价格时安全拒签。

Topo DEX 价格预言机对每个有序身份 ι=(b,q)\iota=(b,q) 维护一条最新稳定价格,其中 bbqq 分别表示基础代币(base_token)和报价代币(quote_token):

状态POC 行为
当前周期累积价格不可使用,因为仍在变化
最新稳定价格可在固定价格读取边界读取并进入计算上下文
从未形成稳定价格整个任务弃权
当前周期无有效样本沿用旧稳定价格并报告陈旧度,不改变 V1 结果

覆盖范围内的每个周期仍使用各自的价格身份映射,但所有身份的实际价格值只在本次计算上下文边界解析一次。后续价格更新不会改变已经构造的计算上下文。未达法定权重后重新构造计算上下文时,才可以在新边界读取新的最新稳定价格。

7. 贡献事件解释

每条贡献事件按固定顺序处理:

  1. 验证事件游标位于该源周期的边界区间;
  2. 验证原始字节、数据模式和事件发出方;
  3. 按游标顺序应用此前的注册表状态转换;
  4. 校验应用、权益代币、托管关系和即时准入状态;
  5. 使用 Config(p)\operatorname{Config}(p) 解析权重、价格身份、单位和最小值;
  6. 检查业务唯一身份与重复规则;
  7. 使用固定整数规则归一化;
  8. 产生已接受(Accepted)、业务拒绝(BusinessRejected)或任务级错误。

缺少价格、配置或历史留存规则属于依赖缺失(MissingDependency),必须使整个任务弃权;它不能被伪装成贡献值为零。

8. 确定性计算

协议对象必须先规范排序和去重。事件按 τ=(v,i)\tau=(v,i) 排序,其中 vv 表示交易版本、ii 表示事件序号(event_index);价格使用有序身份 ι=(b,q)\iota=(b,q);用户与状态补丁按地址原始字节排序;交付批次按批次序号(batch_index)排序。

只允许固定宽度整数与受检算术(checked arithmetic)。浮点数、无序映射迭代、平台相关的无符号长度类型(usize)、本地时区和系统时钟都不能进入协议结果。

对用户 uuVp(u)V_p(u) 表示期末值,Rp(u)R_p(u) 表示留存后的值,Δp(u)\Delta_p(u) 表示本期增量,ρp\rho_p 表示留存参数。mm 表示最近物化周期(last_materialized_period),Ret\operatorname{Ret} 表示单周期留存函数。以下每个 ++ 都采用受检算术。

对历史记录先物化到生效游标 LL

Rq(u)=Ret ⁣(Vq1(u),ρq),Vq(u)=Rq(u),q=m+1,,L\begin{aligned} R_q(u)&=\operatorname{Ret}\!\left(V_{q-1}(u),\rho_q\right), \\ V_q(u)&=R_q(u),\qquad q=m+1,\ldots,L \end{aligned}

再处理覆盖范围:

Rp(u)=Ret ⁣(Vp1(u),ρp),Vp(u)=Rp(u)+Δp(u),p=L+1,,P\begin{aligned} R_p(u)&=\operatorname{Ret}\!\left(V_{p-1}(u),\rho_p\right), \\ V_p(u)&=R_p(u)+\Delta_p(u),\qquad p=L+1,\ldots,P \end{aligned}

受影响用户(Affected)是覆盖范围内至少存在一条有效且归一化贡献大于零的用户并集。每个受影响用户在最终稀疏状态补丁中恰好出现一次;其他用户不写入。

9. 状态补丁、交付批次与空状态补丁

状态补丁对用户严格排序并绑定项目数量。认证状态适配器必须证明基准状态根与链上生效状态根相同,并验证每个受影响用户的成员证明或非成员证明。

交付批次只能从完整状态补丁按协议套件固定的项目数与字节数上限进行确定性切分。线程数、临时文件、Gas 估算或提交者偏好都不能改变交付批次边界。

受影响用户为空时,令 P\mathcal P 为状态补丁,B\mathcal B 为交付批次集合,HbaseH_{\mathrm{base}}HpostH_{\mathrm{post}} 为基准状态根和后置状态根:

P=B=0,Hpost=Hbase\lvert\mathcal P\rvert=\lvert\mathcal B\rvert=0,\qquad H_{\mathrm{post}}=H_{\mathrm{base}}

空状态补丁仍需完整证据包、计算上下文、结果承诺、投票与 QC;原子激活后生效版本增加 1,游标推进到覆盖终点。

10. 证据包、结果承诺与投票

证据包是按内容寻址的审计对象,至少包含周期切片、配置与映射、贡献判定、价格快照、基准见证数据、历史留存规则、状态补丁和交付批次。文件位置、URI 和 ETag 都不是内容权威。

构造顺序必须无环:

Hin=h(Xin),Hπ=h(Xπ),Hctx=h(Ctx),Ω=(U,Hbase,P,Hpost,B),(Xin,Xπ,Ctx,Ω)AHart=h(A),HartMHcom=h(M)Vote\begin{gathered} H_{\mathrm{in}}=h(X_{\mathrm{in}}),\quad H_{\pi}=h(X_{\pi}),\quad H_{\mathrm{ctx}}=h(\mathrm{Ctx}), \\ \Omega=(U,H_{\mathrm{base}},\mathcal P,H_{\mathrm{post}},\mathcal B), \\ (X_{\mathrm{in}},X_{\pi},\mathrm{Ctx},\Omega) \longrightarrow \mathcal A \longrightarrow H_{\mathrm{art}}=h(\mathcal A), \\ H_{\mathrm{art}}\longrightarrow \mathcal M \longrightarrow H_{\mathrm{com}}=h(\mathcal M) \longrightarrow \mathrm{Vote} \end{gathered}

其中 hh 表示规范哈希;XinX_{\mathrm{in}}XπX_{\pi}UU 分别表示周期输入片段(PeriodInputSlice)、价格快照(PriceSnapshot)与受影响用户;Ω\Omega 汇总基准、状态补丁、后置状态和交付批次;A\mathcal AM\mathcal M 分别表示证据包(Artifact)与结果承诺(Commitment)。各哈希符号继续绑定对应的周期输入根(period_inputs_root)、价格快照根(price_snapshot_root)、计算上下文哈希(context_hash)、证据包载荷摘要(artifact_payload_digest)与结果承诺哈希(commitment_hash)。

签名器(Signer)首次签名前必须重新打开证据包,并复核最新的最终确认资格。安全槽位使用 σ=(χ,ν,e)\sigma=(\chi,\nu,e),其中 χ\chiν\nuee 分别表示链标识(chain_id)、验证者标识(validator_id)与覆盖源周期终点(covered_source_end)。相同投票可以幂等返回;只要任一字段不同,就属于签名冲突(SignerConflict),签名器必须停止签名。

11. 投票与加权 QC

聚合器只把有序绑定 β=(HΓ,Hctx,Hcom)\beta=(H_{\Gamma},H_{\mathrm{ctx}},H_{\mathrm{com}}) 相同的投票放入同一组,各分量分别表示验证委员会根(committee_root)、计算上下文哈希与结果承诺哈希。每个验证者最多计权一次,权重来自最终确认的验证委员会快照。

QC:3S>2W\mathrm{QC}:\qquad 3S>2W

聚合器必须逐个验证投票、重算权重并自验最终 QC。多个不同结果承诺不能合并,也不能采用“消息最多的结果”。没有 QC 时不写链上失败对象,而是等待下一边界扩大范围。

12. 候选结果状态机

合法 QC 创建隐藏的候选结果;非空结果经过暂存、全部交付批次和封存后才能原子激活,未达法定权重、已过期或已拒绝都保持原有生效算力。

转换条件对生效状态的影响
未记录(Unrecorded)→ 暂存中(Staging)合法非空状态补丁 QC
未记录 → 已封存(Sealed)合法空状态补丁 QC
暂存中 → 已封存全部承诺的交付批次已幂等提交
暂存中 → 已过期(Expired)超过协议截止期
暂存中/已封存 → 已拒绝(Rejected)授权治理拒绝
已封存 → 已激活(Activated)目标边界、基准与游标连续且激活成功原子更新状态根、版本、游标与下一代种子

同一交付批次的重复提交不能覆盖第一次合法交付回执;不同载荷必须拒绝。封存只证明暂存内容完整匹配 QC 结果承诺,不使算力对下游可见。

13. 链上交付责任与公共兜底

聚合器先持久化 QC 就绪状态;验证者链上交付执行器按生效种子派生的主责任与次级责任窗口提交 QC、交付批次和封存操作,全部窗口失败后由公共中继器接续。

聚合器自验 QC 后必须先把规范化 QC 与 QC 就绪状态(QcReady)原子持久化,链上交付执行器(Settlement Worker)再异步消费。RPC、Gas、交易序号、交易池和链最终确认性不得进入确定性计算、签名器或基础共识调用栈。

责任顺序从当前生效状态中由上一次激活生成的种子派生,并绑定基准、计算上下文、结果承诺、动作类型、交付批次序号和验证者地址。链上不保存按验证者划分的交付批次排名表;重放、未达法定权重、已过期或已拒绝都不能重新抽取种子。

主责任窗口(Primary)失败后,次级责任窗口(Secondary)按最终确认边界接管;有限的验证者窗口全部结束后进入无许可公共兜底。公共中继器(Public Relayer)只能提交 QC 已绑定的内容,不获得 QC 权重或修改结果的权限。

14. 原子激活

激活必须在一个交易中完成:

  1. 校验候选结果已经封存;
  2. 校验基准状态根、版本和游标与当前生效状态一致;
  3. 校验 s=L+1s=L+1,其中 ss 表示覆盖源周期起点(covered_source_start),LL 表示当前游标(current_cursor);
  4. 完成幂等、容量、算术和奖励预留检查;
  5. 生成唯一的下一代交付责任种子,重放不得重抽;
  6. 原子切换状态根、版本和游标,并记录激活周期;
  7. 只把已预留奖励标记为可领取(Claimable),不遍历验证委员会或执行批量转账。

任一不可预期中止必须回滚全部写集。

15. 失败与安全收敛

故障安全结果恢复方式
输入缺失、版本缺口或解释不一致未就绪/弃权从最终确认链或归档恢复
验证者结果分叉或权重不足未达法定权重下一边界扩大完整范围
聚合器离线门槛不变其他聚合器从持久化投票中补偿恢复
证据包不可验证不签名或不交付切换副本并按摘要重验
部分交付批次候选结果保持隐藏幂等补齐,或过期后重算
主责任窗口的链上交付故障生效状态不变次级责任窗口或公共兜底接管
奖励池不足或领取失败算力流程继续禁用本候选结果的奖励或幂等重试
安全随机数暂不可用算力激活不应永久阻塞使用链内固定降级规则并告警,调用者不可选择

16. 治理边界

治理可以更新未来配置、暂停新任务、冻结或拒绝候选结果、升级协议套件,并调整版本化的奖励与交付责任策略。治理不能改写 QC 签名结果、手工推进游标、绕过 QC 写入算力、覆盖生效种子,或追溯修改已有候选结果的受益人与回执。

17. 仍需证据验证的参数

  • 定点数精度尺度、舍入、溢出和最大总算力(max_total_power);
  • 认证树、证明、零值与删除语义,以及创世状态根;
  • 交付批次、证据包、覆盖范围和验证委员会的生产容量;
  • 精确准入边界、Gas 与存储预算;
  • 安全随机数的非中止适配器与降级演练;
  • 交付责任窗口、奖励资金来源、金额函数和领取截止期。

这些参数通过验证前,只能用于参考实现、影子运行或测试网。

18. 协议验收

  • 两个独立实现对同一输入快照产生逐位一致的计算上下文、结果承诺、状态补丁和状态根。
  • 必需价格从未出现、历史留存规则缺失或基准证明不符时不会签名。
  • 同一覆盖终点的冲突投票被签名日志永久拒绝。
  • 不超过严格三分之二权重的 QC 不能形成或通过链上准入。
  • 部分交付批次、已过期、已拒绝和并发失败不会改变生效状态。
  • 空状态补丁正常推进游标,并使生效版本增加 1。
  • 全部验证者链上交付执行器停止后,公共中继器仍能在最终确认边界后完成交付。
  • 未达法定权重后,下一周期从未推进的游标重新覆盖完整范围。