Aller au contenu principal

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

AlgorithmeBibliothèqueUsage
Ed25519ed25519-dalekSignature 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

FonctionBibliothèqueUsage
SHA-256sha2Hachage du message de signature de transaction
SHA-512sha2Hachage de bloc (avec étiquette de domaine "BLK" + octet de version)
BLAKE3blake3Calcul de la racine d'état, hachage rapide
Keccak256sha3Dé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ÉtiquetteDescription
Bloc"BLK" + octet de versionHachage de bloc
Racine de transactionÉtiquette de feuille "TXv1"Accumulateur glissant sur bincode
Racine d'étatGraine "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 :

CheminObjectifDépendances
Savitri-core/Savitri-core/Autonome (prêt pour crates.io)Zéro dépendance interne
Savitri-core/Version étenduesavitri-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.