Commit Graph

609 Commits

Author SHA1 Message Date
Jack Grigg e926151f8f zcash_client_sqlite: Use `Uuid::from_u128` for all UUIDs
Previously we used `Uuid::from_fields` to ensure that the various UUID
fields were correctly constructed, but now that we have a CI lint that
checks this automatically, we can consistently use `Uuid::from_u128`
which is easier to prepare from `uuidgen` output.
2023-09-25 12:05:42 +00:00
Jack Grigg 478b5d1858 zcash_client_sqlite: Clean up migrations graph comment 2023-09-25 11:14:24 +00:00
Kris Nuttycombe b90f285359 zcash_client_sqlite: Include spent utxos in v_transactions net value.
This fixes a bug in v_transactions whereby shielding transactions
displayed an incorrect balance.
2023-09-24 21:35:42 -06:00
Jack Grigg 30c58ebfb2 zcash_client_sqlite 0.8.0-rc.5 2023-09-22 23:26:43 +01:00
Jack Grigg 4afc24af6a zcash_client_backend 0.10.0-rc.4 2023-09-22 23:25:19 +01:00
Jack Grigg b76b028b3a zcash_client_sqlite: Set chain tip to truncation height when truncating
We don't know at truncation time what the latest chain tip is; the chain
might have reorged to a shorter heavier chain, or the reorg depth might
only be a few blocks. `WalletDb::chain_height` uses the scan queue as
its source of truth, so the `Verify` range we add during truncation
(to prioritise determining whether the rewind was sufficient) can't
extend beyond the block height we know to exist.

The next call to `WalletDb::update_chain_tip` will add additional ranges
beyond this height, which might include a `Verify` range that ends up
merging with the one added during truncation.
2023-09-22 21:09:23 +00:00
Jack Grigg 625a5ff594 zcash_client_sqlite: Remove is-mined checks from transparent balance
The `LEFT OUTER JOIN` was causing the `tx.block IS NULL` check to alias
two cases: an unspent transparent output, and a transparent output spent
in an unmined transaction. The latter only makes sense to include in the
UTXO count if the transaction is expired, and (due to limitations of the
transparent data model in the current wallet) if that expiry won't be
undone by a reorg. We now handle these two cases directly.

Partly reverts 8828276361.
Closes zcash/librustzcash#983.

Co-authored-by: Kris Nuttycombe <kris@nutty.land>
2023-09-22 21:09:23 +00:00
Jack Grigg cd6c962719 zcash_client_sqlite: Write a test for transparent balance behaviour 2023-09-22 17:20:10 +00:00
Jack Grigg 71e38fe190 zcash_client_sqlite: Enable `TestState` to mine wallet transactions 2023-09-22 17:20:07 +00:00
Jack Grigg 9e4fa96dd7 zcash_client_sqlite: Clean up existing transparent input test 2023-09-22 17:01:00 +00:00
str4d e817a75582
Merge pull request #987 from zcash/test-harness-fixes-to-rc-branch
Merge test harness fixes to the release candidate branch
2023-09-22 18:00:22 +01:00
Kris Nuttycombe b69d80f25d zcash_client_sqlite: Remove use of boolean constants from `v_tx_outputs`
At present, [zcash/zcash-android-wallet-sdk] supports Android API 27,
which bundles SQLite 3.19. SQLite support for the `TRUE` and `FALSE`
constants were introduced in SQLite 3.23, so we cannot currently use
these constants and retain support for Android API 27.

This version support limitation applies only to the `v_transactions`
and `v_tx_outputs` views, which are considered part of the public API
of this crate; other use of more recent SQLite features is fine because
they rely upon the SQLite bundled via our use of the `rusqlite` crate
and feature compatibility is verified via the unit tests of this crate.
2023-09-20 10:09:25 -06:00
Kris Nuttycombe e7b3e9c04e zcash_client_sqlite 0.8.0-rc.4 2023-09-19 15:01:52 -06:00
Kris Nuttycombe 6d2c53111a zcash_client_backend 0.10.0-rc.3 2023-09-19 15:00:51 -06:00
Kris Nuttycombe c0e29ad103 zcash_client_sqlite: fix join to blocks table in `v_transactions`
This allows us to display additional block information when a
transparent UTXO was provided for a block that we have scanned.
Also, this ensures that memos from a wallet to itself are not
double-counted.

Co-authored-by: str4d <thestr4d@gmail.com>
2023-09-19 13:15:50 -06:00
Kris Nuttycombe 15bfb41773 Apply suggestions from code review.
Co-Authored-By: str4d <thestr4d@gmail.com>
Co-Authored-By: Daira Hopwood <daira@jacaranda.org>
2023-09-19 13:15:50 -06:00
Kris Nuttycombe 6ebd66da76 zcash_client_sqlite: Remove inner join between `transactions` and `utxos` from `v_transactions`
Under normal usage conditions, the `transactions` table is not currently
populated for transactions involving transparent UTXOs, and so this join
was always resulting in transparent UTXO information being filtered out
from the transaction history.

