Spécification Cryptographique
Spécification complète de toutes les primitives cryptographiques utilisées dans le Savitri Network.
Schéma de Signature
| Propriété | Valeur |
|---|---|
| Algorithme | Ed25519 |
| Bibliothèque | ed25519-dalek |
| Clé privée | 32 octets |
| Clé publique | 32 octets (point d'Edwards compressé) |
| Signature | 64 octets |
| Adresse | Clé publique encodée en hexadécimal (64 caractères hex) |
Signature de Transaction
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)
Signature de Bloc
Les blocs sont signés par le proposant en utilisant Ed25519 sur le hachage de l'en-tête de bloc (SHA-512).
Identité des Pairs
Les pairs libp2p utilisent Ed25519 pour leurs clés d'identité de pair (distinctes des clés de compte).
Fonctions de Hachage
SHA-256
| Utilisation | Entrée | Sortie |
|---|---|---|
| Message de signature de transaction | Octets TX canoniques | 32 octets |
| Engagement monolithe | Champs d'en-tête | 32 octets |
| Hachage de déclaration ZKP | Champs de déclaration | 32 octets |
| Dérivation de clé AES | Mot de passe | 32 octets |
SHA-512
| Utilisation | Entrée | Sortie |
|---|---|---|
| Hachage de bloc | "BLK" + octet de version + octets d'en-tête | 64 octets |
| Engagement des en-têtes | Arbre binaire des en-têtes de bloc | 64 octets |
BLAKE3
| Utilisation | Entrée | Sortie |
|---|---|---|
| Hachage rapide | Usage général | Variable |
| Calcul d'état | Données d'état | 32 octets |
Keccak256
| Utilisation | Entrée | Sortie |
|---|---|---|
| Emplacements de stockage des contrats | address || base_slot | 8 octets (u64) |
| Mappages imbriqués | key || inner_hash | 8 octets (u64) |
Séparation de Domaine
Tous les calculs de hachage incluent des balises de domaine pour éviter les collisions inter-domaines :
| Domaine | Balise | Hachage | Sortie |
|---|---|---|---|
| Bloc | "BLK" + version: u8 | SHA-512 | 64 octets |
| Racine TX | Balise feuille "TXv1" | Accumulateur progressif | 32 octets |
| Racine d'état | Graine "STATEv1-LE" + feuille "STATE" | Instantané lexicographique | 32 octets |
Racine des Transactions
Calculée comme un accumulateur progressif sur le bincode canonique des transactions :
accumulator = H("TXv1")
for tx in transactions:
leaf = bincode::serialize(tx)
accumulator = H(accumulator || leaf)
tx_root = accumulator
Racine d'État
Calculée à partir d'un instantané lexicographique de la base de données :
seed = H("STATEv1-LE")
for (key, value) in storage.iter_sorted():
leaf = H("STATE" || key || value)
seed = H(seed || leaf)
state_root = seed
Chiffrement
AES-256-GCM (Au Repos)
Utilisé pour :
- Le chiffrement des clés privées dans le SDK
- Le chiffrement des colonnes de base de données mobile
- Le chiffrement des données des appareils dans le connecteur IoT
| Propriété | Valeur |
|---|---|
| Algorithme | AES-256-GCM |
| Taille de clé | 256 bits |
| Taille du nonce | 96 bits (12 octets) |
| Taille de la balise | 128 bits (16 octets) |
| Dérivation de clé | Basée sur un mot de passe |
Chiffrement P2P
| Propriété | Valeur |
|---|---|
| Protocole | Noise (modèle de poignée de main XX) |
| Échange de clés | X25519 |
| Chiffre | ChaChaPoly |
| Multiplexage | Yamux |
Dérivation de Clés (Mobile)
BIP-39
- Liste de mots : Anglais (2048 mots)
- Entropie : 128 bits (12 mots) ou 256 bits (24 mots)
- Mnémonique → Graine : PBKDF2-HMAC-SHA512 (2048 tours)
BIP-44
- Chemin :
m/44'/1337'/0'/0/0 - Type de pièce : 1337 (Savitri)
- Compte : 0
- Changement : 0 (externe)
- Index : 0
Hiérarchie des Clés
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)
Preuves à Connaissance Nulle
Voir Architecture ZKP pour plus de détails.
| Backend | Courbe | Système de Preuve | Cas d'Usage |
|---|---|---|---|
| Mock | N/A | Toujours valide | Tests |
| Arkworks | BN254 | Groth16 | Production |
| PLONK | BN254 | PLONK | Usage général |
Propriétés de Sécurité
Opérations en Temps Constant
Toute vérification de signature utilise une comparaison en temps constant (via la crate subtle) pour prévenir les attaques par canal auxiliaire temporel.
Zéroïsation des Clés
Les clés privées sont zéroïsées à la libération en utilisant la crate zeroize dans le SDK et l'application mobile.
Protection contre la Rediffusion
- Transactions : Basée sur le nonce (strictement croissant par compte)
- Mises à jour FL : Nonce par session par entraîneur
- Flux oracle : Suivi du numéro de séquence
- Messages P2P : Déduplication Gossipsub