From 7d8a96f827b697b14c0eeb80e11c6aaabbf49547 Mon Sep 17 00:00:00 2001 From: Daira-Emma Hopwood Date: Tue, 25 Jun 2024 21:15:22 +0100 Subject: [PATCH] Don't cache metadata between steps; it's not an important optimization. Signed-off-by: Daira-Emma Hopwood --- zcash_client_backend/src/data_api/wallet.rs | 31 ++++++--------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/zcash_client_backend/src/data_api/wallet.rs b/zcash_client_backend/src/data_api/wallet.rs index da1bd173a..f1d9dc520 100644 --- a/zcash_client_backend/src/data_api/wallet.rs +++ b/zcash_client_backend/src/data_api/wallet.rs @@ -33,7 +33,6 @@ to a wallet-internal shielded address, as described in [ZIP 316](https://zips.z. //! [`TransactionRequest`]: crate::zip321::TransactionRequest //! [`propose_transfer`]: crate::data_api::wallet::propose_transfer -use core::convert::Infallible; use nonempty::NonEmpty; use rand_core::OsRng; use sapling::{ @@ -79,6 +78,7 @@ use { proposal::{ProposalError, StepOutput}, wallet::TransparentAddressMetadata, }, + core::convert::Infallible, input_selection::ShieldingSelector, std::collections::HashMap, zcash_primitives::transaction::components::TxOut, @@ -663,11 +663,7 @@ fn create_proposed_transaction( proposal_step: &Step, #[cfg(feature = "transparent-inputs")] unused_transparent_outputs: &mut HashMap< StepOutput, - ( - TransparentAddress, - Option, - OutPoint, - ), + (TransparentAddress, OutPoint), >, ) -> Result> where @@ -884,14 +880,12 @@ where for input_ref in proposal_step.prior_step_inputs() { // A referenced transparent step output must exist and be referenced *at most* once. // (Exactly once in the case of ephemeral outputs.) - let (address, address_metadata_opt, outpoint) = unused_transparent_outputs + let (address, outpoint) = unused_transparent_outputs .remove(input_ref) .ok_or(Error::Proposal(ProposalError::ReferenceError(*input_ref)))?; - let address_metadata = match address_metadata_opt { - Some(meta) => meta, - None => metadata_from_address(address)?, - }; + let address_metadata = metadata_from_address(address)?; + let txout = &prior_step_results[input_ref.step_index()] .1 .transaction() @@ -952,11 +946,6 @@ where Some(sapling_dfvk.to_ovk(Scope::Internal)) }; - #[cfg(feature = "transparent-inputs")] - type TransparentMetadataT = TransparentAddressMetadata; - #[cfg(not(feature = "transparent-inputs"))] - type TransparentMetadataT = Infallible; - #[cfg(feature = "orchard")] let mut orchard_output_meta: Vec<( Recipient<_, PoolType, _>, @@ -971,7 +960,6 @@ where let mut transparent_output_meta: Vec<( Recipient<_, _, ()>, TransparentAddress, - Option, NonNegativeAmount, StepOutputIndex, )> = vec![]; @@ -1030,7 +1018,6 @@ where transparent_output_meta.push(( Recipient::External(recipient_address.clone(), PoolType::TRANSPARENT), to, - None, payment.amount(), StepOutputIndex::Payment(payment_index), )); @@ -1154,7 +1141,8 @@ where .map_err(Error::DataSource)?; assert_eq!(addresses_and_metadata.len(), ephemeral_outputs.len()); - for ((change_index, change_value), (ephemeral_address, address_metadata)) in + // We don't need the TransparentAddressMetadata here; we can look it up from the data source later. + for ((change_index, change_value), (ephemeral_address, _)) in ephemeral_outputs.iter().zip(addresses_and_metadata) { // This is intended for an ephemeral transparent output, rather than a @@ -1168,7 +1156,6 @@ where outpoint_metadata: (), }, ephemeral_address, - Some(address_metadata), change_value.value(), StepOutputIndex::Change(*change_index), )) @@ -1253,13 +1240,13 @@ where #[allow(unused_variables)] let transparent_outputs = transparent_output_meta.into_iter().enumerate().map( - |(n, (recipient, ephemeral_address, address_metadata_opt, value, step_output_index))| { + |(n, (recipient, ephemeral_address, value, step_output_index))| { let outpoint = OutPoint::new(txid, n as u32); let recipient = recipient.map_ephemeral_transparent_outpoint(|()| outpoint.clone()); #[cfg(feature = "transparent-inputs")] unused_transparent_outputs.insert( StepOutput::new(step_index, step_output_index), - (ephemeral_address, address_metadata_opt, outpoint), + (ephemeral_address, outpoint), ); SentTransactionOutput::from_parts(n, recipient, value, None) },