跳到主要内容

零知识证明系统

savitri-zkp 提供一个多后端零知识证明框架,用于区块完整性验证和巨石块承诺。

后端

后端特性标志用途
Mockmock开发和测试
PLONKplonkhalo2_proofs通用 ZKP
Arkworksarkworksark-bn254、Groth16生产环境(BN254 曲线)

默认情况下不启用任何后端。开发时使用 mock 后端。

安全性:若请求生产后端但未启用对应特性标志,系统将 panic,绝不会悄然回退至 MockVerifier。

配置

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

// 预设配置
ZkpConfig::development() // Mock,1MB,5 秒
ZkpConfig::testing() // Mock,512KB,1 秒
ZkpConfig::production() // Arkworks,4MB,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 用于验证巨石块区块承诺:

巨石块头(Monolith Header)

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-bn254Arkworks最新版
ark-groth16Arkworks最新版
halo2_proofsPLONK最新版
sha2sha3blake3所有后端核心哈希
bincode所有后端序列化

无 savitri-core 依赖

savitri-zkp 对 Savitri 内部无任何依赖,以避免循环依赖链。它通过 StatementZkProof 类型与其他 crate 通信。