架构docs/architecture/transactions.md

交易架构

Parano1d 把区块携带的物理交易页与钱包授权的逻辑付款分离。

Tx8x2 物理页采用固定 323 字节编码,最多包含八个输入和两个输出。逻辑 PagedSpend 最多把 128 个物理页组合为一笔原子交易意图,共用一个交易 ID 和一份授权证明封装

层级 限制 用途
Tx8x2 物理页 8 个输入、2 个输出 固定的共识与证明记录
PagedSpend 128 页 一次原子钱包操作
逻辑交易 1,020 个输入、256 个输出 扣除页面标记后的最大有效记录数

固定物理页

每页包含共同的 input_owner交易周期(epoch)锚点、手续费字段、八条输入记录、两条输出记录以及有效性位图(bitmap)。未启用记录必须是规范零值。

输入标识为:

text
{slot_index, amount, creation_id}

输出标识为:

text
{slot_index, amount, owner}

输出物化时,分配器提供新的 creation_id。因此,即使数值槽位以后被复用,过期输入引用也不会重新变为有效。

一笔逻辑交易意图

第一页携带手续费和开始标记,最后一页携带结束标记。所有页面使用同一所有者与交易周期锚点,有效记录必须紧密排列。对于声明的输入和输出数量,页面数必须是最小值。

逻辑交易 ID 承诺:

  • 协议版本;
  • 页面数量;
  • 按顺序排列的每个物理页哈希。

ID 由带域分离的 Poseidon2b 海绵函数计算。钱包授权绑定的是这个逻辑 ID,而非任何单页。

整组页面以原子方式准入、选择、证明和收录。矿工不能只选择一笔大型支出中手续费更有利的页面。

钱包构造

普通付款会花费活动地址对应所有者的输出。钱包优先选择较大金额,以减少证明输入数量;随后创建接收者输出,并把找零退回同一所有者。输出槽位来自节点提供的空槽位提示。

构造过程中有两条证明边界:

  1. 钱包证明自己知道活动地址对应所有者的秘密;
  2. 矿工证明输入当前存在、输出为空、数值守恒、手续费规则以及精确的转换后 State。

钱包证明在钱包状态锁之外生成。挖矿可以继续,但节点会优先处理本地交易,避免持续进行的矿工证明生成任务长时间阻塞用户操作。

内存池准入

准入流程刻意在高成本证明验证前后重复低成本检查:

  1. 解码规范的传输格式并验证整组语义;
  2. 持有内存池锁时,检查手续费、交易周期、冲突与 Live State
  3. 释放锁,在有界 CPU 许可下验证授权证明封装;
  4. 重新取得锁,再次执行低成本 Live State 与冲突检查;
  5. 预留所有有效输入和输出槽,随后转发交易意图。

第二次低成本检查消除了授权验证期间新块或竞争交易造成的竞态。重复提交具有幂等性。

内存池最多容纳 1,024 笔逻辑交易以及 384 MiB 意图数据。槽位预留使输入与输出冲突检测保持常数时间。

区块选择

矿工按费率排序可接受交易组,费率相同时按交易 ID 排序。交易组始终不可拆分。选择还必须满足:

  • 当前证明类别 B64 或 B255;
  • 每区块最多 1,020 个有效输入;
  • 每区块最多 510 个用户输出;
  • 最多触及 256 个不同 State 分段
  • 可用的物理页位置。

计划中的开发奖励付款占用一个物理页位置,因此该区块剩余 254 个用户页;其他区块最多可使用 255 个用户页。

确认与收据

提交成功只表示本地节点接受并转发了完整交易意图,并不表示交易已被区块收录。交易收录并确认后,钱包才能从保留区块中恢复收据

向同一所有者进行的归集不会生成收据。向任何不同所有者付款——包括同一钱包派生出的另一个非活动地址——都会作为支出凭证保留。

规范有效性规则见交易协议,用户界面行为见发送 NOID

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