Types fondamentaux et cryptographie
savitri-core fournit les types de base, les primitives cryptographiques et les utilitaires utilisés dans l'ensemble des crates du réseau Savitri.
Types fondamentaux
Transaction
pub struct Transaction {
pub from: String, // adresse de l'expéditeur (64 caractères hex)
pub to: String, // adresse du destinataire (64 caractères hex)
pub amount: u64, // montant du transfert
}
Compte
pub struct Account {
pub balance: u128, // solde en unité minimale (18 décimales)
pub nonce: u64, // compteur de transactions
}
Encodage : Format fixe de 24 octets (16 octets de solde LE + 8 octets de nonce LE). Rétrocompatible avec l'ancien format de 16 octets (solde uniquement).
Sécurité : credit() et debit() utilisent l'arithmétique vérifiée pour prévenir les dépassements positifs et négatifs.
Limites de frais
pub struct FeeLimits {
pub min_fee: u128, // défaut : 0,0001 SAVT (10^14)
pub max_fee: u128, // défaut : 1,0 SAVT (10^18)
}
Primitives cryptographiques
Signatures
| Algorithme | Bibliothèque | Usage |
|---|---|---|
| Ed25519 | ed25519-dalek | Signature de transactions, signature de blocs, identité des pairs |
Tailles des clés :
- Clé privée : 32 octets
- Clé publique : 32 octets
- Signature : 64 octets
- Adresse : clé publique encodée en hexadécimal (64 caractères hex)
Fonctions de hachage
| Fonction | Bibliothèque | Usage |
|---|---|---|
| SHA-256 | sha2 | Hachage du message de signature de transaction |
| SHA-512 | sha2 | Hachage de bloc (avec étiquette de domaine "BLK" + octet de version) |
| BLAKE3 | blake3 | Calcul de la racine d'état, hachage rapide |
| Keccak256 | sha3 | Dérivation du slot de stockage de contrat |
Hachage avec étiquette de domaine
Pour prévenir les collisions de hachage entre domaines, tous les hachages incluent des étiquettes de domaine :
| Domaine | Étiquette | Description |
|---|---|---|
| Bloc | "BLK" + octet de version | Hachage de bloc |
| Racine de transaction | Étiquette de feuille "TXv1" | Accumulateur glissant sur bincode |
| Racine d'état | Graine "STATEv1-LE" | Instantané de base de données lexicographique |
Gestion des clés
pub struct KeyManager {
// Charger ou générer une paire de clés d'identité
pub fn load_or_generate(path: &Path) -> Result<KeyPair>;
// Générer une nouvelle paire de clés
pub fn generate() -> KeyPair;
}
pub struct KeyPair {
pub signing_key: SigningKey,
pub verifying_key: VerifyingKey,
}
Les clés sont persistées sur disque au format brut de 32 octets. MemoryKeyStorage fournit un stockage en mémoire pour les tests.
Chiffrement
Chiffrement AES-GCM pour les données sensibles au repos :
// Chiffrer avec une clé dérivée du mot de passe
let encrypted = encrypt_aes_gcm(plaintext, password)?;
// Déchiffrer
let plaintext = decrypt_aes_gcm(ciphertext, password)?;
Planificateur de slots
Planification déterministe des slots pour la rotation des leaders :
pub struct SlotScheduler {
slot_duration_ms: u64,
base_ms: u64,
validators: Vec<String>,
local_id: String,
}
pub enum SlotRole {
Leader, // produit des blocs dans ce slot
Follower, // valide les blocs
Observer, // observe uniquement (nœuds gardiens)
}
pub struct SlotInfo {
pub slot: u64,
pub round: u32,
pub leader: Option<String>,
pub role: SlotRole,
pub start_ms: u64,
pub end_ms: u64,
}
Attribution du leader : leader_index = slot % validators.len(). Déterministe pour un même ensemble de validateurs et un même numéro de slot.
Monolithe
Les monolithes compressent plusieurs blocs en une structure unique pour un archivage et une synchronisation efficaces :
pub struct MonolithHeader {
pub exec_height: u64, // hauteur d'exécution
pub window_start: u64, // premier bloc dans le monolithe
pub epoch_id: u64, // identifiant d'époque
pub block_count: u64, // nombre de blocs inclus
pub size_bytes: u64, // taille totale
pub monolith_id: String, // identifiant unique
pub produced_at_ms: u64, // horodatage de production
pub cosignatures: Vec<..>, // cosignatures des validateurs
}
Métriques
Le système de métriques fournit des métriques compatibles Prometheus :
pub struct MetricsProvider {
// Enregistrer des compteurs, jauges, histogrammes
pub fn register_counter(name: &str, help: &str) -> Counter;
pub fn register_gauge(name: &str, help: &str) -> Gauge;
}
Catégories : blockchain, mempool, réseau, stockage, exécution, système, sécurité, tokenomics.
Point d'accès : http://127.0.0.1:9090/metrics (intervalle de mise à jour de 5 secondes).
Structure à double cœur
Il existe deux répertoires savitri-core :
| Chemin | Objectif | Dépendances |
|---|---|---|
Savitri-core/Savitri-core/ | Autonome (prêt pour crates.io) | Zéro dépendance interne |
Savitri-core/ | Version étendue | savitri-storage, savitri-zkp |
La version autonome est sous licence MIT et convient à une utilisation externe. La version étendue ajoute des fonctionnalités telles que l'intégration RocksDB, la compression et le support libp2p.