From 32d346530e0b314fc130017e3d1ddf866b470932 Mon Sep 17 00:00:00 2001 From: Hieu Vu <72878483+hieuvubk@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:49:25 +0700 Subject: [PATCH 1/7] init & export genesis for runtime mm --- runtime/v2/go.mod | 2 +- runtime/v2/manager.go | 167 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 163 insertions(+), 6 deletions(-) diff --git a/runtime/v2/go.mod b/runtime/v2/go.mod index 32ea75176e7a..fe6a7c8485ee 100644 --- a/runtime/v2/go.mod +++ b/runtime/v2/go.mod @@ -42,6 +42,7 @@ require ( cosmossdk.io/store v1.1.0 cosmossdk.io/store/v2 v2.0.0-00010101000000-000000000000 cosmossdk.io/x/tx v0.13.1 + github.com/cometbft/cometbft v0.38.6 github.com/cosmos/cosmos-sdk v0.51.0 github.com/cosmos/gogoproto v1.4.12 github.com/golang/protobuf v1.5.4 @@ -74,7 +75,6 @@ require ( github.com/cockroachdb/pebble v1.1.0 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/cometbft/cometbft v0.38.6 // indirect github.com/cometbft/cometbft-db v0.9.1 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.2 // indirect diff --git a/runtime/v2/manager.go b/runtime/v2/manager.go index 9d139710186e..e88b7deb33ed 100644 --- a/runtime/v2/manager.go +++ b/runtime/v2/manager.go @@ -17,13 +17,18 @@ import ( cosmosmsg "cosmossdk.io/api/cosmos/msg/v1" "cosmossdk.io/core/appmodule" appmodulev2 "cosmossdk.io/core/appmodule/v2" + "cosmossdk.io/core/genesis" "cosmossdk.io/core/registry" "cosmossdk.io/core/transaction" "cosmossdk.io/log" "cosmossdk.io/runtime/v2/protocompat" "cosmossdk.io/server/v2/stf" + cmtcryptoproto "github.com/cometbft/cometbft/proto/tendermint/crypto" + storetypes "cosmossdk.io/store/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" sdkmodule "github.com/cosmos/cosmos-sdk/types/module" ) @@ -139,14 +144,166 @@ func (m *MM) ValidateGenesis(genesisData map[string]json.RawMessage) error { return nil } -// InitGenesis performs init genesis functionality for modules. -func (m *MM) InitGenesis() { - panic("implement me") +func (m *MM) InitGenesis(ctx context.Context, genesisData map[string]json.RawMessage) (*abci.ResponseInitChain, error) { + var validatorUpdates []appmodulev2.ValidatorUpdate + m.logger.Info("initializing blockchain state from genesis.json") + + for _, moduleName := range m.config.InitGenesis { + if genesisData[moduleName] == nil { + continue + } + + mod := m.modules[moduleName] + // Check if module has auto genesis, if so return err + if _, ok := mod.(appmodule.HasGenesisAuto); ok { + m.logger.Debug("running initialization for module", "module", moduleName) + return &abci.ResponseInitChain{}, fmt.Errorf("Not support auto genesis, module: %v", moduleName) + } else if module, ok := mod.(appmodulev2.HasGenesis); ok { + m.logger.Debug("running initialization for module", "module", moduleName) + if err := module.InitGenesis(ctx, genesisData[moduleName]); err != nil { + return &abci.ResponseInitChain{}, err + } + } else if module, ok := mod.(sdkmodule.HasABCIGenesis); ok { + m.logger.Debug("running initialization for module", "module", moduleName) + moduleValUpdates, err := module.InitGenesis(ctx, genesisData[moduleName]) + if err != nil { + return &abci.ResponseInitChain{}, err + } + + // use these validator updates if provided, the module manager assumes + // only one module will update the validator set + if len(moduleValUpdates) > 0 { + if len(validatorUpdates) > 0 { + return &abci.ResponseInitChain{}, errors.New("validator InitGenesis updates already set by a previous module") + } + validatorUpdates = moduleValUpdates + } + } + } + + // a chain must initialize with a non-empty validator set + if len(validatorUpdates) == 0 { + return &abci.ResponseInitChain{}, fmt.Errorf("validator set is empty after InitGenesis, please ensure at least one validator is initialized with a delegation greater than or equal to the DefaultPowerReduction (%d)", sdk.DefaultPowerReduction) + } + + cometValidatorUpdates := make([]abci.ValidatorUpdate, len(validatorUpdates)) + for i, v := range validatorUpdates { + var pubkey cmtcryptoproto.PublicKey + switch v.PubKeyType { + case "ed25519": + pubkey = cmtcryptoproto.PublicKey{ + Sum: &cmtcryptoproto.PublicKey_Ed25519{ + Ed25519: v.PubKey, + }, + } + case "secp256k1": + pubkey = cmtcryptoproto.PublicKey{ + Sum: &cmtcryptoproto.PublicKey_Secp256K1{ + Secp256K1: v.PubKey, + }, + } + } + + cometValidatorUpdates[i] = abci.ValidatorUpdate{ + PubKey: pubkey, + Power: v.Power, + } + } + + return &abci.ResponseInitChain{ + Validators: cometValidatorUpdates, + }, nil } // ExportGenesis performs export genesis functionality for modules -func (m *MM) ExportGenesis() { - panic("implement me") +func (m *MM) ExportGenesis(ctx sdk.Context) (map[string]json.RawMessage, error) { + return m.ExportGenesisForModules(ctx, []string{}) +} + +// ExportGenesisForModules performs export genesis functionality for modules +func (m *MM) ExportGenesisForModules(ctx sdk.Context, modulesToExport []string) (map[string]json.RawMessage, error) { + if len(modulesToExport) == 0 { + modulesToExport = m.config.ExportGenesis + } + // verify modules exists in app, so that we don't panic in the middle of an export + if err := m.checkModulesExists(modulesToExport); err != nil { + return nil, err + } + + type genesisResult struct { + bz json.RawMessage + err error + } + + channels := make(map[string]chan genesisResult) + for _, moduleName := range modulesToExport { + mod := m.modules[moduleName] + if module, ok := mod.(appmodule.HasGenesisAuto); ok { + // core API genesis + channels[moduleName] = make(chan genesisResult) + go func(module appmodule.HasGenesisAuto, ch chan genesisResult) { + ctx := ctx.WithGasMeter(storetypes.NewInfiniteGasMeter()) // avoid race conditions + target := genesis.RawJSONTarget{} + err := module.ExportGenesis(ctx, target.Target()) + if err != nil { + ch <- genesisResult{nil, err} + return + } + + rawJSON, err := target.JSON() + if err != nil { + ch <- genesisResult{nil, err} + return + } + + ch <- genesisResult{rawJSON, nil} + }(module, channels[moduleName]) + } else if module, ok := mod.(appmodulev2.HasGenesis); ok { + channels[moduleName] = make(chan genesisResult) + go func(module appmodulev2.HasGenesis, ch chan genesisResult) { + ctx := ctx.WithGasMeter(storetypes.NewInfiniteGasMeter()) // avoid race conditions + jm, err := module.ExportGenesis(ctx) + if err != nil { + ch <- genesisResult{nil, err} + return + } + ch <- genesisResult{jm, nil} + }(module, channels[moduleName]) + } else if module, ok := mod.(sdkmodule.HasABCIGenesis); ok { + channels[moduleName] = make(chan genesisResult) + go func(module sdkmodule.HasABCIGenesis, ch chan genesisResult) { + ctx := ctx.WithGasMeter(storetypes.NewInfiniteGasMeter()) // avoid race conditions + jm, err := module.ExportGenesis(ctx) + if err != nil { + ch <- genesisResult{nil, err} + } + ch <- genesisResult{jm, nil} + }(module, channels[moduleName]) + } + } + + genesisData := make(map[string]json.RawMessage) + for moduleName := range channels { + res := <-channels[moduleName] + if res.err != nil { + return nil, fmt.Errorf("genesis export error in %s: %w", moduleName, res.err) + } + + genesisData[moduleName] = res.bz + } + + return genesisData, nil +} + +// checkModulesExists verifies that all modules in the list exist in the app +func (m *MM) checkModulesExists(moduleName []string) error { + for _, name := range moduleName { + if _, ok := m.modules[name]; !ok { + return fmt.Errorf("module %s does not exist", name) + } + } + + return nil } // BeginBlock runs the begin-block logic of all modules From 40d391494eae5743e5b8d7ac5f3d851cc17f56d7 Mon Sep 17 00:00:00 2001 From: Hieu Vu <72878483+hieuvubk@users.noreply.github.com> Date: Thu, 11 Apr 2024 16:33:49 +0700 Subject: [PATCH 2/7] fix export --- runtime/v2/manager.go | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/runtime/v2/manager.go b/runtime/v2/manager.go index e88b7deb33ed..bd325e4016a4 100644 --- a/runtime/v2/manager.go +++ b/runtime/v2/manager.go @@ -238,26 +238,9 @@ func (m *MM) ExportGenesisForModules(ctx sdk.Context, modulesToExport []string) channels := make(map[string]chan genesisResult) for _, moduleName := range modulesToExport { mod := m.modules[moduleName] - if module, ok := mod.(appmodule.HasGenesisAuto); ok { - // core API genesis - channels[moduleName] = make(chan genesisResult) - go func(module appmodule.HasGenesisAuto, ch chan genesisResult) { - ctx := ctx.WithGasMeter(storetypes.NewInfiniteGasMeter()) // avoid race conditions - target := genesis.RawJSONTarget{} - err := module.ExportGenesis(ctx, target.Target()) - if err != nil { - ch <- genesisResult{nil, err} - return - } - - rawJSON, err := target.JSON() - if err != nil { - ch <- genesisResult{nil, err} - return - } - - ch <- genesisResult{rawJSON, nil} - }(module, channels[moduleName]) + if _, ok := mod.(appmodule.HasGenesisAuto); ok { + m.logger.Debug("running initialization for module", "module", moduleName) + return nil, fmt.Errorf("Not support auto genesis, module: %v", moduleName) } else if module, ok := mod.(appmodulev2.HasGenesis); ok { channels[moduleName] = make(chan genesisResult) go func(module appmodulev2.HasGenesis, ch chan genesisResult) { From 07c30409fa89f70eddc3e57930f64701c4b009f7 Mon Sep 17 00:00:00 2001 From: Hieu Vu <72878483+hieuvubk@users.noreply.github.com> Date: Thu, 11 Apr 2024 17:36:49 +0700 Subject: [PATCH 3/7] refactor --- runtime/v2/go.mod | 2 +- runtime/v2/manager.go | 80 ++++++++++++------------------------------- 2 files changed, 23 insertions(+), 59 deletions(-) diff --git a/runtime/v2/go.mod b/runtime/v2/go.mod index fe6a7c8485ee..32ea75176e7a 100644 --- a/runtime/v2/go.mod +++ b/runtime/v2/go.mod @@ -42,7 +42,6 @@ require ( cosmossdk.io/store v1.1.0 cosmossdk.io/store/v2 v2.0.0-00010101000000-000000000000 cosmossdk.io/x/tx v0.13.1 - github.com/cometbft/cometbft v0.38.6 github.com/cosmos/cosmos-sdk v0.51.0 github.com/cosmos/gogoproto v1.4.12 github.com/golang/protobuf v1.5.4 @@ -75,6 +74,7 @@ require ( github.com/cockroachdb/pebble v1.1.0 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft v0.38.6 // indirect github.com/cometbft/cometbft-db v0.9.1 // indirect github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-db v1.0.2 // indirect diff --git a/runtime/v2/manager.go b/runtime/v2/manager.go index bd325e4016a4..ede35104cecb 100644 --- a/runtime/v2/manager.go +++ b/runtime/v2/manager.go @@ -17,16 +17,13 @@ import ( cosmosmsg "cosmossdk.io/api/cosmos/msg/v1" "cosmossdk.io/core/appmodule" appmodulev2 "cosmossdk.io/core/appmodule/v2" - "cosmossdk.io/core/genesis" "cosmossdk.io/core/registry" "cosmossdk.io/core/transaction" "cosmossdk.io/log" "cosmossdk.io/runtime/v2/protocompat" "cosmossdk.io/server/v2/stf" - cmtcryptoproto "github.com/cometbft/cometbft/proto/tendermint/crypto" storetypes "cosmossdk.io/store/types" - abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" sdkmodule "github.com/cosmos/cosmos-sdk/types/module" @@ -144,7 +141,7 @@ func (m *MM) ValidateGenesis(genesisData map[string]json.RawMessage) error { return nil } -func (m *MM) InitGenesis(ctx context.Context, genesisData map[string]json.RawMessage) (*abci.ResponseInitChain, error) { +func (m *MM) InitGenesis(ctx context.Context, genesisData map[string]json.RawMessage) ([]appmodulev2.ValidatorUpdate, error) { var validatorUpdates []appmodulev2.ValidatorUpdate m.logger.Info("initializing blockchain state from genesis.json") @@ -154,27 +151,23 @@ func (m *MM) InitGenesis(ctx context.Context, genesisData map[string]json.RawMes } mod := m.modules[moduleName] - // Check if module has auto genesis, if so return err - if _, ok := mod.(appmodule.HasGenesisAuto); ok { - m.logger.Debug("running initialization for module", "module", moduleName) - return &abci.ResponseInitChain{}, fmt.Errorf("Not support auto genesis, module: %v", moduleName) - } else if module, ok := mod.(appmodulev2.HasGenesis); ok { + if module, ok := mod.(appmodulev2.HasGenesis); ok { m.logger.Debug("running initialization for module", "module", moduleName) if err := module.InitGenesis(ctx, genesisData[moduleName]); err != nil { - return &abci.ResponseInitChain{}, err + return nil, err } } else if module, ok := mod.(sdkmodule.HasABCIGenesis); ok { m.logger.Debug("running initialization for module", "module", moduleName) moduleValUpdates, err := module.InitGenesis(ctx, genesisData[moduleName]) if err != nil { - return &abci.ResponseInitChain{}, err + return nil, err } // use these validator updates if provided, the module manager assumes // only one module will update the validator set if len(moduleValUpdates) > 0 { if len(validatorUpdates) > 0 { - return &abci.ResponseInitChain{}, errors.New("validator InitGenesis updates already set by a previous module") + return nil, errors.New("validator InitGenesis updates already set by a previous module") } validatorUpdates = moduleValUpdates } @@ -183,36 +176,12 @@ func (m *MM) InitGenesis(ctx context.Context, genesisData map[string]json.RawMes // a chain must initialize with a non-empty validator set if len(validatorUpdates) == 0 { - return &abci.ResponseInitChain{}, fmt.Errorf("validator set is empty after InitGenesis, please ensure at least one validator is initialized with a delegation greater than or equal to the DefaultPowerReduction (%d)", sdk.DefaultPowerReduction) - } - - cometValidatorUpdates := make([]abci.ValidatorUpdate, len(validatorUpdates)) - for i, v := range validatorUpdates { - var pubkey cmtcryptoproto.PublicKey - switch v.PubKeyType { - case "ed25519": - pubkey = cmtcryptoproto.PublicKey{ - Sum: &cmtcryptoproto.PublicKey_Ed25519{ - Ed25519: v.PubKey, - }, - } - case "secp256k1": - pubkey = cmtcryptoproto.PublicKey{ - Sum: &cmtcryptoproto.PublicKey_Secp256K1{ - Secp256K1: v.PubKey, - }, - } - } - - cometValidatorUpdates[i] = abci.ValidatorUpdate{ - PubKey: pubkey, - Power: v.Power, - } + return nil, fmt.Errorf("validator set is empty after InitGenesis, please ensure at least one validator is initialized with a delegation greater than or equal to the DefaultPowerReduction (%d)", sdk.DefaultPowerReduction) } - return &abci.ResponseInitChain{ - Validators: cometValidatorUpdates, - }, nil + // Not convert to abci response + // Return appmodule.ValidatorUpdates instead + return validatorUpdates, nil } // ExportGenesis performs export genesis functionality for modules @@ -238,10 +207,7 @@ func (m *MM) ExportGenesisForModules(ctx sdk.Context, modulesToExport []string) channels := make(map[string]chan genesisResult) for _, moduleName := range modulesToExport { mod := m.modules[moduleName] - if _, ok := mod.(appmodule.HasGenesisAuto); ok { - m.logger.Debug("running initialization for module", "module", moduleName) - return nil, fmt.Errorf("Not support auto genesis, module: %v", moduleName) - } else if module, ok := mod.(appmodulev2.HasGenesis); ok { + if module, ok := mod.(appmodulev2.HasGenesis); ok { channels[moduleName] = make(chan genesisResult) go func(module appmodulev2.HasGenesis, ch chan genesisResult) { ctx := ctx.WithGasMeter(storetypes.NewInfiniteGasMeter()) // avoid race conditions @@ -504,34 +470,32 @@ func (m *MM) validateConfig() error { if err := m.assertNoForgottenModules("InitGenesis", m.config.InitGenesis, func(moduleName string) bool { module := m.modules[moduleName] - if _, hasGenesis := module.(appmodulev2.HasGenesis); hasGenesis { - return !hasGenesis + if _, hasGenesis := module.(appmodule.HasGenesisAuto); hasGenesis { + panic(fmt.Sprintf("module %s isn't server/v2 compatible", moduleName)) } - // TODO, if we actually don't support old genesis, let's panic here saying this module isn't server/v2 compatible - if _, hasABCIGenesis := module.(sdkmodule.HasABCIGenesis); hasABCIGenesis { - return !hasABCIGenesis + if _, hasGenesis := module.(appmodulev2.HasGenesis); hasGenesis { + return !hasGenesis } - _, hasGenesis := module.(sdkmodule.HasGenesis) - return !hasGenesis + _, hasABCIGenesis := module.(sdkmodule.HasABCIGenesis) + return !hasABCIGenesis }); err != nil { return err } if err := m.assertNoForgottenModules("ExportGenesis", m.config.ExportGenesis, func(moduleName string) bool { module := m.modules[moduleName] - if _, hasGenesis := module.(appmodulev2.HasGenesis); hasGenesis { - return !hasGenesis + if _, hasGenesis := module.(appmodule.HasGenesisAuto); hasGenesis { + panic(fmt.Sprintf("module %s isn't server/v2 compatible", moduleName)) } - // TODO, if we actually don't support old genesis, let's panic here saying this module isn't server/v2 compatible - if _, hasABCIGenesis := module.(sdkmodule.HasABCIGenesis); hasABCIGenesis { - return !hasABCIGenesis + if _, hasGenesis := module.(appmodulev2.HasGenesis); hasGenesis { + return !hasGenesis } - _, hasGenesis := module.(sdkmodule.HasGenesis) - return !hasGenesis + _, hasABCIGenesis := module.(sdkmodule.HasABCIGenesis) + return !hasABCIGenesis }); err != nil { return err } From fffba55619d0ae6759d9d3745b9fcf7f60f40103 Mon Sep 17 00:00:00 2001 From: Hieu Vu <72878483+hieuvubk@users.noreply.github.com> Date: Wed, 17 Apr 2024 15:56:02 +0700 Subject: [PATCH 4/7] use context --- runtime/v2/manager.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/runtime/v2/manager.go b/runtime/v2/manager.go index ccbb551ba39a..c17230fb0347 100644 --- a/runtime/v2/manager.go +++ b/runtime/v2/manager.go @@ -24,7 +24,6 @@ import ( "cosmossdk.io/runtime/v2/protocompat" "cosmossdk.io/server/v2/stf" - storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" sdkmodule "github.com/cosmos/cosmos-sdk/types/module" @@ -186,12 +185,12 @@ func (m *MM) InitGenesis(ctx context.Context, genesisData map[string]json.RawMes } // ExportGenesis performs export genesis functionality for modules -func (m *MM) ExportGenesis(ctx sdk.Context) (map[string]json.RawMessage, error) { +func (m *MM) ExportGenesis(ctx context.Context) (map[string]json.RawMessage, error) { return m.ExportGenesisForModules(ctx, []string{}) } // ExportGenesisForModules performs export genesis functionality for modules -func (m *MM) ExportGenesisForModules(ctx sdk.Context, modulesToExport []string) (map[string]json.RawMessage, error) { +func (m *MM) ExportGenesisForModules(ctx context.Context, modulesToExport []string) (map[string]json.RawMessage, error) { if len(modulesToExport) == 0 { modulesToExport = m.config.ExportGenesis } @@ -211,7 +210,6 @@ func (m *MM) ExportGenesisForModules(ctx sdk.Context, modulesToExport []string) if module, ok := mod.(appmodulev2.HasGenesis); ok { channels[moduleName] = make(chan genesisResult) go func(module appmodulev2.HasGenesis, ch chan genesisResult) { - ctx := ctx.WithGasMeter(storetypes.NewInfiniteGasMeter()) // avoid race conditions jm, err := module.ExportGenesis(ctx) if err != nil { ch <- genesisResult{nil, err} @@ -222,7 +220,6 @@ func (m *MM) ExportGenesisForModules(ctx sdk.Context, modulesToExport []string) } else if module, ok := mod.(sdkmodule.HasABCIGenesis); ok { channels[moduleName] = make(chan genesisResult) go func(module sdkmodule.HasABCIGenesis, ch chan genesisResult) { - ctx := ctx.WithGasMeter(storetypes.NewInfiniteGasMeter()) // avoid race conditions jm, err := module.ExportGenesis(ctx) if err != nil { ch <- genesisResult{nil, err} From 15dcbb661eaf4244494b8abb9788e03d7cbecb77 Mon Sep 17 00:00:00 2001 From: Hieu Vu <72878483+hieuvubk@users.noreply.github.com> Date: Fri, 19 Apr 2024 13:24:33 +0700 Subject: [PATCH 5/7] dup --- runtime/v2/manager.go | 43 ------------------------------------------- 1 file changed, 43 deletions(-) diff --git a/runtime/v2/manager.go b/runtime/v2/manager.go index c17230fb0347..98515e7039b8 100644 --- a/runtime/v2/manager.go +++ b/runtime/v2/manager.go @@ -141,49 +141,6 @@ func (m *MM) ValidateGenesis(genesisData map[string]json.RawMessage) error { return nil } -func (m *MM) InitGenesis(ctx context.Context, genesisData map[string]json.RawMessage) ([]appmodulev2.ValidatorUpdate, error) { - var validatorUpdates []appmodulev2.ValidatorUpdate - m.logger.Info("initializing blockchain state from genesis.json") - - for _, moduleName := range m.config.InitGenesis { - if genesisData[moduleName] == nil { - continue - } - - mod := m.modules[moduleName] - if module, ok := mod.(appmodulev2.HasGenesis); ok { - m.logger.Debug("running initialization for module", "module", moduleName) - if err := module.InitGenesis(ctx, genesisData[moduleName]); err != nil { - return nil, err - } - } else if module, ok := mod.(sdkmodule.HasABCIGenesis); ok { - m.logger.Debug("running initialization for module", "module", moduleName) - moduleValUpdates, err := module.InitGenesis(ctx, genesisData[moduleName]) - if err != nil { - return nil, err - } - - // use these validator updates if provided, the module manager assumes - // only one module will update the validator set - if len(moduleValUpdates) > 0 { - if len(validatorUpdates) > 0 { - return nil, errors.New("validator InitGenesis updates already set by a previous module") - } - validatorUpdates = moduleValUpdates - } - } - } - - // a chain must initialize with a non-empty validator set - if len(validatorUpdates) == 0 { - return nil, fmt.Errorf("validator set is empty after InitGenesis, please ensure at least one validator is initialized with a delegation greater than or equal to the DefaultPowerReduction (%d)", sdk.DefaultPowerReduction) - } - - // Not convert to abci response - // Return appmodule.ValidatorUpdates instead - return validatorUpdates, nil -} - // ExportGenesis performs export genesis functionality for modules func (m *MM) ExportGenesis(ctx context.Context) (map[string]json.RawMessage, error) { return m.ExportGenesisForModules(ctx, []string{}) From 20212376b2acef45aa070ac843be2b01252fc218 Mon Sep 17 00:00:00 2001 From: Hieu Vu <72878483+hieuvubk@users.noreply.github.com> Date: Mon, 22 Apr 2024 17:22:36 +0700 Subject: [PATCH 6/7] clean up --- runtime/v2/manager.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/runtime/v2/manager.go b/runtime/v2/manager.go index 98515e7039b8..5e1e4e2d9786 100644 --- a/runtime/v2/manager.go +++ b/runtime/v2/manager.go @@ -25,7 +25,6 @@ import ( "cosmossdk.io/server/v2/stf" "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" sdkmodule "github.com/cosmos/cosmos-sdk/types/module" ) @@ -142,12 +141,16 @@ func (m *MM) ValidateGenesis(genesisData map[string]json.RawMessage) error { } // ExportGenesis performs export genesis functionality for modules -func (m *MM) ExportGenesis(ctx context.Context) (map[string]json.RawMessage, error) { - return m.ExportGenesisForModules(ctx, []string{}) +func (m *MM) ExportGenesis(ctx context.Context, modulesToExport ...string) (map[string]json.RawMessage, error) { + if len(modulesToExport) == 0 { + modulesToExport = m.config.ExportGenesis + } + + return m.ExportGenesisForModules(ctx, modulesToExport...) } // ExportGenesisForModules performs export genesis functionality for modules -func (m *MM) ExportGenesisForModules(ctx context.Context, modulesToExport []string) (map[string]json.RawMessage, error) { +func (m *MM) ExportGenesisForModules(ctx context.Context, modulesToExport ...string) (map[string]json.RawMessage, error) { if len(modulesToExport) == 0 { modulesToExport = m.config.ExportGenesis } From 07e5e23a612784440f4293e04908cefb153ece73 Mon Sep 17 00:00:00 2001 From: Hieu Vu <72878483+hieuvubk@users.noreply.github.com> Date: Wed, 24 Apr 2024 16:35:01 +0700 Subject: [PATCH 7/7] remove dup code block by using interface --- runtime/v2/manager.go | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/runtime/v2/manager.go b/runtime/v2/manager.go index 5e1e4e2d9786..11ef944728c2 100644 --- a/runtime/v2/manager.go +++ b/runtime/v2/manager.go @@ -164,29 +164,30 @@ func (m *MM) ExportGenesisForModules(ctx context.Context, modulesToExport ...str err error } + type ModuleI interface { + ExportGenesis(ctx context.Context) (json.RawMessage, error) + } + channels := make(map[string]chan genesisResult) for _, moduleName := range modulesToExport { mod := m.modules[moduleName] - if module, ok := mod.(appmodulev2.HasGenesis); ok { - channels[moduleName] = make(chan genesisResult) - go func(module appmodulev2.HasGenesis, ch chan genesisResult) { - jm, err := module.ExportGenesis(ctx) - if err != nil { - ch <- genesisResult{nil, err} - return - } - ch <- genesisResult{jm, nil} - }(module, channels[moduleName]) - } else if module, ok := mod.(sdkmodule.HasABCIGenesis); ok { - channels[moduleName] = make(chan genesisResult) - go func(module sdkmodule.HasABCIGenesis, ch chan genesisResult) { - jm, err := module.ExportGenesis(ctx) - if err != nil { - ch <- genesisResult{nil, err} - } - ch <- genesisResult{jm, nil} - }(module, channels[moduleName]) + var moduleI ModuleI + + if module, hasGenesis := mod.(appmodulev2.HasGenesis); hasGenesis { + moduleI = module.(ModuleI) + } else if module, hasABCIGenesis := mod.(appmodulev2.HasGenesis); hasABCIGenesis { + moduleI = module.(ModuleI) } + + channels[moduleName] = make(chan genesisResult) + go func(moduleI ModuleI, ch chan genesisResult) { + jm, err := moduleI.ExportGenesis(ctx) + if err != nil { + ch <- genesisResult{nil, err} + return + } + ch <- genesisResult{jm, nil} + }(moduleI, channels[moduleName]) } genesisData := make(map[string]json.RawMessage)