交易流水线
交易流水线处理从创建到最终确定的完整生命周期。
概览
用户/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。
内存池准入
无状态守卫(无需访问存储)
- 签名格式验证(64 字节 ed25519)
- 公钥格式验证(32 字节 ed25519)
- 针对消息哈希的签名验证
- 交易大小限制
有状态守卫(需要访问存储)
- Nonce 检查:
tx.nonce >= account.nonce(间隙容忍最大 5000) - 余额检查:
account.balance >= tx.amount + tx.fee - 配额检查:按类别和每发送方的限制
交易类别
| 类别 | 优先级 | 最大配额 |
|---|---|---|
| FederatedUpdate | 1.0(最高) | 50,000 |
| Financial | 0.8 | 50,000 |
| IoTData | 0.5 | 100,000 |
| Governance | 0.7 | 50,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.7,class_weight = 0.3。
SIMD 实现
| 架构 | 指令集 | 通道数 | 阈值 |
|---|---|---|---|
| x86_64 | AVX2 + FMA | 4 个双精度 | 32 笔交易 |
| ARM(aarch64) | NEON | 2 个双精度 | 32 笔交易 |
| 回退 | 标量 | 1 | 始终 |
对于批量小于 32 笔的交易,使用标量计算(SIMD 初始化开销超过收益)。
评分缓存
LRU 缓存避免对跨区块仍留在内存池中的交易重复计算评分。
自适应权重
启用 adaptive_weights 特性标志后,权重将根据以下条件动态调整:
- 内存池中的手续费分布
- 类别多样性
- 历史吞吐量
区块生产
当选提议者执行以下步骤:
- 调用
drain_for_block_production(max_block_txs) - 获取按评分排序的前 N 笔交易
- 使用
pending_nonces跟踪运行final_validation(防止陈旧 nonce 拒绝) - 计算交易根:
"TXv1"叶节点标签,滚动累加器 - 计算状态根:
"STATEv1-LE"种子,字典序快照 - 使用 Ed25519 签署区块
- 通过 gossipsub 广播
Nonce 处理
final_validation为已排空但未提交的交易跟踪pending_noncesHashMap- 冷启动修复:当
storage_nonce=0 且 pending_nonces=0时,接受最低可用 nonce - Nonce 重置:当本地 nonce > storage_nonce + 200 时,交易生成器重置
存储
已提交的区块存储在 RocksDB 列族中:
| 列族 | 键 | 值 |
|---|---|---|
CF_BLOCKS | 高度(u64 小端序) | 区块(bincode) |
CF_TRANSACTIONS | tx_hash | 交易(bincode) |
CF_ACCOUNTS | 地址(32 字节) | 账户(bincode) |
CF_METADATA | "chain_head" | 最新区块(bincode) |
余额为 0、nonce 为 0 的空账户不会被持久化存储。