메인 콘텐츠로 건너뛰기

영지식 증명 시스템

savitri-zkp은 블록 무결성 검증 및 monolith 커밋을 위한 영지식 증명(ZKP) 다중 백엔드 프레임워크를 제공합니다.

백엔드

백엔드기능 플래그라이브러리사용 사례
Mockmock없음개발 및 테스트
PLONKplonkhalo2_proofs범용 ZKP
Arkworksarkworksark-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-bn254Arkworks최신
ark-groth16Arkworks최신
halo2_proofsPLONK최신
sha2, sha3, blake3모두코어 해싱
bincode모두직렬화

savitri-core에 대한 의존성 없음

savitri-zkp은 순환 의존성 체인을 방지하기 위해 Savitri 내부 의존성이 전혀 없습니다. StatementZkProof 타입을 통해 다른 크레이트와 통신합니다.