Система доказательств с нулевым разглашением
savitri-zkp предоставляет мультибэкендовый фреймворк доказательств с нулевым разглашением для верификации целостности блоков и обязательств монолитов.
Бэкенды
| Бэкенд | Флаг функции | Библиотека | Применение |
|---|---|---|---|
| Mock | mock | None | Разработка и тестирование |
| PLONK | plonk | halo2_proofs | ZKP общего назначения |
| Arkworks | arkworks | ark-bn254, Groth16 | Продакшн (кривая BN254) |
По умолчанию бэкенд не включён. Для разработки используется бэкенд mock.
Безопасность: Система завершает работу с паникой, если запрошен продакшн-бэкенд без соответствующего флага функции. Никогда не выполняется тихий откат к MockVerifier.
Конфигурация
pub struct ZkpConfig {
pub backend: ZkpBackend,
pub max_proof_size: usize, // байты
pub verification_timeout_ms: u64,
}
// Предустановки
ZkpConfig::development() // Mock, 1МБ, 5с
ZkpConfig::testing() // Mock, 512КБ, 1с
ZkpConfig::production() // Arkworks, 4МБ, 15с
Базовые типы
Statement (утверждение)
Утверждение содержит публичные входные данные для доказательства:
pub struct Statement {
pub a: [u8; 32], // поле обязательства
pub b: [u8; 32], // поле обязательства
pub c: [u8; 32], // поле обязательства
pub d: [u8; 32], // поле обязательства
pub e: u64, // скалярное поле
pub f: u64, // скалярное поле
}
ZkProof (доказательство)
pub struct ZkProof {
pub proof: Vec<u8>,
pub public_inputs: Vec<u8>,
pub verification_key: Vec<u8>,
}
API верификатора
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>>;
}
Создание верификатора
use savitri_zkp::{create_verifier, ZkpConfig, ZkpBackend};
// Разработка
let verifier = create_verifier(ZkpConfig::development())?;
// Продакшн (требует функцию `arkworks`)
let verifier = create_verifier(ZkpConfig::production())?;
// Верификация доказательства
let is_valid = verifier.verify(&statement, &proof)?;
// Пакетная верификация
let results = verifier.batch_verify(&statements, &proofs)?;
API прувера
pub trait ZkProver: Send + Sync {
fn prove(&self, statement: &Statement) -> Result<ZkProof>;
}
Прувер Arkworks
// Доверенная настройка (генерирует ключи доказательства + верификации)
let prover = ArkworksProver::from_setup()?;
// Из существующих ключей
let prover = ArkworksProver::from_keys(pk_bytes, vk_bytes)?;
// Генерация доказательства
let proof = prover.prove(&statement)?;
Прувер Arkworks использует детерминированное начальное значение (SHA-256("savitri-monolith-sum-circuit-setup-v1")) для воспроизводимой доверенной настройки.
Интеграция с монолитами
ZKP используется для верификации обязательств блоков монолита:
Заголовок монолита
pub struct MonolithHeader {
pub headers_commit: [u8; 64], // бинарное дерево SHA-512 заголовков блоков
pub state_commit: [u8; 64], // обязательство снимка состояния
pub exec_height: u64, // высота выполнения
pub epoch_id: u64, // идентификатор эпохи
}
Обязательство заголовков
Заголовки блоков фиксируются с помощью бинарного дерева редукций:
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)
Обязательство монолита
Полное обязательство связывает все поля монолита:
commitment = SHA-256(
headers_commit || state_commit || exec_height || epoch_id || prev_state_root
)
Верификация
use savitri_zkp::monolith::monolith_zkp;
// Верификация доказательства монолита
let is_valid = monolith_zkp::verify_monolith_proof(
&verifier,
&monolith_header,
&proof,
prev_epoch_id,
)?;
// Генерация доказательства монолита
let proof = monolith_zkp::generate_monolith_proof(
&prover,
&monolith_header,
)?;
Флаги функций
[features]
default = []
mock = [] # MockVerifier (всегда валидный)
plonk = ["halo2_proofs"] # бэкенд PLONK
arkworks = ["ark-bn254", "ark-groth16", "ark-snark", "ark-relations", "ark-serialize", "ark-std"]
circom = [] # Зарезервировано для будущей поддержки Circom
production = ["arkworks"] # Псевдоним для продакшна
advanced = ["plonk", "arkworks"]
all_backends = ["mock", "plonk", "arkworks"]
Зависимости
| Зависимость | Бэкенд | Версия |
|---|---|---|
ark-bn254 | Arkworks | Последняя |
ark-groth16 | Arkworks | Последняя |
halo2_proofs | PLONK | Последняя |
sha2, sha3, blake3 | Все | Основное хеширование |
bincode | Все | Сериализация |
Отсутствие зависимости от savitri-core
savitri-zkp имеет нулевые внутренние зависимости Savitri для избежания циклических зависимостей. Взаимодействие с другими крейтами осуществляется через типы Statement и ZkProof.