librustzcash/zcash_client_backend/CHANGELOG.md

50 KiB

Changelog

All notable changes to this library will be documented in this file.

The format is based on Keep a Changelog, and this library adheres to Rust's notion of Semantic Versioning.

[Unreleased]

Added

  • zcash_client_backend::data_api:
    • chain::BlockCache trait, behind the sync feature flag.
  • zcash_client_backend::scanning:
    • testing module
  • zcash_client_backend::sync module, behind the sync feature flag.

Changed

  • zcash_client_backend::zip321 has been extracted to, and is now a reexport of the root module of the zip321 crate. Several of the APIs of this module have changed as a consequence of this extraction; please see the zip321 CHANGELOG for details.
  • zcash_client_backend::data_api:
    • error::Error has a new Address variant.
    • wallet::input_selection::InputSelectorError has a new Address variant.
  • zcash_client_backend::proto::proposal::Proposal::{from_standard_proposal, try_into_standard_proposal} each no longer require a consensus::Parameters argument.
  • zcash_client_backend::wallet::Recipient variants have changed. Instead of wrapping protocol-address types, the Recipient type now wraps a zcash_address::ZcashAddress. This simplifies the process of tracking the original address to which value was sent.

[0.12.1] - 2024-03-27

Fixed

  • This release fixes a problem in note selection when sending to a transparent recipient, whereby available funds were being incorrectly excluded from input selection.

[0.12.0] - 2024-03-25

Added

  • A new orchard feature flag has been added to make it possible to build client code without orchard dependendencies. Additions and changes related to Orchard below are introduced under this feature flag.
  • zcash_client_backend::data_api:
    • Account
    • AccountBalance::with_orchard_balance_mut
    • AccountBirthday::orchard_frontier
    • AccountSource
    • BlockMetadata::orchard_tree_size
    • DecryptedTransaction::{new, tx(), orchard_outputs()}
    • NoteRetention
    • ScannedBlock::orchard
    • ScannedBlockCommitments::orchard
    • SeedRelevance
    • SentTransaction::new
    • SpendableNotes
    • ORCHARD_SHARD_HEIGHT
    • BlockMetadata::orchard_tree_size
    • WalletSummary::next_orchard_subtree_index
    • chain::ChainState
    • chain::ScanSummary::{spent_orchard_note_count, received_orchard_note_count}
    • impl Debug for chain::CommitmentTreeRoot
  • zcash_client_backend::fees:
    • orchard
    • ChangeValue::orchard
  • zcash_client_backend::proto:
    • service::TreeState::orchard_tree
    • service::TreeState::to_chain_state
    • impl TryFrom<&CompactOrchardAction> for CompactAction
    • CompactOrchardAction::{cmx, nf, ephemeral_key}
  • zcash_client_backend::scanning:
    • impl ScanningKeyOps<OrchardDomain, ..> for ScanningKey<..> for Orchard key types.
    • ScanningKeys::orchard
    • Nullifiers::{orchard, extend_orchard, retain_orchard}
    • TaggedOrchardBatch
    • TaggedOrchardBatchRunner
  • zcash_client_backend::wallet:
    • Note::Orchard
    • WalletOrchardSpend
    • WalletOrchardOutput
    • WalletTx::{orchard_spends, orchard_outputs}
    • ReceivedNote::map_note
    • ReceivedNote<_, sapling::Note>::note_value
    • ReceivedNote<_, orchard::note::Note>::note_value
  • zcash_client_backend::zip321::Payment::without_memo

Changed

  • zcash_client_backend::data_api:
    • Arguments to AccountBirthday::from_parts have changed.
    • Arguments to BlockMetadata::from_parts have changed.
    • Arguments to ScannedBlock::from_parts have changed.
    • Changes to the WalletRead trait:
      • Added Account associated type.
      • Added validate_seed method.
      • Added is_seed_relevant_to_any_derived_accounts method.
      • Added get_account method.
      • Added get_derived_account method.
      • get_account_for_ufvk now returns Self::Account instead of a bare AccountId.
      • Added get_orchard_nullifiers method.
      • get_transaction now returns Result<Option<Transaction>, _> rather than returning an Err if the txid parameter does not correspond to a transaction in the database.
    • WalletWrite::create_account now takes its AccountBirthday argument by reference.
    • Changes to the InputSource trait:
      • select_spendable_notes now takes its target_value argument as a NonNegativeAmount. Also, it now returns a SpendableNotes data structure instead of a vector.
    • Fields of DecryptedTransaction are now private. Use DecryptedTransaction::new and the newly provided accessors instead.
    • Fields of SentTransaction are now private. Use SentTransaction::new and the newly provided accessors instead.
    • ShieldedProtocol has a new Orchard variant.
    • WalletCommitmentTrees
      • type OrchardShardStore
      • fn with_orchard_tree_mut
      • fn put_orchard_subtree_roots
    • Removed Error::AccountNotFound variant.
    • WalletSummary::new now takes an additional next_orchard_subtree_index argument when the orchard feature flag is enabled.
  • zcash_client_backend::decrypt:
    • Fields of DecryptedOutput are now private. Use DecryptedOutput::new and the newly provided accessors instead.
    • decrypt_transaction now returns a DecryptedTransaction<AccountId> instead of a DecryptedOutput<sapling::Note> and will decrypt Orchard outputs when the orchard feature is enabled. In addition, the type constraint on its <AccountId> parameter has been strengthened to Copy.
  • zcash_client_backend::fees:
    • Arguments to ChangeStrategy::compute_balance have changed.
    • ChangeError::DustInputs now has an orchard field behind the orchard feature flag.
  • zcash_client_backend::wallet:
    • The address variants of Recipient now Box their contents to avoid large discrepancies in enum variant sizing.
  • zcash_client_backend::proto:
    • ProposalDecodingError has a new variant TransparentMemo.
  • zcash_client_backend::wallet::Recipient::InternalAccount is now a structured variant with an additional external_address field.
  • zcash_client_backend::zip321::render::amount_str now takes a NonNegativeAmount rather than a signed Amount as its argument.
  • zcash_client_backend::zip321::parse::parse_amount now parses a NonNegativeAmount rather than a signed Amount.
  • zcash_client_backend::zip321::TransactionRequest::total now returns Result<_, BalanceError> instead of Result<_, ()>.

