跳到主要内容

存储架构

Savitri Network 以 RocksDB 作为主要存储后端,通过列族实现数据隔离和高效访问模式。

列族

列族用途
CF_BLOCKS高度(u64 小端序)区块(bincode)区块存储
CF_TRANSACTIONStx_hash(32 字节)交易(bincode)交易查询
CF_ACCOUNTS地址(32 字节)账户(24 字节)余额 + nonce
CF_METADATA字符串键多种类型链头、配置
CF_RECEIPTStx_hash收据(bincode)交易收据
CF_CONTRACTS地址ContractInfo智能合约状态
CF_GOVERNANCEproposal_id提案(bincode)治理提案
CF_ORACLEfeed_idOracleData预言机数据源
CF_BONDS地址保证金金额验证者保证金
CF_VOTE_TOKENS地址VoteToken 余额治理投票代币
CF_TREASURY国库状态网络国库
CF_VESTINGschedule_idVestingSchedule代币归属计划
CF_REWARD_COINS地址奖励余额节点奖励
CF_FEE_METRICS手续费数据手续费追踪
CF_SUPPLY_METRICS供应量数据代币供应量
CF_ACTIVE_NODESnode_id活跃状态节点存活状态
CF_MONOLITHSmonolith_idMonolith区块压缩
CF_FL联邦学习数据联邦学习
CF_POUnode_idPoU 分数共识评分

账户编码

账户使用紧凑的 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 MB1024 MB
写入缓冲区16 MB64 MB
最大打开文件数1001000
同步间隔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创世兼容模式

特性标志

标志描述
rocksdbRocksDB 后端(默认)
memory内存后端(测试)
prometheusPrometheus 指标导出
tempfile用于测试的临时存储