Commit Graph

95 Commits

Author SHA1 Message Date
Kris Nuttycombe 2a19b40fc1 Move position types to position module. 2022-08-04 13:00:56 -06:00
Kris Nuttycombe d631b8278a Move common test code into the testing module. 2022-08-04 13:00:05 -06:00
Kris Nuttycombe e19446f8fd Make test utilities available under a test-dependencies feature. 2022-08-04 13:00:05 -06:00
Kris Nuttycombe 7331a8f458 Rename fragments -> ommers 2022-08-04 13:00:05 -06:00
Kris Nuttycombe 6b6548f02e Rename authentication_path -> witness 2022-08-04 13:00:05 -06:00
Kris Nuttycombe ee93cb8598 Rename witness->mark 2022-08-04 13:00:04 -06:00
Kris Nuttycombe 3b08071125 Remove the `bridgetree::Leaf` type & make ommer levels start at 0
This is a major refactoring that gets rid of a significant wart
in the design of the `bridgetree::Frontier` type that has existed
since the the project's inception.

The `Leaf` type incorrectly treated the siblings of leaves at
odd positions as special, whereas they should have been simply
treated as ordinary entries in the frontier's ommers list. Correcting
this allows for the code to be significantly simplified in a number
of places.
2022-07-21 18:32:58 -06:00
Kris Nuttycombe 4973b6682f Alter MerkleBridge to avoid storing duplicate ommers.
Prior to this change, each position being tracked would
require an entry in the `auth_fragments` map for each
bridge in a BridgeTree. However, very frequently, these
entries would duplicate storage of nodes higher up in the
tree, wherever a single node in the was an ancestor of
a leaf being tracked.

This commit restructures the tracking of auth data to
avoid this duplication of data, as well as the redundant
work that was required to produce each copy of the duplicated
nodes.
2022-07-21 18:27:09 -06:00
Kris Nuttycombe f081cfc81e Factor out bridge-level auth path construction. 2022-07-14 14:22:59 -06:00
Kris Nuttycombe 06728b9499 Add an as_of_root argument to Tree::authentication_path
This requires a user of this API to specify a root of the tree
that identifies the state of the tree at which the user wishes
to construct an authentication path. This must be equal to either
the current root of the tree, or to the root of the tree at a
previous checkpoint.
2022-04-20 14:13:12 -06:00
Kris Nuttycombe fef054d43a Move-only: group witness/remove_witness code together. 2022-04-15 10:00:03 -06:00
Kris Nuttycombe a4aa2bf204 Fix an off-by-one error in BridgeTree garbage collection. 2022-04-05 16:16:41 -06:00
Kris Nuttycombe 10e531d088 Restore forgotten witnesses before pruning to bridges length in rewind. 2022-04-05 16:15:41 -06:00
Kris Nuttycombe f9c12e37aa Add witnessed_positions and garbage_collect methods to the `Tree` trait.
* `witnessed_positions` returns the set of positions that have been
  witnessed in the tree.
* `garbage_collect` makes the garbage collection operation of
  `bridgetree::BridgeTree` publicly accessible. It is always safe to
  implement this method as a no-op.
2022-04-05 16:15:41 -06:00
Kris Nuttycombe f19cf9c381 Add `BridgeTree::from_frontier`
Add a constructor to allow a BridgeTree to be built starting at an
existing frontier.
2022-03-31 11:38:28 -06:00
Kris Nuttycombe 279331e4f3 Fix an error in `MerkleBridge::can_follow`
The subsequent bridge's prior position was incorrectly allowed to
be `None`.
2022-03-31 11:38:28 -06:00
Kris Nuttycombe 027a98e53a Remove redundant documentation on trait impls. 2022-03-31 08:21:33 -06:00
Kris Nuttycombe 244fa7b73c Apply suggestions from code review
Co-authored-by: Daira Hopwood <daira@jacaranda.org>
2022-03-31 07:10:02 -06:00
Kris Nuttycombe a858de06d8 Always query the tree by position, not hash.
This modifies the `Tree::authentication_path` and `Tree::remove_witness`
methods to only operate in terms of the tree position, rather than both
the position and the hash that is expected to be the leaf at that
position.

Positions in the tree are always unique, and the tree already contains
the leaf information corresponding to each position, so the existing API
previously required the storage of redundant information. This change
streamlines the API without loss of power.

