feat(store/v2): add the commitment store (#18526)

This commit is contained in:
cool-developer
2023-11-22 14:17:48 +00:00
committed by GitHub
parent 6ca0b2d1aa
commit fc4ce6c778
21 changed files with 349 additions and 164 deletions
+14 -20
View File
@@ -8,10 +8,10 @@ import (
ics23 "github.com/cosmos/ics23/go"
log "cosmossdk.io/log"
"cosmossdk.io/store/v2"
"cosmossdk.io/store/v2/commitment"
)
var _ store.Committer = (*IavlTree)(nil)
var _ commitment.Tree = (*IavlTree)(nil)
// IavlTree is a wrapper around iavl.MutableTree.
type IavlTree struct {
@@ -26,25 +26,19 @@ func NewIavlTree(db dbm.DB, logger log.Logger, cfg *Config) *IavlTree {
}
}
// WriteBatch writes a batch of key-value pairs to the database.
func (t *IavlTree) WriteBatch(cs *store.Changeset) error {
for _, kv := range cs.Pairs {
if kv.Value == nil {
_, res, err := t.tree.Remove(kv.Key)
if err != nil {
return err
}
if !res {
return fmt.Errorf("failed to delete key %X", kv.Key)
}
} else {
_, err := t.tree.Set(kv.Key, kv.Value)
if err != nil {
return err
}
}
// Remove removes the given key from the tree.
func (t *IavlTree) Remove(key []byte) error {
_, res, err := t.tree.Remove(key)
if !res {
return fmt.Errorf("key %x not found", key)
}
return nil
return err
}
// Set sets the given key-value pair in the tree.
func (t *IavlTree) Set(key, value []byte) error {
_, err := t.tree.Set(key, value)
return err
}
// WorkingHash returns the working hash of the database.
+9 -19
View File
@@ -7,7 +7,6 @@ import (
"github.com/stretchr/testify/require"
"cosmossdk.io/log"
"cosmossdk.io/store/v2"
)
func generateTree(treeType string) *IavlTree {
@@ -25,13 +24,9 @@ func TestIavlTree(t *testing.T) {
require.Equal(t, uint64(0), initVersion)
// write a batch of version 1
cs1 := store.NewChangeset()
cs1.Add([]byte("key1"), []byte("value1"))
cs1.Add([]byte("key2"), []byte("value2"))
cs1.Add([]byte("key3"), []byte("value3"))
err := tree.WriteBatch(cs1)
require.NoError(t, err)
require.NoError(t, tree.Set([]byte("key1"), []byte("value1")))
require.NoError(t, tree.Set([]byte("key2"), []byte("value2")))
require.NoError(t, tree.Set([]byte("key3"), []byte("value3")))
workingHash := tree.WorkingHash()
require.NotNil(t, workingHash)
@@ -44,13 +39,10 @@ func TestIavlTree(t *testing.T) {
require.Equal(t, uint64(1), tree.GetLatestVersion())
// write a batch of version 2
cs2 := store.NewChangeset()
cs2.Add([]byte("key4"), []byte("value4"))
cs2.Add([]byte("key5"), []byte("value5"))
cs2.Add([]byte("key6"), []byte("value6"))
cs2.Add([]byte("key1"), nil) // delete key1
err = tree.WriteBatch(cs2)
require.NoError(t, err)
require.NoError(t, tree.Set([]byte("key4"), []byte("value4")))
require.NoError(t, tree.Set([]byte("key5"), []byte("value5")))
require.NoError(t, tree.Set([]byte("key6"), []byte("value6")))
require.NoError(t, tree.Remove([]byte("key1"))) // delete key1
version2Hash := tree.WorkingHash()
require.NotNil(t, version2Hash)
commitHash, err = tree.Commit()
@@ -67,10 +59,8 @@ func TestIavlTree(t *testing.T) {
require.NotNil(t, proof.GetNonexist())
// write a batch of version 3
cs3 := store.NewChangeset()
cs3.Add([]byte("key7"), []byte("value7"))
cs3.Add([]byte("key8"), []byte("value8"))
err = tree.WriteBatch(cs3)
require.NoError(t, tree.Set([]byte("key7"), []byte("value7")))
require.NoError(t, tree.Set([]byte("key8"), []byte("value8")))
require.NoError(t, err)
_, err = tree.Commit()
require.NoError(t, err)