Saltar al contenido principal

Sistema de Pruebas de Conocimiento Cero

savitri-zkp proporciona un framework de pruebas de conocimiento cero con múltiples backends para la verificación de integridad de bloques y los compromisos de monolith.

Backends

BackendIndicador de CaracterísticaBibliotecaCaso de Uso
MockmockNingunaDesarrollo y pruebas
PLONKplonkhalo2_proofsZKP de propósito general
Arkworksarkworksark-bn254, Groth16Producción (curva BN254)

Por defecto: ningún backend habilitado. El backend mock se usa para desarrollo.

Seguridad: El sistema falla si se solicita un backend de producción sin el indicador de característica correspondiente. Nunca recurre silenciosamente al MockVerifier.

Configuración

pub struct ZkpConfig {
pub backend: ZkpBackend,
pub max_proof_size: usize, // bytes
pub verification_timeout_ms: u64,
}

// Preajustes
ZkpConfig::development() // Mock, 1MB, 5s
ZkpConfig::testing() // Mock, 512KB, 1s
ZkpConfig::production() // Arkworks, 4MB, 15s

Tipos Fundamentales

Statement

Un statement contiene las entradas públicas de una prueba:

pub struct Statement {
pub a: [u8; 32], // campo de compromiso
pub b: [u8; 32], // campo de compromiso
pub c: [u8; 32], // campo de compromiso
pub d: [u8; 32], // campo de compromiso
pub e: u64, // campo escalar
pub f: u64, // campo escalar
}

ZkProof

pub struct ZkProof {
pub proof: Vec<u8>,
pub public_inputs: Vec<u8>,
pub verification_key: Vec<u8>,
}

API del Verificador

pub trait ZkVerifier: Send + Sync {
fn verify(&self, statement: &Statement, proof: &ZkProof) -> Result<bool>;
fn batch_verify(&self, statements: &[Statement], proofs: &[ZkProof]) -> Result<Vec<bool>>;
}

Crear un Verificador

use savitri_zkp::{create_verifier, ZkpConfig, ZkpBackend};

// Desarrollo
let verifier = create_verifier(ZkpConfig::development())?;

// Producción (requiere la característica `arkworks`)
let verifier = create_verifier(ZkpConfig::production())?;

// Verificar una prueba
let is_valid = verifier.verify(&statement, &proof)?;

// Verificación por lote
let results = verifier.batch_verify(&statements, &proofs)?;

API del Probador

pub trait ZkProver: Send + Sync {
fn prove(&self, statement: &Statement) -> Result<ZkProof>;
}

Probador Arkworks

// Configuración de confianza (genera claves de prueba + verificación)
let prover = ArkworksProver::from_setup()?;

// A partir de claves existentes
let prover = ArkworksProver::from_keys(pk_bytes, vk_bytes)?;

// Generar prueba
let proof = prover.prove(&statement)?;

El probador Arkworks usa una semilla determinista (SHA-256("savitri-monolith-sum-circuit-setup-v1")) para una configuración de confianza reproducible.

Integración con Monolith

ZKP se usa para verificar los compromisos de bloques monolith:

Cabecera Monolith

pub struct MonolithHeader {
pub headers_commit: [u8; 64], // árbol binario SHA-512 de cabeceras de bloques
pub state_commit: [u8; 64], // compromiso de instantánea de estado
pub exec_height: u64, // altura de ejecución
pub epoch_id: u64, // identificador de época
}

Compromiso de Cabeceras

Las cabeceras de bloque se comprometen usando una reducción de árbol binario:

leaf_0 = H(block_header_0)
leaf_1 = H(block_header_1)
...
node_01 = SHA-512(leaf_0 || leaf_1)
node_23 = SHA-512(leaf_2 || leaf_3)
...
root = SHA-512(node_01..n-1 || node_23..n)

Compromiso Monolith

El compromiso completo vincula todos los campos del monolith:

commitment = SHA-256(
headers_commit || state_commit || exec_height || epoch_id || prev_state_root
)

Verificación

use savitri_zkp::monolith::monolith_zkp;

// Verificar una prueba monolith
let is_valid = monolith_zkp::verify_monolith_proof(
&verifier,
&monolith_header,
&proof,
prev_epoch_id,
)?;

// Generar una prueba monolith
let proof = monolith_zkp::generate_monolith_proof(
&prover,
&monolith_header,
)?;

Indicadores de Característica

[features]
default = []
mock = [] # MockVerifier (siempre válido)
plonk = ["halo2_proofs"] # backend PLONK
arkworks = ["ark-bn254", "ark-groth16", "ark-snark", "ark-relations", "ark-serialize", "ark-std"]
circom = [] # Reservado para soporte futuro de Circom
production = ["arkworks"] # Alias de producción
advanced = ["plonk", "arkworks"]
all_backends = ["mock", "plonk", "arkworks"]

Dependencias

DependenciaBackendVersión
ark-bn254ArkworksÚltima
ark-groth16ArkworksÚltima
halo2_proofsPLONKÚltima
sha2, sha3, blake3TodosHash central
bincodeTodosSerialización

Sin Dependencia de savitri-core

savitri-zkp tiene cero dependencias internas de Savitri para evitar cadenas de dependencias circulares. Se comunica con otros crates a través de los tipos Statement y ZkProof.