encapsulate proof

This commit is contained in:
Sergio Chouhy 2025-08-19 10:47:24 -03:00
parent 769e372e8f
commit 538bb72556

View File

@ -14,13 +14,22 @@ pub mod circuit {
program::{InstructionData, ProgramOutput}, program::{InstructionData, ProgramOutput},
}; };
use rand::{Rng, RngCore, rngs::OsRng}; use rand::{Rng, RngCore, rngs::OsRng};
use risc0_zkvm::{ExecutorEnv, Receipt, default_prover}; use risc0_zkvm::{ExecutorEnv, InnerReceipt, Receipt, default_prover};
use crate::{error::NssaError, program::Program}; use crate::{error::NssaError, program::Program};
use program_methods::PRIVACY_PRESERVING_CIRCUIT_ELF; use program_methods::{PRIVACY_PRESERVING_CIRCUIT_ELF, PRIVACY_PRESERVING_CIRCUIT_ID};
pub type Proof = Vec<u8>; #[derive(Debug, Clone, PartialEq, Eq)]
pub struct Proof(Vec<u8>);
impl Proof {
pub(crate) fn is_valid_for(&self, circuit_output: &PrivacyPreservingCircuitOutput) -> bool {
let inner: InnerReceipt = borsh::from_slice(&self.0).unwrap();
let receipt = Receipt::new(inner, circuit_output.to_bytes());
receipt.verify(PRIVACY_PRESERVING_CIRCUIT_ID).is_ok()
}
}
/// Executes and proves the program `P`. /// Executes and proves the program `P`.
/// Returns the proof /// Returns the proof
@ -84,7 +93,7 @@ pub mod circuit {
let prover = default_prover(); let prover = default_prover();
let prove_info = prover.prove(env, PRIVACY_PRESERVING_CIRCUIT_ELF).unwrap(); let prove_info = prover.prove(env, PRIVACY_PRESERVING_CIRCUIT_ELF).unwrap();
let proof = borsh::to_vec(&prove_info.receipt.inner)?; let proof = Proof(borsh::to_vec(&prove_info.receipt.inner)?);
let circuit_output: PrivacyPreservingCircuitOutput = prove_info let circuit_output: PrivacyPreservingCircuitOutput = prove_info
.receipt .receipt
@ -108,7 +117,6 @@ mod tests {
EncryptedAccountData, EncryptedAccountData,
account::{Account, AccountWithMetadata, NullifierPublicKey, NullifierSecretKey}, account::{Account, AccountWithMetadata, NullifierPublicKey, NullifierSecretKey},
}; };
use program_methods::PRIVACY_PRESERVING_CIRCUIT_ID;
use risc0_zkvm::{InnerReceipt, Journal, Receipt}; use risc0_zkvm::{InnerReceipt, Journal, Receipt};
use crate::{ use crate::{
@ -159,9 +167,7 @@ mod tests {
) )
.unwrap(); .unwrap();
let inner: InnerReceipt = borsh::from_slice(&proof).unwrap(); assert!(proof.is_valid_for(&output));
let receipt = Receipt::new(inner, output.to_bytes());
receipt.verify(PRIVACY_PRESERVING_CIRCUIT_ID).unwrap();
let [sender_pre] = output.public_pre_states.try_into().unwrap(); let [sender_pre] = output.public_pre_states.try_into().unwrap();
let [sender_post] = output.public_post_states.try_into().unwrap(); let [sender_post] = output.public_post_states.try_into().unwrap();