-
Notifications
You must be signed in to change notification settings - Fork 107
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(test): Update the reference Sapling treestate #9051
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
upbqdn
added
C-bug
Category: This is a bug
C-testing
Category: These are tests
P-Critical 🚑
labels
Nov 22, 2024
github-actions
bot
added
the
C-trivial
Category: A trivial change that is not worth mentioning in the CHANGELOG
label
Nov 22, 2024
Zebra's treestate serialization differs from `zcashd` in the following way: `zcashd` omits the serialization of empty trailing ommers, while Zebra doesn't. This means that `zcashd` serializes the Sapling treestate for height 419_201 as 019eb30778ddeea84c72e69e07a1689f3c8def3dc0a1939f0edcbe47279069d9310002000150715810d52caf35471d10feb487213fbd95ff209122225b7b65d27a7fb1a44d Whereas Zebra serializes it as 019eb30778ddeea84c72e69e07a1689f3c8def3dc0a1939f0edcbe47279069d931001f000150715810d52caf35471d10feb487213fbd95ff209122225b7b65d27a7fb1a44d0000000000000000000000000000000000000000000000000000000000 Serialization Format ==================== The serialized treestate consists of optional, hex-encoded, 32-byte hashes. If the hash is not present, it is serialized as byte 0, i.e., `0x00`. If the hash is present, it is prefixed by byte 1, i.e. `0x01`. The first two hashes in the serialized treestate are the treestate's left and right leaves. These are followed by the serialized length of the vector of ommers. This length is serialized as 1, 3, 5, or 9 bytes. If the length is less than 253, it is serialized as a single byte. The length is then followed by the serialized ommers. We can now parse the first string, produced by `zcashd`: - `0119eb30778ddeea84c72e69e07a1689f3c8def3dc0a1939f0edcbe47279069d931` is the serialized left leaf, - `00` is the serialized right leaf, - `02` is the serialized length of the vector of ommers, - `00` is the serialized first ommer, - `0150715810d52caf35471d10feb487213fbd95ff209122225b7b65d27a7fb1a44d` is the serialized second ommer. And the second one, produced by Zebra: - `0119eb30778ddeea84c72e69e07a1689f3c8def3dc0a1939f0edcbe47279069d931` is the serialized left leaf, - `00` is the serialized right leaf, - `1f` is the serialized length of the vector of ommers, - `00` is the serialized first ommer, - `0150715810d52caf35471d10feb487213fbd95ff209122225b7b65d27a7fb1a44d` is the serialized second ommer - `0000000000000000000000000000000000000000000000000000000000` are the remaining 29 serialized ommers. Note that both serializations represent the same treestate.
upbqdn
force-pushed
the
fix-treestate-test-vector
branch
from
November 22, 2024 00:23
c6c6cbd
to
8d73c15
Compare
arya2
reviewed
Nov 22, 2024
arya2
reviewed
Nov 22, 2024
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This PR looks good once the extra newline is removed. Thank you for the CI fix!
mpguerra
approved these changes
Nov 22, 2024
@mergify refresh |
✅ Pull request refreshed |
@mergify refresh |
✅ Pull request refreshed |
@mergify queue |
✅ The pull request has been merged automaticallyThe pull request has been merged automatically at 5f2f972 |
This was referenced Nov 22, 2024
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
C-bug
Category: This is a bug
C-testing
Category: These are tests
C-trivial
Category: A trivial change that is not worth mentioning in the CHANGELOG
P-Critical 🚑
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation
Zebra's treestate serialization differs from
zcashd
in the following way:zcashd
omits the serialization of empty trailing ommers, while Zebra doesn't. This means thatzcashd
serializes the Sapling treestate for height 419_201 as019eb30778ddeea84c72e69e07a1689f3c8def3dc0a1939f0edcbe47279069d9310002000150715810d52caf35471d10feb487213fbd95ff209122225b7b65d27a7fb1a44d
Whereas Zebra serializes it as
019eb30778ddeea84c72e69e07a1689f3c8def3dc0a1939f0edcbe47279069d931001f000150715810d52caf35471d10feb487213fbd95ff209122225b7b65d27a7fb1a44d0000000000000000000000000000000000000000000000000000000000
Specifications & References
The serialized treestate consists of optional, hex-encoded, 32-byte hashes. If the hash is not present, it is serialized as byte 0, i.e.,
0x00
. If the hash is present, it is prefixed by byte 1, i.e.0x01
. The first two hashes in the serialized treestate are the treestate's left and right leaves. These are followed by the serialized length of the vector of ommers. This length is serialized as 1, 3, 5, or 9 bytes. If the length is less than 253, it is serialized as a single byte. The length is then followed by the serialized ommers.We can now parse the first string, produced by
zcashd
:0119eb30778ddeea84c72e69e07a1689f3c8def3dc0a1939f0edcbe47279069d931
is the serialized left leaf,00
is the serialized right leaf,02
is the serialized length of the vector of ommers,00
is the serialized first ommer,0150715810d52caf35471d10feb487213fbd95ff209122225b7b65d27a7fb1a44d
is the serialized second ommer.And the second one, produced by Zebra:
0119eb30778ddeea84c72e69e07a1689f3c8def3dc0a1939f0edcbe47279069d931
is the serialized left leaf,00
is the serialized right leaf,1f
is the serialized length of the vector of ommers,00
is the serialized first ommer,0150715810d52caf35471d10feb487213fbd95ff209122225b7b65d27a7fb1a44d
is the serialized second ommer0000000000000000000000000000000000000000000000000000000000
are the remaining 29 serialized ommers.Note that both serializations represent the same treestate.
Solution
Replace the first string by the second one in the test vector.
Tests
Follow-up Work
PR Author's Checklist
PR Reviewer's Checklist