Removed

  • zcash_client_backend::PoolType::is_receiver: use zcash_keys::Address::has_receiver instead.
  • zcash_client_backend::wallet::ReceivedNote::traverse_opt removed as unnecessary.

Fixed

  • This release fixes an error in amount parsing in zip321 that previously allowed amounts having a decimal point but no decimal value to be parsed as valid.

[0.11.1] - 2024-03-09

Fixed

  • Documentation now correctly builds with all feature flags.

[0.11.0] - 2024-03-01

Added

  • zcash_client_backend:
    • {PoolType, ShieldedProtocol} (moved from zcash_client_backend::data_api).
    • PoolType::is_receiver
  • zcash_client_backend::data_api:
    • InputSource
    • ScannedBlock::{into_commitments, sapling}
    • ScannedBundles
    • ScannedBlockCommitments
    • Balance::{add_spendable_value, add_pending_change_value, add_pending_spendable_value}
    • AccountBalance::{ with_sapling_balance_mut, add_unshielded_value }
    • WalletSummary::next_sapling_subtree_index
    • wallet:
      • propose_standard_transfer_to_address
      • create_proposed_transactions
      • input_selection:
        • ShieldingSelector, behind the transparent-inputs feature flag (refactored out from the InputSelector trait).
        • impl std::error::Error for InputSelectorError
  • zcash_client_backend::fees:
    • standard and sapling modules.
    • ChangeValue::new
  • zcash_client_backend::wallet:
    • {NoteId, Recipient} (moved from zcash_client_backend::data_api).
    • Note
    • ReceivedNote
    • Recipient::{map_internal_account, internal_account_transpose_option}
    • WalletOutput
    • WalletSaplingOutput::{key_source, account_id, recipient_key_scope}
    • WalletSaplingSpend::account_id
    • WalletSpend
    • WalletTx::new
    • WalletTx getter methods {txid, block_index, sapling_spends, sapling_outputs} (replacing what were previously public fields.)
    • TransparentAddressMetadata (which replaces zcash_keys::address::AddressMetadata).
    • impl {Debug, Clone} for OvkPolicy
  • zcash_client_backend::proposal:
    • Proposal::{shielded_inputs, payment_pools, single_step, multi_step}
    • ShieldedInputs
    • Step
  • zcash_client_backend::proto:
    • PROPOSAL_SER_V1
    • ProposalDecodingError
    • proposal module, for parsing and serializing transaction proposals.
    • impl TryFrom<&CompactSaplingOutput> for CompactOutputDescription
  • zcash_client_backend::scanning:
    • ScanningKeyOps has replaced the ScanningKey trait.
    • ScanningKeys
    • Nullifiers
  • impl Clone for zcash_client_backend::{ zip321::{Payment, TransactionRequest, Zip321Error, parse::Param, parse::IndexedParam}, wallet::WalletTransparentOutput, proposal::Proposal, }
  • impl {PartialEq, Eq} for zcash_client_backend::{ zip321::{Zip321Error, parse::Param, parse::IndexedParam}, wallet::WalletTransparentOutput, proposal::Proposal, }
  • zcash_client_backend::zip321:
    • TransactionRequest::{total, from_indexed}
    • parse::Param::name