Fixes [zcash/ZcashLightClientKit#1271]
2023-09-19 13:15:50 -06:00
Kris Nuttycombe 1575f2db88 zcash_client_backend: make the `SpanningTree` type usable outside of `zcash_client_sqlite`
This adds the `data_api::scanning::spanning_tree` module under
a new `unstable-spanning-tree` feature flag, making it available to
other implementations who want to be able to write their own storage
backends without having to reinvent the spanning tree logic.
2023-09-18 11:22:35 -06:00
Kris Nuttycombe b32aa3d2a6 Fix missing zcash_client_backend feature dependency. 2023-09-12 09:35:18 -06:00
Kris Nuttycombe e6b34eeaa2 zcash_client_sqlite 0.8.0-rc.2 2023-09-12 08:32:34 -06:00
Kris Nuttycombe 24068cd63a zcash_client_backend 0.10.0-rc.2 2023-09-12 08:31:39 -06:00
Kris Nuttycombe 1e39daf6f8
Merge pull request #963 from nuttycom/bug/commitment_tree_depth
zcash_client_backend: Fix an error that can occur due to sparse `shardtree` checkpoints.
2023-09-12 08:05:50 -06:00
Kris Nuttycombe f2dcba3a34 Apply suggestions from code review
Co-authored-by: str4d <thestr4d@gmail.com>
2023-09-11 18:39:27 -06:00
Kris Nuttycombe 24e8c82546 zcash_client_backend: Get commitment tree depth for a given number of confirmations from the database.
This fixes the following bug:

Due to complexities related to non-linear scanning, checkpoints are only
added to the wallet's commitment tree in cases where there are notes
discovered within a scanned block. At present, the `shardtree` API only
makes it possible to add multiple checkpoints of the same tree state
when adding checkpoints at the chain tip, and this functionality is not
used by `zcash_client_backend` because we perform checkpoint insertion
in batches that may contain gaps in the case that multiple blocks
contain no Sapling notes. While it would be possible to fix this by
altering the `shardtree` API to permit explicit insertion of multiple
checkpoints of the same tree state at a given note position, this fix
takes a simpler approach.

Instead of ensuring that a checkpoint exists at every block and
computing the required checkpoint depth directly from the minimum number
of confirmations required when attempting a spend, we alter the
`WalletCommitmentTrees` API to allow internal information of the note
commitment tree to be used to determine this checkpoint depth, given the
minimum number of commitments as an argument. This allows us to select a
usable checkpoint from the sparse checkpoint set that resulted from the
sparse insertion of checkpoints described above.
2023-09-11 18:38:54 -06:00
Daira Emma Hopwood 101c9c0ea4 Add passing test for current behaviour of wallet restore from seed.
refs #936

Signed-off-by: Daira Emma Hopwood <daira@jacaranda.org>
2023-09-12 01:33:12 +01:00
Daira Emma Hopwood 401af23484 Improve wallet tests.
Signed-off-by: Daira Emma Hopwood <daira@jacaranda.org>
2023-09-12 01:33:12 +01:00
Kris Nuttycombe 771e4013c3 Move shardtree serialization to the `zcash_client_backend` crate 2023-09-11 18:18:08 -06:00
Kris Nuttycombe 28f1f7d296 zcash_client_sqlite: Add a test for when gaps exist in checkpoints. 2023-09-11 17:08:51 -06:00
Kris Nuttycombe 92237a5558 zcash_client_sqlite: `serialization` module should not have been public. 2023-09-11 16:48:13 -06:00
Jack Grigg 62e3299255 zcash_client_sqlite 0.8.0-rc.1 2023-09-08 19:58:46 +00:00
Jack Grigg 9db68c76ee zcash_client_backend 0.10.0-rc.1 2023-09-08 19:50:53 +00:00
Jack Grigg 87ca71b8db zcash_proofs 0.13.0-rc.1 2023-09-08 19:48:55 +00:00
Jack Grigg 67b84c25e0 zcash_primitives 0.13.0-rc.1 2023-09-08 19:45:54 +00:00
Jack Grigg 94c1f2413d Migrate to `incrementalmerkletree 0.5`, `orchard 0.6` 2023-09-08 18:57:25 +00:00
Kris Nuttycombe 61e06d2227 zcash_client_sqlite: Update CHANGELOG.md for 0.8.0 release 2023-09-08 11:02:37 -06:00
Jack Grigg 6e34e2d113 zcash_client_backend: Migrate to `prost 0.12`, `tonic 0.10` 2023-09-08 16:21:48 +00:00
Kris Nuttycombe aa039819df Fix formatting & clippy lints. 2023-09-08 08:46:20 -06:00
Jack Grigg 504efcfab7 zcash_client_sqlite: Fix scan range matching with incomplete shard
The `v_sapling_shard_scan_ranges` view pairs every scan range with every
shard range, such that each row shows an overlapping pair.

For the complete shards, this is an overlap check between two ranges,
which the previous query was performing correctly (if verbosely).

For the last incomplete shard, we have a half-open range that needs to
be handled separately. The previous query only handled the case where a
scan range was contained within the last shard, and did not handle the
case where the scan range contained the last shard.

This led to a puzzling bug, where `WalletDb::get_wallet_summary` was
sometimes treating any note received within the last shard as part of
the wallet's pending balance. If the wallet's scan queue contained a
range that encompassed the last incomplete shard, the bug in the
`v_sapling_shard_scan_ranges` view meant that it omitted any mention of
the last shard, which translated into these notes being considered
unmined when joining `sapling_received_notes` against the sub-view
`v_sapling_shards_scan_state`.

The bug was made harder to diagnose due to the previous commit's bug
that was causing scan ranges to not be correctly merged; this resulted
in smaller scan ranges that were more likely to be contained within the
last shard, making it visible in `v_sapling_shard_scan_ranges` and
enabling notes to be detected as mined.

The fixed view uses a simpler query that enables us to handle complete
and incomplete shards together.

Time spent investigating and fixing: 4.5 hours

Co-authored-by: Kris Nuttycombe <kris@nutty.land>
2023-09-08 04:04:10 +00:00
Jack Grigg 457c9d26dd zcash_client_sqlite: Prevent empty `FoundNote` ranges in `scan_complete`
In the sandblasting block ranges, shard trees only cover a few hundred
blocks at most. When scanning block ranges much larger than this, it is
likely that when a note is discovered, its parent shard tree is entirely
contained within the scan range. In this situation, `extended_range`
would be set to `range`, and then because an extended range existed,
ranges with `FoundNote` priority would always be created - that in this
case are empty.

In an effectively-linear-scanning wallet situation, this leads to a
`SpanningTree` being constructed with adjacent `Scanned` ranges,
separated by empty `FoundNote` ranges, which it was unable to merge.

We address this by both preventing generation of the empty `FoundNote`
ranges, and by defensively fixing `SpanningTree::into_vec` to skip empty
ranges.

Co-authored-by: Kris Nuttycombe <kris@nutty.land>
2023-09-08 03:57:21 +00:00
Jack Grigg 7a4954c242 zcash_client_sqlite: Fix off-by-one in `scan_complete`
Shard end heights are end-inclusive, while Rust `Range`s are
end-exclusive.

Co-authored-by: Kris Nuttycombe <kris@nutty.land>
2023-09-08 03:44:03 +00:00
Jack Grigg b54969953f zcash_client_sqlite: Simplify range query in `replace_queue_entries`
Co-authored-by: Kris Nuttycombe <kris@nutty.land>
2023-09-08 03:43:07 +00:00
Kris Nuttycombe 341379ee8d
Merge pull request #951 from nuttycom/wallet/balance_for_all_accounts
zcash_client_sqlite: Return a balance for every account from `get_wallet_summary`
2023-09-07 11:49:23 -06:00
Kris Nuttycombe 8dfab23683
Merge pull request #946 from nuttycom/test/unspendable_chain_tip
zcash_client_sqlite: Add a test demonstrating chain tip fund unavailability
2023-09-07 11:27:51 -06:00
Kris Nuttycombe 2131cd547e zcash_client_sqlite: Return a balance for every account from `get_wallet_summary`
Fixes #948
2023-09-07 11:02:59 -06:00
Kris Nuttycombe 0937c6a384 zcash_client_sqlite: Add a test demonstrating chain tip fund unavailability.
This also factors out and cleans up repeated code that checks for anchor
shard completeness.
2023-09-07 10:55:16 -06:00
Kris Nuttycombe 19582a4ca6
Apply suggestions from code review
Co-authored-by: str4d <thestr4d@gmail.com>
2023-09-07 10:29:21 -06:00
Kris Nuttycombe a6328a098f zcash_client_sqlite: Bound creation of scan ranges on wallet birthday.
This modifies `update_chain_tip` and `scan_complete` to ensure that
newly created scan ranged do not extend below the wallet birthday
height.

Fixes #947
2023-09-07 09:58:21 -06:00
Kris Nuttycombe f56c5d8f4b Measure scan progress from wallet birthday, not the fully scanned height. 2023-09-06 12:07:18 -06:00
Jack Grigg c9d58b223c zcash_client_sqlite: Fix bug in `check_shard_discontinuity`
The previous code was checking that the existing shard range was at
least partially inside the proposed insertion range, but this didn't
handle the case where the proposed insertion range was fully contained
by the existing shard range.
2023-09-06 17:13:12 +00:00
Kris Nuttycombe 65420f59df zcash_client_backend: Add `WalletRead::block_max_scanned`
Fixes #941
2023-09-06 08:49:43 -06:00