存储架构
Savitri Network 以 RocksDB 作为主要存储后端,通过列族实现数据隔离和高效访问模式。
列族
| 列族 | 键 | 值 | 用途 |
|---|---|---|---|
CF_BLOCKS | 高度(u64 小端序) | 区块(bincode) | 区块存储 |
CF_TRANSACTIONS | tx_hash(32 字节) | 交易(bincode) | 交易查询 |
CF_ACCOUNTS | 地址(32 字节) | 账户(24 字节) | 余额 + nonce |
CF_METADATA | 字符串键 | 多种类型 | 链头、配置 |
CF_RECEIPTS | tx_hash | 收据(bincode) | 交易收据 |
CF_CONTRACTS | 地址 | ContractInfo | 智能合约状态 |
CF_GOVERNANCE | proposal_id | 提案(bincode) | 治理提案 |
CF_ORACLE | feed_id | OracleData | 预言机数据源 |
CF_BONDS | 地址 | 保证金金额 | 验证者保证金 |
CF_VOTE_TOKENS | 地址 | VoteToken 余额 | 治理投票代币 |
CF_TREASURY | 键 | 国库状态 | 网络国库 |
CF_VESTING | schedule_id | VestingSchedule | 代币归属计划 |
CF_REWARD_COINS | 地址 | 奖励余额 | 节点奖励 |
CF_FEE_METRICS | 键 | 手续费数据 | 手续费追踪 |
CF_SUPPLY_METRICS | 键 | 供应量数据 | 代币供应量 |
CF_ACTIVE_NODES | node_id | 活跃状态 | 节点存活状态 |
CF_MONOLITHS | monolith_id | Monolith | 区块压缩 |
CF_FL | 键 | 联邦学习数据 | 联邦学习 |
CF_POU | node_id | PoU 分数 | 共识评分 |
账户编码
账户使用紧凑的 24 字节固定宽度编码:
字节 0-15: 余额(u128,小端序)
字节 16-23:nonce(u64,小端序)
向后兼容:旧版 16 字节格式(仅含余额,nonce=0)仍受支持。
余额为 0、nonce 为 0 的空账户从不持久化,以节省存储空间。
状态根
状态根通过字典序数据库快照计算:
seed = H("STATEv1-LE")
leaf = H("STATE" || key || value) 对每个键值对
root = rolling_accumulate(seed, leaf_1, leaf_2, ..., leaf_n)
键按字典序迭代以保证确定性。
存储特征
所有存储后端均实现 StorageTrait:
pub trait StorageTrait: Send + Sync {
fn get_cf(&self, cf: &str, key: &[u8]) -> Result<Option<Vec<u8>>>;
fn put_cf(&self, cf: &str, key: &[u8], value: &[u8]) -> Result<()>;
fn delete_cf(&self, cf: &str, key: &[u8]) -> Result<()>;
fn get_cf_prefix(&self, cf: &str, prefix: &[u8]) -> Result<Vec<(Vec<u8>, Vec<u8>)>>;
// ... 批量操作、迭代等
}
安全反序列化
所有 bincode 反序列化均设置最大大小限制,以防止内存耗尽:
const MAX_BINCODE_SIZE: u64 = 16 * 1024 * 1024; // 16MB
缓存
针对频繁访问数据的 LRU 缓存层:
- 账户缓存:减少余额/nonce 检查时的 RocksDB 读取
- 合约存储缓存:在合约执行期间缓存 SLOAD 结果
- 评分缓存:内存池交易评分的 LRU 缓存(避免重复计算)
RocksDB 配置
| 参数 | 开发环境 | 生产环境 |
|---|---|---|
| 缓存大小 | 256 MB | 1024 MB |
| 写入缓冲区 | 16 MB | 64 MB |
| 最大打开文件数 | 100 | 1000 |
| 同步间隔 | 5 秒 | 30 秒 |
| 压缩 | 禁用 | 启用 |
批量操作
原子批量写入确保一致性:
let mut batch = storage.batch();
batch.put_cf(CF_ACCOUNTS, &addr, &account.encode());
batch.put_cf(CF_TRANSACTIONS, &tx_hash, &tx_bytes);
batch.put_cf(CF_BLOCKS, &height_key, &block_bytes);
batch.commit()?;
归属系统
代币归属计划支持三种类型:
| 类型 | 行为 |
|---|---|
Linear | 代币在归属期内线性释放 |
Cliff | 悬崖期内无代币释放,之后线性释放 |
Staged | 创世兼容模式 |
特性标志
| 标志 | 描述 |
|---|---|
rocksdb | RocksDB 后端(默认) |
memory | 内存后端(测试) |
prometheus | Prometheus 指标导出 |
tempfile | 用于测试的临时存储 |