This also adds additional consistency checks to the property tests.
2022-03-30 22:16:31 -06:00
Kris Nuttycombe d4d4950d31 Use existing current_leaf method rather than introducing "tip" 2022-03-30 18:09:50 -06:00
Kris Nuttycombe 12187dc0a4 Remove inaccurate test comment. 2022-03-30 17:57:18 -06:00
Kris Nuttycombe fc1d1ab9fc Avoid unnecessary clones in garbage collection. 2022-03-30 16:41:59 -06:00
Kris Nuttycombe da24923d7f Add a test that demonstrates the failure case. 2022-03-30 16:41:59 -06:00
Kris Nuttycombe 31449b350e Track the state since the last checkpoint/witness separately from prior bridges. 2022-03-30 16:41:59 -06:00
Kris Nuttycombe 34cc29dc4b Remove the unused recording types & logic 2022-03-30 15:20:11 -06:00
Kris Nuttycombe f8703a2eab Fix incorrect consistency check for auth_fragment construction.
This was just entirely wrong; it will often be the case that we've
observed several altitudes but have an empty list of values within
a particular fragment.
2022-03-11 15:45:33 -07:00
Kris Nuttycombe 9b710286d5 Fix incorrect from_parts consistency check. 2022-03-10 18:39:51 -07:00
Kris Nuttycombe 250052489d Add a test demonstrating incorrect consistency check. 2022-03-10 18:39:36 -07:00
Kris Nuttycombe e01885f6e2 Rewinds are no longer blocked by existing witnesses.
In practice, when performing a rewind we don't want to have to
do the additional bookkeeping keeping the leaf position and
value around just to be able to remove the witnesses. After
this change, `rewind` will always succeed unless there are
no checkpoints.
2022-03-02 11:32:31 -07:00
Kris Nuttycombe 23c0370b54 Add missing position accessor to AuthFragment 2022-02-24 09:11:46 -07:00
Kris Nuttycombe f112568d73 Do not force Hashable values to also be Ord and Clone
While these additional bounds are often used with hashable
types, they are not necessary for the construction of `Frontier`
values, and so should not be required everywhere.
2022-02-24 09:01:23 -07:00
Kris Nuttycombe 36b26cf0bb Add public accessors and constructors for Checkpoint. 2022-02-24 08:17:21 -07:00
Kris Nuttycombe 42b9608e43 Fix linting errors. 2022-02-23 21:44:36 -07:00
Kris Nuttycombe 61a06de241 Fix formatting. 2022-02-23 21:30:52 -07:00
Kris Nuttycombe b4339d94db Return the current position & leaf from the witness operation.
Co-authored-by: str4d <jack@electriccoin.co>
2022-02-23 19:30:10 -07:00
Kris Nuttycombe 1dbb0d057d Update the property tests to generate positioned unwitness and auth_path operations. 2022-02-23 13:35:17 -07:00
Kris Nuttycombe b23b6ff9ec Record position with hash when constructing witnesses. 2022-02-23 11:33:08 -07:00
Kris Nuttycombe d5b7d90e13 Add bridgetree garbage collection.
This adds a garbage collection method to BridgeTree that
can be used to eliminate checkpoints and removed witnesses
that are no longer reachable for possible rewinds. It also
prunes unnecessary auth fragments from the tree.
2022-02-23 08:59:12 -07:00
Kris Nuttycombe c284081a0a Merge remote-tracking branch 'upstream/master' into fix_bridgetree_checkpoint_rewind 2022-02-22 21:05:11 -07:00
Kris Nuttycombe fd9300bf8f Simplify the checkpoint data structure by removing is_checkpointed
It's possible to figure out whether or not a checkpoint is a duplicate
just by looking at the list of checkpoints; the checkpoint doesn't
need to carry that data internally.
2022-02-22 09:51:19 -07:00
Kris Nuttycombe 993dd64650 Fix bridgetree checkpoint/rewind logic to fully restore the tree state.
Removal of witnesses is now recorded on a per-checkpoint
level, so that rewinding the tree state now restores any
witnesses that were removed since the checkpoint.

A number of internal consistency checks previously enforced
by the property tests have been removed as they did not
correctly implement this semantic, and reimplementing these
consistency checks would be equivalent to reimplementing the
sample tree, so these checks are now performed simply by
comparison against the reference implentation.
2022-02-22 09:44:32 -07:00
Kris Nuttycombe aedd865d42 Make example tests reusable across tree implementations. 2022-02-20 13:09:49 -07:00
Kris Nuttycombe ba4fe68eb2 Update bridgetree checkpoint/rewind tests to demonstrate the rewind error. 2022-02-20 10:21:58 -07:00
Kris Nuttycombe efffa8a442 Key auth fragments by note position rather than bridge index.
This substantially simplifies reasoning about authentication
path fragments in garbage collection.
2022-02-20 10:21:58 -07:00
Kris Nuttycombe da420277a5 Use BTreeMap instead of HashMap when keyed by leaf hashes 2022-02-20 10:21:58 -07:00
Kris Nuttycombe 6327364524 Add current_leaf and is_witnessed to the tree API
Rename `current_position` to `current_offset` in the
sample API to avoid confusion with the meaning of
the `Position` type.
2022-02-20 10:21:21 -07:00
Kris Nuttycombe 60d12057a0 Fix a second error in checkpoint/witness/rewind ordering for the sample tree. 2022-02-18 13:32:45 -07:00
Kris Nuttycombe c73cedf8b6 Fix failing rewind/remove_witness interaction. 2022-02-18 13:32:45 -07:00
Kris Nuttycombe 6440119cf7 Add a failing test for remove_witness/rewind interaction 2022-02-18 13:32:45 -07:00
ghassmo 24e1980e8a use Self instead of the type's name 2022-01-23 23:16:30 +04:00