零知识证明系统
savitri-zkp 提供一个多后端零知识证明框架,用于区块完整性验证和巨石块承诺。
后端
| 后端 | 特性标志 | 库 | 用途 |
|---|---|---|---|
| Mock | mock | 无 | 开发和测试 |
| PLONK | plonk | halo2_proofs | 通用 ZKP |
| Arkworks | arkworks | ark-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-bn254 | Arkworks | 最新版 |
ark-groth16 | Arkworks | 最新版 |
halo2_proofs | PLONK | 最新版 |
sha2、sha3、blake3 | 所有后端 | 核心哈希 |
bincode | 所有后端 | 序列化 |
无 savitri-core 依赖
savitri-zkp 对 Savitri 内部无任何依赖,以避免循环依赖链。它通过 Statement 和 ZkProof 类型与其他 crate 通信。