feat: export genesis in simapp v2 (#21199)

Co-authored-by: marbar3778 <marbar3778@yahoo.com>
This commit is contained in:
Randy Grok
2024-08-16 11:15:45 +00:00
committed by GitHub
co-authored by marbar3778
parent e2ec889bb7
commit aeeaca64da
15 changed files with 426 additions and 67 deletions
+5
View File
@@ -79,6 +79,11 @@ func (a *App[T]) LoadHeight(height uint64) error {
return a.db.LoadVersion(height)
}
// LoadLatestHeight loads the latest height.
func (a *App[T]) LoadLatestHeight() (uint64, error) {
return a.db.GetLatestVersion()
}
// Close is called in start cmd to gracefully cleanup resources.
func (a *App[T]) Close() error {
return nil
+14 -1
View File
@@ -69,7 +69,7 @@ func (a *AppBuilder[T]) RegisterModules(modules map[string]appmodulev2.AppModule
// RegisterStores registers the provided store keys.
// This method should only be used for registering extra stores
// wiich is necessary for modules that not registered using the app config.
// which is necessary for modules that not registered using the app config.
// To be used in combination of RegisterModules.
func (a *AppBuilder[T]) RegisterStores(keys ...string) {
a.app.storeKeys = append(a.app.storeKeys, keys...)
@@ -175,6 +175,19 @@ func (a *AppBuilder[T]) Build(opts ...AppBuilderOption[T]) (*App[T], error) {
}
return nil
},
ExportGenesis: func(ctx context.Context, version uint64) ([]byte, error) {
genesisJson, err := a.app.moduleManager.ExportGenesisForModules(ctx)
if err != nil {
return nil, fmt.Errorf("failed to export genesis: %w", err)
}
bz, err := json.Marshal(genesisJson)
if err != nil {
return nil, fmt.Errorf("failed to marshal genesis: %w", err)
}
return bz, nil
},
}
appManager, err := appManagerBuilder.Build()
+9 -23
View File
@@ -203,16 +203,13 @@ func (m *MM[T]) ExportGenesisForModules(
return nil, err
}
type genesisResult struct {
bz json.RawMessage
err error
}
type ModuleI interface {
ExportGenesis(ctx context.Context) (json.RawMessage, error)
}
channels := make(map[string]chan genesisResult)
genesisData := make(map[string]json.RawMessage)
// TODO: make async export genesis https://github.com/cosmos/cosmos-sdk/issues/21303
for _, moduleName := range modulesToExport {
mod := m.modules[moduleName]
var moduleI ModuleI
@@ -221,27 +218,16 @@ func (m *MM[T]) ExportGenesisForModules(
moduleI = module.(ModuleI)
} else if module, hasABCIGenesis := mod.(appmodulev2.HasGenesis); hasABCIGenesis {
moduleI = module.(ModuleI)
} else {
continue
}
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)
for moduleName := range channels {
res := <-channels[moduleName]
if res.err != nil {
return nil, fmt.Errorf("genesis export error in %s: %w", moduleName, res.err)
res, err := moduleI.ExportGenesis(ctx)
if err != nil {
return nil, err
}
genesisData[moduleName] = res.bz
genesisData[moduleName] = res
}
return genesisData, nil