zcashd/doc/release-notes/release-notes-4.7.0.md

870 lines
50 KiB
Markdown

Notable changes
===============
Changes to Testnet NU5 Consensus Rules
--------------------------------------
NOTE: All testnet nodes that have been running on testnet above height 1,599,200 will need
to upgrade to `v4.7.0` and then run with `-reindex` and `-rescan`.
- In order to better support hardware wallets, transparent signature hash construction as
defined in [ZIP 244](https://zips.z.cash/zip-0244) has been modified to include a hash
of the serialization of the amounts of all outputs being spent, along with a hash of all
spent outputs `scriptPubKeys` values, except in the case that the `ANYONECANPAY` flag is
set. This allows hardware wallet devices to verify the UTXO amounts without having to
stream all the previous transactions containing the outputs being spent to the device.
Also as part of these changes, the transparent signature hash digest now commits
directly, rather than implicitly, to the sighash type, and the sighash type is
restricted to a fixed set of valid values. The change to ZIP 244 can be seen
[here](https://github.com/zcash/zips/commit/ac9dd97f77869b9191dc9592faa3ebf45475c341).
- This release fixes a bug in `v4.6.0` that caused a consensus failure on the Zcash
testnet at height `1,779,200`. For details see
<https://github.com/zcash/zcash/commit/5990853de3e9f04f28b7a4d59ef9e549eb4b4cca>.
- There have been changes to the Halo2 proving system to improve consistency between the
specification and the implementation, and these may break compatibility. See for example
<https://github.com/zcash/halo2/commit/247cd620eeb434e7f86dc8579774b30384ae02b2>.
- There have been numerous changes to the Orchard circuit implementation since `v4.6.0`.
See <https://github.com/zcash/orchard/issues?q=label%3AM-consensus-change-since-0.1.0-beta-1>
for a complete list.
- A potential Faerie Gold vulnerability affecting the previous activation of NU5 on
testnet and existing since `v4.6.0` has been mitigated.
NU5 Testnet Reactivation
------------------------
To support the aforementioned testnet consensus changes, the following changes are made in
`zcashd v4.7.0`:
- The consensus branch ID for NU5 is changed to `0xC2D6D0B4`.
- The protocol version indicating NU5-aware testnet nodes is set to `170050`.
- The testnet reactivation height for NU5 is set to **1,842,420**.
As mentioned above, all testnet nodes that have been running on testnet above height
1,599,200 will need to upgrade to `v4.7.0` and then run with `-reindex` and `-rescan`.
Emergency Recovery Phrases
--------------------------
The zcashd wallet has been modified to support BIP 39, which describes how to derive the
wallet's HD seed from a mnemonic phrase, hereafter known as the wallet's "emergency
recovery phrase". The emergency recovery phrase will be generated on load of the wallet,
or the first time the wallet is unlocked, and is available via the `z_exportwallet` RPC
call. All new addresses produced by the wallet are now derived from this seed using the HD
wallet functionality described in ZIP 32 and ZIP 316. For users upgrading an existing
Zcashd wallet, it is recommended that the wallet be backed up prior to upgrading to the
4.7.0 Zcashd release. In the remainder of this document, the HD seed derived from the
emergency recovery phrase will be termed the wallet's "mnemonic seed".
Following the upgrade to 4.7.0, Zcashd will require that the user confirm that they have
backed up their new emergency recovery phrase, which may be obtained from the output of
the `z_exportwallet` RPC call. This confirmation can be performed manually using the
`zcashd-wallet-tool` utility that is supplied with this release (built or installed in the
same directory as `zcashd`). The wallet will not allow the generation of new addresses
until this confirmation has been performed. It is recommended that after this upgrade,
funds tied to preexisting addresses be migrated to newly generated addresses so that all
wallet funds are recoverable using the emergency recovery phrase going forward. If you
choose not to migrate funds in this fashion, you will continue to need to securely back up
the entire `wallet.dat` file to ensure that you do not lose access to existing funds;
EXISTING FUNDS WILL NOT BE RECOVERABLE USING THE EMERGENCY RECOVERY PHRASE UNLESS THEY
HAVE BEEN MOVED TO A NEWLY GENERATED ADDRESS FOLLOWING THE 4.7.0 UPGRADE.
In the case that your wallet previously contained a Sapling HD seed, the emergency
recovery phrase is constructed using the bytes of that seed, such that it is possible to
reconstruct keys generated using that legacy seed if you know the emergency recovery
phrase. HOWEVER, THIS RECONSTRUCTION DOES NOT FOLLOW THE NORMAL PROCESS OF DERIVATION FROM
THE EMERGENCY RECOVERY PHRASE. Instead, to recover a legacy Sapling key from the emergency
recovery phrase, it is necessary to reconstruct the bytes of the legacy seed by conversion
of the phrase back to its source randomness instead of by hashing as is specified in BIP
39. Only keys and addresses produced after the upgrade can be obtained by normal
derivation of a ZIP 32 or BIP 32 master seed using BIP 39.
Wallet Updates
--------------
The zcashd wallet now supports the Orchard shielded protocol.
The zcashd wallet has been modified to alter the way that change is handled. In the case
that funds are being spent from a unified account, change is sent to a wallet-internal
change address for that account instead of sending change amounts back to the original
address where a note being spent was received. The rationale for this change is that it
improves the security that is provided to the user of the wallet when supplying incoming
viewing keys to third parties; previously, an incoming viewing key could effectively be
used to detect when a note was spent (hence violating the "incoming" restriction) by
observing change outputs that were sent back to the address where the spent note was
originally received.
New RPC Methods
---------------
- `walletconfirmbackup` This newly created API checks a provided emergency recovery phrase
against the wallet's emergency recovery phrase; if the phrases match then it updates the
wallet state to allow the generation of new addresses. This backup confirmation
workflow can be disabled by starting zcashd with `-walletrequirebackup=false` but this
is not recommended unless you know what you're doing (and have otherwise backed up the
wallet's emergency recovery phrase anyway). For security reasons, this RPC method is
not intended for use via `zcash-cli` but is provided to enable `zcashd-wallet-tool` and
other third-party wallet interfaces to satisfy the backup confirmation requirement. Use
of the `walletconfirmbackup` API via `zcash-cli` would risk that the emergency recovery
phrase being confirmed might be leaked via the user's shell history or the system
process table; `zcashd-wallet-tool` is provided specifically to avoid this problem.
- `z_getnewaccount` This API allows for creation of new BIP 44 / ZIP 32 accounts using HD
derivation from the wallet's mnemonic seed. Each account represents a separate spending
authority and source of funds. A single account may contain funds in the Sapling and
Orchard shielded pools, as well as funds held in transparent addresses.
- `z_listaccounts` This API returns the list of BIP 44 / ZIP 32 accounts that are being
tracked by the wallet.
- `z_getaddressforaccount` This API allows for creation of diversified unified addresses
under a single account. Each call to this API will, by default, create a new diversified
unified address containing transparent p2pkh, Sapling, and Orchard receivers. Additional
arguments to this API may be provided to request the address to be created with a
user-specified set of receiver types and diversifier index.
- `z_getbalanceforaccount` This API makes it possible to obtain balance information on a
per-account basis.
- `z_getbalanceforviewingkey` This API allows a user to obtain balance
information for funds visible to a Sapling or Unified full viewing key; if a Sprout
viewing key is provided, this method allows retrieval of the balance only in the case
that the wallet controls the corresponding spending key. This API has been added to
supplement (and largely supplant) `z_getbalance`. Querying for balance by a single
address returns only the amount received by that address, and omits value sent to other
diversified addresses derived from the same full viewing key; by using
`z_getbalanceforviewingkey` it is possible to obtain a correct balance that includes all
amounts controlled by a single spending key, including both those sent to external
diversified addresses and to wallet-internal change addresses.
- `z_listunifiedreceivers` This API allows the caller to extract the individual component
receivers from a unified address. This is useful if one needs to provide a bare Sapling
or transparent p2pkh address to a service that does not yet support unified addresses.
RPC Changes
-----------
- The result type for the `listaddresses` endpoint has been modified:
- The `keypool` source type has been removed; it was reserved but not used.
- In the `sapling` address results, the `zip32AccountId` attribute has been removed in
favor of `zip32KeyPath`. This is to allow distinct key paths to be reported for
addresses derived from the legacy account under different child spending authorities,
as are produced by `z_getnewaddress`.
- Addresses derived from the wallet's mnemonic seed are now included in
`listaddresses` output.
- The results of the `dumpwallet` and `z_exportwallet` RPC methods have been modified
to now include the wallet's newly generated emergency recovery phrase as part of the
exported data. Also, the seed fingerprint and HD keypath information are now included in
the output of these methods for all HD-derived keys.
- The results of the `getwalletinfo` RPC have been modified to return two new fields:
`mnemonic_seedfp` and `legacy_seedfp`, the latter of which replaces the field that
was previously named `seedfp`.
- A new `pool` attribute has been added to each element returned by `z_listunspent` to
indicate which value pool the unspent note controls funds in.
- `z_listreceivedbyaddress`
- A `pool` attribute has been added to each result to indicate what pool the received
funds are held in.
- A boolean-valued `change` attribute has been added to indicate whether the output is
change.
- Block metadata attributes `blockheight`, `blockindex`, and `blocktime` have been
added to the result.
- `z_viewtransaction` has been updated to include attributes that provide information
about Orchard components of the transaction. Also, the `type` attribute for spend and
output values has been deprecated and replaced by the `pool` attribute.
- `z_getnotescount` now also returns information for Orchard notes.
- The output format of `z_exportwallet` has been changed. The exported file now includes
the mnemonic seed for the wallet, and HD keypaths are now exported for transparent
addresses when available.
- The result value for `z_importviewingkey` now includes an `address_type` field that
replaces the now-deprecated `type` key.
- `z_listunspent` has been updated to render unified addresses for Sapling and
Orchard outputs when those outputs are controlled by unified spending keys. Outputs
received by unified internal addresses do not include the `address` field.
- Legacy transparent address generation using `getnewaddress` no longer uses a
preallocated keypool, but instead performs HD derivation from the wallet's mnemonic seed
according to BIP 39 and BIP 44 under account ID `0x7FFFFFFF`.
- `z_gettreestate` has been updated to include information about the Orchard note
commitment tree.
### 'z_sendmany'
- The `z_sendmany` RPC call no longer permits Sprout recipients in the list of recipient
addresses. Transactions spending Sprout funds will still result in change being sent
back into the Sprout pool, but no other `Sprout->Sprout` transactions will be
constructed by the Zcashd wallet.
- The restriction that prohibited `Sprout->Sapling` transactions has been lifted; however,
since such transactions reveal the amount crossing pool boundaries, they must be
explicitly enabled via a parameter to the `z_sendmany` call.
- A new string parameter, `privacyPolicy`, has been added to the list of arguments
accepted by `z_sendmany`. This parameter enables the caller to control what kind of
information they permit `zcashd` to reveal on-chain when creating the transaction. If the
transaction can only be created by revealing more information than the given strategy
permits, `z_sendmany` will return an error. The parameter defaults to `LegacyCompat`,
which applies the most restrictive strategy `FullPrivacy` when a Unified Address is
present as the sender or a recipient, and otherwise preserves existing behaviour (which
corresponds to the `AllowFullyTransparent` policy). In cases where it is possible to do
so without revealing additional information, and where it is permitted by the privacy
policy, the wallet will now opportunistically shield funds to the most current pool.
- Since Sprout outputs are no longer created (with the exception of change)
`z_sendmany` no longer generates payment disclosures (which were only available for
Sprout outputs) when the `-paymentdisclosure` experimental feature flag is set.
- Outgoing viewing keys used for shielded outputs are now produced as
described in [ZIP 316](https://zips.z.cash/zip-0316#usage-of-outgoing-viewing-keys)
- When sending from or to one or more unified addresses, change outputs
are now always sent to addresses controlled by the wallet's internal spending keys, as
described in [ZIP 316](https://zips.z.cash/zip-0316#deriving-internal-keys). These
addresses are not returned by any RPC API, as they are intended to never be shared with
any third party, and are for wallet-internal use only. This change improves the privacy
properties that may be maintained when sharing a unified internal viewing key for an
account in the wallet.
- In cases where `z_sendmany` might produce transparent change UTXOs, those UTXOs are
sent to addresses derived from the wallet's mnemonic seed via the BIP 44 `change`
derivation path.
RPC Deprecations
----------------
- `z_getnewaddress` has been deprecated in favor of `z_getnewaccount` and
`z_getaddressforaccount`.
- `z_listaddresses` has been deprecated. Use `listaddresses` instead.
- `z_getbalance` has been deprecated. Use `z_getbalanceforviewingkey` instead.
See the discussion of how change is now handled under the `Wallet` heading for
additional background.
- `z_gettotalbalance` has been deprecated. Use `z_getbalanceforaccount` instead.
- `dumpwallet` has been deprecated. Use `z_exportwallet` instead.
Build System
------------
- Clang has been updated to use LLVM 13.0.1.
- libc++ has been updated to use LLVM 13.0.1, except on Windows where it uses 13.0.0-3.
- The Rust toolchain dependency has been updated to version 1.59.0.
Platform Support
----------------
- Debian 9 has been removed from the list of supported platforms.
- Debian 11 (Bullseye) has been added to the list of supported platforms.
- A build issue (a missing header file) has been fixed for macOS targets.
- On Arch Linux only, a copy of Debian's libtinfo5_6.0 is used to fix a build
regression.
Mining
------
- Mining to Orchard recipients is now supported on testnet.
- It is now possible to mine to a Sapling receiver of a unified address.
- Concurrency bugs related to `getblocktemplate` have been fixed via backports from
Bitcoin Core.
Licenses
--------
- License information in `contrib/debian/copyright` has been updated to be more accurate.
Changelog
=========
Alfredo Garcia (3):
change error message
fix grammar in message
remove final dot from error msg
Charlie O'Keefe (2):
Update base image used by Dockerfile from debian 10 to debian 11
Remove stretch (debian 9), add bullseye (debian 11) in gitian descriptor
Conrado Gouvea (2):
Add comment to zcash_script_new_precomputed_tx about references to input buffers
Add zcash_script V5 functions
Daira Hopwood (42):
Avoid a warning by explicitly calling drop.
Replace call to drop with zeroization.
contrib/devtools/rust-deps-graph.sh: allow overriding the arguments to `cargo deps`.
Cosmetic whitespace change
Make a zcashd-wallet-tool executable.
Attempt to fix linking problem on ARM.
Add some text about choosing location of the physical backup. Add TODO for better handling of file not found and permission errors.
Move `wallet_tool.rs` from `src/rust/src` into `src/rust/bin`. Also add a brief description of `zcashd-wallet-tool` to `src/rust/README.md`.
Improved error handling.
The recovery phrase confirmation and `zcashd-wallet-tool` are being introduced in zcashd v4.7.0.
Refactor use of `export_path` as suggested.
Tweak the wording of the fallback messages when the terminal cannot be automatically cleared.
Simplify extraction of recovery phrase.
Improve memory hygiene, and use -stdin to pass the recovery phrase to the child zcash-cli process.
Cleanups to error handling for the first invocation of zcash-cli.
Use the tracing crate for debugging.
Improve error message when the config file cannot be found, taking into account -conf and -datadir.
Ensure the buffer used in `prompt` is zeroized even on error.
Document that '~' cannot be used in `-datadir` (see #5661).
Set `meta` for `-datadir` option.
Simplify debug tracing.
Correct the fallback instruction for how to clear the terminal on macOS: pressing Command + K also clears scrollback.
Include $(bin_SCRIPTS) in `check-symbols`, `check-security`, and `clean` targets. Checking for stack canaries in `check-security` is disabled for Rust executables (Rust does support `-Z stack-protector=all` but only for the nightly compiler).
qa/zcash/full_test_suite.py: enable `test_rpath_runpath` for Rust binaries, and reenable `test_fortify_source` for C++ binaries.
Tweaks to message text.
zcashd-wallet-tool: add man page generation. fixes #5729
zcashd-wallet-tool: warn that wallet.dat needs to be backed up. fixes #5704
zcashd-wallet-tool: adjust man page to correct copyright information.
Start with an empty banlist if -reindex is set. fixes #5739
contrib/debian/copyright: add license entries for Libtool macros.
contrib/debian/copyright: minor corrections and formatting
contrib/debian/copyright: add licenses of Rust dependencies that do not have Expat/MIT as an option.
contrib/debian/copyright: add license for Apache-2.0.
Switch Jack Grigg's copyright on src/rust/{include/tracing.h, src/tracing_ffi.rs} to the Zcash developers (with his permission).
Repair `feature_zip239` RPC test by checking the debug log of node 0 rather than its stderr.
qa/zcash/updatecheck.py: print status code and response of failed http requests.
Postpone native_clang and libcxx 14.0.0.
Fix an incorrect preprocessor symbol. Also repair the lint-includes-guards.sh script that was checking for the incorrect symbol.
.gitignore: add files temporarily created by autoconf.
This check done for Sprout and Sapling (which is separate from consensus nullifier checks) was not being done for Orchard.
AcceptToMemoryPool: Remove initial nullifier checks for Sprout and Sapling (within the mempool only), that are redundant with checks in HaveShieldedRequirements. The latter take into account nullifiers in the chain (using CCoinsViewMemPool::GetNullifier) and include Orchard.
Revert "rpc: Reload CNode spans after reloading the log filter". fixes #5863
Dimitris Apostolou (2):
Fix typos
Fix typos
Jack Grigg (111):
wallet: Implement `z_getnewaccount`
wallet: Implement `z_getaddressforaccount`
wallet: Implement `z_listunifiedreceivers`
wallet: Show UAs owned by the wallet in `z_viewtransaction`
wallet: Reverse order of arguments to z_getaddressforaccount
rust: Add missing Orchard receiver check in UA parsing
rust: Add missing checks for shielded UFVK items
rust: Add missing checks for transparent UFVK items
wallet: Implement `z_getbalanceforaccount`
wallet: Fix account generation bug
wallet: Implement `z_getbalanceforaddress`
wallet: Don't show Sapling receivers from UAs in `z_listaddresses`
wallet: Show UAs instead of Sapling receivers in `z_listunspent`
wallet: Remove `CWallet::GetKeyFromPool`
wallet: Store internal transparent keys in the keypool
wallet: Separate counters for external and internal transparent keys
Move shielded signature checks out of `ContextualCheckTransaction`
Make `PrecomputedTransactionData` a required argument of `SignatureHash`
Update ZIP 244 test vectors
Add Orchard recipient support to the transaction builder
Update ZIP 244 implementation
Enforce ZIP 244 consensus rules on sighash type
Make `TransactionBuilder::AddOrchardOutput` memo optional
Enforce length constraints on allPrevOutputs
ZIP 244: Address review comments
Return UFVK from `CWallet::GenerateNewUnifiedSpendingKey`
Rename to `ZcashdUnifiedSpendingKey::GetSaplingKey` for consistency
Trial-decrypt candidate Sapling receivers with all wallet UFVKs
Add mappings from Orchard receivers to IVKs to the wallet
Add Orchard to default UA receiver types
Fix semantic merge conflicts
Select Orchard receivers preferentially from UAs
Regenerate `TxDigests` after rebuilding tx with Orchard bundle
Migrate to `orchard` crate revision with circuit changes
qa: Bump all postponed dependencies
qa: Postpone recent CCache release
depends: Update Rust to 1.59.0
depends: Update Clang / libcxx to LLVM 13.0.1
cargo update
rust: Fix clippy lint
Ensure the view's best Orchard anchor matches the previous block
Add missing `view.PopAnchor(_, ORCHARD)` in `DisconnectBlock`
Add RPC test for the Orchard commitment tree bug on first NU5 testnet
Use `std::optional` in `CValidationInterface::GetAddressForMining`
Select Orchard receivers from UA miner addresses once NU5 activates
miner: Manually add dummy Orchard output with Orchard miner address
rpc: Handle keypool exhaustion separately in `generate` RPC
libzcash_script: Add more granular errors to the new APIs
depends: Revert to `libc++ 13.0.0-3` for Windows cross-compile
Add Orchard spend support to the transaction builder
wallet: Alter `OrchardWallet::GetSpendInfo` to return the spending key
Improve FFI interface documentation
Refactor `CWallet::GenerateChangeAddressForAccount`
Add unit tests for `SpendableInputs::LimitToAmount`
Fix bug in `SpendableInputs::LimitToAmount`
Select spendable inputs based on recipient and change pool types
Implement opportunistic shielding in `SpendableInputs::LimitToAmount`
Add Orchard cases to note selection logic
Add Orchard to change address generation
Add support for sending Orchard funds in `z_sendmany`
Set default Orchard anchor confirmations to 1
build: Fix `zcash/address/orchard.hpp` filename in `src/Makefile.am`
z_sendmany: Replace `allowRevealedAmount` with `privacyStrategy`
z_sendmany: Expand `privacyPolicy` cases
build: Add missing `util/match.h` to `src/Makefile.am`
wallet: Add seedfp to transparent keys in dumpwallet / z_exportwallet
Fix bugs in wallet_addresses RPC test
wallet: Fix bugs in `listaddresses`
wallet: Fix Sapling address bug in `listaddresses`
wallet: Fix expected `listaddresses` sources in `rpc_wallet_tests`
qa: Exclude `native_libtinfo` from dependency update checks
cargo update
make-release.py: Versioning changes for 4.7.0-rc1.
make-release.py: Updated manpages for 4.7.0-rc1.
make-release.py: Updated release notes and changelog for 4.7.0-rc1.
Migrate to latest `zcash/librustzcash` revision
Fix logical merge conflicts after merging 4.7.0-rc1
builder: Use correct `PrecomputedTransactionData` for transparent sigs
Set NU5 protocol version for regtest to 170040, bump protocol version
qa: Remove hard-coded consensus branch IDs from RPC tests
qa: Remove pinned action indices from wallet_listreceived
Test Orchard shielded coinbase rules
test: Print all logged errors to stdout during gtests
builder: Handle `std::ios_base::failure` exceptions during sighash
test: Improve gtest handling of `TransactionBuilderResult::GetTxOrThrow`
rust: Improve `PrecomputedTransactionData` construction errors
test: Fix `WalletTests.GetConflictedOrchardNotes` gtest
qa: Add RPC test testing Orchard note position persistence
wallet: Move Orchard note position data into a separate map
wallet: Persist Orchard note positions with the witness tree
wallet: Add version information to Orchard commitment tree data
wallet: Persist Orchard tx height alongside note positions
qa: Add test for Orchard support in `z_listunspent`
wallet: Treat `mnemonichdchain` records as key material
wallet: Initialise ThreadNotifyWallets with wallet's best block
Apply `HaveShieldedRequirements` to coinbase transactions
mempool: Remove duplicated anchor and nullifier assertions
AcceptToMemoryPool: Re-add missing code comment
wallet: Rename `CWallet::GetBestBlock` to `GetPersistedBestBlock`
Add trace-level logging to the Orchard wallet
wallet: Add assertions during Orchard wallet bundle appends
wallet: Remove duplicate nullifier insertion into Orchard wallet
lint: Add check that every Cargo patch has a matching replacement
qa: Postpone update to Rust 1.60
wallet: Bump a trace log message to error in `Wallet::checkpoint`
rpc: Document that enabling trace-level logging is unsafe
test: Capture gtest log output and only print on error
qa: Update Berkeley DB release listener regex
cargo update
depends: Remove `hyper 0.14.2` pin
depends: Remove direct `tokio` dependency
John Newbery (1):
Log calls to getblocktemplate
Jonas Schnelli (1):
[Wallet] add HD xpriv to dumpwallet
Kris Nuttycombe (303):
Derive random HD seeds from ZIP-339 seed phrases.
Add support for externally searching for valid Sapling diversifiers.
Adds basic unified spending key derivation.
Add unified full viewing keys and Zcash-internal unified addresses.
Use the default UA-based Sapling address for the saplingmigration tool.
Fix tests for wallet operations on legacy Sapling keys.
Remove unused forward declaration.
Update librustzcash dependency version.
Apply suggestions from code review
Derive transparent keys from mnemonic seed.
Generate legacy Sapling addresses from the mnemonic seed.
Replace account ID with ZIP-0032 key path in listaddresses output.
Use legacy address for Sapling migration until UA functionality is available to the RPC tests.
Revert change to the type of GenerateNewKey
Fix wallet import/export test
Use 0x7FFFFFFF for the legacy account ID.
Require backup of the emergency recovery phrase.
Use hardened derivation for the legacy Sapling key at the address index level.
Address comments from code review.
Restore legacy HD seed storage & retrieval tests.
Fix spurious test passage.
Move CKeyMetadata back to wallet.h
Clean up format of recovery information in the wallet dump.
Use SecureString for mnemonic phrase.
Apply suggestions from code review
Fix diversifier_index_t less than operator.
Restore FindAddress comment
Fix transparent BIP-44 keypaths.
Fix naming of unified spending & full viewing keys
Fix max transparent diversifier index.
Clean up handling of mnemonic seed metadata.
Restore legacy HDSeed encryption tests.
Style fix in BIP 32 path account parsing test.
Do not strip quotes when verifying mnemonic seed.
Apply suggestions from code review
Fix name of menmonic entropy length constant.
Fix polymorphism of string serialization.
Document mnemonic-seed-related RPC method changes & update changelog.
Minor cleanup of the code that searches for a valid transparent key.
Generalize keypath parsing over account id.
Update documentation for GenerateNewSeed.
Use MnemonicSeed instead of HDSeed where appropriate.
Add diversifier_index_t::ToTransparentChildIndex
Only maintain CKeyID for the transparent part of ZcashdUnifiedAddress
Minor naming fixes
Parameterize HD keypath parsing by coin type.
Fix error message text to refer to zcashd-wallet-tool rather than the RPC method.
Apply suggestions from code review
Minor textual fixes to release notes.
Improve documentation of the `-walletrequirebackup` zcashd wallet configuration option.
Add libzcash::AccountId type.
Adds Orchard Address, IncomingViewingKey, FullViewingKey, and SpendingKey types.
Apply suggestions from code review
Update orchard & librustzcash dependency versions.
Remove incorrect FFI method documentation.
Remove Orchard spending key equality implementation.
Refine structure of Zcash address generation.
Use CKeyID and CScriptID instead of new P2PKH/P2SHAddress classes.
Remove ZcashdUnifiedAddress in favor of UnifiedAddress
Update to ufvk zcash_address build.
Adds SaplingDiversifiableFullViewingKey
Add Rust FFI components for unified full viewing keys.
Add UnifiedFullViewingKey type.
Apply suggestions from code review
Add tests for ufvk roundtrip serialization.
Apply suggestions from code review
Apply suggestions from code review
Apply suggestions from code review
Add functions for generating BIP-44 and ZIP-32 keypaths
Check the output of zip339_phrase_to_seed in MnemonicSeed initialization.
Compute key id for UFVKs.
Add ZcashdUnifiedKeyMetadata and libzcash::ReceiverType
Add unified key components to the transparent & Sapling wallet parts.
Store ufvks to the wallet database.
Add unified address tracking to KeyStore
Load unified full viewing keys from the walletdb.
Add key metadata to walletdb.
Add unified address generation.
AddTransparentSecretKey does not need to take a CExtKey
Add newly generated transparent UA receivers to the wallet.
Add CWallet::GetUnifiedForReceiver
Add tests for keystore storage and retrieval of UFVKs.
Add test for wallet UA generation & detection.
Add test for CKeyStore::AddUnifiedAddress
Fix handling of unified full viewing key metadata.
Apply suggestions from code review
Only derive ZcashdUnifiedFullViewingKey from UnifiedFullViewingKey
Rename `ZcashdUnifiedSpendingKeyMetadata` -> `ZcashdUnifiedAccount`
Remove unused ufvkid argument from AddTransparentSecretKey
Ensure that unified address metadata is always correctly populated.
Apply suggestions from code review
Make `FindAddress` correctly check for maximum transparent child index.
Use Bip44TransparentAccountKeyPath() for Bip44AccountChains keypath construction.
Improve documentation of UFVK/UA metadata storage semantics.
Apply suggestions from code review
Fix encoding order of unified addresses.
Remove the `InvalidEncoding` type from key & address variants.
Use CKeyID and CScriptID instead of new P2PKH/P2SHAddress classes.
Remove spurious uses of HaveSpendingKeyForPaymentAddress
Add raw transparent address types to PaymentAddress
Remove spurious variant from asyncrpcoperation_sendmany
Remove `RawAddress`
Replace `DecodeDestination` in `GetMinerAddress` with `DecodePaymentAddress`
Remove uses of KeyIO::DecodeDestination
Remove a use of KeyIO::DecodeDestination in z_shieldcoinbase
Use libzcash::PaymentAddress instead of std::string in mergetoaddress
Improve error messages in the case of taddr decoding failure.
Apply suggestions from code review
Apply suggestions from code review
Use transaction builder for asyncrpcoperation_sendmany.
Transaction builder must not set consensus branch ID for V4 transactions.
Fix conditions around dust thresholds.
Require an explicit flag to allow cross-pool transfers in z_sendmany.
Apply suggestions from code review
Return z_sendmany errors synchronously when possible.
Update release notes to reflect z_sendmany changes
Move FindSpendableInputs to CWallet
Replace the badly-named `PaymentSource` with `ZTXOSelector`
Add support for unified addresses to CWallet::ToZTXOSelector
Replace `HaveSpendingKeyForAddress` with checks at ZTXOSelector construction.
Modify CWallet::FindSpendableInputs to use ZTXOSelector
Add CWallet::FindAccountForSelector
Add RecipientAddress type.
Use libzcash::RecipientAddress for z_sendmany recipients.
Apply suggestions from code review
Rename ZTXOSelector::SpendingKeysAvailable -> RequireSpendingKeys
Make `FindSpendableInputs` respect `ZTXOSelector::RequireSpendingKeys()`
Clarify documentation of CWallet::FindAccountForSelector
Use `ZTXOSelector::IncludesSapling` rather than selector internals.
Add documentation for `UnifiedAddress::GetPreferredRecipientAddress`
Add correct selection of change addresses to z_sendmany
Add a first-class type for transparent full viewing keys.
Implement OVK selection for z_sendmany.
Implement derivation of the internal Sapling spending key.
Use a BIP 44 change address for change when sending from legacy t-addrs.
Add a check for internal vs. external outputs to wallet_listreceived test.
Fix z_sendmany handling of transparent OVK derivation in the ANY_TADDR case.
Simplify determination of valid change types.
Add failing tests for z_sendmany ANY_TADDR -> UA and UA -> <legacy_taddr>
Add gtest for change address derivation.
Fix variable shadowing in change address derivation & add change IVK to the keystore.
GenerateLegacySaplingZKey only needs to return an address, not an extfvk.
Rename AddSaplingIncomingViewingKey -> AddSaplingPaymentAddress
Do not add Sapling addresses to the wallet by default when adding extfvks.
Fix a bug in the generation of addresses from UFVKs
Add accessor method for Sapling IVKs to SaplingDiversifiableFullViewingKey
Address TODOs in rpc-tests/wallet-accounts.py
Add a few additional cases to z_sendmany RPC tests.
Update librustzcash dependency.
Fix nondeterministic test error (checking for the wrong error case).
Use z_shieldcoinbase for Sprout funds in wallet_listreceived tests.
Apply suggestions from code review
Apply suggestions from code review.
Fix nondeterministic test failure in wallet_listreceivedby.py
Fix locking in z_getbalanceforaddress and z_getbalanceforaccount
Replace z_getbalanceforaddress with z_getbalanceforviewingkey
Clarify documentation of z_getbalanceforviewingkey for Sprout viewing keys.
Implement PaymentAddressBelongsToWallet for unified addresses.
Add unified address support to GetSourceForPaymentAddress
Address comments from review.
Add change field to z_listreceivedbyaddress for transparent addrs.
Fix missing std::variant header that was breaking Darwin builds.
Add test vectors for UFVK derivation
Rename sapling-specific zip32 FFI methods.
Make SaveRecipientMappings polymorphic in RecipientMapping type.
Add Rust backend for Orchard components of the wallet.
Add GetFilteredNotes to Orchard wallet.
Add test for Orchard wallet note detection.
Move parsing of unified addresses to UnifiedAddress.
Remove txid field from TxNotes
Apply suggestions from code review
Add various bits of documentation
Add Orchard components to unified address
Add Orchard components to unified full viewing keys
Add Orchard components to unified spending keys
Remove OrchardSpendingKey serialization code
Select Orchard notes in FindSpendableInputs
GenerateNewKey must be guarded by a cs_wallet lock
Filter returned Orchard notes by minimum confirmations.
Log outpoint for failed Sapling witness lookup.
Add a roundtrip test for Orchard merkle frontier serialization from the C++ side.
Add test for Orchard contribution to z_gettotalbalance
Respect minDepth argument for Orchard notes in GetFilteredNotes
Update MSRV for lints.
Update incrementalmerkletree version
Split LoadWalletTx from AddToWallet
Fix missing locks for GenerateNewUnifiedSpendingKey tests.
Record when notes are detected as being spent in the Orchard wallet.
Reset Orchard wallet state when rescanning from below NU5 activation.
Check wallet latest anchor against hashFinalOrchardRoot in ChainTip.
Remove assertions that require Orchard wallet persistence to satisfy.
Add a test for Orchard note detection.
Assert we never attempt to checkpoint the Orchard wallet at a negative block height.
Apply suggestions from code review
Add an `InPoint` type to the Orchard wallet to fix incorrect conflict data.
Apply suggestions from code review
Fix missing update to `last_checkpoint` on rewind.
Track mined-ness instead of spent-ness of notes in the Orchard wallet.
Apply suggestions from code review
Respect maxDepth for Orchard notes in GetFilteredNotes
Set number of confirmations for Orchard notes returned by FindSpendableInputs
Update walletTx with decrypted Orchard action metadata.
Persist Orchard action index/IVK mappings in CWalletTx
Restore decrypted notes to the wallet.
Update tests with rollback checks.
Apply suggestions from code review
Restore mined block heights when restoring decrypted notes.
Apply suggestions from code review
Return std::optional<CExtKey> from CExtKey::Master
Ensure that Orchard spentness information is repopulated by LoadUnifiedCaches.
Modify `join_network` in tests to skip mempool resync.
Address suggestions from code review on #5637
Apply suggestions from code review
Serialize the Orchard note commitment tree to the wallet.
Update orchard_wallet_add_notes_from_bundle documentation.
Derive the new mnemonic seed from the legacy HD seed, if one is available.
Fix indentation.
Apply suggestions from code review
Explicitly specify the change address in the Sapling migration.
Add TODO for Orchard z_listunspent integration.
Document that z_getnewaccount and z_getaddressforaccount replace z_getnewaddress.
Add orchard support to z_getnotescount
Document that Orchard keys are not supported in z_importkey help
Return the correct error for `z_getbalance` if a UA does not correspond to an account in the wallet..
Update documentation of z_importviewingkey and z_exportviewingkey to address unified keys.
Add UnifiedAddress variant to ZTXOSelector
Eliminate redundancy between the wallet and the keystore.
Simplify retrieval of unified account by address.
Add OrchardWallet::GetTxActions
Apply suggestions from code review
Update z_viewtransaction documentation to correctly represent field names.
Add debug printing for receivers and recipient addresses.
Correctly report change outputs in z_viewtransaction.
Return the default unified address if we have the UFVK but no address metadata.
Fix missing AllowRevealedSenders flag in test.
Uncomment addtional tests that depend on z_viewtransaction.
Minor rename & documentation improvement.
Add RecipientType to GetPaymentAddressForRecipient result.
Make CWallet::DefaultReceiverTypes height-dependent.
Return failure rather than asserting on WriteRecipientMapping failure.
Lock cs_main for accesses to chainActive in GetPaymentAddressForRecipient.
Fix legacy address handling in CWallet::GetPaymentAddressForRecipient
Documentation fix for UnifiedAddressForReciever (+ spelling corrections.)
Restore legacy default Sapling addresses to the keystore.
Assert that pindexStart cannot be null in CWallet::ScanForWalletTransactions
Rename unifiedaddress->address in z_getaddressforaccount results
Add undocumented components to getinfo API.
Improve consistency of RPC parameter and result attribute naming.
Correctly return p2pkh/p2sh labels for z_listunifiedreceivers
Add test for rollback of an Orchard spend.
Add missing filter to ensure only fully-transparent transactions end up in mapOrphans.
Apply suggestions from code review
Improve error message for when a UA is only usable after a future NU.
Improve error logging in walletdb.cpp
Add an RPC test that attempts a double-spend.
Fix overzealous matching of Orchard FVKs to addresses.
Guard against invalid coercion of int to u32 in FindSpendableInputs
Apply suggestions from code review
Ensure that legacy imported addresses are properly restored to the wallet.
Add a test verifying the default addr is added when importing a Sapling key.
Update release notes to include all RPC changes since 4.6.0
Note that Debian 9 has been removed from the list of supported platforms.
Add independent wallet persistence tests.
Apply suggestions from code review
Add Orchard support to z_listunspent.
Update incrementalmerkletree version to fix GC bug & use updated API.
Add account ID to z_listunspent results.
Add a test demonstrating that z_listaddresses reveals internal addrs.
Do not display internal addresses in z_listaddresses.
Adds a test demonstrating an Orchard wallet initialization bug.
Refactor ChainTip to take a struct of Merkle trees instead of a pair.
Fix a bug in initialization of the Orchard wallet after NU5 activation.
Improve error output from OrchardWallet::get_spend_info
Update test to verify rewind behavior.
Omit check of Orchard commitment root after rewind past first checkpoint.
Only check nWitnessCacheSize on rewind if we've ever witnessed a Sprout or Sapling note.
Add a test demonstrating that change may cross the pool boundary without permission.
Add logging to the miner to provide more detail on tx selection.
Check privacy strategy when setting allowed change types.
Update to orchard-0.1.0-beta.3, incrementalmerkletree 0.3.0-beta.2, secp256k1-0.21
Make all privacy policy checks after note selection.
Add 'AllowRevealedAmounts' in tests where it is now necessary.
Return MAX_PRIORITY when transactions contain an Orchard bundle.
Use DEFAULT_FEE consistently in wallet_unified_change test
Never consider transactions that pay the default fee to be free.
Fix assertion in wallet initialization when wallet best block is ahead of the main chain.
Apply suggestions from code review
Apply suggestions from code review
Fix error in z_listaccounts help text.
Ensure pindexPrev is not null before mining against it.
Make Orchard `finalState` serialization format match Sapling.
Fix missing null initialization of `pindexLastTip` pointer in ThreadStartWalletNotifier
Fix uninitialized sleep variable.
Don't advance the wallet init timer until past reindex.
Defensively check for a null pindex in `FindFork`
Set NU5 testnet reactivation height.
Update protocol version to 170050 for v4.7.0 release.
Update the release notes to describe consensus changes since v4.6.0
Apply suggestions from code review
Push back NU5 testnet release height to 1842420
qa: postpone native_clang, libcxx, boost, and native_b2 upgrades before 4.7.0 release
make-release.py: Versioning changes for 4.7.0.
make-release.py: Updated manpages for 4.7.0.
Larry Ruane (13):
add ParseArbitraryInt() for diversifier index
add -orchardwallet experimental feature flag
Add new and modify existing Orchard RPCs, non-functional
mining: submitblock: log detailed equihash solution error
allow UA as z_shieldcoinbase destination
fix minconf parsing for z_getbalanceforaccount and z_getbalanceforaddress
Update z_listreceivedbyaddress to support unified addresses (5467)
fix wallet_listreceived.py, add blockdata to taddr output
z_listreceivedbyaddress: reject UA component addr (#5537)
add functional test
document global variables
update listaddresses RPC for UAs, Orchard
Add regtest documentation to book
Marius Kjærstad (1):
Update copyright year to 2022
Marshall Gaucher (1):
Update Dockerfile
Pieter Wuille (2):
Fix csBestBlock/cvBlockChange waiting in rpc/mining
Modernize best block mutex/cv/hash variable naming
Sean Bowe (12):
wallet: consolidate unified key/address/account map reconstruction
wallet: restore Orchard secret keys from mnemonic seed
wallet: restore orchard address to IVK mappings during wallet loading
wallet: rather than assert, error in case of inconsistency between FVK and address
wallet: add logging for failure cases in unified cache loading
AddBogusOrchardSpends
Add test that checks if a bundle containing duplicate Orchard nullifiers is rejected.
Hardcode transaction data for DuplicateOrchardNullifier test.
Revert "AddBogusOrchardSpends"
Activate NU5 at start of DuplicateOrchardNullifier test.
Rename constant in include file to avoid conflicts with btest
Fix logic for deciding whether to perform Orchard updates during rescan
Steven Smith (9):
Lock cs_main prior to calling blockToJSON
Mark z_gettotalbalance and dumpwallet as deprecated
Add Orchard support to the z_gettreestate RPC
Update transaction size estimation to include V5 transactions
Extend uniqueness check in z_sendmany to UA receivers
Load previously persisted sent transaction recipient metadata back into the wallet.
Add Orchard & unified address support to z_viewtransaction.
Ensure z_viewtransaction returns Orchard details
Remove the fExperimentalOrchardWallet flag and related logic
Taylor Hornby (2):
Untested, not working yet, use libtinfo from the debian packages
Only send exceptions to the log, not stderr
sasha (21):
on Arch only, use Debian's libtinfo5_6.0 to satisfy clang
explain the 0x0f0f[..]0f0f powLimit constant for regtest
remove superfluous space at end of native_packages line
gtests ordering: change wallet filename in WriteZkeyDirectToDb
gtests ordering: ContextualCheckBlockTest's TearDown deactivates Blossom
gtests ordering: CheckBlock.VersionTooLow calls SelectParams(MAIN)
implement AtomicTimer::zeroize() that resets start_time and total_time
gtests ordering: make Metrics.GetLocalSolPS idempotent
gtests ordering: clean up wallet files before each WalletZkeysTest
make librustzcash_init_zksnark_params idempotent
move proof parameter loading out of gtest/main.cpp and into utiltest.cpp
Call LoadProofParameters() in gtests that need proofs
Add missing wallet/orchard.h to src/Makefile.am
Add missing gtest/test_transaction_builder.h to Makefile.gtest.include
Prevent a pindex == NULL case in the ScanForWalletTransactions traversal
Disallow testnet peers with a protocol version older than 170040
Fix test_wallet_zkeys failures by increasing diversifier search offset
Fix sporadic failures in StoreAndRetrieveMnemonicSeedInEncryptedStore
Fix the exception message for SetSeedFromMnemonic failure
add walletrequirebackup=false to the zcash argument list in smoke_tests.py
fix smoke_tests.py accounting math to remove the warning before test 4r
Jack Grigg (1):
Apply suggestions from code review
Ying Tong Lai (31):
Move SendManyRecipient to wallet.h and introduce optional ua field.
SendTransaction: Introduce recipients argument.
Implement read and write for (txid, recipient) -> ua mapping.
z_sendmany: Only get ua if decoded is ua variant.
ShieldToAddress: Factor out static shieldToAddress() helper.
Docfixes.
CSerializeRecipientAddress: add Read method and make constructor private.
WriteRecipientMapping: Check that receiver exists in UA.
wallet_sendmany_any_taddr.py: Test sending from a change taddr.
wallet_sendmany_any_taddr.py: Test sending output from expired tx.
FindSpendableInputs: Add nDepth < 0 check.
wallet_sendmany_any_taddr.py: Expect expired tx to be ignored.
Orchard: invalidate mempool transactions that use orphaned anchors.
coins_tests.cpp: Add Orchard nullifier to TxWithNullifiers().
coins_tests: Update tests to include Orchard case.
CWallet::GetConflictS: Handle conflicting Orchard spends.
z_getbalance: Handle Unified Address case.
Adapt RPC tests to use z_getbalance for UAs.
test_wallet: Test GetConflictedOrchardNotes.
Fix GetConflictedOrchardNotes test.
Introduce OrchardWallet::GetPotentialSpendsFromNullifier method.
Update FFI to use scoped APIs for viewing keys and addresses
Introduce CWallet::HaveOrchardSpendingKeyForAddress.
Introduce push_orchard_result in z_listreceivedbyaddress.
IsNoteSaplingChange: Inline internal recipient check.
Correctly derive UAs for unknown Orchard receivers.
Add z_listaccounts RPC.
Inline z_listaccounts check in wallet_accounts.py
Use height of latest network upgrade in -mineraddress validation.
Fix >= bound when iterating over network upgrades.
Check for overflow in IncrementAccountCounter().
ying tong (3):
Apply docfixes from code review
Style improvements in RPC tests.
orchard_wallet_get_potential_spends: Do not use uint256 type.
Zancas Wilcox (4):
blake2b/s is integrated into hashlib, drop external python package dependency
update doctest in gtest suite to prefer hashlib
enforce usage of the get_tests comptool interface as ComparisonTestFramework method
All implementations of ComparisonTestFramework were overriding num_nodes