跳到主要内容

交易流水线

交易流水线处理从创建到最终确定的完整生命周期。

概览

用户/SDK
│ 构建 + 签名(Ed25519)

JSON-RPC(savitri_sendRawTransaction)
│ 十六进制解码 → bytes_to_raw_tx

内存池准入
│ 无状态守卫 → 有状态守卫

SIMD 批量评分
│ fee * 0.7 + class_priority * 0.3

区块提议者(drain_for_block_production)
│ 按评分取前 N 名,按每个发送方 nonce 排序

区块生产
│ 计算 tx_root、state_root

Gossipsub 广播(/savitri/block/1)


BFT 投票(2f+1 法定人数)
│ 区块接受证书

RocksDB 提交
│ CF_BLOCKS、CF_TRANSACTIONS、CF_ACCOUNTS

最终确定

交易格式

规范签名消息

from(十六进制字节)|| to(十六进制字节)|| amount(u64 小端序)|| nonce(u64 小端序)|| fee(u128 小端序)

此消息经 SHA-256 哈希后,使用 Ed25519 签名。

线路格式(raw_tx_hex)

from_hex_bytes || to_hex_bytes || amount_le_u64 || nonce_le_u64 || fee_le_u128 || pubkey(32B)|| signature(64B)|| data(可选)

以十六进制编码字符串形式提交给 savitri_sendRawTransaction

内存池准入

无状态守卫(无需访问存储)

  1. 签名格式验证(64 字节 ed25519)
  2. 公钥格式验证(32 字节 ed25519)
  3. 针对消息哈希的签名验证
  4. 交易大小限制

有状态守卫(需要访问存储)

  1. Nonce 检查tx.nonce >= account.nonce(间隙容忍最大 5000)
  2. 余额检查account.balance >= tx.amount + tx.fee
  3. 配额检查:按类别和每发送方的限制

交易类别

类别优先级最大配额
FederatedUpdate1.0(最高)50,000
Financial0.850,000
IoTData0.5100,000
Governance0.750,000

配额系统

  • 按类别限制:Financial 50K,IoT 100K,Global 100K
  • 每发送方上限:每个发送方最多 512 笔待处理交易
  • 公平排空drain_fair_batch() 遵守配额并调用 record_removal()

SIMD 评分

调度器使用 SIMD 优化批量计算对交易进行评分:

score = fee_normalized * fee_weight + class_priority * class_weight

默认权重:fee_weight = 0.7class_weight = 0.3

SIMD 实现

架构指令集通道数阈值
x86_64AVX2 + FMA4 个双精度32 笔交易
ARM(aarch64)NEON2 个双精度32 笔交易
回退标量1始终

对于批量小于 32 笔的交易,使用标量计算(SIMD 初始化开销超过收益)。

评分缓存

LRU 缓存避免对跨区块仍留在内存池中的交易重复计算评分。

自适应权重

启用 adaptive_weights 特性标志后,权重将根据以下条件动态调整:

  • 内存池中的手续费分布
  • 类别多样性
  • 历史吞吐量

区块生产

当选提议者执行以下步骤:

  1. 调用 drain_for_block_production(max_block_txs)
  2. 获取按评分排序的前 N 笔交易
  3. 使用 pending_nonces 跟踪运行 final_validation(防止陈旧 nonce 拒绝)
  4. 计算交易根:"TXv1" 叶节点标签,滚动累加器
  5. 计算状态根:"STATEv1-LE" 种子,字典序快照
  6. 使用 Ed25519 签署区块
  7. 通过 gossipsub 广播

Nonce 处理

  • final_validation 为已排空但未提交的交易跟踪 pending_nonces HashMap
  • 冷启动修复:当 storage_nonce=0 且 pending_nonces=0 时,接受最低可用 nonce
  • Nonce 重置:当本地 nonce > storage_nonce + 200 时,交易生成器重置

存储

已提交的区块存储在 RocksDB 列族中:

列族
CF_BLOCKS高度(u64 小端序)区块(bincode)
CF_TRANSACTIONStx_hash交易(bincode)
CF_ACCOUNTS地址(32 字节)账户(bincode)
CF_METADATA"chain_head"最新区块(bincode)

余额为 0、nonce 为 0 的空账户不会被持久化存储。