Skip to main content

pczt/roles/tx_extractor/
sapling.rs

1use rand_core::CryptoRng;
2use sapling::{
3    BatchValidator, Bundle,
4    bundle::Authorized,
5    circuit::{OutputVerifyingKey, SpendVerifyingKey},
6};
7use zcash_protocol::value::ZatBalance;
8
9pub(super) fn verify_bundle(
10    rng: impl CryptoRng,
11    bundle: &Bundle<Authorized, ZatBalance>,
12    spend_vk: &SpendVerifyingKey,
13    output_vk: &OutputVerifyingKey,
14    sighash: [u8; 32],
15) -> Result<(), SaplingError> {
16    let mut validator = BatchValidator::new();
17
18    if !validator.check_bundle(bundle.clone(), sighash) {
19        return Err(SaplingError::ConsensusRuleViolation);
20    }
21
22    if !validator.validate(spend_vk, output_vk, rng) {
23        return Err(SaplingError::InvalidProofsOrSignatures);
24    }
25
26    Ok(())
27}
28
29#[derive(Debug)]
30pub enum SaplingError {
31    ConsensusRuleViolation,
32    Extract(sapling::pczt::TxExtractorError),
33    InvalidProofsOrSignatures,
34}