영지식 증명 시스템
savitri-zkp은 블록 무결성 검증 및 monolith 커밋을 위한 영지식 증명(ZKP) 다중 백엔드 프레임워크를 제공합니다.
백엔드
| 백엔드 | 기능 플래그 | 라이브러리 | 사용 사례 |
|---|---|---|---|
| Mock | mock | 없음 | 개발 및 테스트 |
| 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, 1MB, 5초
ZkpConfig::testing() // Mock, 512KB, 1초
ZkpConfig::production() // Arkworks, 4MB, 15초
핵심 타입
Statement
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"))를 사용합니다.
Monolith 통합
ZKP는 monolith 블록 커밋을 검증하는 데 사용됩니다:
Monolith 헤더
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)
Monolith 커밋
전체 커밋은 모든 monolith 필드를 바인딩합니다:
commitment = SHA-256(
headers_commit || state_commit || exec_height || epoch_id || prev_state_root
)
검증
use savitri_zkp::monolith::monolith_zkp;
// monolith 증명 검증
let is_valid = monolith_zkp::verify_monolith_proof(
&verifier,
&monolith_header,
&proof,
prev_epoch_id,
)?;
// monolith 증명 생성
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 타입을 통해 다른 크레이트와 통신합니다.