miden_protocol/transaction/
verifier.rs1use miden_verifier::verify_with_precompiles;
2
3use crate::CoreLibrary;
4use crate::errors::TransactionVerifierError;
5use crate::transaction::{ProvenTransaction, TransactionKernel};
6use crate::vm::ProgramInfo;
7
8pub struct TransactionVerifier {
17 tx_program_info: ProgramInfo,
18 proof_security_level: u32,
19}
20
21impl TransactionVerifier {
22 pub fn new(proof_security_level: u32) -> Self {
24 let tx_program_info = TransactionKernel::program_info();
25 Self { tx_program_info, proof_security_level }
26 }
27
28 pub fn verify(&self, transaction: &ProvenTransaction) -> Result<(), TransactionVerifierError> {
35 let stack_inputs = TransactionKernel::build_input_stack(
37 transaction.account_id(),
38 transaction.account_update().initial_state_commitment(),
39 transaction.input_notes().commitment(),
40 transaction.ref_block_commitment(),
41 transaction.ref_block_num(),
42 );
43 let stack_outputs = TransactionKernel::build_output_stack(
44 transaction.account_update().final_state_commitment(),
45 transaction.account_update().account_patch_commitment(),
46 transaction.output_notes().commitment(),
47 transaction.expiration_block_num(),
48 );
49
50 let precompile_verifiers = CoreLibrary::default().verifier_registry();
52 let proof_security_level = verify_with_precompiles(
53 self.tx_program_info.clone(),
54 stack_inputs,
55 stack_outputs,
56 transaction.proof().clone(),
57 &precompile_verifiers,
58 )
59 .map_err(TransactionVerifierError::TransactionVerificationFailed)?
60 .0;
61
62 if proof_security_level < self.proof_security_level {
64 return Err(TransactionVerifierError::InsufficientProofSecurityLevel {
65 actual: proof_security_level,
66 expected_minimum: self.proof_security_level,
67 });
68 }
69
70 Ok(())
71 }
72}