-
Notifications
You must be signed in to change notification settings - Fork 129
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
chore(trie): proof code refactoring and fixes #2604
Conversation
7b06cf8
to
af7791a
Compare
8a738e6
to
b897c7c
Compare
// Note this is exported because it is imported and used by: | ||
// https://github.com/ComposableFi/ibc-go/blob/6d62edaa1a3cb0768c430dab81bb195e0b0c72db/modules/light-clients/11-beefy/types/client_state.go#L78 |
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.
Notify them of the fixes/changes once this gets merged
2132ac2
to
e9bc295
Compare
e9bc295
to
67f6383
Compare
Codecov Report
@@ Coverage Diff @@
## development #2604 +/- ##
===============================================
+ Coverage 61.97% 62.12% +0.15%
===============================================
Files 215 214 -1
Lines 28453 28556 +103
===============================================
+ Hits 17634 17741 +107
- Misses 9067 9068 +1
+ Partials 1752 1747 -5
Flags with carried forward coverage won't be shown. Click here to find out more.
Continue to review full report at Codecov.
|
Hi @qdm12 I'm currently using the trie lib in gossamer to implement a light client in golang here: composableFi/ibc-go We actually depend on this functionality and wondering if it'll be possible to keep it? |
Also with these changes, would you say that the lib can be used to verify proofs from paritytech/trie |
Hi @seunlanlege sorry for the delay, I was off the last few days.
I have checked your codebase, you only check a single key-value pair in every of your calls so far, so it won't affect your codebase. The functions you use are still exported as well, although their signature and import path do change a bit, but Gossamer is still in its v0.x.x versions so this is expected.
This is a work in progress to be able to verify proofs generated by the v1 trie state. |
0bdb189
to
ad08ea1
Compare
9d55d9c
to
9691124
Compare
ad08ea1
to
58dbc47
Compare
- `lib/trie` proof files - `internal/trie/record` package
- Only verify for a single key and value - Produce ordered proof encoded nodes from root to leaves - Node deduplication logic removed (now unneeded) - Remove recorder code (now unneeded) - Generate uses a `Database` smaller interface - Better error wrapping - Error when key is not found in trie when generating proof - Generate only generates proof encoded nodes for a single given key
- `buildTrie` returns a `*trie.Trie` - `loadProof` only acts on a parent node pointer - Older `LoadFromProof` and `loadProof` functions removed from `trie/database.go`
- More context to error wrapping - Verify function only returns an error
- `proofHashToNode` to `merkleValueToNode` - `proofHash` to `merkleValue`
- Load trie only once from database - Move StorageState `GenerateTrieProof` to `lib/trie/proof` package - Update tests
b3faafd
to
25b4e57
Compare
// Load reconstructs the trie from the database from the given root hash. | ||
// It is used when restarting the node to load the current state trie. | ||
func (t *Trie) Load(db chaindb.Database, rootHash common.Hash) error { | ||
func (t *Trie) Load(db Database, rootHash common.Hash) error { |
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.
I would like to remove the chaindb
dependency completely at some point.
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.
Agreed, although not a priority, but a not-too-complex task either.
Also we should use locally defined interfaces exported so that they get injected (accept interfaces), it should be up to the caller to define a (narrow as possible) interface for a concrete implementation. I guess one step closer now 😉
I am Quentin Mc Gaw, a software engineer working the Go Polkadot host **Gossamer**. I have been working full time on Gossamer since October 2021, mostly on the state trie and storage. I have also made a [few minor pull requests](https://github.com/w3f/polkadot-spec/pulls?q=is%3Apr+is%3Aclosed+author%3Aqdm12) to the Polkadot specification repository. I am requesting to join the Fellowship at rank 1. ## Main contributions ### Gossamer - Fix memory leaks - Trie encoding buffer pools usage fixed [#2009](ChainSafe/gossamer#2009) - Fix state map of tries memory leak [#2286](ChainSafe/gossamer#2286) - Fix sync benchmark [#2234](ChainSafe/gossamer#2234) - Trie proof fixes ([#2604](ChainSafe/gossamer#2604), [#2661](ChainSafe/gossamer#2661)) - Fix end to end tests orchestration ([#2470](ChainSafe/gossamer#2470), [#2452](ChainSafe/gossamer#2452), [#2385](ChainSafe/gossamer#2385), [#2370](ChainSafe/gossamer#2370)) - State trie statistics ([#2378](ChainSafe/gossamer#2378), [#2310](ChainSafe/gossamer#2310), [#2272](ChainSafe/gossamer#2272)) - State trie fixes and improvements - Only deep copy nodes when mutation is certain [#2352](ChainSafe/gossamer#2352) and [#2223](ChainSafe/gossamer#2223) - Only deep copy necessary fields of a node [#2384](ChainSafe/gossamer#2384) - Use Merkle values for database keys instead of always hash [#2725](ChainSafe/gossamer#2725) - Opportunistic parallel Merkle value commputing [#2081](ChainSafe/gossamer#2081) - Grandpa capped number of tracked messages ([#2490](ChainSafe/gossamer#2490), [#2485](ChainSafe/gossamer#2485)) - Add pprof HTTP service for profiling [#1991](ChainSafe/gossamer#1991) Ongoing work: - State trie lazy loading and caching - State trie v1 support ([#2736](ChainSafe/gossamer#2736), [#2747](ChainSafe/gossamer#2747), [#2687](ChainSafe/gossamer#2687), [#2686](ChainSafe/gossamer#2686), [#2685](ChainSafe/gossamer#2685), [#2673](ChainSafe/gossamer#2673), [#2611](ChainSafe/gossamer#2611), [#2530](ChainSafe/gossamer#2530)) ### Polkadot specification ➡️ [Pull requests from qdm12](https://github.com/w3f/polkadot-spec/pulls?q=is%3Apr+is%3Aclosed+author%3Aqdm12)
🎉 This PR is included in version 0.7.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
Changes
lib/trie/proof
containing:lib/trie/proof.go
(refactored)internal/trie/record
files (then removed)lib/trie/database.go
(moved since it had nothing to do with database)Verify
function:buildTrie
to detect root node for roots with encoding smaller than 32 bytesGenerate
function:internal/trie/recorder
code (now unneeded)Database
interface inproof
andtrie
packagesproofEncodedNodes
toencodedProofNodes
decProofs
toencodedProofNodes
Tests
go test -count 1 ./internal/trie/... ./lib/trie/...
Issues
One more step towards #2418
Primary Reviewer
@EclesioMeloJunior