Passa al contenuto principale

Specifica Crittografica

Specifica completa di tutte le primitive crittografiche utilizzate nella Savitri Network.

Schema di Firma

ProprietàValore
AlgoritmoEd25519
Libreriaed25519-dalek
Chiave privata32 byte
Chiave pubblica32 byte (punto di Edwards compresso)
Firma64 byte
IndirizzoChiave pubblica con codifica esadecimale (64 caratteri hex)

Firma delle Transazioni

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)

Firma dei Blocchi

I blocchi vengono firmati dal proposer tramite Ed25519 sull'hash dell'intestazione del blocco (SHA-512).

Identità dei Peer

I peer libp2p utilizzano Ed25519 per le loro chiavi di identità peer (separate dalle chiavi dell'account).

Funzioni Hash

SHA-256

UtilizzoInputOutput
Messaggio di firma transazioneByte TX canonici32 byte
Impegno MonolithCampi intestazione32 byte
Hash statement ZKPCampi statement32 byte
Derivazione chiave AESPassword32 byte

SHA-512

UtilizzoInputOutput
Hash blocco"BLK" + byte versione + byte intestazione64 byte
Commit intestazioniAlbero binario delle intestazioni blocco64 byte

BLAKE3

UtilizzoInputOutput
Hash veloceUso generaleVariabile
Calcolo dello statoDati di stato32 byte

Keccak256

UtilizzoInputOutput
Slot storage contractaddress || base_slot8 byte (u64)
Mapping annidatikey || inner_hash8 byte (u64)

Separazione dei Domini

Tutti i calcoli hash includono tag di dominio per prevenire collisioni tra domini:

DominioTagHashOutput
Blocco"BLK" + version: u8SHA-51264 byte
Radice TXTag foglia "TXv1"Accumulatore rolling32 byte
Radice di statoSeed "STATEv1-LE" + foglia "STATE"Snapshot lessicografico32 byte

Radice delle Transazioni

Calcolata come accumulatore rolling sul bincode canonico delle transazioni:

accumulator = H("TXv1")
for tx in transactions:
leaf = bincode::serialize(tx)
accumulator = H(accumulator || leaf)
tx_root = accumulator

Radice di Stato

Calcolata da uno snapshot lessicografico del database:

seed = H("STATEv1-LE")
for (key, value) in storage.iter_sorted():
leaf = H("STATE" || key || value)
seed = H(seed || leaf)
state_root = seed

Cifratura

AES-256-GCM (A Riposo)

Utilizzato per:

  • Cifratura delle chiavi private nell'SDK
  • Cifratura delle colonne del database mobile
  • Cifratura dei dati dei dispositivi nel connettore IoT
ProprietàValore
AlgoritmoAES-256-GCM
Dimensione chiave256 bit
Dimensione nonce96 bit (12 byte)
Dimensione tag128 bit (16 byte)
Derivazione chiaveBasata su password

Cifratura P2P

ProprietàValore
ProtocolloNoise (pattern di handshake XX)
Scambio di chiaviX25519
CifrarioChaChaPoly
MultiplexingYamux

Derivazione delle Chiavi (Mobile)

BIP-39

  • Wordlist: Inglese (2048 parole)
  • Entropia: 128 bit (12 parole) o 256 bit (24 parole)
  • Mnemonica → Seed: PBKDF2-HMAC-SHA512 (2048 iterazioni)

BIP-44

  • Percorso: m/44'/1337'/0'/0/0
  • Tipo di moneta: 1337 (Savitri)
  • Account: 0
  • Change: 0 (esterno)
  • Indice: 0

Gerarchia delle Chiavi

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)

Prove a Conoscenza Zero

Vedi Architettura ZKP per i dettagli.

BackendCurvaSistema di ProveCaso d'Uso
MockN/ASempre validoTest
ArkworksBN254Groth16Produzione
PLONKBN254PLONKUso generale

Proprietà di Sicurezza

Operazioni a Tempo Costante

Tutta la verifica delle firme utilizza confronti a tempo costante (tramite crate subtle) per prevenire attacchi side-channel basati sul timing.

Azzeramento delle Chiavi

Le chiavi private vengono azzerate al drop tramite il crate zeroize sia nell'SDK che nell'app mobile.

Protezione dal Replay

  • Transazioni: Basata sul nonce (monotonicamente crescente per account)
  • Aggiornamenti FL: Nonce per round per trainer
  • Feed oracle: Tracciamento del numero di sequenza
  • Messaggi P2P: Deduplicazione Gossipsub