From e0251f699908bbc859d994f2997b1d92c8424475 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Tue, 14 Jan 2025 17:40:50 +0800 Subject: [PATCH 01/11] fix(x/upgrade): register missing implementation for SoftwareUpgradeProposal (#23179) --- UPGRADING.md | 20 ++++++- simapp/v2/upgrades.go | 7 --- store/v2/root/factory.go | 47 +-------------- store/v2/root/factory_test.go | 1 - store/v2/root/migrate_test.go | 8 +-- store/v2/root/store.go | 96 ++----------------------------- store/v2/root/store_mock_test.go | 11 ---- store/v2/root/store_test.go | 6 +- store/v2/root/upgrade_test.go | 4 +- tests/systemtests/upgrade_test.go | 2 +- x/upgrade/CHANGELOG.md | 3 + x/upgrade/go.mod | 2 +- x/upgrade/types/codec.go | 6 +- x/upgrade/types/codec_test.go | 33 +++++++++++ x/upgrade/types/proposal.go | 21 +++++++ 15 files changed, 94 insertions(+), 173 deletions(-) create mode 100644 x/upgrade/types/codec_test.go create mode 100644 x/upgrade/types/proposal.go diff --git a/UPGRADING.md b/UPGRADING.md index ae7eae68d94b..f5c621bcc5aa 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -469,9 +469,23 @@ Accounts's AccountNumber will be used as a global account number tracking replac ```go import authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" ... -err := authkeeper.MigrateAccountNumberUnsafe(ctx, &app.AuthKeeper) -if err != nil { - return nil, err +app.UpgradeKeeper.SetUpgradeHandler(planName, + func(ctx context.Context, _ upgradetypes.Plan, fromVM appmodule.VersionMap) (appmodule.VersionMap, error) { + if err := authkeeper.MigrateAccountNumberUnsafe(ctx, &app.AuthKeeper); err != nil { + return nil, err + } + return app.ModuleManager.RunMigrations(ctx, app.configurator, fromVM) + }, +) +``` + +Add `x/accounts` store while upgrading to v0.52.x: + +```go +storetypes.StoreUpgrades{ + Added: []string{ + accounts.StoreKey, + }, } ``` diff --git a/simapp/v2/upgrades.go b/simapp/v2/upgrades.go index 2145196fa86d..20643c129749 100644 --- a/simapp/v2/upgrades.go +++ b/simapp/v2/upgrades.go @@ -6,10 +6,7 @@ import ( "cosmossdk.io/core/appmodule" "cosmossdk.io/core/store" "cosmossdk.io/runtime/v2" - "cosmossdk.io/x/accounts" bankv2types "cosmossdk.io/x/bank/v2/types" - epochstypes "cosmossdk.io/x/epochs/types" - protocolpooltypes "cosmossdk.io/x/protocolpool/types" upgradetypes "cosmossdk.io/x/upgrade/types" ) @@ -37,12 +34,8 @@ func (app *SimApp[T]) RegisterUpgradeHandlers() { if upgradeInfo.Name == UpgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { storeUpgrades := store.StoreUpgrades{ Added: []string{ - accounts.StoreKey, - protocolpooltypes.StoreKey, - epochstypes.StoreKey, bankv2types.ModuleName, }, - Deleted: []string{"crisis"}, // The SDK discontinued the crisis module in v0.52.0 } app.SetStoreLoader(runtime.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) diff --git a/store/v2/root/factory.go b/store/v2/root/factory.go index fb90c575e783..f0c080b96851 100644 --- a/store/v2/root/factory.go +++ b/store/v2/root/factory.go @@ -16,9 +16,7 @@ import ( "cosmossdk.io/store/v2/db" "cosmossdk.io/store/v2/internal" "cosmossdk.io/store/v2/metrics" - "cosmossdk.io/store/v2/migration" "cosmossdk.io/store/v2/pruning" - "cosmossdk.io/store/v2/snapshots" ) type ( @@ -115,13 +113,8 @@ func CreateRootStore(opts *FactoryOptions) (store.RootStore, error) { } // check if we need to migrate the store - isMigrating := false - scType := storeOpts.SCType - if scType != SCTypeIavl { - isMigrating = true // need to migrate - scType = SCTypeIavl // only support iavl v1 for migration - } + scType := storeOpts.SCType trees := make(map[string]commitment.Tree, len(opts.StoreKeys)) for _, key := range opts.StoreKeys { @@ -129,17 +122,6 @@ func CreateRootStore(opts *FactoryOptions) (store.RootStore, error) { if err != nil { return nil, err } - if isMigrating { - v, err := tree.GetLatestVersion() - if err != nil { - return nil, err - } - if v == 0 && latestVersion > 0 { - if err := tree.SetInitialVersion(latestVersion + 1); err != nil { - return nil, err - } - } - } trees[key] = tree } oldTrees := make(map[string]commitment.Tree, len(opts.StoreKeys)) @@ -156,31 +138,6 @@ func CreateRootStore(opts *FactoryOptions) (store.RootStore, error) { return nil, err } - var mm *migration.Manager - if isMigrating { - snapshotDB, err := snapshots.NewStore(fmt.Sprintf("%s/data/snapshots/store.db", opts.RootDir)) - if err != nil { - return nil, err - } - snapshotMgr := snapshots.NewManager(snapshotDB, snapshots.SnapshotOptions{}, sc, nil, opts.Logger) - var newSC *commitment.CommitStore - if scType != storeOpts.SCType { - newTrees := make(map[string]commitment.Tree, len(opts.StoreKeys)) - for _, key := range opts.StoreKeys { - tree, err := newTreeFn(key, storeOpts.SCType) - if err != nil { - return nil, err - } - newTrees[key] = tree - } - newSC, err = commitment.NewCommitStore(newTrees, nil, opts.SCRawDB, opts.Logger) - if err != nil { - return nil, err - } - } - mm = migration.NewManager(opts.SCRawDB, snapshotMgr, newSC, opts.Logger) - } - pm := pruning.NewManager(sc, storeOpts.SCPruningOption) - return New(opts.SCRawDB, opts.Logger, sc, pm, mm, metrics.NoOpMetrics{}) + return New(opts.SCRawDB, opts.Logger, sc, pm, metrics.NoOpMetrics{}) } diff --git a/store/v2/root/factory_test.go b/store/v2/root/factory_test.go index 031ccd0adfa1..a58d39f099ba 100644 --- a/store/v2/root/factory_test.go +++ b/store/v2/root/factory_test.go @@ -34,7 +34,6 @@ func TestFactory(t *testing.T) { f, err = CreateRootStore(&fop) require.NoError(t, err) require.NotNil(t, f) - require.False(t, f.(*Store).isMigrating) } func setLatestVersion(db corestore.KVStoreWithBatch, version int64) error { diff --git a/store/v2/root/migrate_test.go b/store/v2/root/migrate_test.go index 3b431bdb24f6..cad83c930ee5 100644 --- a/store/v2/root/migrate_test.go +++ b/store/v2/root/migrate_test.go @@ -14,9 +14,7 @@ import ( "cosmossdk.io/store/v2/commitment" "cosmossdk.io/store/v2/commitment/iavl" dbm "cosmossdk.io/store/v2/db" - "cosmossdk.io/store/v2/migration" "cosmossdk.io/store/v2/pruning" - "cosmossdk.io/store/v2/snapshots" ) var storeKeys = []string{"store1", "store2", "store3"} @@ -66,14 +64,10 @@ func (s *MigrateStoreTestSuite) SetupTest() { sc, err := commitment.NewCommitStore(multiTrees1, nil, dbm.NewMemDB(), testLog) s.Require().NoError(err) - snapshotsStore, err := snapshots.NewStore(s.T().TempDir()) - s.Require().NoError(err) - snapshotManager := snapshots.NewManager(snapshotsStore, snapshots.NewSnapshotOptions(1500, 2), orgSC, nil, testLog) - migrationManager := migration.NewManager(dbm.NewMemDB(), snapshotManager, sc, testLog) pm := pruning.NewManager(sc, nil) // assume no storage store, simulate the migration process - s.rootStore, err = New(dbm.NewMemDB(), testLog, orgSC, pm, migrationManager, nil) + s.rootStore, err = New(dbm.NewMemDB(), testLog, orgSC, pm, nil) s.Require().NoError(err) } diff --git a/store/v2/root/store.go b/store/v2/root/store.go index c0d06420a7c6..e11d59a15368 100644 --- a/store/v2/root/store.go +++ b/store/v2/root/store.go @@ -5,14 +5,12 @@ import ( "errors" "fmt" "io" - "sync" "time" corelog "cosmossdk.io/core/log" corestore "cosmossdk.io/core/store" "cosmossdk.io/store/v2" "cosmossdk.io/store/v2/metrics" - "cosmossdk.io/store/v2/migration" "cosmossdk.io/store/v2/proof" "cosmossdk.io/store/v2/pruning" ) @@ -43,17 +41,6 @@ type Store struct { // pruningManager reflects the pruning manager used to prune state of the SS and SC backends pruningManager *pruning.Manager - - // Migration related fields - // migrationManager reflects the migration manager used to migrate state from v1 to v2 - migrationManager *migration.Manager - // chChangeset reflects the channel used to send the changeset to the migration manager - chChangeset chan *migration.VersionedChangeset - // chDone reflects the channel used to signal the migration manager that the migration - // is done - chDone chan struct{} - // isMigrating reflects whether the store is currently migrating - isMigrating bool } // New creates a new root Store instance. @@ -64,17 +51,14 @@ func New( logger corelog.Logger, sc store.Committer, pm *pruning.Manager, - mm *migration.Manager, m metrics.StoreMetrics, ) (store.RootStore, error) { return &Store{ - dbCloser: dbCloser, - logger: logger, - stateCommitment: sc, - pruningManager: pm, - migrationManager: mm, - telemetry: m, - isMigrating: mm != nil, + dbCloser: dbCloser, + logger: logger, + stateCommitment: sc, + pruningManager: pm, + telemetry: m, }, nil } @@ -233,10 +217,6 @@ func (s *Store) LoadVersionAndUpgrade(version uint64, upgrades *corestore.StoreU defer s.telemetry.MeasureSince(time.Now(), "root_store", "load_version_and_upgrade") } - if s.isMigrating { - return errors.New("cannot upgrade while migrating") - } - if err := s.loadVersion(version, upgrades, true); err != nil { return err } @@ -271,11 +251,6 @@ func (s *Store) loadVersion(v uint64, upgrades *corestore.StoreUpgrades, overrid return fmt.Errorf("failed to get commit info for version %d: %w", v, err) } - // if we're migrating, we need to start the migration process - if s.isMigrating { - s.startMigration() - } - return nil } @@ -291,10 +266,6 @@ func (s *Store) Commit(cs *corestore.Changeset) ([]byte, error) { }() } - if err := s.handleMigration(cs); err != nil { - return nil, err - } - // signal to the pruning manager that a new version is about to be committed // this may be required if the SS and SC backends implementation have the // background pruning process (iavl v1 for example) which must be paused during the commit @@ -325,63 +296,6 @@ func (s *Store) Commit(cs *corestore.Changeset) ([]byte, error) { return s.lastCommitInfo.Hash(), nil } -// startMigration starts a migration process to migrate the RootStore/v1 to the -// SS and SC backends of store/v2 and initializes the channels. -// It runs in a separate goroutine and replaces the current RootStore with the -// migrated new backends once the migration is complete. -// -// NOTE: This method should only be called once after loadVersion. -func (s *Store) startMigration() { - // buffer at most 1 changeset, if the receiver is behind attempting to buffer - // more than 1 will block. - s.chChangeset = make(chan *migration.VersionedChangeset, 1) - // it is used to signal the migration manager that the migration is done - s.chDone = make(chan struct{}) - - mtx := sync.Mutex{} - mtx.Lock() - go func() { - version := s.lastCommitInfo.Version - s.logger.Info("starting migration", "version", version) - mtx.Unlock() - if err := s.migrationManager.Start(uint64(version), s.chChangeset, s.chDone); err != nil { - s.logger.Error("failed to start migration", "err", err) - } - }() - - // wait for the migration manager to start - mtx.Lock() - defer mtx.Unlock() -} - -func (s *Store) handleMigration(cs *corestore.Changeset) error { - if s.isMigrating { - // if the migration manager has already migrated to the version, close the - // channels and replace the state commitment - if s.migrationManager.GetMigratedVersion() == uint64(s.lastCommitInfo.Version) { - close(s.chDone) - close(s.chChangeset) - s.isMigrating = false - newStateCommitment := s.migrationManager.GetStateCommitment() - if newStateCommitment != nil { - // close the old state commitment and replace it with the new one - if err := s.stateCommitment.Close(); err != nil { - return fmt.Errorf("failed to close the old SC store: %w", err) - } - s.stateCommitment = newStateCommitment - } - if err := s.migrationManager.Close(); err != nil { - return fmt.Errorf("failed to close migration manager: %w", err) - } - s.logger.Info("migration completed", "version", s.lastCommitInfo.Version) - } else { - // queue the next changeset to the migration manager - s.chChangeset <- &migration.VersionedChangeset{Version: uint64(s.lastCommitInfo.Version + 1), Changeset: cs} - } - } - return nil -} - func (s *Store) Prune(version uint64) error { return s.pruningManager.Prune(version) } diff --git a/store/v2/root/store_mock_test.go b/store/v2/root/store_mock_test.go index 0ec0a31bdaf2..495d5b8520eb 100644 --- a/store/v2/root/store_mock_test.go +++ b/store/v2/root/store_mock_test.go @@ -23,7 +23,6 @@ func newTestRootStore(sc store.Committer) *Store { telemetry: metrics.Metrics{}, stateCommitment: sc, pruningManager: pm, - isMigrating: false, } } @@ -62,12 +61,6 @@ func TestQuery(t *testing.T) { _, err = rs.Query(nil, 0, nil, true) require.Error(t, err) - // Query with Migration - - rs.isMigrating = true - sc.EXPECT().Get(gomock.Any(), gomock.Any(), gomock.Any()).Return([]byte("value"), nil) - _, err = rs.Query(nil, 0, nil, false) - require.NoError(t, err) } func TestLoadVersion(t *testing.T) { @@ -96,8 +89,4 @@ func TestLoadVersion(t *testing.T) { err = rs.LoadVersionAndUpgrade(uint64(2), v) require.Error(t, err) - // LoadVersionUpgrade with Migration - rs.isMigrating = true - err = rs.LoadVersionAndUpgrade(uint64(2), v) - require.Error(t, err) } diff --git a/store/v2/root/store_test.go b/store/v2/root/store_test.go index 59df4d68384d..1646bf2120e1 100644 --- a/store/v2/root/store_test.go +++ b/store/v2/root/store_test.go @@ -52,7 +52,7 @@ func (s *RootStoreTestSuite) SetupTest() { s.Require().NoError(err) pm := pruning.NewManager(sc, nil) - rs, err := New(dbm.NewMemDB(), noopLog, sc, pm, nil, nil) + rs, err := New(dbm.NewMemDB(), noopLog, sc, pm, nil) s.Require().NoError(err) s.rootStore = rs @@ -73,7 +73,7 @@ func (s *RootStoreTestSuite) newStoreWithPruneConfig(config *store.PruningOption pm := pruning.NewManager(sc, config) - rs, err := New(dbm.NewMemDB(), noopLog, sc, pm, nil, nil) + rs, err := New(dbm.NewMemDB(), noopLog, sc, pm, nil) s.Require().NoError(err) s.rootStore = rs @@ -82,7 +82,7 @@ func (s *RootStoreTestSuite) newStoreWithPruneConfig(config *store.PruningOption func (s *RootStoreTestSuite) newStoreWithBackendMount(sc store.Committer, pm *pruning.Manager) { noopLog := coretesting.NewNopLogger() - rs, err := New(dbm.NewMemDB(), noopLog, sc, pm, nil, nil) + rs, err := New(dbm.NewMemDB(), noopLog, sc, pm, nil) s.Require().NoError(err) s.rootStore = rs diff --git a/store/v2/root/upgrade_test.go b/store/v2/root/upgrade_test.go index 1bcee4149b48..3ee0f6ff10b0 100644 --- a/store/v2/root/upgrade_test.go +++ b/store/v2/root/upgrade_test.go @@ -44,7 +44,7 @@ func (s *UpgradeStoreTestSuite) SetupTest() { sc, err := commitment.NewCommitStore(multiTrees, nil, s.commitDB, testLog) s.Require().NoError(err) pm := pruning.NewManager(sc, nil) - s.rootStore, err = New(s.commitDB, testLog, sc, pm, nil, nil) + s.rootStore, err = New(s.commitDB, testLog, sc, pm, nil) s.Require().NoError(err) // commit changeset @@ -86,7 +86,7 @@ func (s *UpgradeStoreTestSuite) loadWithUpgrades(upgrades *corestore.StoreUpgrad sc, err := commitment.NewCommitStore(multiTrees, oldTrees, s.commitDB, testLog) s.Require().NoError(err) pm := pruning.NewManager(sc, nil) - s.rootStore, err = New(s.commitDB, testLog, sc, pm, nil, nil) + s.rootStore, err = New(s.commitDB, testLog, sc, pm, nil) s.Require().NoError(err) } diff --git a/tests/systemtests/upgrade_test.go b/tests/systemtests/upgrade_test.go index 81e2b93f5d61..cc2f8497ecff 100644 --- a/tests/systemtests/upgrade_test.go +++ b/tests/systemtests/upgrade_test.go @@ -37,7 +37,7 @@ func TestChainUpgrade(t *testing.T) { const ( upgradeHeight int64 = 22 - upgradeName = "v052-to-v054" // must match UpgradeName in simapp/upgrades.go + upgradeName = "v052-to-v2" // must match UpgradeName in simapp/upgrades.go ) systest.Sut.StartChain(t, fmt.Sprintf("--comet.halt-height=%d", upgradeHeight+1)) diff --git a/x/upgrade/CHANGELOG.md b/x/upgrade/CHANGELOG.md index 1886aedd8f67..4e0521d3443a 100644 --- a/x/upgrade/CHANGELOG.md +++ b/x/upgrade/CHANGELOG.md @@ -25,6 +25,9 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] +### Bug Fixes +* (x/upgrade) [#23179](https://github.com/cosmos/cosmos-sdk/pull/23179) Register missing implementation for SoftwareUpgradeProposal to avoid no concrete type registered for type URL /cosmos.upgrade.v1beta1.SoftwareUpgradeProposal against interface *v1beta1.Content error. + ## [v0.2.0-rc.1](https://github.com/cosmos/cosmos-sdk/releases/tag/x/upgrade/v0.2.0-rc.1) - 2024-12-18 ### Improvements diff --git a/x/upgrade/go.mod b/x/upgrade/go.mod index 9396ea02c8d2..209c5545fd33 100644 --- a/x/upgrade/go.mod +++ b/x/upgrade/go.mod @@ -11,6 +11,7 @@ require ( cosmossdk.io/log v1.5.0 cosmossdk.io/store v1.10.0-rc.1 cosmossdk.io/x/gov v0.0.0-20231113122742-912390d5fc4a + cosmossdk.io/x/tx v1.0.0 github.com/cometbft/cometbft v1.0.0 github.com/cometbft/cometbft/api v1.0.0 github.com/cosmos/cosmos-proto v1.0.0-beta.5 @@ -46,7 +47,6 @@ require ( cosmossdk.io/schema v1.0.0 // indirect cosmossdk.io/x/bank v0.0.0-20240226161501-23359a0b6d91 // indirect cosmossdk.io/x/staking v0.0.0-00010101000000-000000000000 // indirect - cosmossdk.io/x/tx v1.0.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect diff --git a/x/upgrade/types/codec.go b/x/upgrade/types/codec.go index 0ab589acf313..abfd8a85600b 100644 --- a/x/upgrade/types/codec.go +++ b/x/upgrade/types/codec.go @@ -3,6 +3,7 @@ package types import ( "cosmossdk.io/core/registry" coretransaction "cosmossdk.io/core/transaction" + "cosmossdk.io/x/gov/types/v1beta1" "github.com/cosmos/cosmos-sdk/codec/legacy" "github.com/cosmos/cosmos-sdk/types/msgservice" @@ -23,6 +24,9 @@ func RegisterInterfaces(registrar registry.InterfaceRegistrar) { &MsgSoftwareUpgrade{}, &MsgCancelUpgrade{}, ) - + registrar.RegisterImplementations( + (*v1beta1.Content)(nil), + &SoftwareUpgradeProposal{}, + ) msgservice.RegisterMsgServiceDesc(registrar, &_Msg_serviceDesc) } diff --git a/x/upgrade/types/codec_test.go b/x/upgrade/types/codec_test.go new file mode 100644 index 000000000000..27198d1d12bf --- /dev/null +++ b/x/upgrade/types/codec_test.go @@ -0,0 +1,33 @@ +package types + +import ( + "testing" + + proto "github.com/cosmos/gogoproto/proto" + gogoprotoany "github.com/cosmos/gogoproto/types/any" + "github.com/stretchr/testify/require" + + "cosmossdk.io/x/gov/types/v1beta1" + "cosmossdk.io/x/tx/signing" + + codectestutil "github.com/cosmos/cosmos-sdk/codec/testutil" + "github.com/cosmos/cosmos-sdk/codec/types" +) + +func TestInterfaceRegistrationOfContent(t *testing.T) { + opts := codectestutil.CodecOptions{} + registrar, err := types.NewInterfaceRegistryWithOptions(types.InterfaceRegistryOptions{ + ProtoFiles: proto.HybridResolver, + SigningOptions: signing.Options{ + AddressCodec: opts.GetAddressCodec(), + ValidatorAddressCodec: opts.GetValidatorCodec(), + }, + }) + require.NoError(t, err) + RegisterInterfaces(registrar) + val := &gogoprotoany.Any{ + TypeUrl: "/cosmos.upgrade.v1beta1.SoftwareUpgradeProposal", + Value: []byte{}, + } + require.NoError(t, registrar.UnpackAny(val, new(v1beta1.Content))) +} diff --git a/x/upgrade/types/proposal.go b/x/upgrade/types/proposal.go new file mode 100644 index 000000000000..0df833c9f73f --- /dev/null +++ b/x/upgrade/types/proposal.go @@ -0,0 +1,21 @@ +package types + +import ( + "cosmossdk.io/x/gov/types" + "cosmossdk.io/x/gov/types/v1beta1" +) + +// GetTitle returns the proposal title +func (sp *SoftwareUpgradeProposal) GetTitle() string { return sp.Title } + +// GetDescription returns the proposal description +func (sp *SoftwareUpgradeProposal) GetDescription() string { return sp.Description } + +// ProposalRoute returns the proposal router key +func (sp *SoftwareUpgradeProposal) ProposalRoute() string { return types.RouterKey } + +// ProposalType is "Text" +func (sp *SoftwareUpgradeProposal) ProposalType() string { return v1beta1.ProposalTypeText } + +// ValidateBasic validates the content's title and description of the proposal +func (sp *SoftwareUpgradeProposal) ValidateBasic() error { return v1beta1.ValidateAbstract(sp) } From 6f118d50f2ee09324d13f703df6675dfd9b4dcab Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Tue, 14 Jan 2025 16:42:21 +0100 Subject: [PATCH 02/11] attempt --- runtime/v2/app.go | 13 +++++++++++++ runtime/v2/go.mod | 8 +++++++- runtime/v2/go.sum | 22 ++++++++++++++++++---- runtime/v2/module.go | 2 ++ server/v2/commands.go | 1 + server/v2/server_test.go | 2 +- server/v2/store/commands.go | 12 +++++++++--- server/v2/store/server.go | 12 +++++++----- server/v2/store/snapshot.go | 4 ++-- simapp/v2/go.mod | 16 ++++++---------- simapp/v2/simdv2/cmd/commands.go | 2 +- store/v2/root/builder.go | 10 ++++++++++ 12 files changed, 77 insertions(+), 27 deletions(-) diff --git a/runtime/v2/app.go b/runtime/v2/app.go index b89febe8117e..015bbd292120 100644 --- a/runtime/v2/app.go +++ b/runtime/v2/app.go @@ -41,6 +41,9 @@ type App[T transaction.Tx] struct { amino registry.AminoRegistrar moduleManager *MM[T] queryHandlers map[string]appmodulev2.Handler // queryHandlers defines the query handlers + + // storeKeys + storeKeys []string } // Name returns the app name. @@ -111,3 +114,13 @@ func (a *App[T]) Close() error { func (a *App[T]) GetApp() *App[T] { return a } + +// SetStoreKeys sets the store keys. +func (a *App[T]) SetStoreKeys(keys []string) { + a.storeKeys = keys +} + +// GetStoreKeys returns the store keys that have been registered. +func (a *App[T]) GetStoreKeys() []string { + return a.storeKeys +} diff --git a/runtime/v2/go.mod b/runtime/v2/go.mod index 35397f24e7eb..c86e6d7d6e11 100644 --- a/runtime/v2/go.mod +++ b/runtime/v2/go.mod @@ -25,13 +25,17 @@ require ( google.golang.org/protobuf v1.36.2 ) +replace cosmossdk.io/store/v2 => ../../store/v2 + require ( buf.build/gen/go/cometbft/cometbft/protocolbuffers/go v1.36.1-20241120201313-68e42a58b301.1 // indirect buf.build/gen/go/cosmos/gogo-proto/protocolbuffers/go v1.36.1-20240130113600-88ef6483f90f.1 // indirect cosmossdk.io/core/testing v0.0.1 // indirect cosmossdk.io/errors/v2 v2.0.0 // indirect github.com/DataDog/zstd v1.5.5 // indirect + github.com/aybabtme/uniplot v0.0.0-20151203143629-039c559e5e7e // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bvinc/go-sqlite-lite v0.6.1 // indirect github.com/bytedance/sonic v1.12.6 // indirect github.com/bytedance/sonic/loader v0.2.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect @@ -44,8 +48,10 @@ require ( github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect github.com/cosmos/iavl v1.3.4 // indirect + github.com/cosmos/iavl/v2 v2.0.0-alpha.4 // indirect github.com/cosmos/ics23/go v0.11.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/emicklei/dot v1.6.2 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -57,9 +63,9 @@ require ( github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/klauspost/compress v1.17.9 // indirect github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/kocubinski/costor-api v1.1.1 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/linxGnu/grocksdb v1.9.3 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect diff --git a/runtime/v2/go.sum b/runtime/v2/go.sum index 210228ac2ed5..ed456c19c991 100644 --- a/runtime/v2/go.sum +++ b/runtime/v2/go.sum @@ -21,8 +21,6 @@ cosmossdk.io/server/v2/appmanager v1.0.0-beta.1 h1:EISWki+z9SDAt3OJnUl2y5Ow4qjOb cosmossdk.io/server/v2/appmanager v1.0.0-beta.1/go.mod h1:RVYxIaEdIT10nWSRqbwKDLFWfvCVx+cwAorCyPAQg9A= cosmossdk.io/server/v2/stf v1.0.0-beta.1 h1:s+nRgjhKVC08/qpr51eFVodLhyyQ9ASvJBanLBfQVNI= cosmossdk.io/server/v2/stf v1.0.0-beta.1/go.mod h1:nfjihbofEF2GGadkYSFmgy5tqrAnSrmGcXUDZmmWyi8= -cosmossdk.io/store/v2 v2.0.0-beta.1 h1:p1fdZ9uNijhpXZXdqs0QS6NmXNDVPNyT4DHV4yQnF64= -cosmossdk.io/store/v2 v2.0.0-beta.1/go.mod h1:qHQmf/9mnsXwo/Ypp2u2Zs6BmkYcx1R/Jrpyn9Ro13A= cosmossdk.io/x/tx v1.0.0-alpha.3 h1:+55/JFH5QRqnFhOI2heH3DKsaNL0RpXcJOQNzUvHiaQ= cosmossdk.io/x/tx v1.0.0-alpha.3/go.mod h1:h4pQ/j6Gfu8goB1R3Jbl4qY4RjYVNAsoylcleTXdSRg= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -34,10 +32,14 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/aybabtme/uniplot v0.0.0-20151203143629-039c559e5e7e h1:dSeuFcs4WAJJnswS8vXy7YY1+fdlbVPuEVmDAfqvFOQ= +github.com/aybabtme/uniplot v0.0.0-20151203143629-039c559e5e7e/go.mod h1:uh71c5Vc3VNIplXOFXsnDy21T1BepgT32c5X/YPrOyc= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bvinc/go-sqlite-lite v0.6.1 h1:JU8Rz5YAOZQiU3WEulKF084wfXpytRiqD2IaW2QjPz4= +github.com/bvinc/go-sqlite-lite v0.6.1/go.mod h1:2GiE60NUdb0aNhDdY+LXgrqAVDpi2Ijc6dB6ZMp9x6s= github.com/bytedance/sonic v1.12.6 h1:/isNmCUF2x3Sh8RAp/4mh4ZGkcFAX/hLrzrK3AvpRzk= github.com/bytedance/sonic v1.12.6/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= @@ -74,6 +76,10 @@ github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fr github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= github.com/cosmos/iavl v1.3.4 h1:A0RUAms7TZ0L6EFrrBIPg4Dy7qD9vvD5lJKUxEXURLM= github.com/cosmos/iavl v1.3.4/go.mod h1:T6SfBcyhulVIY2G/ZtAtQm/QiJvsuhIos52V4dWYk88= +github.com/cosmos/iavl-bench/bench v0.0.4 h1:J6zQPiBqF4CXMM3QBsLqZgQEBGY0taX85vLIZMhmAfQ= +github.com/cosmos/iavl-bench/bench v0.0.4/go.mod h1:j2rLae77EffacWcp7mmj3Uaa4AOAmZA7ymvhsuBQKKI= +github.com/cosmos/iavl/v2 v2.0.0-alpha.4 h1:PfpQt7xl4hojw2UFS2JdJppJnx8sjlmcxRQ7Hxk7Cl0= +github.com/cosmos/iavl/v2 v2.0.0-alpha.4/go.mod h1:7RSm0aeApe3S1x4TrLffvUL6pjOtMYV4glYnpAhr2lw= github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -81,6 +87,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -155,6 +163,8 @@ github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iP github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -170,6 +180,8 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kocubinski/costor-api v1.1.1 h1:sgfJA7T/8IfZ59zxiMrED0xdjerAFuPNBTqyO90GiEE= +github.com/kocubinski/costor-api v1.1.1/go.mod h1:ESMBMDkKfN+9vvvhhNVdKLhbOmzI3O/i16iXvRM9Tuc= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -180,8 +192,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/linxGnu/grocksdb v1.9.3 h1:s1cbPcOd0cU2SKXRG1nEqCOWYAELQjdqg3RVI2MH9ik= -github.com/linxGnu/grocksdb v1.9.3/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -260,6 +270,10 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= diff --git a/runtime/v2/module.go b/runtime/v2/module.go index 9f638bb9c07c..96a78a8520a7 100644 --- a/runtime/v2/module.go +++ b/runtime/v2/module.go @@ -142,6 +142,8 @@ func ProvideAppBuilder[T transaction.Tx]( } appBuilder := &AppBuilder[T]{app: app, storeBuilder: storeBuilder, storeConfig: storeConfig} + appBuilder.app.SetStoreKeys(storeBuilder.GetStoreKeys()) + return appBuilder, msgRouterBuilder, appModule[T]{app}, protoFiles, protoTypes } diff --git a/server/v2/commands.go b/server/v2/commands.go index 082e78243f33..e0f848adf60a 100644 --- a/server/v2/commands.go +++ b/server/v2/commands.go @@ -184,6 +184,7 @@ func topLevelCmd(ctx context.Context, use, short string) *cobra.Command { var appBuildingCommands = [][]string{ {"start"}, {"genesis", "export"}, + {"snapshot", "restore"}, } // IsAppRequired determines if a command requires a full application to be built by diff --git a/server/v2/server_test.go b/server/v2/server_test.go index d3cd5aaa8edf..eee4444231e3 100644 --- a/server/v2/server_test.go +++ b/server/v2/server_test.go @@ -56,7 +56,7 @@ func TestServer(t *testing.T) { grpcServer, err := grpc.New[transaction.Tx](logger, &mockInterfaceRegistry{}, map[string]appmodulev2.Handler{}, nil, cfg) require.NoError(t, err) - storeServer, err := store.New[transaction.Tx](&mockStore{}, cfg) + storeServer, err := store.New[transaction.Tx](&mockStore{}, cfg, []string{"mock-store-key"}) require.NoError(t, err) mockServer := &mockServer{name: "mock-server-1", ch: make(chan string, 100)} diff --git a/server/v2/store/commands.go b/server/v2/store/commands.go index 3ebe6e6ecba6..2ae577d6567e 100644 --- a/server/v2/store/commands.go +++ b/server/v2/store/commands.go @@ -40,7 +40,7 @@ Supported app-db-backend types include 'goleveldb', 'pebbledb'.`, } logger := serverv2.GetLoggerFromCmd(cmd) - rootStore, opts, err := createRootStore(vp, logger) + rootStore, opts, err := createRootStore(vp, logger, s.storeKeys) if err != nil { return fmt.Errorf("can not create root store %w", err) } @@ -74,12 +74,18 @@ Supported app-db-backend types include 'goleveldb', 'pebbledb'.`, return cmd } -func createRootStore(v *viper.Viper, logger log.Logger) (storev2.RootStore, root.Options, error) { +func createRootStore(v *viper.Viper, logger log.Logger, storeKeys []string) (storev2.RootStore, root.Options, error) { storeConfig, err := UnmarshalConfig(v.AllSettings()) if err != nil { return nil, root.Options{}, fmt.Errorf("failed to unmarshal config: %w", err) } - store, err := root.NewBuilder().Build(logger, storeConfig) + + builder := root.NewBuilder() + for _, key := range storeKeys { + builder.RegisterKey(key) + } + + store, err := builder.Build(logger, storeConfig) if err != nil { return nil, root.Options{}, fmt.Errorf("failed to create store backend: %w", err) } diff --git a/server/v2/store/server.go b/server/v2/store/server.go index ec6d2d14e133..f324ae2c1fca 100644 --- a/server/v2/store/server.go +++ b/server/v2/store/server.go @@ -23,18 +23,20 @@ const ServerName = "store" // Server manages store config and contains prune & snapshot commands type Server[T transaction.Tx] struct { - config *root.Config - store storev2.Backend + config *root.Config + store storev2.Backend + storeKeys []string } -func New[T transaction.Tx](store storev2.Backend, cfg server.ConfigMap) (*Server[T], error) { +func New[T transaction.Tx](store storev2.Backend, cfg server.ConfigMap, storeKeys []string) (*Server[T], error) { config, err := UnmarshalConfig(cfg) if err != nil { return nil, err } return &Server[T]{ - store: store, - config: config, + store: store, + config: config, + storeKeys: storeKeys, }, nil } diff --git a/server/v2/store/snapshot.go b/server/v2/store/snapshot.go index a86fb355e406..35de4167afcd 100644 --- a/server/v2/store/snapshot.go +++ b/server/v2/store/snapshot.go @@ -39,7 +39,7 @@ func (s *Server[T]) ExportSnapshotCmd() *cobra.Command { } logger := serverv2.GetLoggerFromCmd(cmd) - rootStore, _, err := createRootStore(v, logger) + rootStore, _, err := createRootStore(v, logger, s.storeKeys) if err != nil { return err } @@ -94,7 +94,7 @@ func (s *Server[T]) RestoreSnapshotCmd() *cobra.Command { return err } - rootStore, _, err := createRootStore(v, logger) + rootStore, _, err := createRootStore(v, logger, s.storeKeys) if err != nil { return fmt.Errorf("failed to create root store: %w", err) } diff --git a/simapp/v2/go.mod b/simapp/v2/go.mod index a3a655c5ed9c..d834695aae1d 100644 --- a/simapp/v2/go.mod +++ b/simapp/v2/go.mod @@ -12,11 +12,14 @@ require ( cosmossdk.io/math v1.5.0 cosmossdk.io/runtime/v2 v2.0.0-00010101000000-000000000000 cosmossdk.io/server/v2 v2.0.0-beta.1 + cosmossdk.io/server/v2/appmanager v1.0.0-beta.1 cosmossdk.io/server/v2/cometbft v0.0.0-20241015140036-ee3d320eaa55 cosmossdk.io/store/v2 v2.0.0 cosmossdk.io/tools/benchmark v0.2.0-rc.1 + cosmossdk.io/tools/confix v0.0.0-00010101000000-000000000000 cosmossdk.io/x/accounts v0.0.0-20240913065641-0064ccbce64e cosmossdk.io/x/accounts/defaults/base v0.0.0-00010101000000-000000000000 + cosmossdk.io/x/accounts/defaults/lockup v0.0.0-00010101000000-000000000000 cosmossdk.io/x/accounts/defaults/multisig v0.0.0-00010101000000-000000000000 cosmossdk.io/x/authz v0.0.0-00010101000000-000000000000 cosmossdk.io/x/bank v0.0.0-20240226161501-23359a0b6d91 @@ -35,10 +38,10 @@ require ( cosmossdk.io/x/staking v0.0.0-00010101000000-000000000000 cosmossdk.io/x/upgrade v0.0.0-20230613133644-0a778132a60f github.com/cometbft/cometbft v1.0.0 + github.com/cometbft/cometbft/api v1.0.0 // this version is not used as it is always replaced by the latest Cosmos SDK version github.com/cosmos/cosmos-sdk v0.53.0 github.com/jackc/pgx/v5 v5.7.2 - github.com/spf13/cast v1.7.1 // indirect github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.19.0 @@ -46,15 +49,6 @@ require ( google.golang.org/protobuf v1.36.2 ) -require github.com/cosmos/iavl/v2 v2.0.0-alpha.4 // indirect - -require ( - cosmossdk.io/server/v2/appmanager v1.0.0-beta.1 - cosmossdk.io/tools/confix v0.0.0-00010101000000-000000000000 - cosmossdk.io/x/accounts/defaults/lockup v0.0.0-00010101000000-000000000000 - github.com/cometbft/cometbft/api v1.0.0 -) - require ( buf.build/gen/go/cometbft/cometbft/protocolbuffers/go v1.36.1-20241120201313-68e42a58b301.1 // indirect buf.build/gen/go/cosmos/gogo-proto/protocolbuffers/go v1.36.1-20240130113600-88ef6483f90f.1 // indirect @@ -107,6 +101,7 @@ require ( github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/gogoproto v1.7.0 // indirect github.com/cosmos/iavl v1.3.4 // indirect + github.com/cosmos/iavl/v2 v2.0.0-alpha.4 // indirect github.com/cosmos/ics23/go v0.11.0 // indirect github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect github.com/creachadair/atomicfile v0.3.7 // indirect @@ -207,6 +202,7 @@ require ( github.com/sasha-s/go-deadlock v0.3.5 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.1 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/supranational/blst v0.3.13 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect diff --git a/simapp/v2/simdv2/cmd/commands.go b/simapp/v2/simdv2/cmd/commands.go index f9b9e6ebfc09..522d3e411df2 100644 --- a/simapp/v2/simdv2/cmd/commands.go +++ b/simapp/v2/simdv2/cmd/commands.go @@ -98,7 +98,7 @@ func InitRootCmd[T transaction.Tx]( simApp := deps.SimApp // store component (not a server) - storeComponent, err := serverstore.New[T](simApp.Store(), deps.GlobalConfig) + storeComponent, err := serverstore.New[T](simApp.Store(), deps.GlobalConfig, simApp.App.GetStoreKeys()) if err != nil { return nil, err } diff --git a/store/v2/root/builder.go b/store/v2/root/builder.go index a282c9fe3328..3091034edf09 100644 --- a/store/v2/root/builder.go +++ b/store/v2/root/builder.go @@ -25,6 +25,8 @@ type Builder interface { RegisterKey(string) // Get returns the Store. Build should be called before calling Get or the result will be nil. Get() store.RootStore + // GetStoreKeys returns the store keys that have been registered. + GetStoreKeys() []string } var _ Builder = (*builder)(nil) @@ -98,3 +100,11 @@ func (sb *builder) Get() store.RootStore { func (sb *builder) RegisterKey(key string) { sb.storeKeys[key] = struct{}{} } + +func (sb *builder) GetStoreKeys() []string { + keys := make([]string, 0, len(sb.storeKeys)) + for key := range sb.storeKeys { + keys = append(keys, key) + } + return keys +} From a317dab36541880e45fd155ba5b9375ae467cd27 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Tue, 14 Jan 2025 17:07:37 +0100 Subject: [PATCH 03/11] rename snapshots_test to store_test and remove one skip --- tests/systemtests/{snapshots_test.go => store_test.go} | 2 -- 1 file changed, 2 deletions(-) rename tests/systemtests/{snapshots_test.go => store_test.go} (98%) diff --git a/tests/systemtests/snapshots_test.go b/tests/systemtests/store_test.go similarity index 98% rename from tests/systemtests/snapshots_test.go rename to tests/systemtests/store_test.go index 70a7b4f59f88..a635158be943 100644 --- a/tests/systemtests/snapshots_test.go +++ b/tests/systemtests/store_test.go @@ -68,8 +68,6 @@ func TestSnapshots(t *testing.T) { } func TestPrune(t *testing.T) { - t.Skip("Not persisting properly on CI") - systest.Sut.ResetChain(t) cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) From f1bd8ff594ec458a1e19c27d0daf160d063f60f9 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Tue, 14 Jan 2025 17:30:52 +0100 Subject: [PATCH 04/11] fix --- server/v2/commands.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/v2/commands.go b/server/v2/commands.go index e0f848adf60a..d0453cf107f8 100644 --- a/server/v2/commands.go +++ b/server/v2/commands.go @@ -184,7 +184,7 @@ func topLevelCmd(ctx context.Context, use, short string) *cobra.Command { var appBuildingCommands = [][]string{ {"start"}, {"genesis", "export"}, - {"snapshot", "restore"}, + {"store", "restore"}, } // IsAppRequired determines if a command requires a full application to be built by @@ -206,7 +206,8 @@ func IsAppRequired(cmd *cobra.Command, required ...[]string) bool { } cmdPath := make([]string, 0, 5) // Pre-allocate with reasonable capacity for { - cmdPath = append(cmdPath, cmd.Use) + cmdName := cmd.Name() + cmdPath = append(cmdPath, cmdName) if _, ok := m[strings.Join(cmdPath, "")]; ok { return true } From ff8501cc107fa7670f945546b3180e164df60d9e Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Tue, 14 Jan 2025 17:54:31 +0100 Subject: [PATCH 05/11] more fixes --- server/v2/commands.go | 2 +- server/v2/server_test.go | 2 +- server/v2/store/commands.go | 35 ++------------------------------ server/v2/store/server.go | 12 +++++------ server/v2/store/snapshot.go | 19 ++--------------- simapp/v2/simdv2/cmd/commands.go | 2 +- 6 files changed, 12 insertions(+), 60 deletions(-) diff --git a/server/v2/commands.go b/server/v2/commands.go index d0453cf107f8..849899028308 100644 --- a/server/v2/commands.go +++ b/server/v2/commands.go @@ -184,7 +184,7 @@ func topLevelCmd(ctx context.Context, use, short string) *cobra.Command { var appBuildingCommands = [][]string{ {"start"}, {"genesis", "export"}, - {"store", "restore"}, + {"store"}, } // IsAppRequired determines if a command requires a full application to be built by diff --git a/server/v2/server_test.go b/server/v2/server_test.go index eee4444231e3..d3cd5aaa8edf 100644 --- a/server/v2/server_test.go +++ b/server/v2/server_test.go @@ -56,7 +56,7 @@ func TestServer(t *testing.T) { grpcServer, err := grpc.New[transaction.Tx](logger, &mockInterfaceRegistry{}, map[string]appmodulev2.Handler{}, nil, cfg) require.NoError(t, err) - storeServer, err := store.New[transaction.Tx](&mockStore{}, cfg, []string{"mock-store-key"}) + storeServer, err := store.New[transaction.Tx](&mockStore{}, cfg) require.NoError(t, err) mockServer := &mockServer{name: "mock-server-1", ch: make(chan string, 100)} diff --git a/server/v2/store/commands.go b/server/v2/store/commands.go index 2ae577d6567e..42a13a567ffb 100644 --- a/server/v2/store/commands.go +++ b/server/v2/store/commands.go @@ -4,12 +4,8 @@ import ( "fmt" "github.com/spf13/cobra" - "github.com/spf13/viper" - "cosmossdk.io/log" serverv2 "cosmossdk.io/server/v2" - storev2 "cosmossdk.io/store/v2" - "cosmossdk.io/store/v2/root" ) // PrunesCmd implements the default command for pruning app history states. @@ -38,14 +34,8 @@ Supported app-db-backend types include 'goleveldb', 'pebbledb'.`, if err := vp.BindPFlags(cmd.PersistentFlags()); err != nil { return err } - logger := serverv2.GetLoggerFromCmd(cmd) - rootStore, opts, err := createRootStore(vp, logger, s.storeKeys) - if err != nil { - return fmt.Errorf("can not create root store %w", err) - } - - latestHeight, err := rootStore.GetLatestVersion() + latestHeight, err := s.store.GetLatestVersion() if err != nil { return err } @@ -55,10 +45,7 @@ Supported app-db-backend types include 'goleveldb', 'pebbledb'.`, return fmt.Errorf("the database has no valid heights to prune, the latest height: %v", latestHeight) } - diff := latestHeight - opts.SCPruningOption.KeepRecent - cmd.Printf("pruning heights up to %v\n", diff) - - err = rootStore.Prune(latestHeight) + err = s.store.Prune(latestHeight) if err != nil { return err } @@ -73,21 +60,3 @@ Supported app-db-backend types include 'goleveldb', 'pebbledb'.`, return cmd } - -func createRootStore(v *viper.Viper, logger log.Logger, storeKeys []string) (storev2.RootStore, root.Options, error) { - storeConfig, err := UnmarshalConfig(v.AllSettings()) - if err != nil { - return nil, root.Options{}, fmt.Errorf("failed to unmarshal config: %w", err) - } - - builder := root.NewBuilder() - for _, key := range storeKeys { - builder.RegisterKey(key) - } - - store, err := builder.Build(logger, storeConfig) - if err != nil { - return nil, root.Options{}, fmt.Errorf("failed to create store backend: %w", err) - } - return store, storeConfig.Options, nil -} diff --git a/server/v2/store/server.go b/server/v2/store/server.go index f324ae2c1fca..857d1bf0ebfa 100644 --- a/server/v2/store/server.go +++ b/server/v2/store/server.go @@ -23,20 +23,18 @@ const ServerName = "store" // Server manages store config and contains prune & snapshot commands type Server[T transaction.Tx] struct { - config *root.Config - store storev2.Backend - storeKeys []string + config *root.Config + store storev2.RootStore } -func New[T transaction.Tx](store storev2.Backend, cfg server.ConfigMap, storeKeys []string) (*Server[T], error) { +func New[T transaction.Tx](store storev2.RootStore, cfg server.ConfigMap) (*Server[T], error) { config, err := UnmarshalConfig(cfg) if err != nil { return nil, err } return &Server[T]{ - store: store, - config: config, - storeKeys: storeKeys, + store: store, + config: config, }, nil } diff --git a/server/v2/store/snapshot.go b/server/v2/store/snapshot.go index 35de4167afcd..ad4de3a4e3ba 100644 --- a/server/v2/store/snapshot.go +++ b/server/v2/store/snapshot.go @@ -39,21 +39,10 @@ func (s *Server[T]) ExportSnapshotCmd() *cobra.Command { } logger := serverv2.GetLoggerFromCmd(cmd) - rootStore, _, err := createRootStore(v, logger, s.storeKeys) - if err != nil { - return err - } - if height == 0 { - lastCommitId, err := rootStore.LastCommitID() - if err != nil { - return err - } - height = int64(lastCommitId.Version) - } cmd.Printf("Exporting snapshot for height %d\n", height) - sm, err := createSnapshotsManager(cmd, v, logger, rootStore) + sm, err := createSnapshotsManager(cmd, v, logger, s.store) if err != nil { return err } @@ -94,11 +83,7 @@ func (s *Server[T]) RestoreSnapshotCmd() *cobra.Command { return err } - rootStore, _, err := createRootStore(v, logger, s.storeKeys) - if err != nil { - return fmt.Errorf("failed to create root store: %w", err) - } - sm, err := createSnapshotsManager(cmd, v, logger, rootStore) + sm, err := createSnapshotsManager(cmd, v, logger, s.store) if err != nil { return err } diff --git a/simapp/v2/simdv2/cmd/commands.go b/simapp/v2/simdv2/cmd/commands.go index 522d3e411df2..f9b9e6ebfc09 100644 --- a/simapp/v2/simdv2/cmd/commands.go +++ b/simapp/v2/simdv2/cmd/commands.go @@ -98,7 +98,7 @@ func InitRootCmd[T transaction.Tx]( simApp := deps.SimApp // store component (not a server) - storeComponent, err := serverstore.New[T](simApp.Store(), deps.GlobalConfig, simApp.App.GetStoreKeys()) + storeComponent, err := serverstore.New[T](simApp.Store(), deps.GlobalConfig) if err != nil { return nil, err } From 450705df1933862bf2f43a5b01868a7c45020c11 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Wed, 15 Jan 2025 09:43:31 +0100 Subject: [PATCH 06/11] test --- server/v2/commands.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/v2/commands.go b/server/v2/commands.go index 849899028308..d0453cf107f8 100644 --- a/server/v2/commands.go +++ b/server/v2/commands.go @@ -184,7 +184,7 @@ func topLevelCmd(ctx context.Context, use, short string) *cobra.Command { var appBuildingCommands = [][]string{ {"start"}, {"genesis", "export"}, - {"store"}, + {"store", "restore"}, } // IsAppRequired determines if a command requires a full application to be built by From 5bf663f10e9da08246157bff64b066360b2fee6c Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Thu, 30 Jan 2025 15:16:26 +0100 Subject: [PATCH 07/11] Make prune system test work --- runtime/v2/app.go | 13 ------------- runtime/v2/module.go | 2 -- server/v2/commands.go | 1 + simapp/v2/go.mod | 1 - 4 files changed, 1 insertion(+), 16 deletions(-) diff --git a/runtime/v2/app.go b/runtime/v2/app.go index 015bbd292120..b89febe8117e 100644 --- a/runtime/v2/app.go +++ b/runtime/v2/app.go @@ -41,9 +41,6 @@ type App[T transaction.Tx] struct { amino registry.AminoRegistrar moduleManager *MM[T] queryHandlers map[string]appmodulev2.Handler // queryHandlers defines the query handlers - - // storeKeys - storeKeys []string } // Name returns the app name. @@ -114,13 +111,3 @@ func (a *App[T]) Close() error { func (a *App[T]) GetApp() *App[T] { return a } - -// SetStoreKeys sets the store keys. -func (a *App[T]) SetStoreKeys(keys []string) { - a.storeKeys = keys -} - -// GetStoreKeys returns the store keys that have been registered. -func (a *App[T]) GetStoreKeys() []string { - return a.storeKeys -} diff --git a/runtime/v2/module.go b/runtime/v2/module.go index 96a78a8520a7..9f638bb9c07c 100644 --- a/runtime/v2/module.go +++ b/runtime/v2/module.go @@ -142,8 +142,6 @@ func ProvideAppBuilder[T transaction.Tx]( } appBuilder := &AppBuilder[T]{app: app, storeBuilder: storeBuilder, storeConfig: storeConfig} - appBuilder.app.SetStoreKeys(storeBuilder.GetStoreKeys()) - return appBuilder, msgRouterBuilder, appModule[T]{app}, protoFiles, protoTypes } diff --git a/server/v2/commands.go b/server/v2/commands.go index aefbff8a7bc4..3a573c07c3c9 100644 --- a/server/v2/commands.go +++ b/server/v2/commands.go @@ -185,6 +185,7 @@ var appBuildingCommands = [][]string{ {"start"}, {"genesis", "export"}, {"store", "restore"}, + {"store", "prune"}, } // IsAppRequired determines if a command requires a full application to be built by diff --git a/simapp/v2/go.mod b/simapp/v2/go.mod index 071129fb3352..3d0cf699d5b8 100644 --- a/simapp/v2/go.mod +++ b/simapp/v2/go.mod @@ -305,5 +305,4 @@ replace ( cosmossdk.io/server/v2/cometbft => ../../server/v2/cometbft cosmossdk.io/server/v2/stf => ../../server/v2/stf cosmossdk.io/store/v2 => ../../store/v2 - ) From 332407afa447400f7ef8115e977ad14dde2c124b Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 31 Jan 2025 13:17:52 +0100 Subject: [PATCH 08/11] Restore command --- server/v2/commands.go | 1 + store/v2/commitment/store.go | 3 +++ tests/systemtests/store_test.go | 15 +++++++-------- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/server/v2/commands.go b/server/v2/commands.go index 3a573c07c3c9..be80a3c8a31c 100644 --- a/server/v2/commands.go +++ b/server/v2/commands.go @@ -186,6 +186,7 @@ var appBuildingCommands = [][]string{ {"genesis", "export"}, {"store", "restore"}, {"store", "prune"}, + {"store", "export"}, } // IsAppRequired determines if a command requires a full application to be built by diff --git a/store/v2/commitment/store.go b/store/v2/commitment/store.go index 08c254b1992d..063090d934d8 100644 --- a/store/v2/commitment/store.go +++ b/store/v2/commitment/store.go @@ -563,6 +563,9 @@ loop: node.Value = []byte{} } } + if node.Version == 0 { + node.Version = int64(version) + } err := importer.Add(node) if err != nil { return snapshotstypes.SnapshotItem{}, fmt.Errorf("failed to add node to importer: %w", err) diff --git a/tests/systemtests/store_test.go b/tests/systemtests/store_test.go index a635158be943..0a579edfd176 100644 --- a/tests/systemtests/store_test.go +++ b/tests/systemtests/store_test.go @@ -15,8 +15,6 @@ import ( const disabledLog = "--log_level=disabled" func TestSnapshots(t *testing.T) { - t.Skip("Not persisting properly on CI") - systest.Sut.ResetChain(t) cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) systest.Sut.StartChain(t) @@ -28,7 +26,9 @@ func TestSnapshots(t *testing.T) { node0Dir := systest.Sut.NodeDir(0) command := "store" - restoreableDirs := []string{fmt.Sprintf("%s/data/application.db", node0Dir), fmt.Sprintf("%s/data/ss", node0Dir)} + restoreableDirs := []string{ + fmt.Sprintf("%s/data/application.db", node0Dir), + } // export snapshot at height 5 res := cli.RunCommandWithArgs(command, "export", "--height=5", fmt.Sprintf("--home=%s", node0Dir), disabledLog) @@ -52,19 +52,18 @@ func TestSnapshots(t *testing.T) { res = cli.RunCommandWithArgs(command, "load", fmt.Sprintf("%s/5-3.tar.gz", node0Dir), fmt.Sprintf("--home=%s", node0Dir), disabledLog) require.DirExists(t, fmt.Sprintf("%s/data/snapshots/5/3", node0Dir)) - // Restore from snapshots + // Remove database for _, dir := range restoreableDirs { require.NoError(t, os.RemoveAll(dir)) } - // Remove database - err := os.RemoveAll(fmt.Sprintf("%s/data/application.db", node0Dir)) - require.NoError(t, err) - require.NoError(t, os.RemoveAll(fmt.Sprintf("%s/data/ss", node0Dir))) + // Restore from snapshots res = cli.RunCommandWithArgs(command, "restore", "5", "3", fmt.Sprintf("--home=%s", node0Dir), disabledLog) for _, dir := range restoreableDirs { require.DirExists(t, dir) } + systest.Sut.StartChain(t) + systest.Sut.AwaitNBlocks(t, 2) } func TestPrune(t *testing.T) { From 3eb09d7a4309ef668b970d7fa82af808061495ce Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 31 Jan 2025 15:11:52 +0100 Subject: [PATCH 09/11] Linter only --- store/v2/root/store_mock_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/store/v2/root/store_mock_test.go b/store/v2/root/store_mock_test.go index 495d5b8520eb..25722615dddf 100644 --- a/store/v2/root/store_mock_test.go +++ b/store/v2/root/store_mock_test.go @@ -60,7 +60,6 @@ func TestQuery(t *testing.T) { sc.EXPECT().GetProof(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, errors.New("error")) _, err = rs.Query(nil, 0, nil, true) require.Error(t, err) - } func TestLoadVersion(t *testing.T) { @@ -88,5 +87,4 @@ func TestLoadVersion(t *testing.T) { sc.EXPECT().LoadVersionAndUpgrade(uint64(2), v).Return(errors.New("error")) err = rs.LoadVersionAndUpgrade(uint64(2), v) require.Error(t, err) - } From 5ed53a41549fe9e98258ebb69fbd9eb9e3a56a42 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 31 Jan 2025 15:14:39 +0100 Subject: [PATCH 10/11] Update Changelog --- store/v2/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/store/v2/CHANGELOG.md b/store/v2/CHANGELOG.md index 789d1be3d225..9df2edd1fbd6 100644 --- a/store/v2/CHANGELOG.md +++ b/store/v2/CHANGELOG.md @@ -26,7 +26,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] ### Improvements - +* [#23568](https://github.com/cosmos/cosmos-sdk/pull/23568) Remove auto migration and fix restore cmd * [#23013](https://github.com/cosmos/cosmos-sdk/pull/23013) Support memDB for sims ### Bug Fixes From e4ff2f05547b0427823315db7c89f76876e77acd Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Fri, 31 Jan 2025 17:32:04 +0100 Subject: [PATCH 11/11] Review feedback --- store/v2/root/builder.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/store/v2/root/builder.go b/store/v2/root/builder.go index 3091034edf09..a282c9fe3328 100644 --- a/store/v2/root/builder.go +++ b/store/v2/root/builder.go @@ -25,8 +25,6 @@ type Builder interface { RegisterKey(string) // Get returns the Store. Build should be called before calling Get or the result will be nil. Get() store.RootStore - // GetStoreKeys returns the store keys that have been registered. - GetStoreKeys() []string } var _ Builder = (*builder)(nil) @@ -100,11 +98,3 @@ func (sb *builder) Get() store.RootStore { func (sb *builder) RegisterKey(key string) { sb.storeKeys[key] = struct{}{} } - -func (sb *builder) GetStoreKeys() []string { - keys := make([]string, 0, len(sb.storeKeys)) - for key := range sb.storeKeys { - keys = append(keys, key) - } - return keys -}