Revert passing Parameters to methods
This commit is contained in:
parent
74b2f0a79e
commit
a25348dfba
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue