核心类型与密码学
savitri-core 提供了基础类型、密码学原语以及在所有 Savitri Network crate 中使用的工具。
核心类型
交易(Transaction)
pub struct Transaction {
pub from: String, // 发送方地址(64 个十六进制字符)
pub to: String, // 接收方地址(64 个十六进制字符)
pub amount: u64, // 转账金额
}
账户(Account)
pub struct Account {
pub balance: u128, // 余额,以最小单位表示(18 位小数)
pub nonce: u64, // 交易计数器
}
编码方式:固定 24 字节格式(16 字节余额小端序 + 8 字节 nonce 小端序)。向后兼容旧版 16 字节格式(仅含余额)。
安全性:credit() 和 debit() 使用经过检查的算术运算,以防止溢出和下溢。
手续费限额(Fee Limits)
pub struct FeeLimits {
pub min_fee: u128, // 默认值:0.0001 SAVT(10^14)
pub max_fee: u128, // 默认值:1.0 SAVT(10^18)
}
密码学原语
签名
| 算法 | 库 | 用途 |
|---|---|---|
| Ed25519 | ed25519-dalek | 交易签名、区块签名、节点身份 |
密钥规格:
- 私钥:32 字节
- 公钥:32 字节
- 签名:64 字节
- 地址:十六进制编码的公钥(64 个十六进制字符)
哈希函数
| 函数 | 库 | 用途 |
|---|---|---|
| SHA-256 | sha2 | 交易签名消息哈希 |
| SHA-512 | sha2 | 区块哈希(含域标签 "BLK" + 版本字节) |
| BLAKE3 | blake3 | 状态根计算、快速哈希 |
| Keccak256 | sha3 | 合约存储槽推导 |
带域标签的哈希
为防止跨域哈希碰撞,所有哈希均包含域标签:
| 域 | 标签 | 描述 |
|---|---|---|
| 区块 | "BLK" + 版本字节 | 区块哈希 |
| 交易根 | "TXv1" 叶节点标签 | 对 bincode 的滚动累加器 |
| 状态根 | "STATEv1-LE" 种子 | 字典序数据库快照 |
密钥管理
pub struct KeyManager {
// 加载或生成身份密钥对
pub fn load_or_generate(path: &Path) -> Result<KeyPair>;
// 生成新密钥对
pub fn generate() -> KeyPair;
}
pub struct KeyPair {
pub signing_key: SigningKey,
pub verifying_key: VerifyingKey,
}
密钥以原始 32 字节格式持久化存储到磁盘。MemoryKeyStorage 提供内存存储,用于测试。
加密
对静态敏感数据使用 AES-GCM 加密:
// 使用密码派生密钥进行加密
let encrypted = encrypt_aes_gcm(plaintext, password)?;
// 解密
let plaintext = decrypt_aes_gcm(ciphertext, password)?;
槽调度器(Slot Scheduler)
用于领导者轮换的确定性槽调度:
pub struct SlotScheduler {
slot_duration_ms: u64,
base_ms: u64,
validators: Vec<String>,
local_id: String,
}
pub enum SlotRole {
Leader, // 在本槽中生产区块
Follower, // 验证区块
Observer, // 仅观察(守护节点)
}
pub struct SlotInfo {
pub slot: u64,
pub round: u32,
pub leader: Option<String>,
pub role: SlotRole,
pub start_ms: u64,
pub end_ms: u64,
}
领导者分配方式:leader_index = slot % validators.len()。在相同验证者集合和槽编号下,结果是确定性的。
巨石块(Monolith)
巨石块将多个区块压缩为单一结构,用于高效归档和同步:
pub struct MonolithHeader {
pub exec_height: u64, // 执行高度
pub window_start: u64, // 巨石块中的第一个区块
pub epoch_id: u64, // 纪元标识符
pub block_count: u64, // 包含的区块数量
pub size_bytes: u64, // 总大小
pub monolith_id: String, // 唯一标识符
pub produced_at_ms: u64, // 生产时间戳
pub cosignatures: Vec<..>, // 验证者联合签名
}
指标(Metrics)
指标系统提供与 Prometheus 兼容的指标:
pub struct MetricsProvider {
// 注册计数器、仪表、直方图
pub fn register_counter(name: &str, help: &str) -> Counter;
pub fn register_gauge(name: &str, help: &str) -> Gauge;
}
类别:区块链、内存池、网络、存储、执行、系统、安全、代币经济。
端点:http://127.0.0.1:9090/metrics(每 5 秒更新一次)。
双核结构
存在两个 savitri-core 目录:
| 路径 | 用途 | 依赖关系 |
|---|---|---|
Savitri-core/Savitri-core/ | 独立版本(适用于 crates.io) | 无内部依赖 |
Savitri-core/ | 扩展版本 | savitri-storage、savitri-zkp |
独立版本采用 MIT 许可证,适合外部使用。扩展版本增加了 RocksDB 集成、压缩和 libp2p 支持等功能。