From 538bb72556d986f66b6562765ff7bf34263ccb65 Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Tue, 19 Aug 2025 10:47:24 -0300 Subject: [PATCH] encapsulate proof --- .../src/privacy_preserving_transaction/mod.rs | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/nssa/src/privacy_preserving_transaction/mod.rs b/nssa/src/privacy_preserving_transaction/mod.rs index 0caba33..be229b7 100644 --- a/nssa/src/privacy_preserving_transaction/mod.rs +++ b/nssa/src/privacy_preserving_transaction/mod.rs @@ -14,13 +14,22 @@ pub mod circuit { program::{InstructionData, ProgramOutput}, }; 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 program_methods::PRIVACY_PRESERVING_CIRCUIT_ELF; + use program_methods::{PRIVACY_PRESERVING_CIRCUIT_ELF, PRIVACY_PRESERVING_CIRCUIT_ID}; - pub type Proof = Vec; + #[derive(Debug, Clone, PartialEq, Eq)] + pub struct Proof(Vec); + + 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`. /// Returns the proof @@ -84,7 +93,7 @@ pub mod circuit { let prover = default_prover(); 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 .receipt @@ -108,7 +117,6 @@ mod tests { EncryptedAccountData, account::{Account, AccountWithMetadata, NullifierPublicKey, NullifierSecretKey}, }; - use program_methods::PRIVACY_PRESERVING_CIRCUIT_ID; use risc0_zkvm::{InnerReceipt, Journal, Receipt}; use crate::{ @@ -159,9 +167,7 @@ mod tests { ) .unwrap(); - let inner: InnerReceipt = borsh::from_slice(&proof).unwrap(); - let receipt = Receipt::new(inner, output.to_bytes()); - receipt.verify(PRIVACY_PRESERVING_CIRCUIT_ID).unwrap(); + assert!(proof.is_valid_for(&output)); let [sender_pre] = output.public_pre_states.try_into().unwrap(); let [sender_post] = output.public_post_states.try_into().unwrap();