密码学规范
Savitri Network 中使用的所有密码学原语的完整规范。
签名方案
| 属性 | 值 |
|---|---|
| 算法 | Ed25519 |
| 库 | ed25519-dalek |
| 私钥 | 32 字节 |
| 公钥 | 32 字节(压缩 Edwards 点) |
| 签名 | 64 字节 |
| 地址 | 十六进制编码的公钥(64 个十六进制字符) |
交易签名
message = from_hex_bytes || to_hex_bytes || amount_le_u64 || nonce_le_u64 || fee_le_u128
hash = SHA-256(message)
sig = Ed25519_sign(signing_key, hash)
区块签名
区块由提案者使用 Ed25519 对区块头哈希(SHA-512)进行签名。
对等节点身份
libp2p 对等节点使用 Ed25519 作为其对等节点身份密钥(与账户密钥分离)。
哈希函数
SHA-256
| 用途 | 输入 | 输出 |
|---|---|---|
| 交易签名消息 | 规范 TX 字节 | 32 字节 |
| Monolith 承诺 | 头部字段 | 32 字节 |
| ZKP 声明哈希 | 声明字段 | 32 字节 |
| AES 密钥派生 | 密码 | 32 字节 |
SHA-512
| 用途 | 输入 | 输出 |
|---|---|---|
| 区块哈希 | "BLK" + 版本字节 + 头部字节 | 64 字节 |
| 头部提交 | 区块头的二叉树 | 64 字节 |
BLAKE3
| 用途 | 输入 | 输出 |
|---|---|---|
| 快速哈希 | 通用目的 | 可变 |
| 状态计算 | 状态数据 | 32 字节 |
Keccak256
| 用途 | 输入 | 输出 |
|---|---|---|
| 合约存储槽 | address || base_slot | 8 字节(u64) |
| 嵌套映射 | key || inner_hash | 8 字节(u64) |
域分离
所有哈希计算包含域标签以防止跨域冲突:
| 域 | 标签 | 哈希 | 输出 |
|---|---|---|---|
| 区块 | "BLK" + version: u8 | SHA-512 | 64 字节 |
| TX 根 | "TXv1" 叶标签 | 滚动累加器 | 32 字节 |
| 状态根 | "STATEv1-LE" 种子 + "STATE" 叶 | 字典序快照 | 32 字节 |
交易根
作为交易规范 bincode 的滚动累加器计算:
accumulator = H("TXv1")
for tx in transactions:
leaf = bincode::serialize(tx)
accumulator = H(accumulator || leaf)
tx_root = accumulator
状态根
从字典序数据库快照计算:
seed = H("STATEv1-LE")
for (key, value) in storage.iter_sorted():
leaf = H("STATE" || key || value)
seed = H(seed || leaf)
state_root = seed
加密
AES-256-GCM(静态加密)
用于:
- SDK 中的私钥加密
- 移动数据库列加密
- IoT 连接器中的设备数据加密
| 属性 | 值 |
|---|---|
| 算法 | AES-256-GCM |
| 密钥大小 | 256 位 |
| Nonce 大小 | 96 位(12 字节) |
| 标签大小 | 128 位(16 字节) |
| 密钥派生 | 基于密码 |
P2P 加密
| 属性 | 值 |
|---|---|
| 协议 | Noise(XX 握手模式) |
| 密钥交换 | X25519 |
| 密码 | ChaChaPoly |
| 多路复用 | Yamux |
密钥派生(移动端)
BIP-39
- 词表:英语(2048 个词)
- 熵:128 位(12 个词)或 256 位(24 个词)
- 助记词 → 种子:PBKDF2-HMAC-SHA512(2048 轮)
BIP-44
- 路径:
m/44'/1337'/0'/0/0 - 币种类型:1337(Savitri)
- 账户:0
- 找零:0(外部)
- 索引:0
密钥层次结构
mnemonic → seed (512 bits)
→ master_key (via HMAC-SHA512)
→ m/44' → m/44'/1337' → m/44'/1337'/0'
→ m/44'/1337'/0'/0 → m/44'/1337'/0'/0/0
→ ed25519_private_key (32 bytes)
→ ed25519_public_key (32 bytes)
→ address (hex-encoded, 64 chars)
零知识证明
详见 ZKP 架构。
| 后端 | 曲线 | 证明系统 | 使用场景 |
|---|---|---|---|
| Mock | N/A | 始终有效 | 测试 |
| Arkworks | BN254 | Groth16 | 生产 |
| PLONK | BN254 | PLONK | 通用目的 |
安全属性
常量时间操作
所有签名验证使用常量时间比较(通过 subtle 库)以防止计时侧信道攻击。
密钥零化
私钥在 SDK 和移动应用中均使用 zeroize 库在丢弃时清零。
重放保护
- 交易:基于 nonce(每账户单调递增)
- FL 更新:每个训练者的每轮次 nonce
- 预言机馈送:序列号跟踪
- P2P 消息:Gossipsub 去重