Changed

  • Migrated to zcash_primitives 0.14, orchard 0.7.
  • Several structs and functions now take an AccountId type parameter parameter in order to decouple the concept of an account identifier from the ZIP 32 account index. Many APIs that previously referenced zcash_primitives::zip32::AccountId now reference the generic type. Impacted types and functions are:
    • zcash_client_backend::data_api:
      • WalletRead now has an associated AccountId type.
      • WalletRead::{ get_account_birthday, get_current_address, get_unified_full_viewing_keys, get_account_for_ufvk, get_wallet_summary, get_sapling_nullifiers, get_transparent_receivers, get_transparent_balances, get_account_ids } now refer to the WalletRead::AccountId associated type.
      • WalletWrite::{create_account, get_next_available_address} now refer to the WalletRead::AccountId associated type.
      • ScannedBlock now takes an additional AccountId type parameter.
      • DecryptedTransaction is now parameterized by AccountId
      • SentTransaction is now parameterized by AccountId
      • SentTransactionOutput is now parameterized by AccountId
      • WalletSummary is now parameterized by AccountId
    • zcash_client_backend::decrypt
      • DecryptedOutput is now parameterized by AccountId
      • decrypt_transaction is now parameterized by AccountId
    • zcash_client_backend::scanning::scan_block is now parameterized by AccountId
    • zcash_client_backend::wallet:
      • Recipient now takes an additional AccountId type parameter.
      • WalletTx now takes an additional AccountId type parameter.
      • WalletSaplingSpend now takes an additional AccountId type parameter.
      • WalletSaplingOutput now takes an additional AccountId type parameter.
  • zcash_client_backend::data_api:
    • BlockMetadata::sapling_tree_size now returns an Option<u32> instead of a u32 for future consistency with Orchard.
    • ScannedBlock is no longer parameterized by the nullifier type as a consequence of the WalletTx change.
    • ScannedBlock::metadata has been renamed to to_block_metadata and now returns an owned value rather than a reference.
    • Fields of Balance and AccountBalance have been made private and the values of these fields have been made available via methods having the same names as the previously-public fields.
    • WalletSummary::new now takes an additional next_sapling_subtree_index argument.
    • WalletSummary::new now takes a HashMap instead of a BTreeMap for its account_balances argument.
    • WalletSummary::account_balances now returns a HashMap instead of a BTreeMap.
    • Changes to the WalletRead trait:
      • Added associated type AccountId.
      • Added get_account function.
      • get_checkpoint_depth has been removed without replacement. This is no longer needed given the change to use the stored anchor height for transaction proposal execution.
      • is_valid_account_extfvk has been removed; it was unused in the ECC mobile wallet SDKs and has been superseded by get_account_for_ufvk.
      • get_spendable_sapling_notes, select_spendable_sapling_notes, and get_unspent_transparent_outputs have been removed; use data_api::InputSource instead.
      • Added get_account_ids.
      • get_transparent_receivers and get_transparent_balances are now guarded by the transparent-inputs feature flag, with noop default implementations provided.
      • get_transparent_receivers now returns Option<zcash_client_backend::wallet::TransparentAddressMetadata> as part of its result where previously it returned zcash_keys::address::AddressMetadata.
    • WalletWrite::get_next_available_address now takes an additional UnifiedAddressRequest argument.
    • chain::scan_cached_blocks now returns a ScanSummary containing metadata about the scanned blocks on success.
    • error::Error enum changes:
      • The NoteMismatch variant now wraps a NoteId instead of a backend-specific note identifier. The related NoteRef type parameter has been removed from error::Error.
      • New variants have been added:
        • Error::UnsupportedChangeType
        • Error::NoSupportedReceivers
        • Error::NoSpendingKey
        • Error::Proposal
        • Error::ProposalNotSupported
      • Variant ChildIndexOutOfRange has been removed.
    • wallet:
      • shield_transparent_funds no longer takes a memo argument; instead, memos to be associated with the shielded outputs should be specified in the construction of the value of the input_selector argument, which is used to construct the proposed shielded values as internal "change" outputs. Also, it returns its result as a NonEmpty<TxId> instead of a single TxId.
      • create_proposed_transaction has been replaced by create_proposed_transactions. Relative to the prior method, the new method has the following changes:
        • It no longer takes a change_memo argument; instead, change memos are represented in the individual values of the proposed_change field of the Proposal's TransactionBalance.
        • create_proposed_transactions takes its proposal argument by reference instead of as an owned value.
        • create_proposed_transactions no longer takes a min_confirmations argument. Instead, it uses the anchor height from its proposal argument.
        • create_proposed_transactions forces implementations to ignore the database identifiers for its contained notes by universally quantifying the NoteRef type parameter.
        • It returns a NonEmpty<TxId> instead of a single TxId value.
      • create_spend_to_address now takes additional change_memo and fallback_change_pool arguments. It also returns its result as a NonEmpty<TxId> instead of a single TxId.
      • spend returns its result as a NonEmpty<TxId> instead of a single TxId.
      • The error type of create_spend_to_address has been changed to use zcash_primitives::transaction::fees::zip317::FeeError instead of zcash_primitives::transaction::components::amount::BalanceError. Yes this is confusing because create_spend_to_address is explicitly not using ZIP 317 fees; it's just an artifact of the internal implementation, and the error variants are not specific to ZIP 317.
      • The following methods now take &impl SpendProver, &impl OutputProver instead of impl TxProver:
        • create_proposed_transactions
        • create_spend_to_address
        • shield_transparent_funds
        • spend
      • propose_shielding and shield_transparent_funds now take their min_confirmations arguments as u32 rather than a NonZeroU32, to permit implementations to enable zero-conf shielding.
      • input_selection:
        • InputSelector::propose_shielding has been moved out to the newly-created ShieldingSelector trait.
          • ShieldingSelector::propose_shielding has been altered such that it takes an explicit target_height in order to minimize the capabilities that the data_api::InputSource trait must expose. Also, it now takes its min_confirmations argument as u32 instead of NonZeroU32.
        • The InputSelector::DataSource associated type has been renamed to InputSource.
        • InputSelectorError has added variant Proposal.
        • The signature of InputSelector::propose_transaction has been altered such that it longer takes min_confirmations as an argument, instead taking explicit target_height and anchor_height arguments. This helps to minimize the set of capabilities that the data_api::InputSource must expose.
        • GreedyInputSelector now has relaxed requirements for its InputSource associated type.
  • zcash_client_backend::proposal:
    • Arguments to Proposal::from_parts have changed.
    • Proposal::min_anchor_height has been removed in favor of storing this value in SaplingInputs.
    • Proposal::sapling_inputs has been replaced by Proposal::shielded_inputs
    • In addition to having been moved to the zcash_client_backend::proposal module, the Proposal type has been substantially modified in order to make it possible to represent multi-step transactions, such as a deshielding transaction followed by a zero-conf transfer as required by ZIP 320. Individual transaction proposals are now represented by the proposal::Step type.
    • ProposalError has new variants:
      • ReferenceError
      • StepDoubleSpend
      • ChainDoubleSpend
      • PaymentPoolsMismatch
  • zcash_client_backend::fees:
    • ChangeStrategy::compute_balance arguments have changed.
    • ChangeValue is now a struct. In addition to the existing change value, it now also provides the output pool to which change should be sent and an optional memo to be associated with the change output.
    • ChangeError has a new BundleError variant.
    • fixed::SingleOutputChangeStrategy::new, zip317::SingleOutputChangeStrategy::new, and standard::SingleOutputChangeStrategy::new each now accept additional change_memo and fallback_change_pool arguments.
  • zcash_client_backend::wallet:
    • Recipient is now polymorphic in the type of the payload for wallet-internal recipients. This simplifies the handling of wallet-internal outputs.
    • SentTransactionOutput::from_parts now takes a Recipient<Note>.
    • SentTransactionOutput::recipient now returns a Recipient<Note>.
    • OvkPolicy::Custom is now a structured variant that can contain independent Sapling and Orchard OutgoingViewingKeys.
    • WalletSaplingOutput::from_parts arguments have changed.
    • WalletSaplingOutput::nf now returns an Option<sapling::Nullifier>.
    • WalletTx is no longer parameterized by the nullifier type; instead, the nullifier is present as an optional value.
  • zcash_client_backend::scanning:
    • Arguments to scan_blocks have changed.
    • ScanError has new variants TreeSizeInvalid and EncodingInvalid.
    • ScanningKey is now a concrete type that bundles an incoming viewing key with an optional nullifier key and key source metadata. The trait that provides uniform access to scanning key information is now ScanningKeyOps.
  • zcash_client_backend::zip321:
    • TransactionRequest::payments now returns a BTreeMap<usize, Payment> instead of &[Payment] so that parameter indices may be preserved.
    • TransactionRequest::to_uri now returns a String instead of an Option<String> and provides canonical serialization for the empty proposal.
    • TransactionRequest::from_uri previously stripped payment indices, meaning that round-trip serialization was not supported. Payment indices are now retained.
  • The following fields now have type NonNegativeAmount instead of Amount:
    • zcash_client_backend::data_api:
      • error::Error::InsufficientFunds.{available, required}
      • wallet::input_selection::InputSelectorError::InsufficientFunds.{available, required}
    • zcash_client_backend::fees:
      • ChangeError::InsufficientFunds.{available, required}
    • zcash_client_backend::zip321::Payment.amount
  • The following methods now take NonNegativeAmount instead of Amount:
    • zcash_client_backend::data_api:
      • SentTransactionOutput::from_parts
      • wallet::create_spend_to_address
      • wallet::input_selection::InputSelector::propose_shielding
    • zcash_client_backend::fees:
      • ChangeValue::sapling
      • DustOutputPolicy::new
      • TransactionBalance::new
  • The following methods now return NonNegativeAmount instead of Amount:
    • zcash_client_backend::data_api::SentTransactionOutput::value
    • zcash_client_backend::fees:
      • ChangeValue::value
      • DustOutputPolicy::dust_threshold
      • TransactionBalance::{fee_required, total}
    • zcash_client_backend::wallet::WalletTransparentOutput::value

