Browse Source

Move cmu and epk parsing onto CompactOutput struct

master
Jack Grigg 5 years ago
parent
commit
b44653e686
No known key found for this signature in database
GPG Key ID: 9E8255172BBF9898
  1. 31
      zcash_client_backend/src/proto/mod.rs
  2. 25
      zcash_client_backend/src/welding_rig.rs

31
zcash_client_backend/src/proto/mod.rs

@ -1,6 +1,12 @@
//! Generated code for handling light client protobuf structs. //! Generated code for handling light client protobuf structs.
use zcash_primitives::block::{BlockHash, BlockHeader}; use ff::{PrimeField, PrimeFieldRepr};
use pairing::bls12_381::{Bls12, Fr, FrRepr};
use zcash_primitives::{
block::{BlockHash, BlockHeader},
jubjub::{edwards, PrimeOrder},
JUBJUB,
};
pub mod compact_formats; pub mod compact_formats;
@ -52,3 +58,26 @@ impl compact_formats::CompactBlock {
} }
} }
} }
impl compact_formats::CompactOutput {
/// Returns the note commitment for this output.
///
/// A convenience method that parses [`CompactOutput.cmu`].
///
/// [`CompactOutput.cmu`]: #structfield.cmu
pub fn cmu(&self) -> Result<Fr, ()> {
let mut repr = FrRepr::default();
repr.read_le(&self.cmu[..]).map_err(|_| ())?;
Fr::from_repr(repr).map_err(|_| ())
}
/// Returns the ephemeral public key for this output.
///
/// A convenience method that parses [`CompactOutput.epk`].
///
/// [`CompactOutput.epk`]: #structfield.epk
pub fn epk(&self) -> Result<edwards::Point<Bls12, PrimeOrder>, ()> {
let p = edwards::Point::<Bls12, _>::read(&self.epk[..], &JUBJUB).map_err(|_| ())?;
p.as_prime_order(&JUBJUB).ok_or(())
}
}

25
zcash_client_backend/src/welding_rig.rs

@ -1,17 +1,15 @@
//! Tools for scanning a compact representation of the Zcash block chain. //! Tools for scanning a compact representation of the Zcash block chain.
use ff::{PrimeField, PrimeFieldRepr}; use ff::PrimeField;
use pairing::bls12_381::{Bls12, Fr, FrRepr};
use std::collections::HashSet; use std::collections::HashSet;
use subtle::{ConditionallySelectable, ConstantTimeEq, CtOption}; use subtle::{ConditionallySelectable, ConstantTimeEq, CtOption};
use zcash_primitives::{ use zcash_primitives::{
jubjub::{edwards, fs::Fs}, jubjub::fs::Fs,
merkle_tree::{CommitmentTree, IncrementalWitness}, merkle_tree::{CommitmentTree, IncrementalWitness},
note_encryption::try_sapling_compact_note_decryption, note_encryption::try_sapling_compact_note_decryption,
sapling::Node, sapling::Node,
transaction::TxId, transaction::TxId,
zip32::ExtendedFullViewingKey, zip32::ExtendedFullViewingKey,
JUBJUB,
}; };
use crate::proto::compact_formats::{CompactBlock, CompactOutput}; use crate::proto::compact_formats::{CompactBlock, CompactOutput};
@ -33,23 +31,8 @@ fn scan_output(
block_witnesses: &mut [&mut IncrementalWitness<Node>], block_witnesses: &mut [&mut IncrementalWitness<Node>],
new_witnesses: &mut [IncrementalWitness<Node>], new_witnesses: &mut [IncrementalWitness<Node>],
) -> Option<(WalletShieldedOutput, IncrementalWitness<Node>)> { ) -> Option<(WalletShieldedOutput, IncrementalWitness<Node>)> {
let mut repr = FrRepr::default(); let cmu = output.cmu().ok()?;
if repr.read_le(&output.cmu[..]).is_err() { let epk = output.epk().ok()?;
return None;
}
let cmu = match Fr::from_repr(repr) {
Ok(cmu) => cmu,
Err(_) => return None,
};
let epk = match edwards::Point::<Bls12, _>::read(&output.epk[..], &JUBJUB) {
Ok(p) => match p.as_prime_order(&JUBJUB) {
Some(epk) => epk,
None => return None,
},
Err(_) => return None,
};
let ct = output.ciphertext; let ct = output.ciphertext;
// Increment tree and witnesses // Increment tree and witnesses

Loading…
Cancel
Save