内存池架构
内存池管理待处理交易的完整生命周期,从准入、评分到区块生产排空。
处理流水线
网络(gossipsub /savitri/tx/1)
│
▼
预验证(无状态)
│ 签名格式、大小限制
▼
准入控制
│ 配额检查、每发送方上限
▼
有状态验证
│ nonce、余额、手续费限额
▼
SIMD 批量评分
│ fee * 0.7 + class * 0.3
▼
评分缓存(LRU)
│
▼
待处理池
│
▼
drain_for_block_production()
│ 按评分取前 N 名,final_validation
▼
区块提议者
交易类别
| 类别 | 优先级 | 用途 |
|---|---|---|
FederatedUpdate | 1.0(最高) | 联邦学习模型更新 |
Financial | 0.8 | 代币转账 |
Governance | 0.7 | 投票、提案 |
IoTData | 0.5 | 传感器数据 |
准入配额
| 类别 | 最大待处理数 | 每发送方上限 |
|---|---|---|
| Financial | 50,000 | 512 |
| IoT | 100,000 | 512 |
| Global | 100,000 | 512 |
drain_fair_batch() 函数在排空交易时调用 record_removal(),以正确递减类别计数(第 6 轮修复)。
SIMD 评分
评分公式
score = fee_normalized * fee_weight + class_priority * class_weight
默认值:fee_weight = 0.7,class_weight = 0.3。
架构专属实现
| 架构 | 内部指令 | 通道数 | 最小批量 |
|---|---|---|---|
| x86_64(AVX2+FMA) | _mm256_set1_pd、_mm256_fmadd_pd | 4 个双精度 | 32 |
| ARM(NEON) | vdupq_n_f64、vfmaq_f64 | 2 个双精度 | 32 |
| 回退(Fallback) | 标量循环 | 1 | 始终 |
对于批量小于 32 笔的交易,使用标量计算,因为 SIMD 初始化开销超过了收益。
自适应权重(可选)
启用 adaptive_weights 特性标志后,权重将根据以下条件调整:
- 手续费分布:若手续费集中在较高区间,增加 fee_weight
- 类别多样性:若类别种类较多,增加 class_weight
- 历史吞吐量:根据最近区块调整
参数:
base_fee_weight = 0.7
base_class_weight = 0.3
adaptation_rate = 0.1(平滑系数)
fee_threshold_high = 2,000,000,000
fee_threshold_low = 500,000,000
class_diversity_threshold = 0.5
评分缓存
LRU 缓存避免重复计算评分:
| 参数 | 开发环境 | 生产环境 |
|---|---|---|
| 缓存大小 | 100 条 | 10,000 条 |
| 生存时间(TTL) | 60 秒 | 300 秒 |
Nonce 管理
标准流程
- 交易携带 nonce N 到达
- 检查:
N >= account.storage_nonce - 排空期间在
pending_noncesHashMap 中跟踪 - 区块最终确定后提交 nonce
间隙容忍
nonce 间隙最大允许 5000,用于长时间停滞后的突发恢复(第 11 轮从 1000 提升至此)。
冷启动修复
当 storage_nonce=0 且 pending_nonces=0 时,接受最低可用 nonce 作为起始点。此举解决了交易已被排空但前任提议者从未提交区块的情况。
Nonce 重置
当 local_nonce > storage_nonce + 200(MAX_NONCE_AHEAD)时,交易生成器重置本地 nonce。此前本地 nonce 可能漂移至 2000+,而存储中仅为 84,导致所有交易被拒绝。
重放防护
通过跟踪交易哈希来防止重放攻击。一旦某交易哈希被记录,重复提交将被拒绝。
手续费验证
FeeLimits {
min_fee: 100_000_000_000_000, // 0.0001 SAVT
max_fee: 1_000_000_000_000_000_000, // 1.0 SAVT
}
特性标志
| 标志 | 描述 |
|---|---|
simd | SIMD 优化评分(默认) |
cache | 评分缓存(默认) |
adaptive_weights | 动态权重调整 |