Deprecated

  • zcash_client_backend::data_api::wallet:
    • spend (use propose_transfer and create_proposed_transactions instead).

Removed

  • zcash_client_backend::wallet:
    • ReceivedSaplingNote (use zcash_client_backend::ReceivedNote instead).
    • input_selection::{Proposal, ShieldedInputs, ProposalError} (moved to zcash_client_backend::proposal).
    • SentTransactionOutput::sapling_change_to - the note created by an internal transfer is now conveyed in the recipient field.
    • WalletSaplingOutput::cmu (use WalletSaplingOutput::note and sapling_crypto::Note::cmu instead).
    • WalletSaplingOutput::account (use WalletSaplingOutput::account_id instead)
    • WalletSaplingSpend::account (use WalletSaplingSpend::account_id instead)
    • WalletTx fields {txid, index, sapling_spends, sapling_outputs} (use the new getters instead.)
  • zcash_client_backend::data_api:
    • {PoolType, ShieldedProtocol} (moved to zcash_client_backend).
    • {NoteId, Recipient} (moved to zcash_client_backend::wallet).
    • ScannedBlock::from_parts
    • ScannedBlock::{sapling_tree_size, sapling_nullifier_map, sapling_commitments} (use ScannedBundles::{tree_size, nullifier_map, commitments} instead).
    • ScannedBlock::into_sapling_commitments (use ScannedBlock::into_commitments instead).
    • wallet::create_proposed_transaction (use wallet::create_proposed_transactions instead).
    • chain::ScanSummary::from_parts
  • zcash_client_backend::proposal:
    • Proposal::min_anchor_height (use ShieldedInputs::anchor_height instead).
    • Proposal::sapling_inputs (use Proposal::shielded_inputs instead).

[0.10.0] - 2023-09-25

Notable Changes

  • zcash_client_backend now supports out-of-order scanning of blockchain history. See the module documentation for zcash_client_backend::data_api::chain for details on how to make use of the new scanning capabilities.
  • This release of zcash_client_backend defines the concept of an account birthday. The account birthday is defined as the minimum height among blocks to be scanned when recovering an account.
  • Account creation now requires the caller to provide account birthday information, including the state of the note commitment tree at the end of the block prior to the birthday height. A wallet's birthday is the earliest birthday height among accounts maintained by the wallet.

Added

  • impl Eq for zcash_client_backend::address::RecipientAddress
  • impl Eq for zcash_client_backend::zip321::{Payment, TransactionRequest}
  • impl Debug for zcash_client_backend::{data_api::wallet::input_selection::Proposal, wallet::ReceivedSaplingNote}
  • zcash_client_backend::data_api:
    • AccountBalance
    • AccountBirthday
    • Balance
    • BirthdayError
    • BlockMetadata
    • NoteId
    • NullifierQuery for use with WalletRead::get_sapling_nullifiers
    • Ratio
    • ScannedBlock
    • ShieldedProtocol
    • WalletCommitmentTrees
    • WalletSummary
    • WalletRead::{ chain_height, block_metadata, block_max_scanned, block_fully_scanned, suggest_scan_ranges, get_wallet_birthday, get_account_birthday, get_wallet_summary }
    • WalletWrite::{put_blocks, update_chain_tip}
    • chain::CommitmentTreeRoot
    • scanning A new module containing types required for suggest_scan_ranges
    • testing::MockWalletDb::new
    • wallet::input_sellection::Proposal::{min_target_height, min_anchor_height}
    • SAPLING_SHARD_HEIGHT constant
  • zcash_client_backend::proto::compact_formats:
    • impl<A: sapling::Authorization> From<&sapling::SpendDescription<A>> for CompactSaplingSpend
    • impl<A: sapling::Authorization> From<&sapling::OutputDescription<A>> for CompactSaplingOutput
    • impl<SpendAuth> From<&orchard::Action<SpendAuth>> for CompactOrchardAction
  • zcash_client_backend::wallet::WalletSaplingOutput::note_commitment_tree_position
  • zcash_client_backend::scanning:
    • ScanError
    • impl<K: ScanningKey> ScanningKey for &K
    • impl ScanningKey for (zip32::Scope, sapling::SaplingIvk, sapling::NullifierDerivingKey)
  • Test utility functions zcash_client_backend::keys::UnifiedSpendingKey::{default_address, default_transparent_address} are now available under the test-dependencies feature flag.

