From 0a5b4d7308609ef7e7cd9127cbb709cfa04179b2 Mon Sep 17 00:00:00 2001 From: Robert Pirtle Date: Mon, 28 Aug 2023 11:59:49 -0700 Subject: [PATCH] unregister x/metrics & call BeginBlocker directly (#1690) registering x/metrics to the module manager breaks the AppHash because its consensus version is added to the ModuleVersionMap which affects the AppHash. this commit unregisters the module so it is not consensus breaking. instead, it directly calls the BeginBlock before running the module manager's. --- app/app.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/app.go b/app/app.go index f2a76159e4..c232005930 100644 --- a/app/app.go +++ b/app/app.go @@ -218,7 +218,6 @@ var ( router.AppModuleBasic{}, mint.AppModuleBasic{}, community.AppModuleBasic{}, - metrics.AppModuleBasic{}, ) // module account permissions @@ -334,6 +333,12 @@ type App struct { // configurator configurator module.Configurator + + // backported x/metrics Metrics + // to prevent AppHash mismatch, the module is not registered to the module manager. + // instead, the module's BeginBlocker is called directly. + // this way, its consensus version has no bearing on the ModuleVersionMap included in the AppHash. + metrics *metricstypes.Metrics } func init() { @@ -387,6 +392,7 @@ func NewApp( keys: keys, tkeys: tkeys, memKeys: memKeys, + metrics: metricstypes.NewMetrics(options.TelemetryOptions), } // init params keeper and subspaces @@ -795,12 +801,10 @@ func NewApp( // nil InflationCalculationFn, use SDK's default inflation function mint.NewAppModule(appCodec, app.mintKeeper, app.accountKeeper, nil), community.NewAppModule(app.communityKeeper, app.accountKeeper), - metrics.NewAppModule(options.TelemetryOptions), ) // Warning: Some begin blockers must run before others. Ensure the dependencies are understood before modifying this list. app.mm.SetOrderBeginBlockers( - metricstypes.ModuleName, // Upgrade begin blocker runs migrations on the first block after an upgrade. It should run before any other module. upgradetypes.ModuleName, // Capability begin blocker runs non state changing initialization. @@ -889,7 +893,6 @@ func NewApp( routertypes.ModuleName, minttypes.ModuleName, communitytypes.ModuleName, - metricstypes.ModuleName, ) // Warning: Some init genesis methods must run before others. Ensure the dependencies are understood before modifying this list @@ -931,7 +934,6 @@ func NewApp( validatorvestingtypes.ModuleName, liquidtypes.ModuleName, routertypes.ModuleName, - metricstypes.ModuleName, ) app.mm.RegisterInvariants(&app.crisisKeeper) @@ -1019,6 +1021,10 @@ func (app *App) RegisterServices(cfg module.Configurator) { // BeginBlocker contains app specific logic for the BeginBlock abci call. func (app *App) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { + // call the metrics BeginBlocker directly instead of registering the module to the module manager. + // all consensus versions of modules registrered to the moduel manager contribute to the AppHash. + // to prevent the backport of x/metrics from being consensus breaking, it is called directly. + metrics.BeginBlocker(ctx, app.metrics) return app.mm.BeginBlock(ctx, req) }