From def4c9249b85d2979f539b213e66803bfeca3c48 Mon Sep 17 00:00:00 2001 From: codchen Date: Tue, 23 Jan 2024 16:08:34 +0800 Subject: [PATCH] Expose VersionExists (#400) ## Describe your changes and provide context Add an interface function `VersionExists` to store types ## Testing performed to validate your change local sei integration --- go.mod | 4 ++-- go.sum | 4 ++-- server/mock/store.go | 4 ++++ store/cachekv/store.go | 4 ++++ store/dbadapter/store.go | 4 ++++ store/gaskv/store.go | 4 ++++ store/listenkv/store.go | 4 ++++ store/prefix/store.go | 4 ++++ store/tracekv/store.go | 4 ++++ store/types/store.go | 2 ++ storev2/commitment/store.go | 5 +++++ storev2/state/store.go | 11 ++++++++++- x/bank/keeper/keeper.go | 6 ++++++ 13 files changed, 55 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index af0a69dcd..4d2b06633 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/regen-network/cosmos-proto v0.3.1 github.com/rs/zerolog v1.30.0 github.com/savaki/jq v0.0.0-20161209013833-0e6baecebbf8 - github.com/sei-protocol/sei-db v0.0.22 + github.com/sei-protocol/sei-db v0.0.27-0.20240123064153-d6dfa112e760 github.com/sei-protocol/sei-tm-db v0.0.5 github.com/spf13/cast v1.5.0 github.com/spf13/cobra v1.6.1 @@ -180,7 +180,7 @@ replace ( // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/sei-protocol/sei-db => github.com/sei-protocol/sei-db v0.0.25 + github.com/sei-protocol/sei-db => github.com/sei-protocol/sei-db v0.0.27-0.20240123064153-d6dfa112e760 // Latest goleveldb is broken, we have to stick to this version github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.2.36-evm-multi-tx-per-account-2 diff --git a/go.sum b/go.sum index 99107fc34..8c6215993 100644 --- a/go.sum +++ b/go.sum @@ -781,8 +781,8 @@ github.com/savaki/jq v0.0.0-20161209013833-0e6baecebbf8/go.mod h1:Nw/CCOXNyF5JDd github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/sei-protocol/sei-db v0.0.25 h1:jC1ivcaNxSR7EmxqvxexqPpnN/G0vUTZNHZI+C9T8M8= -github.com/sei-protocol/sei-db v0.0.25/go.mod h1:F/ZKZA8HJPcUzSZPA8yt6pfwlGriJ4RDR4eHKSGLStI= +github.com/sei-protocol/sei-db v0.0.27-0.20240123064153-d6dfa112e760 h1:MiHIPwPH2Yo6LQQfINgFTofm+K1EqpQYmg8h5m/cFrs= +github.com/sei-protocol/sei-db v0.0.27-0.20240123064153-d6dfa112e760/go.mod h1:F/ZKZA8HJPcUzSZPA8yt6pfwlGriJ4RDR4eHKSGLStI= github.com/sei-protocol/sei-iavl v0.1.9 h1:y4mVYftxLNRs6533zl7N0/Ch+CzRQc04JDfHolIxgBE= github.com/sei-protocol/sei-iavl v0.1.9/go.mod h1:7PfkEVT5dcoQE+s/9KWdoXJ8VVVP1QpYYPLdxlkSXFk= github.com/sei-protocol/sei-tendermint v0.2.36-evm-multi-tx-per-account-2 h1:XnJmqfmdcl/bRYla9leVWc2fOnWUZC93KaFmuSZr+lU= diff --git a/server/mock/store.go b/server/mock/store.go index 0a47cc08c..5a4c2f4b3 100644 --- a/server/mock/store.go +++ b/server/mock/store.go @@ -226,6 +226,10 @@ func (kv kvStore) ReverseSubspaceIterator(prefix []byte) sdk.Iterator { panic("not implemented") } +func (kv kvStore) VersionExists(version int64) bool { + panic("not implemented") +} + func NewCommitMultiStore() sdk.CommitMultiStore { return multiStore{kv: make(map[sdk.StoreKey]kvStore)} } diff --git a/store/cachekv/store.go b/store/cachekv/store.go index e4177f767..4217db46a 100644 --- a/store/cachekv/store.go +++ b/store/cachekv/store.go @@ -192,6 +192,10 @@ func (store *Store) iterator(start, end []byte, ascending bool) types.Iterator { return NewCacheMergeIterator(parent, cache, ascending, store.storeKey) } +func (store *Store) VersionExists(version int64) bool { + return store.parent.VersionExists(version) +} + func findStartIndex(strL []string, startQ string) int { // Modified binary search to find the very first element in >=startQ. if len(strL) == 0 { diff --git a/store/dbadapter/store.go b/store/dbadapter/store.go index bf0c95364..04b3910ac 100644 --- a/store/dbadapter/store.go +++ b/store/dbadapter/store.go @@ -95,5 +95,9 @@ func (dsa Store) CacheWrapWithListeners(storeKey types.StoreKey, listeners []typ return cachekv.NewStore(listenkv.NewStore(dsa, storeKey, listeners), storeKey, types.DefaultCacheSizeLimit) } +func (dsa Store) VersionExists(version int64) bool { + panic("no versioning for dbadater") +} + // dbm.DB implements KVStore so we can CacheKVStore it. var _ types.KVStore = Store{} diff --git a/store/gaskv/store.go b/store/gaskv/store.go index 0aa9f4282..4792becbe 100644 --- a/store/gaskv/store.go +++ b/store/gaskv/store.go @@ -126,6 +126,10 @@ func (gs *Store) iterator(start, end []byte, ascending bool) types.Iterator { return gi } +func (gs *Store) VersionExists(version int64) bool { + return gs.parent.VersionExists(version) +} + type gasIterator struct { gasMeter types.GasMeter gasConfig types.GasConfig diff --git a/store/listenkv/store.go b/store/listenkv/store.go index bf49b1282..99bdce48e 100644 --- a/store/listenkv/store.go +++ b/store/listenkv/store.go @@ -81,6 +81,10 @@ func (s *Store) iterator(start, end []byte, ascending bool) types.Iterator { return newTraceIterator(parent, s.listeners) } +func (s *Store) VersionExists(version int64) bool { + return s.parent.VersionExists(version) +} + type listenIterator struct { parent types.Iterator listeners []types.WriteListener diff --git a/store/prefix/store.go b/store/prefix/store.go index f6c29fd15..bb79f93f4 100644 --- a/store/prefix/store.go +++ b/store/prefix/store.go @@ -124,6 +124,10 @@ func (s Store) ReverseIterator(start, end []byte) types.Iterator { return newPrefixIterator(s.prefix, start, end, iter) } +func (s Store) VersionExists(version int64) bool { + return s.parent.VersionExists(version) +} + var _ types.Iterator = (*prefixIterator)(nil) type prefixIterator struct { diff --git a/store/tracekv/store.go b/store/tracekv/store.go index 2798d90ec..f18ab2c77 100644 --- a/store/tracekv/store.go +++ b/store/tracekv/store.go @@ -182,6 +182,10 @@ func (tkv *Store) CacheWrapWithListeners(_ types.StoreKey, _ []types.WriteListen panic("cannot CacheWrapWithListeners a TraceKVStore") } +func (tkv *Store) VersionExists(version int64) bool { + return tkv.parent.VersionExists(version) +} + // writeOperation writes a KVStore operation to the underlying io.Writer as // JSON-encoded data where the key/value pair is base64 encoded. func writeOperation(w io.Writer, op operation, tc types.TraceContext, key, value []byte) { diff --git a/store/types/store.go b/store/types/store.go index 19115ab72..37411e576 100644 --- a/store/types/store.go +++ b/store/types/store.go @@ -247,6 +247,8 @@ type KVStore interface { ReverseIterator(start, end []byte) Iterator GetWorkingHash() ([]byte, error) + + VersionExists(version int64) bool } // Iterator is an alias db's Iterator for convenience. diff --git a/storev2/commitment/store.go b/storev2/commitment/store.go index a51073875..406419ad9 100644 --- a/storev2/commitment/store.go +++ b/storev2/commitment/store.go @@ -177,3 +177,8 @@ func (st *Store) Query(req abci.RequestQuery) (res abci.ResponseQuery) { return res } + +func (st *Store) VersionExists(version int64) bool { + // one version per SC tree + return version == st.tree.Version() +} diff --git a/storev2/state/store.go b/storev2/state/store.go index 72e4b0ce9..d3c65d7d7 100644 --- a/storev2/state/store.go +++ b/storev2/state/store.go @@ -1,10 +1,11 @@ package state import ( - "cosmossdk.io/errors" "fmt" "io" + "cosmossdk.io/errors" + "github.com/cosmos/cosmos-sdk/store/cachekv" "github.com/cosmos/cosmos-sdk/store/listenkv" "github.com/cosmos/cosmos-sdk/store/tracekv" @@ -125,3 +126,11 @@ func (st *Store) Query(req abci.RequestQuery) (res abci.ResponseQuery) { return res } + +func (st *Store) VersionExists(version int64) bool { + earliest, err := st.store.GetEarliestVersion() + if err != nil { + panic(err) + } + return version >= earliest +} diff --git a/x/bank/keeper/keeper.go b/x/bank/keeper/keeper.go index cdcf20d6c..8b0bd2f03 100644 --- a/x/bank/keeper/keeper.go +++ b/x/bank/keeper/keeper.go @@ -51,6 +51,8 @@ type Keeper interface { DelegateCoins(ctx sdk.Context, delegatorAddr, moduleAccAddr sdk.AccAddress, amt sdk.Coins) error UndelegateCoins(ctx sdk.Context, moduleAccAddr, delegatorAddr sdk.AccAddress, amt sdk.Coins) error + GetStoreKey() sdk.StoreKey + types.QueryServer } @@ -677,6 +679,10 @@ func (k BaseKeeper) trackUndelegation(ctx sdk.Context, addr sdk.AccAddress, amt return nil } +func (k BaseKeeper) GetStoreKey() sdk.StoreKey { + return k.storeKey +} + // IterateTotalSupply iterates over the total supply calling the given cb (callback) function // with the balance of each coin. // The iteration stops if the callback returns true.