Changed

  • MSRV is now 1.65.0.
  • Bumped dependencies to hdwallet 0.4, zcash_primitives 0.13, zcash_note_encryption 0.4, incrementalmerkletree 0.5, orchard 0.6, bs58 0.5, tempfile 3.5.0, prost 0.12, tonic 0.10.
  • zcash_client_backend::data_api:
    • WalletRead::TxRef has been removed in favor of consistently using TxId instead.
    • WalletRead::get_transaction now takes a TxId as its argument.
    • WalletRead::create_account now takes an additional birthday argument.
    • WalletWrite::{store_decrypted_tx, store_sent_tx} now return Result<(), Self::Error> as the WalletRead::TxRef associated type has been removed. Use WalletRead::get_transaction with the transaction's TxId instead.
    • WalletRead::get_memo now takes a NoteId as its argument instead of Self::NoteRef and returns Result<Option<Memo>, Self::Error> instead of Result<Memo, Self::Error> in order to make representable wallet states where the full note plaintext is not available.
    • WalletRead::get_nullifiers has been renamed to WalletRead::get_sapling_nullifiers and its signature has changed; it now subsumes the removed WalletRead::get_all_nullifiers.
    • WalletRead::get_target_and_anchor_heights now takes its argument as a NonZeroU32
    • chain::scan_cached_blocks now takes a from_height argument that permits the caller to control the starting position of the scan range. In addition, the limit parameter is now required and has type usize.
    • chain::BlockSource::with_blocks now takes its limit as an Option<usize> instead of Option<u32>. It is also now required to return an error if from_height is set to a block that does not exist in self.
    • A new CommitmentTree variant has been added to data_api::error::Error
    • wallet::{create_spend_to_address, create_proposed_transaction, shield_transparent_funds} all now require that WalletCommitmentTrees be implemented for the type passed to them for the wallet_db parameter.
    • wallet::create_proposed_transaction now takes an additional min_confirmations argument.
    • wallet::{spend, create_spend_to_address, shield_transparent_funds, propose_transfer, propose_shielding, create_proposed_transaction} now take their respective min_confirmations arguments as NonZeroU32
    • A new Scan variant replaces the Chain variant of data_api::chain::error::Error. The NoteRef parameter to data_api::chain::error::Error has been removed in favor of using NoteId to report the specific note for which a failure occurred.
    • A new SyncRequired variant has been added to data_api::wallet::input_selection::InputSelectorError.
    • The variants of the PoolType enum have changed; the PoolType::Sapling variant has been removed in favor of a PoolType::Shielded variant that wraps a ShieldedProtocol value.
  • zcash_client_backend::wallet:
    • SpendableNote has been renamed to ReceivedSaplingNote.
    • Arguments to WalletSaplingOutput::from_parts have changed.
  • zcash_client_backend::data_api::wallet::input_selection::InputSelector:
    • Arguments to {propose_transaction, propose_shielding} have changed.
    • InputSelector::{propose_transaction, propose_shielding} now take their respective min_confirmations arguments as NonZeroU32
  • zcash_client_backend::data_api::wallet::{create_spend_to_address, spend, create_proposed_transaction, shield_transparent_funds} now return the TxId for the newly created transaction instead an internal database identifier.
  • zcash_client_backend::wallet::ReceivedSaplingNote::note_commitment_tree_position has replaced the witness field in the same struct.
  • zcash_client_backend::welding_rig has been renamed to zcash_client_backend::scanning
  • zcash_client_backend::scanning::ScanningKey::sapling_nf has been changed to take a note position instead of an incremental witness for the note.
  • Arguments to zcash_client_backend::scanning::scan_block have changed. This method now takes an optional BlockMetadata argument instead of a base commitment tree and incremental witnesses for each previously-known note. In addition, the return type has now been updated to return a Result<ScannedBlock, ScanError>.
  • zcash_client_backend::proto::service:
    • The module is no longer behind the lightwalletd-tonic feature flag; that now only gates the service::compact_tx_streamer_client submodule. This exposes the service types to parse messages received by other gRPC clients.
    • The module has been updated to include the new gRPC endpoints supported by lightwalletd v0.4.15.

