feat(store/v2): Fallback to SC on queries (#19090)

This commit is contained in:
Aleksandr Bezobchuk
2024-01-19 15:11:15 +00:00
committed by GitHub
parent 2587e756c1
commit 8d0696326b
7 changed files with 107 additions and 12 deletions
+12 -3
View File
@@ -67,12 +67,21 @@ func (t *IavlTree) Commit() ([]byte, uint64, error) {
// GetProof returns a proof for the given key and version.
func (t *IavlTree) GetProof(version uint64, key []byte) (*ics23.CommitmentProof, error) {
imutableTree, err := t.tree.GetImmutable(int64(version))
immutableTree, err := t.tree.GetImmutable(int64(version))
if err != nil {
return nil, err
return nil, fmt.Errorf("failed to get immutable tree at version %d: %w", version, err)
}
return imutableTree.GetProof(key)
return immutableTree.GetProof(key)
}
func (t *IavlTree) Get(version uint64, key []byte) ([]byte, error) {
immutableTree, err := t.tree.GetImmutable(int64(version))
if err != nil {
return nil, fmt.Errorf("failed to get immutable tree at version %d: %w", version, err)
}
return immutableTree.Get(key)
}
// GetLatestVersion returns the latest version of the tree.
+9
View File
@@ -57,6 +57,15 @@ func TestIavlTree(t *testing.T) {
require.Equal(t, workingHash, commitHash)
require.Equal(t, uint64(1), tree.GetLatestVersion())
// ensure we can get expected values
bz, err := tree.Get(1, []byte("key1"))
require.NoError(t, err)
require.Equal(t, []byte("value1"), bz)
bz, err = tree.Get(2, []byte("key1"))
require.Error(t, err)
require.Nil(t, bz)
// write a batch of version 2
require.NoError(t, tree.Set([]byte("key4"), []byte("value4")))
require.NoError(t, tree.Set([]byte("key5"), []byte("value5")))
+14
View File
@@ -255,6 +255,20 @@ func (c *CommitStore) GetProof(storeKey string, version uint64, key []byte) ([]s
return []store.CommitmentOp{commitOp, *storeCommitmentOp}, nil
}
func (c *CommitStore) Get(storeKey string, version uint64, key []byte) ([]byte, error) {
tree, ok := c.multiTrees[storeKey]
if !ok {
return nil, fmt.Errorf("store %s not found", storeKey)
}
bz, err := tree.Get(version, key)
if err != nil {
return nil, fmt.Errorf("failed to get key %s from store %s: %w", key, storeKey, err)
}
return bz, nil
}
func (c *CommitStore) Prune(version uint64) (ferr error) {
// prune the metadata
batch := c.db.NewBatch()
+10
View File
@@ -17,14 +17,24 @@ type Tree interface {
Set(key, value []byte) error
Remove(key []byte) error
GetLatestVersion() uint64
// Hash returns the hash of the latest saved version of the tree.
Hash() []byte
// WorkingHash returns the working hash of the tree.
WorkingHash() []byte
LoadVersion(version uint64) error
Commit() ([]byte, uint64, error)
SetInitialVersion(version uint64) error
GetProof(version uint64, key []byte) (*ics23.CommitmentProof, error)
// Get attempts to retrieve a value from the tree for a given version.
//
// NOTE: This method only exists to support migration from IAVL v0/v1 to v2.
// Once migration is complete, this method should be removed and/or not used.
Get(version uint64, key []byte) ([]byte, error)
Prune(version uint64) error
Export(version uint64) (Exporter, error)
Import(version uint64) (Importer, error)