Revert passing Parameters to methods

This commit is contained in:
therealyingtong 2020-08-05 12:47:29 +08:00
parent 74b2f0a79e
commit a25348dfba
No known key found for this signature in database
GPG Key ID: 179F32A1503D607E
10 changed files with 179 additions and 277 deletions

View File

@ -33,7 +33,6 @@ pub struct DecryptedOutput {
/// [`ExtendedFullViewingKey`]s.
pub fn decrypt_transaction<P: consensus::Parameters>(
height: u32,
parameters: &P,
tx: &Transaction,
extfvks: &[ExtendedFullViewingKey],
) -> Vec<DecryptedOutput> {
@ -52,8 +51,7 @@ pub fn decrypt_transaction<P: consensus::Parameters>(
};
for (account, (ivk, ovk)) in vks.iter().enumerate() {
let ((note, to, memo), outgoing) = match try_sapling_note_decryption(
parameters,
let ((note, to, memo), outgoing) = match try_sapling_note_decryption::<P>(
height,
ivk,
&epk,
@ -61,8 +59,7 @@ pub fn decrypt_transaction<P: consensus::Parameters>(
&output.enc_ciphertext,
) {
Some(ret) => (ret, false),
None => match try_sapling_output_recovery(
parameters,
None => match try_sapling_output_recovery::<P>(
height,
ovk,
&output.cv,

View File

@ -15,3 +15,9 @@ pub mod wallet;
pub mod welding_rig;
pub use decrypt::{decrypt_transaction, DecryptedOutput};
#[cfg(feature = "mainnet")]
pub use zcash_primitives::consensus::MainNetwork as Network;
#[cfg(not(feature = "mainnet"))]
pub use zcash_primitives::consensus::TestNetwork as Network;

View File

@ -24,7 +24,6 @@ use crate::wallet::{WalletShieldedOutput, WalletShieldedSpend, WalletTx};
/// The given [`CommitmentTree`] and existing [`IncrementalWitness`]es are incremented
/// with this output's commitment.
fn scan_output<P: consensus::Parameters>(
parameters: &P,
height: u32,
(index, output): (usize, CompactOutput),
ivks: &[Fs],
@ -53,7 +52,7 @@ fn scan_output<P: consensus::Parameters>(
for (account, ivk) in ivks.iter().enumerate() {
let (note, to) =
match try_sapling_compact_note_decryption(parameters, height, ivk, &epk, &cmu, &ct) {
match try_sapling_compact_note_decryption::<P>(height, ivk, &epk, &cmu, &ct) {
Some(ret) => ret,
None => continue,
};
@ -88,7 +87,6 @@ fn scan_output<P: consensus::Parameters>(
/// The given [`CommitmentTree`] and existing [`IncrementalWitness`]es are
/// incremented appropriately.
pub fn scan_block<P: consensus::Parameters>(
parameters: &P,
block: CompactBlock,
extfvks: &[ExtendedFullViewingKey],
nullifiers: &[(&[u8], usize)],
@ -155,8 +153,7 @@ pub fn scan_block<P: consensus::Parameters>(
.map(|output| &mut output.witness)
.collect();
if let Some(output) = scan_output(
parameters,
if let Some(output) = scan_output::<P>(
block.height as u32,
to_scan,
&ivks,
@ -194,7 +191,6 @@ mod tests {
use pairing::bls12_381::{Bls12, Fr};
use rand_core::{OsRng, RngCore};
use zcash_primitives::{
consensus,
consensus::{NetworkUpgrade, Parameters},
jubjub::{fs::Fs, FixedGenerators, JubjubParams, ToUniform},
merkle_tree::CommitmentTree,
@ -206,7 +202,10 @@ mod tests {
};
use super::scan_block;
use crate::proto::compact_formats::{CompactBlock, CompactOutput, CompactSpend, CompactTx};
use crate::{
proto::compact_formats::{CompactBlock, CompactOutput, CompactSpend, CompactTx},
Network,
};
fn random_compact_tx<R: RngCore>(rng: &mut R) -> CompactTx {
let fake_nf = {
@ -258,7 +257,7 @@ mod tests {
// Create a fake Note for the account
let mut rng = OsRng;
let rseed = if consensus::MainNetwork.is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let rseed = if Network::is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
@ -335,14 +334,7 @@ mod tests {
assert_eq!(cb.vtx.len(), 2);
let mut tree = CommitmentTree::new();
let txs = scan_block(
&consensus::MainNetwork,
cb,
&[extfvk],
&[],
&mut tree,
&mut [],
);
let txs = scan_block::<Network>(cb, &[extfvk], &[], &mut tree, &mut []);
assert_eq!(txs.len(), 1);
let tx = &txs[0];
@ -374,14 +366,7 @@ mod tests {
assert_eq!(cb.vtx.len(), 3);
let mut tree = CommitmentTree::new();
let txs = scan_block(
&consensus::MainNetwork,
cb,
&[extfvk],
&[],
&mut tree,
&mut [],
);
let txs = scan_block::<Network>(cb, &[extfvk], &[], &mut tree, &mut []);
assert_eq!(txs.len(), 1);
let tx = &txs[0];
@ -409,14 +394,7 @@ mod tests {
assert_eq!(cb.vtx.len(), 2);
let mut tree = CommitmentTree::new();
let txs = scan_block(
&consensus::MainNetwork,
cb,
&[],
&[(&nf, account)],
&mut tree,
&mut [],
);
let txs = scan_block::<Network>(cb, &[], &[(&nf, account)], &mut tree, &mut []);
assert_eq!(txs.len(), 1);
let tx = &txs[0];

View File

@ -33,12 +33,17 @@ use zcash_primitives::zip32::ExtendedFullViewingKey;
use zcash_client_backend::constants::mainnet::{
HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, HRP_SAPLING_PAYMENT_ADDRESS,
};
#[cfg(not(feature = "mainnet"))]
use zcash_client_backend::constants::testnet::{
HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, HRP_SAPLING_PAYMENT_ADDRESS,
};
#[cfg(feature = "mainnet")]
pub use zcash_primitives::consensus::MainNetwork as Network;
#[cfg(not(feature = "mainnet"))]
pub use zcash_primitives::consensus::TestNetwork as Network;
pub mod address;
pub mod chain;
pub mod error;
@ -89,6 +94,7 @@ fn get_target_and_anchor_heights(data: &Connection) -> Result<(u32, u32), error:
#[cfg(test)]
mod tests {
use crate::Network;
use ff::{Field, PrimeField};
use pairing::bls12_381::Bls12;
use protobuf::Message;
@ -100,7 +106,6 @@ mod tests {
};
use zcash_primitives::{
block::BlockHash,
consensus,
consensus::{NetworkUpgrade, Parameters},
jubjub::fs::Fs,
note_encryption::{Memo, SaplingNoteEncryption},
@ -122,7 +127,7 @@ mod tests {
// Create a fake Note for the account
let mut rng = OsRng;
let rseed = if consensus::MainNetwork.is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let rseed = if Network::is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
@ -178,7 +183,7 @@ mod tests {
value: Amount,
) -> CompactBlock {
let mut rng = OsRng;
let rseed = if consensus::MainNetwork.is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let rseed = if Network::is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
@ -221,14 +226,13 @@ mod tests {
// Create a fake Note for the change
ctx.outputs.push({
let change_addr = extfvk.default_address().unwrap().1;
let rseed =
if consensus::MainNetwork.is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
} else {
Rseed::BeforeZip212(Fs::random(&mut rng))
};
let rseed = if Network::is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
} else {
Rseed::BeforeZip212(Fs::random(&mut rng))
};
let note = Note {
g_d: change_addr.diversifier().g_d::<Bls12>(&JUBJUB).unwrap(),
pk_d: change_addr.pk_d().clone(),

View File

@ -9,7 +9,6 @@ use zcash_client_backend::{
proto::compact_formats::CompactBlock, welding_rig::scan_block,
};
use zcash_primitives::{
consensus,
merkle_tree::{CommitmentTree, IncrementalWitness},
sapling::Node,
transaction::Transaction,
@ -19,7 +18,7 @@ use zcash_primitives::{
use crate::{
address::RecipientAddress,
error::{Error, ErrorKind},
HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, SAPLING_ACTIVATION_HEIGHT,
Network, HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, SAPLING_ACTIVATION_HEIGHT,
};
struct CompactBlockRow {
@ -188,8 +187,7 @@ pub fn scan_cached_blocks<P: AsRef<Path>, Q: AsRef<Path>>(
let txs = {
let nf_refs: Vec<_> = nullifiers.iter().map(|(nf, acc)| (&nf[..], *acc)).collect();
let mut witness_refs: Vec<_> = witnesses.iter_mut().map(|w| &mut w.witness).collect();
scan_block(
&consensus::MainNetwork,
scan_block::<Network>(
block,
&extfvks[..],
&nf_refs,
@ -383,7 +381,7 @@ pub fn decrypt_and_store_transaction<P: AsRef<Path>>(
row.get(0).or(Ok(last_height + 1))
})?;
let outputs = decrypt_transaction(height as u32, &consensus::MainNetwork, tx, &extfvks);
let outputs = decrypt_transaction::<Network>(height as u32, tx, &extfvks);
if outputs.is_empty() {
// Nothing to see here

View File

@ -27,7 +27,7 @@ use zcash_primitives::{
use crate::{
address::RecipientAddress,
error::{Error, ErrorKind},
get_target_and_anchor_heights, HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY,
get_target_and_anchor_heights, Network, HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY,
};
/// Describes a policy for which outgoing viewing key should be able to decrypt
@ -292,7 +292,7 @@ pub fn create_to_address<P: AsRef<Path>>(
}
match to {
RecipientAddress::Shielded(to) => {
builder.add_sapling_output(ovk, to.clone(), value, memo.clone())
builder.add_sapling_output::<Network>(ovk, to.clone(), value, memo.clone())
}
RecipientAddress::Transparent(to) => builder.add_transparent_output(&to, value),
}?;
@ -393,7 +393,7 @@ mod tests {
query::{get_balance, get_verified_balance},
scan::scan_cached_blocks,
tests::{fake_compact_block, insert_into_cache},
SAPLING_ACTIVATION_HEIGHT,
Network, SAPLING_ACTIVATION_HEIGHT,
};
fn test_prover() -> impl TxProver {
@ -815,8 +815,7 @@ mod tests {
.unwrap();
let output = &tx.shielded_outputs[output_index as usize];
try_sapling_output_recovery(
&consensus::MainNetwork,
try_sapling_output_recovery::<Network>(
SAPLING_ACTIVATION_HEIGHT as u32,
&extfvk.fvk.ovk,
&output.cv,

View File

@ -5,10 +5,10 @@ use std::fmt;
/// Zcash consensus parameters.
pub trait Parameters {
fn activation_height(&self, nu: NetworkUpgrade) -> Option<u32>;
fn activation_height(nu: NetworkUpgrade) -> Option<u32>;
fn is_nu_active(&self, nu: NetworkUpgrade, height: u32) -> bool {
match self.activation_height(nu) {
fn is_nu_active(nu: NetworkUpgrade, height: u32) -> bool {
match Self::activation_height(nu) {
Some(h) if h <= height => true,
_ => false,
}
@ -26,7 +26,7 @@ pub trait Parameters {
pub struct MainNetwork;
impl Parameters for MainNetwork {
fn activation_height(&self, nu: NetworkUpgrade) -> Option<u32> {
fn activation_height(nu: NetworkUpgrade) -> Option<u32> {
match nu {
NetworkUpgrade::Overwinter => Some(347_500),
NetworkUpgrade::Sapling => Some(419_200),
@ -48,7 +48,7 @@ impl Parameters for MainNetwork {
pub struct TestNetwork;
impl Parameters for TestNetwork {
fn activation_height(&self, nu: NetworkUpgrade) -> Option<u32> {
fn activation_height(nu: NetworkUpgrade) -> Option<u32> {
match nu {
NetworkUpgrade::Overwinter => Some(207_500),
NetworkUpgrade::Sapling => Some(280_000),
@ -194,9 +194,9 @@ impl BranchId {
/// the given height.
///
/// This is the branch ID that should be used when creating transactions.
pub fn for_height<C: Parameters>(parameters: C, height: u32) -> Self {
pub fn for_height<C: Parameters>(height: u32) -> Self {
for nu in UPGRADES_IN_ORDER.iter().rev() {
if parameters.is_nu_active(*nu, height) {
if C::is_nu_active(*nu, height) {
return nu.branch_id();
}
}
@ -208,18 +208,18 @@ impl BranchId {
#[cfg(test)]
mod tests {
use super::{BranchId, MainNetwork, NetworkUpgrade, UPGRADES_IN_ORDER};
use crate::consensus::Parameters;
use std::convert::TryFrom;
use super::{BranchId, MainNetwork, NetworkUpgrade, Parameters, UPGRADES_IN_ORDER};
#[test]
fn nu_ordering() {
for i in 1..UPGRADES_IN_ORDER.len() {
let nu_a = UPGRADES_IN_ORDER[i - 1];
let nu_b = UPGRADES_IN_ORDER[i];
match (
MainNetwork.activation_height(nu_a),
MainNetwork.activation_height(nu_b),
MainNetwork::activation_height(nu_a),
MainNetwork::activation_height(nu_b),
) {
(Some(a), Some(b)) if a < b => (),
(Some(_), None) => (),
@ -234,9 +234,15 @@ mod tests {
#[test]
fn nu_is_active() {
assert!(!MainNetwork.is_nu_active(NetworkUpgrade::Overwinter, 0));
assert!(!MainNetwork.is_nu_active(NetworkUpgrade::Overwinter, 347_499));
assert!(MainNetwork.is_nu_active(NetworkUpgrade::Overwinter, 347_500));
assert!(!MainNetwork::is_nu_active(NetworkUpgrade::Overwinter, 0));
assert!(!MainNetwork::is_nu_active(
NetworkUpgrade::Overwinter,
347_499
));
assert!(MainNetwork::is_nu_active(
NetworkUpgrade::Overwinter,
347_500
));
}
#[test]
@ -247,28 +253,25 @@ mod tests {
#[test]
fn branch_id_for_height() {
assert_eq!(BranchId::for_height::<MainNetwork>(0), BranchId::Sprout,);
assert_eq!(
BranchId::for_height::<MainNetwork>(MainNetwork, 0),
BranchId::Sprout,
);
assert_eq!(
BranchId::for_height::<MainNetwork>(MainNetwork, 419_199),
BranchId::for_height::<MainNetwork>(419_199),
BranchId::Overwinter,
);
assert_eq!(
BranchId::for_height::<MainNetwork>(MainNetwork, 419_200),
BranchId::for_height::<MainNetwork>(419_200),
BranchId::Sapling,
);
assert_eq!(
BranchId::for_height::<MainNetwork>(MainNetwork, 903_000),
BranchId::for_height::<MainNetwork>(903_000),
BranchId::Heartwood,
);
assert_eq!(
BranchId::for_height::<MainNetwork>(MainNetwork, 1_046_400),
BranchId::for_height::<MainNetwork>(1_046_400),
BranchId::Canopy,
);
assert_eq!(
BranchId::for_height::<MainNetwork>(MainNetwork, 5_000_000),
BranchId::for_height::<MainNetwork>(5_000_000),
BranchId::Canopy,
);
}

View File

@ -35,3 +35,9 @@ use crate::jubjub::JubjubBls12;
lazy_static! {
pub static ref JUBJUB: JubjubBls12 = JubjubBls12::new();
}
#[cfg(feature = "mainnet")]
use crate::consensus::MainNetwork as Network;
#[cfg(not(feature = "mainnet"))]
use crate::consensus::TestNetwork as Network;

View File

@ -341,14 +341,13 @@ impl SaplingNoteEncryption {
}
fn parse_note_plaintext_without_memo<P: consensus::Parameters>(
parameters: &P,
height: u32,
ivk: &Fs,
cmu: &Fr,
plaintext: &[u8],
) -> Option<(Note<Bls12>, PaymentAddress<Bls12>)> {
// Check note plaintext version
match plaintext_version_is_valid(parameters, height, plaintext[0]) {
match plaintext_version_is_valid::<P>(height, plaintext[0]) {
true => (),
false => return None,
}
@ -361,7 +360,7 @@ fn parse_note_plaintext_without_memo<P: consensus::Parameters>(
let mut r = [0u8; 32];
r.copy_from_slice(&plaintext[20..COMPACT_NOTE_SIZE]);
let rseed = if parameters.is_nu_active(NetworkUpgrade::Canopy, height) {
let rseed = if P::is_nu_active(NetworkUpgrade::Canopy, height) {
Rseed::AfterZip212(r)
} else {
let rcm = Fs::from_repr(FsRepr(r.try_into().expect("slice is the correct length")))?;
@ -384,14 +383,9 @@ fn parse_note_plaintext_without_memo<P: consensus::Parameters>(
Some((note, to))
}
pub fn plaintext_version_is_valid<P: consensus::Parameters>(
parameters: &P,
height: u32,
leadbyte: u8,
) -> bool {
if parameters.is_nu_active(NetworkUpgrade::Canopy, height) {
let grace_period_end_height = parameters
.activation_height(NetworkUpgrade::Canopy)
pub fn plaintext_version_is_valid<P: consensus::Parameters>(height: u32, leadbyte: u8) -> bool {
if P::is_nu_active(NetworkUpgrade::Canopy, height) {
let grace_period_end_height = P::activation_height(NetworkUpgrade::Canopy)
.expect("Should have Canopy activation height")
+ ZIP212_GRACE_PERIOD;
@ -418,7 +412,6 @@ pub fn plaintext_version_is_valid<P: consensus::Parameters>(
///
/// Implements section 4.17.2 of the Zcash Protocol Specification.
pub fn try_sapling_note_decryption<P: consensus::Parameters>(
parameters: &P,
height: u32,
ivk: &Fs,
epk: &edwards::Point<Bls12, PrimeOrder>,
@ -444,7 +437,7 @@ pub fn try_sapling_note_decryption<P: consensus::Parameters>(
NOTE_PLAINTEXT_SIZE
);
let (note, to) = parse_note_plaintext_without_memo(parameters, height, ivk, cmu, &plaintext)?;
let (note, to) = parse_note_plaintext_without_memo::<P>(height, ivk, cmu, &plaintext)?;
match note.rseed {
Rseed::AfterZip212(rseed) => {
@ -470,7 +463,6 @@ pub fn try_sapling_note_decryption<P: consensus::Parameters>(
///
/// [`ZIP 307`]: https://github.com/zcash/zips/pull/226
pub fn try_sapling_compact_note_decryption<P: consensus::Parameters>(
parameters: &P,
height: u32,
ivk: &Fs,
epk: &edwards::Point<Bls12, PrimeOrder>,
@ -487,7 +479,7 @@ pub fn try_sapling_compact_note_decryption<P: consensus::Parameters>(
plaintext.copy_from_slice(&enc_ciphertext);
ChaCha20Ietf::xor(key.as_bytes(), &[0u8; 12], 1, &mut plaintext);
parse_note_plaintext_without_memo(parameters, height, ivk, cmu, &plaintext)
parse_note_plaintext_without_memo::<P>(height, ivk, cmu, &plaintext)
}
/// Recovery of the full note plaintext by the sender.
@ -498,7 +490,6 @@ pub fn try_sapling_compact_note_decryption<P: consensus::Parameters>(
///
/// Implements section 4.17.3 of the Zcash Protocol Specification.
pub fn try_sapling_output_recovery<P: consensus::Parameters>(
parameters: &P,
height: u32,
ovk: &OutgoingViewingKey,
cv: &edwards::Point<Bls12, Unknown>,
@ -548,7 +539,7 @@ pub fn try_sapling_output_recovery<P: consensus::Parameters>(
);
// Check note plaintext version
match plaintext_version_is_valid(parameters, height, plaintext[0]) {
match plaintext_version_is_valid::<P>(height, plaintext[0]) {
true => (),
false => return None,
}
@ -561,7 +552,7 @@ pub fn try_sapling_output_recovery<P: consensus::Parameters>(
let mut r = [0u8; 32];
r.copy_from_slice(&plaintext[20..COMPACT_NOTE_SIZE]);
let rseed = if parameters.is_nu_active(NetworkUpgrade::Canopy, height) {
let rseed = if P::is_nu_active(NetworkUpgrade::Canopy, height) {
Rseed::AfterZip212(r)
} else {
let rcm = Fs::from_repr(FsRepr(r.try_into().expect("slice is the correct length")))?;
@ -595,7 +586,6 @@ pub fn try_sapling_output_recovery<P: consensus::Parameters>(
#[cfg(test)]
mod tests {
use crate::{
consensus,
consensus::{NetworkUpgrade, Parameters, ZIP212_GRACE_PERIOD},
jubjub::{
edwards,
@ -603,6 +593,7 @@ mod tests {
PrimeOrder, Unknown,
},
primitives::{Diversifier, PaymentAddress, Rseed, ValueCommitment},
Network,
};
use crypto_api_chachapoly::ChachaPolyIetf;
use ff::{Field, PrimeField};
@ -753,17 +744,11 @@ mod tests {
let (ovk, ivk, cv, cmu, epk, enc_ciphertext, out_ciphertext) =
random_enc_ciphertext_with(height, ivk, rng);
assert!(try_sapling_note_decryption(
&consensus::MainNetwork,
height,
&ivk,
&epk,
&cmu,
&enc_ciphertext
)
.is_some());
assert!(try_sapling_compact_note_decryption(
&consensus::MainNetwork,
assert!(
try_sapling_note_decryption::<Network>(height, &ivk, &epk, &cmu, &enc_ciphertext)
.is_some()
);
assert!(try_sapling_compact_note_decryption::<Network>(
height,
&ivk,
&epk,
@ -771,8 +756,7 @@ mod tests {
&enc_ciphertext[..COMPACT_NOTE_SIZE]
)
.is_some());
assert!(try_sapling_output_recovery(
&consensus::MainNetwork,
assert!(try_sapling_output_recovery::<Network>(
height,
&ovk,
&cv,
@ -811,7 +795,7 @@ mod tests {
};
let cv = value_commitment.cm(&JUBJUB).into();
let rseed = if consensus::MainNetwork.is_nu_active(NetworkUpgrade::Canopy, height) {
let rseed = if Network::is_nu_active(NetworkUpgrade::Canopy, height) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
@ -930,8 +914,8 @@ mod tests {
fn decryption_with_invalid_ivk() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -939,8 +923,7 @@ mod tests {
let (_, _, _, cmu, epk, enc_ciphertext, _) = random_enc_ciphertext(height, &mut rng);
assert_eq!(
try_sapling_note_decryption(
&consensus::MainNetwork,
try_sapling_note_decryption::<Network>(
height,
&Fs::random(&mut rng),
&epk,
@ -956,8 +939,8 @@ mod tests {
fn decryption_with_invalid_epk() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -965,8 +948,7 @@ mod tests {
let (_, ivk, _, cmu, _, enc_ciphertext, _) = random_enc_ciphertext(height, &mut rng);
assert_eq!(
try_sapling_note_decryption(
&consensus::MainNetwork,
try_sapling_note_decryption::<Network>(
height,
&ivk,
&edwards::Point::<Bls12, _>::rand(&mut rng, &JUBJUB).mul_by_cofactor(&JUBJUB),
@ -982,8 +964,8 @@ mod tests {
fn decryption_with_invalid_cmu() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -991,8 +973,7 @@ mod tests {
let (_, ivk, _, _, epk, enc_ciphertext, _) = random_enc_ciphertext(height, &mut rng);
assert_eq!(
try_sapling_note_decryption(
&consensus::MainNetwork,
try_sapling_note_decryption::<Network>(
height,
&ivk,
&epk,
@ -1008,8 +989,8 @@ mod tests {
fn decryption_with_invalid_tag() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1019,14 +1000,7 @@ mod tests {
enc_ciphertext[ENC_CIPHERTEXT_SIZE - 1] ^= 0xff;
assert_eq!(
try_sapling_note_decryption(
&consensus::MainNetwork,
height,
&ivk,
&epk,
&cmu,
&enc_ciphertext
),
try_sapling_note_decryption::<Network>(height, &ivk, &epk, &cmu, &enc_ciphertext),
None
);
}
@ -1036,9 +1010,9 @@ mod tests {
fn decryption_with_invalid_version_byte() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT - 1,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT + ZIP212_GRACE_PERIOD,
Network::CANOPY_ACTIVATION_HEIGHT - 1,
Network::CANOPY_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT + ZIP212_GRACE_PERIOD,
];
let leadbyte_array = [0x02, 0x03, 0x01];
@ -1057,14 +1031,7 @@ mod tests {
|pt| pt[0] = leadbyte_array[i],
);
assert_eq!(
try_sapling_note_decryption(
&consensus::MainNetwork,
height,
&ivk,
&epk,
&cmu,
&enc_ciphertext
),
try_sapling_note_decryption::<Network>(height, &ivk, &epk, &cmu, &enc_ciphertext),
None
);
}
@ -1074,8 +1041,8 @@ mod tests {
fn decryption_with_invalid_diversifier() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1093,14 +1060,7 @@ mod tests {
|pt| pt[1..12].copy_from_slice(&find_invalid_diversifier().0),
);
assert_eq!(
try_sapling_note_decryption(
&consensus::MainNetwork,
height,
&ivk,
&epk,
&cmu,
&enc_ciphertext
),
try_sapling_note_decryption::<Network>(height, &ivk, &epk, &cmu, &enc_ciphertext),
None
);
}
@ -1110,8 +1070,8 @@ mod tests {
fn decryption_with_incorrect_diversifier() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1129,14 +1089,7 @@ mod tests {
|pt| pt[1..12].copy_from_slice(&find_valid_diversifier().0),
);
assert_eq!(
try_sapling_note_decryption(
&consensus::MainNetwork,
height,
&ivk,
&epk,
&cmu,
&enc_ciphertext
),
try_sapling_note_decryption::<Network>(height, &ivk, &epk, &cmu, &enc_ciphertext),
None
);
}
@ -1146,8 +1099,8 @@ mod tests {
fn compact_decryption_with_invalid_ivk() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1155,8 +1108,7 @@ mod tests {
let (_, _, _, cmu, epk, enc_ciphertext, _) = random_enc_ciphertext(height, &mut rng);
assert_eq!(
try_sapling_compact_note_decryption(
&consensus::MainNetwork,
try_sapling_compact_note_decryption::<Network>(
height,
&Fs::random(&mut rng),
&epk,
@ -1172,8 +1124,8 @@ mod tests {
fn compact_decryption_with_invalid_epk() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1181,8 +1133,7 @@ mod tests {
let (_, ivk, _, cmu, _, enc_ciphertext, _) = random_enc_ciphertext(height, &mut rng);
assert_eq!(
try_sapling_compact_note_decryption(
&consensus::MainNetwork,
try_sapling_compact_note_decryption::<Network>(
height,
&ivk,
&edwards::Point::<Bls12, _>::rand(&mut rng, &JUBJUB).mul_by_cofactor(&JUBJUB),
@ -1198,8 +1149,8 @@ mod tests {
fn compact_decryption_with_invalid_cmu() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1207,8 +1158,7 @@ mod tests {
let (_, ivk, _, _, epk, enc_ciphertext, _) = random_enc_ciphertext(height, &mut rng);
assert_eq!(
try_sapling_compact_note_decryption(
&consensus::MainNetwork,
try_sapling_compact_note_decryption::<Network>(
height,
&ivk,
&epk,
@ -1224,9 +1174,9 @@ mod tests {
fn compact_decryption_with_invalid_version_byte() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT - 1,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT + ZIP212_GRACE_PERIOD,
Network::CANOPY_ACTIVATION_HEIGHT - 1,
Network::CANOPY_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT + ZIP212_GRACE_PERIOD,
];
let leadbyte_array = [0x02, 0x03, 0x01];
@ -1245,8 +1195,7 @@ mod tests {
|pt| pt[0] = leadbyte_array[i],
);
assert_eq!(
try_sapling_compact_note_decryption(
&consensus::MainNetwork,
try_sapling_compact_note_decryption::<Network>(
height,
&ivk,
&epk,
@ -1262,8 +1211,8 @@ mod tests {
fn compact_decryption_with_invalid_diversifier() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1281,8 +1230,7 @@ mod tests {
|pt| pt[1..12].copy_from_slice(&find_invalid_diversifier().0),
);
assert_eq!(
try_sapling_compact_note_decryption(
&consensus::MainNetwork,
try_sapling_compact_note_decryption::<Network>(
height,
&ivk,
&epk,
@ -1298,8 +1246,8 @@ mod tests {
fn compact_decryption_with_incorrect_diversifier() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1317,8 +1265,7 @@ mod tests {
|pt| pt[1..12].copy_from_slice(&find_valid_diversifier().0),
);
assert_eq!(
try_sapling_compact_note_decryption(
&consensus::MainNetwork,
try_sapling_compact_note_decryption::<Network>(
height,
&ivk,
&epk,
@ -1334,8 +1281,8 @@ mod tests {
fn recovery_with_invalid_ovk() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1345,8 +1292,7 @@ mod tests {
ovk.0[0] ^= 0xff;
assert_eq!(
try_sapling_output_recovery(
&consensus::MainNetwork,
try_sapling_output_recovery::<Network>(
height,
&ovk,
&cv,
@ -1364,8 +1310,8 @@ mod tests {
fn recovery_with_invalid_cv() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1374,8 +1320,7 @@ mod tests {
random_enc_ciphertext(height, &mut rng);
assert_eq!(
try_sapling_output_recovery(
&consensus::MainNetwork,
try_sapling_output_recovery::<Network>(
height,
&ovk,
&edwards::Point::<Bls12, _>::rand(&mut rng, &JUBJUB),
@ -1393,8 +1338,8 @@ mod tests {
fn recovery_with_invalid_cmu() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1403,8 +1348,7 @@ mod tests {
random_enc_ciphertext(height, &mut rng);
assert_eq!(
try_sapling_output_recovery(
&consensus::MainNetwork,
try_sapling_output_recovery::<Network>(
height,
&ovk,
&cv,
@ -1422,8 +1366,8 @@ mod tests {
fn recovery_with_invalid_epk() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1432,8 +1376,7 @@ mod tests {
random_enc_ciphertext(height, &mut rng);
assert_eq!(
try_sapling_output_recovery(
&consensus::MainNetwork,
try_sapling_output_recovery::<Network>(
height,
&ovk,
&cv,
@ -1451,8 +1394,8 @@ mod tests {
fn recovery_with_invalid_enc_tag() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1462,8 +1405,7 @@ mod tests {
enc_ciphertext[ENC_CIPHERTEXT_SIZE - 1] ^= 0xff;
assert_eq!(
try_sapling_output_recovery(
&consensus::MainNetwork,
try_sapling_output_recovery::<Network>(
height,
&ovk,
&cv,
@ -1481,8 +1423,8 @@ mod tests {
fn recovery_with_invalid_out_tag() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1492,8 +1434,7 @@ mod tests {
out_ciphertext[OUT_CIPHERTEXT_SIZE - 1] ^= 0xff;
assert_eq!(
try_sapling_output_recovery(
&consensus::MainNetwork,
try_sapling_output_recovery::<Network>(
height,
&ovk,
&cv,
@ -1511,9 +1452,9 @@ mod tests {
fn recovery_with_invalid_version_byte() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT - 1,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT + ZIP212_GRACE_PERIOD,
Network::CANOPY_ACTIVATION_HEIGHT - 1,
Network::CANOPY_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT + ZIP212_GRACE_PERIOD,
];
let leadbyte_array = [0x02, 0x03, 0x01];
@ -1532,8 +1473,7 @@ mod tests {
|pt| pt[0] = leadbyte_array[i],
);
assert_eq!(
try_sapling_output_recovery(
&consensus::MainNetwork,
try_sapling_output_recovery::<Network>(
height,
&ovk,
&cv,
@ -1551,8 +1491,8 @@ mod tests {
fn recovery_with_invalid_diversifier() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1570,8 +1510,7 @@ mod tests {
|pt| pt[1..12].copy_from_slice(&find_invalid_diversifier().0),
);
assert_eq!(
try_sapling_output_recovery(
&consensus::MainNetwork,
try_sapling_output_recovery::<Network>(
height,
&ovk,
&cv,
@ -1589,8 +1528,8 @@ mod tests {
fn recovery_with_incorrect_diversifier() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1609,8 +1548,7 @@ mod tests {
|pt| pt[1..12].copy_from_slice(&find_valid_diversifier().0),
);
assert_eq!(
try_sapling_output_recovery(
&consensus::MainNetwork,
try_sapling_output_recovery::<Network>(
height,
&ovk,
&cv,
@ -1628,8 +1566,8 @@ mod tests {
fn recovery_with_invalid_pk_d() {
let mut rng = OsRng;
let height_array = [
consensus::MainNetwork::SAPLING_ACTIVATION_HEIGHT,
consensus::MainNetwork::CANOPY_ACTIVATION_HEIGHT,
Network::SAPLING_ACTIVATION_HEIGHT,
Network::CANOPY_ACTIVATION_HEIGHT,
];
for height_ref in height_array.iter() {
@ -1639,8 +1577,7 @@ mod tests {
random_enc_ciphertext_with(height, ivk, &mut rng);
assert_eq!(
try_sapling_output_recovery(
&consensus::MainNetwork,
try_sapling_output_recovery::<Network>(
height,
&ovk,
&cv,
@ -1676,8 +1613,7 @@ mod tests {
};
}
let height = consensus::MainNetwork
.activation_height(NetworkUpgrade::Sapling)
let height = Network::activation_height(NetworkUpgrade::Sapling)
.expect("Should have Sapling activation height");
for tv in test_vectors {
@ -1726,14 +1662,7 @@ mod tests {
// (Tested first because it only requires immutable references.)
//
match try_sapling_note_decryption(
&consensus::MainNetwork,
height,
&ivk,
&epk,
&cmu,
&tv.c_enc,
) {
match try_sapling_note_decryption::<Network>(height, &ivk, &epk, &cmu, &tv.c_enc) {
Some((decrypted_note, decrypted_to, decrypted_memo)) => {
assert_eq!(decrypted_note, note);
assert_eq!(decrypted_to, to);
@ -1742,8 +1671,7 @@ mod tests {
None => panic!("Note decryption failed"),
}
match try_sapling_compact_note_decryption(
&consensus::MainNetwork,
match try_sapling_compact_note_decryption::<Network>(
height,
&ivk,
&epk,
@ -1757,15 +1685,8 @@ mod tests {
None => panic!("Compact note decryption failed"),
}
match try_sapling_output_recovery(
&consensus::MainNetwork,
height,
&ovk,
&cv,
&cmu,
&epk,
&tv.c_enc,
&tv.c_out,
match try_sapling_output_recovery::<Network>(
height, &ovk, &cv, &cmu, &epk, &tv.c_enc, &tv.c_out,
) {
Some((decrypted_note, decrypted_to, decrypted_memo)) => {
assert_eq!(decrypted_note, note);

View File

@ -25,7 +25,7 @@ use crate::{
components::{amount::DEFAULT_FEE, Amount, OutputDescription, SpendDescription, TxOut},
signature_hash_data, Transaction, TransactionData, SIGHASH_ALL,
},
JUBJUB,
Network, JUBJUB,
};
#[cfg(feature = "transparent-inputs")]
@ -88,7 +88,6 @@ pub struct SaplingOutput {
impl SaplingOutput {
pub fn new<R: RngCore + CryptoRng, P: consensus::Parameters>(
parameters: P,
height: u32,
rng: &mut R,
ovk: OutgoingViewingKey,
@ -104,7 +103,7 @@ impl SaplingOutput {
return Err(Error::InvalidAmount);
}
let rseed = if parameters.is_nu_active(NetworkUpgrade::Canopy, height) {
let rseed = if P::is_nu_active(NetworkUpgrade::Canopy, height) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
@ -403,22 +402,14 @@ impl<R: RngCore + CryptoRng> Builder<R> {
}
/// Adds a Sapling address to send funds to.
pub fn add_sapling_output(
pub fn add_sapling_output<P: consensus::Parameters>(
&mut self,
ovk: OutgoingViewingKey,
to: PaymentAddress<Bls12>,
value: Amount,
memo: Option<Memo>,
) -> Result<(), Error> {
let output = SaplingOutput::new(
consensus::MainNetwork,
self.height,
&mut self.rng,
ovk,
to,
value,
memo,
)?;
let output = SaplingOutput::new::<R, P>(self.height, &mut self.rng, ovk, to, value, memo)?;
self.mtx.value_balance -= value;
@ -518,7 +509,7 @@ impl<R: RngCore + CryptoRng> Builder<R> {
return Err(Error::NoChangeAddress);
};
self.add_sapling_output(change_address.0, change_address.1, change, None)?;
self.add_sapling_output::<Network>(change_address.0, change_address.1, change, None)?;
}
//
@ -733,7 +724,7 @@ mod tests {
sapling::Node,
transaction::components::Amount,
zip32::{ExtendedFullViewingKey, ExtendedSpendingKey},
JUBJUB,
Network, JUBJUB,
};
#[test]
@ -745,7 +736,7 @@ mod tests {
let mut builder = Builder::new(0);
assert_eq!(
builder.add_sapling_output(ovk, to, Amount::from_i64(-1).unwrap(), None),
builder.add_sapling_output::<Network>(ovk, to, Amount::from_i64(-1).unwrap(), None),
Err(Error::InvalidAmount)
);
}
@ -758,9 +749,8 @@ mod tests {
TransactionData,
};
let sapling_activation_height = consensus::MainNetwork
.activation_height(NetworkUpgrade::Sapling)
.unwrap();
let sapling_activation_height =
Network::activation_height(NetworkUpgrade::Sapling).unwrap();
// Create a builder with 0 fee, so we can construct t outputs
let mut builder = builder::Builder {
@ -865,7 +855,7 @@ mod tests {
{
let mut builder = Builder::new(0);
builder
.add_sapling_output(
.add_sapling_output::<Network>(
ovk.clone(),
to.clone(),
Amount::from_u64(50000).unwrap(),
@ -915,7 +905,7 @@ mod tests {
)
.unwrap();
builder
.add_sapling_output(
.add_sapling_output::<Network>(
ovk.clone(),
to.clone(),
Amount::from_u64(30000).unwrap(),
@ -961,7 +951,7 @@ mod tests {
.add_sapling_spend(extsk, *to.diversifier(), note2, witness2.path().unwrap())
.unwrap();
builder
.add_sapling_output(ovk, to, Amount::from_u64(30000).unwrap(), None)
.add_sapling_output::<Network>(ovk, to, Amount::from_u64(30000).unwrap(), None)
.unwrap();
builder
.add_transparent_output(