Removed

  • zcash_client_backend::data_api:
    • WalletRead::block_height_extrema has been removed. Use chain_height instead to obtain the wallet's view of the chain tip instead, or suggest_scan_ranges to obtain information about blocks that need to be scanned.
    • WalletRead::get_balance_at has been removed. Use WalletRead::get_wallet_summary instead.
    • WalletRead::{get_all_nullifiers, get_commitment_tree, get_witnesses} have been removed without replacement. The utility of these methods is now subsumed by those available from the WalletCommitmentTrees trait.
    • WalletWrite::advance_by_block (use WalletWrite::put_blocks instead).
    • PrunedBlock has been replaced by ScannedBlock
    • testing::MockWalletDb, which is available under the test-dependencies feature flag, has been modified by the addition of a sapling_tree property.
    • wallet::input_selection:
      • Proposal::target_height (use Proposal::min_target_height instead).
  • zcash_client_backend::data_api::chain::validate_chain (logic merged into chain::scan_cached_blocks.
  • zcash_client_backend::data_api::chain::error::{ChainError, Cause} have been replaced by zcash_client_backend::scanning::ScanError
  • zcash_client_backend::proto::compact_formats:
    • impl<A> From<sapling::OutputDescription<A>> for CompactSaplingOutput (use From<&sapling::OutputDescription<A>> instead).
  • zcash_client_backend::wallet::WalletSaplingOutput::{witness, witness_mut} have been removed as individual incremental witnesses are no longer tracked on a per-note basis. The global note commitment tree for the wallet should be used to obtain witnesses for spend operations instead.
  • Default implementations of zcash_client_backend::data_api::WalletRead::{ get_target_and_anchor_heights, get_max_height_hash } have been removed. These should be implemented in a backend-specific fashion.

[0.9.0] - 2023-04-28

Added

  • data_api::SentTransactionOutput::from_parts
  • data_api::WalletRead::get_min_unspent_height

Changed

  • decrypt::DecryptedOutput is now parameterized by a Note type parameter, to allow reuse of the data structure for non-Sapling contexts.
  • data_api::SentTransactionOutput must now be constructed using SentTransactionOutput::from_parts. The internal state of SentTransactionOutput is now private, and accessible via methods that have the same names as the previously exposed fields.

Renamed

  • The following types and fields have been renamed in preparation for supporting orchard in wallet APIs:
    • WalletTx::shielded_spends -> WalletTx::sapling_spends
    • WalletTx::shielded_outputs -> WalletTx::sapling_outputs
    • WalletShieldedSpend -> WalletSaplingSpend. Also, the internals of this data structure have been made private.
    • WalletShieldedOutput -> WalletSaplingOutput. Also, the internals of this data structure have been made private.
  • The data_api::WalletWrite::rewind_to_height method has been renamed to truncate_to_height to better reflect its semantics.

Removed

  • wallet::WalletTx::num_spends
  • wallet::WalletTx::num_outputs
  • wallet::WalletSaplingOutput::to is redundant and has been removed; the recipient address can be obtained from the note.
  • decrypt::DecryptedOutput::to is redundant and has been removed; the recipient address can be obtained from the note.

[0.8.0] - 2023-04-15

Changed

  • Bumped dependencies to bls12_381 0.8, group 0.13, orchard 0.4, tonic 0.9, base64 0.21, bech32 0.9, zcash_primitives 0.11.
  • The dependency on zcash_primitives no longer enables the multicore feature by default in order to support compilation under wasm32-wasi. Users of other platforms may need to include an explicit dependency on zcash_primitives without default-features = false or otherwise explicitly enable the zcash_primitives/multicore feature if they did not already depend upon zcash_primitives with default features enabled.

Fixed

  • zcash_client_backend::fees::zip317::SingleOutputChangeStrategy now takes into account the Sapling output padding behaviour of zcash_primitives::transaction::components::sapling::builder::SaplingBuilder.

[0.7.0] - 2023-02-01

Added

  • zcash_client_backend::data_api::wallet:
    • input_selection::Proposal::{is_shielding, target_height}
    • propose_transfer
    • propose_shielding
    • create_proposed_transaction

Changed

  • MSRV is now 1.60.0.
  • Bumped dependencies to zcash_primitives 0.10.
  • zcash_client_backend::data_api::chain:
    • BlockSource::with_blocks now takes from_height as Option<BlockHeight> instead of BlockHeight. Trait implementors should return all available blocks in the datastore when from_height is None.
    • Various breaking changes to validate_chain:
      • The parameters: &ParamsT argument has been removed. When None is given as the validate_from argument, validate_chain will now pass None to BlockSource::with_blocks (instead of the Sapling network upgrade's activation height).
      • A limit: Option<u32> argument has been added. This enables callers to validate smaller intervals of blocks already present on the provided BlockSource, shortening processing times of the function call at the expense of obtaining a partial result. When providing a limit, a result of Ok(()) means that the chain has been validated on its continuity of heights and hashes in the range [validate_from, validate_from + limit). Callers are responsible for making subsequent calls to validate_chain in order to complete validating the totality of block_source.
  • zcash_client_backend::data_api::wallet:
    • input_selection::Proposal no longer has a TransparentInput generic parameter, and Proposal::transparent_inputs now returns &[zcash_client_backend::wallet::WalletTransparentOutput].
    • shield_transparent_funds now takes a shielding_threshold argument that can be used to specify the minimum value allowed as input to a shielding transaction. Previously the shielding threshold was fixed at 100000 zatoshis.
  • Note commitments now use zcash_primitives::sapling::note::ExtractedNoteCommitment instead of bls12_381::Scalar in the following places:
    • The cmu field of zcash_client_backend::wallet::WalletShieldedOutput.
    • zcash_client_backend::proto::compact_formats::CompactSaplingOutput::cmu.

Removed

  • zcash_client_backend::data_api:
    • WalletWrite::remove_unmined_tx (was behind the unstable feature flag).

[0.6.1] - 2022-12-06

Added

  • zcash_client_backend::data_api::chain::scan_cached_blocks now generates tracing spans, which can be used for profiling.

Fixed

  • zcash_client_backend:zip321 no longer returns an error when trying to parse a URI without query parameters.

[0.6.0] - 2022-11-12

Added

  • Functionality that enables the receiving and spending of transparent funds, behind the new transparent-inputs feature flag.
    • A new zcash_client_backend::data_api::wallet::shield_transparent_funds method has been added to facilitate the automatic shielding of transparent funds received by the wallet.
    • A zcash_client_backend::wallet::WalletTransparentOutput type in support of transparent-inputs functionality.
  • An unstable feature flag; this is added to parts of the API that may change in any release.
  • zcash_client_backend::address:
    • RecipientAddress::Unified
    • AddressMetadata
    • impl Eq for UnifiedAddress
  • zcash_client_backend::data_api:
    • wallet::spend method, intended to supersede the wallet::create_spend_to_address method. This new method now constructs transactions via interpretation of a zcash_client_backend::zip321::TransactionRequest value. This facilitates the implementation of ZIP 321 support in wallets and provides substantially greater flexibility in transaction creation.
    • PoolType
    • ShieldedPool
    • Recipient
    • SentTransactionOutput
    • WalletRead::get_unified_full_viewing_keys
    • WalletRead::get_account_for_ufvk
    • WalletRead::get_current_address
    • WalletRead::get_all_nullifiers
    • WalletRead::get_transparent_receivers
    • WalletRead::get_unspent_transparent_outputs
    • WalletRead::get_transparent_balances
    • WalletWrite::create_account
    • WalletWrite::remove_unmined_tx (behind the unstable feature flag).
    • WalletWrite::get_next_available_address
    • WalletWrite::put_received_transparent_utxo
    • impl From<prost::DecodeError> for error::Error
    • chain::error: a module containing error types type that that can occur only in chain validation and sync have been separated out from errors related to other wallet operations.
    • input_selection: a module containing types related to the process of selecting inputs to be spent, given a transaction request.
  • zcash_client_backend::decrypt:
    • TransferType
  • zcash_client_backend::proto:
    • actions field on compact_formats::CompactTx
    • compact_formats::CompactOrchardAction
    • gRPC bindings for the lightwalletd server, behind a lightwalletd-tonic feature flag.
  • zcash_client_backend::zip321::TransactionRequest methods:
    • TransactionRequest::empty for constructing a new empty request.
    • TransactionRequest::new for constructing a request from Vec<Payment>.
    • TransactionRequest::payments for accessing the Payments that make up a request.
  • zcash_client_backend::encoding
    • KeyError
    • AddressCodec implementations for sapling::PaymentAddress and UnifiedAddress.
  • zcash_client_backend::fees
    • ChangeError
    • ChangeStrategy
    • ChangeValue
    • TransactionBalance
    • fixed, a module containing change selection strategies for the old fixed fee rule.
    • zip317, a module containing change selection strategies for the ZIP 317 fee rule.
  • New experimental APIs that should be considered unstable, and are likely to be modified and/or moved to a different module in a future release:
    • zcash_client_backend::address::UnifiedAddress
    • zcash_client_backend::keys::{UnifiedSpendingKey, UnifiedFullViewingKey, Era, DecodingError}
    • zcash_client_backend::encoding::AddressCodec
    • zcash_client_backend::encoding::encode_payment_address
    • zcash_client_backend::encoding::encode_transparent_address

Changed

  • MSRV is now 1.56.1.
  • Bumped dependencies to ff 0.12, group 0.12, bls12_381 0.7 zcash_primitives 0.9, orchard 0.3.
  • zcash_client_backend::proto:
    • The Protocol Buffers bindings are now generated for prost 0.11 instead of protobuf 2.
    • compact_formats::CompactSpend has been renamed to CompactSaplingSpend, and its epk field (and associated set_epk method) has been renamed to ephemeralKey (and set_ephemeralKey).
    • compact_formats::CompactOutput has been renamed to CompactSaplingOutput.
  • epk: jubjub::ExtendedPoint has been replaced by ephemeral_key: zcash_note_encryption::EphemeralKeyBytes in various places:
    • zcash_client_backend::wallet::WalletShieldedOutput: the epk field has been replaced by ephemeral_key.
    • zcash_client_backend::proto::compact_formats::CompactSaplingOutput: the epk method has been replaced by ephemeral_key.
  • zcash_client_backend::data_api:
    • Renamed the following to use lower-case abbreviations (matching Rust naming conventions):
      • testing::MockWalletDB to testing::MockWalletDb
    • Changes to the WalletRead trait:
      • WalletRead::get_target_and_anchor_heights now takes a min_confirmations argument that is used to compute an upper bound on the anchor height being returned; this had previously been hardcoded to wallet::ANCHOR_OFFSET.
      • WalletRead::get_spendable_notes has been renamed to get_spendable_sapling_notes, and now takes as an argument a vector of note IDs to be excluded from consideration.
      • WalletRead::select_spendable_notes has been renamed to select_spendable_sapling_notes, and now takes as an argument a vector of note IDs to be excluded from consideration.
      • The WalletRead::NoteRef and WalletRead::TxRef associated types are now required to implement Eq and Ord
    • WalletWrite::store_received_tx has been renamed to store_decrypted_tx.
    • wallet::decrypt_and_store_transaction now always stores the transaction by calling WalletWrite::store_decrypted_tx, even if no outputs could be decrypted. The error type produced by the provided WalletWrite instance is also now returned directly.
    • The SentTransaction type has been substantially modified to accommodate handling of transparent inputs. Per-output data has been split out into a new struct SentTransactionOutput, and SentTransaction can now contain multiple outputs, and tracks the fee paid.
    • ReceivedTransaction has been renamed to DecryptedTransaction, and its outputs field has been renamed to sapling_outputs.
    • BlockSource has been moved to the chain module.
    • The types of the with_row callback argument to BlockSource::with_blocks and the return type of this method have been modified to return chain::error::Error.
    • testing::MockBlockSource has been moved to chain::testing::MockBlockSource module.
    • chain::{validate_chain, scan_cached_blocks} have altered parameters and result types. The latter have been modified to returnchain::error::Error instead of abstract error types. This new error type now wraps the errors of the block source and wallet database to which these methods delegate IO operations directly, which simplifies error handling in cases where callback functions are involved.
    • error::ChainInvalid has been moved to chain::error.
    • error::Error has been substantially modified. It now wraps database, note selection, builder, and other errors.
      • Added new error cases:
        • Error::DataSource
        • Error::NoteSelection
        • Error::BalanceError
        • Error::MemoForbidden
        • Error::AddressNotRecognized
        • Error::ChildIndexOutOfRange
        • Error::NoteMismatch
      • Error::InsufficientBalance has been renamed to InsufficientFunds and restructured to have named fields.
      • Error::Protobuf has been removed; these decoding errors are now produced as data source and/or block-source implementation-specific errors.
      • Error::InvalidChain has been removed; its former purpose is now served by chain::ChainError.
      • Error::InvalidNewWitnessAnchor and Error::InvalidWitnessAnchor have been moved to chain::error::ContinuityError.
      • Error::InvalidExtSk (now unused) has been removed.
      • Error::KeyNotFound (now unused) has been removed.
      • Error::KeyDerivationError (now unused) has been removed.
      • Error::SaplingNotActive (now unused) has been removed.
  • zcash_client_backend::decrypt:
    • decrypt_transaction now takes a HashMap<_, UnifiedFullViewingKey> instead of HashMap<_, ExtendedFullViewingKey>.
  • If no memo is provided when sending to a shielded recipient, the empty memo will be used.
  • zcash_client_backend::keys::spending_key has been moved to the zcash_client_backend::keys::sapling module.
  • zcash_client_backend::zip321::MemoError has been renamed and expanded into a more comprehensive Zip321Error type, and functions in the zip321 module have been updated to use this unified error type. The following error cases have been added:
    • Zip321Error::TooManyPayments(usize)
    • Zip321Error::DuplicateParameter(parse::Param, usize)
    • Zip321Error::TransparentMemo(usize)
    • Zip321Error::RecipientMissing(usize)
    • Zip321Error::ParseError(String)
  • zcash_client_backend::welding_rig:
    • The API of ScanningKey has changed to accommodate batch decryption and to correctly handle scanning with the internal (change) keys derived from ZIP 316 UFVKs and UIVKs.
    • scan_block now uses batching for trial-decryption of transaction outputs.
  • The return type of the following methods in zcash_client_backend::encoding have been changed to improve error reporting:
    • decode_extended_spending_key
    • decode_extended_full_viewing_key
    • decode_payment_address
  • zcash_client_backend::wallet::SpendableNote is now parameterized by a note identifier type and has an additional note_id field that is used to hold the identifier used to refer to the note in the wallet database.

Deprecated

  • zcash_client_backend::data_api::wallet::create_spend_to_address has been deprecated. Use zcash_client_backend::data_api::wallet::spend instead. If you wish to continue using create_spend_to_address, note that the arguments to the function has been modified to take a unified spending key instead of a Sapling extended spending key, and now also requires a min_confirmations argument that the caller can provide to specify a minimum number of confirmations required for notes being selected. A minimum of 10 confirmations is recommended.

Removed

  • zcash_client_backend::data_api:
    • wallet::ANCHOR_OFFSET
    • WalletRead::get_extended_full_viewing_keys (use WalletRead::get_unified_full_viewing_keys instead).
    • WalletRead::get_address (use WalletRead::get_current_address or WalletWrite::get_next_available_address instead.)
    • impl From<protobuf::ProtobufError> for error::Error
  • zcash_client_backend::proto::compact_formats:
    • Compact*::new methods (use Default::default or struct instantiation instead).
    • Getters (use dedicated typed methods or direct field access instead).
    • Setters (use direct field access instead).
  • zcash_client_backend::wallet::AccountId (moved to zcash_primitives::zip32::AccountId).
  • impl zcash_client_backend::welding_rig::ScanningKey for ExtendedFullViewingKey (use DiversifiableFullViewingKey instead).

[0.5.0] - 2021-03-26

Added

  • zcash_client_backend::address::RecipientAddress
  • zcash_client_backend::data_api module, containing the Data Access API.
  • zcash_client_backend::wallet:
    • AccountId
    • SpendableNote
    • OvkPolicy
  • zcash_client_backend::welding_rig::ScanningKey trait, representing a key which can be used for trial decryption of outputs, and optionally nullifier computation. This trait is implemented for zcash_primitives::zip32:ExtendedFullViewingKey and zcash_primitives::primitives::SaplingIvk.
  • First alpha of TZE support, behind the zfuture feature flag.

Changed

  • MSRV is now 1.47.0.
  • epk fields and return values were changed from a jubjub::SubgroupPoint to a jubjub::ExtendedPoint, to match the change to the zcash_primitives decryption APIs:
    • zcash_client_backend::proto::compact_formats::CompactOutput::epk()
    • The epk field of zcash_client_backend::wallet::WalletShieldedOutput.
  • zcash_client_backend::decrypt:
    • decrypt_transaction now takes a variable with type P: zcash_primitives::consensus::Parameters.
    • The memo field of DecryptedOutput now has type MemoBytes.
  • zcash_client_backend::wallet:
    • The nf property of WalletShieldedSpend now has the type Nullifier.
    • The account property of WalletShieldedSpend and WalletShieldedOutput now has the type AccountId.
  • zcash_client_backend::welding_rig:
    • scan_block now takes &[(AccountId, K: ScanningKey)], instead of a slice of extended full viewing keys with implicit account IDs.
    • The nullifiers argument to scan_block now has the type &[(AccountId, Nullifier)].

Removed

  • zcash_client_backend::constants module (its sub-modules have been moved into zcash_primitives::constants, and more generally replaced by the new methods on the zcash_primitives::consensus::Parameters trait).

[0.4.0] - 2020-09-09

Changed

  • MSRV is now 1.44.1.
  • Bumped dependencies to ff 0.8, group 0.8, bls12_381 0.3.1, jubjub 0.5.1, protobuf 2.15.

[0.3.0] - 2020-08-24

TBD

[0.2.0] - 2020-03-13

TBD

[0.1.0] - 2019-10-08

Initial release.