feat: introduce PreBlock (#17421)
This commit is contained in:
@@ -736,6 +736,10 @@ func (app *BaseApp) FinalizeBlock(req *abci.RequestFinalizeBlock) (*abci.Respons
|
||||
}
|
||||
}
|
||||
|
||||
if err := app.preBlock(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
beginBlock, err := app.beginBlock(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
+22
-30
@@ -43,12 +43,6 @@ type (
|
||||
StoreLoader func(ms storetypes.CommitMultiStore) error
|
||||
)
|
||||
|
||||
// MigrationModuleManager is the interface that a migration module manager should implement to handle
|
||||
// the execution of migration logic during the beginning of a block.
|
||||
type MigrationModuleManager interface {
|
||||
RunMigrationBeginBlock(ctx sdk.Context) (bool, error)
|
||||
}
|
||||
|
||||
const (
|
||||
execModeCheck execMode = iota // Check a transaction
|
||||
execModeReCheck // Recheck a (pending) transaction after a commit
|
||||
@@ -81,6 +75,7 @@ type BaseApp struct {
|
||||
postHandler sdk.PostHandler // post handler, optional, e.g. for tips
|
||||
|
||||
initChainer sdk.InitChainer // ABCI InitChain handler
|
||||
preBlocker sdk.PreBlocker // logic to run before BeginBlocker
|
||||
beginBlocker sdk.BeginBlocker // (legacy ABCI) BeginBlock handler
|
||||
endBlocker sdk.EndBlocker // (legacy ABCI) EndBlock handler
|
||||
processProposal sdk.ProcessProposalHandler // ABCI ProcessProposal handler
|
||||
@@ -98,9 +93,6 @@ type BaseApp struct {
|
||||
// manages snapshots, i.e. dumps of app state at certain intervals
|
||||
snapshotManager *snapshots.Manager
|
||||
|
||||
// manages migrate module
|
||||
migrationModuleManager MigrationModuleManager
|
||||
|
||||
// volatile states:
|
||||
//
|
||||
// - checkState is set on InitChain and reset on Commit
|
||||
@@ -283,11 +275,6 @@ func (app *BaseApp) SetMsgServiceRouter(msgServiceRouter *MsgServiceRouter) {
|
||||
app.msgServiceRouter = msgServiceRouter
|
||||
}
|
||||
|
||||
// SetMigrationModuleManager sets the MigrationModuleManager of a BaseApp.
|
||||
func (app *BaseApp) SetMigrationModuleManager(migrationModuleManager MigrationModuleManager) {
|
||||
app.migrationModuleManager = migrationModuleManager
|
||||
}
|
||||
|
||||
// MountStores mounts all IAVL or DB stores to the provided keys in the BaseApp
|
||||
// multistore.
|
||||
func (app *BaseApp) MountStores(keys ...storetypes.StoreKey) {
|
||||
@@ -682,6 +669,26 @@ func (app *BaseApp) cacheTxContext(ctx sdk.Context, txBytes []byte) (sdk.Context
|
||||
return ctx.WithMultiStore(msCache), msCache
|
||||
}
|
||||
|
||||
func (app *BaseApp) preBlock() error {
|
||||
if app.preBlocker != nil {
|
||||
ctx := app.finalizeBlockState.ctx
|
||||
rsp, err := app.preBlocker(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// rsp.ConsensusParamsChanged is true from preBlocker means ConsensusParams in store get changed
|
||||
// write the consensus parameters in store to context
|
||||
if rsp.ConsensusParamsChanged {
|
||||
ctx = ctx.WithConsensusParams(app.GetConsensusParams(ctx))
|
||||
// GasMeter must be set after we get a context with updated consensus params.
|
||||
gasMeter := app.getBlockGasMeter(ctx)
|
||||
ctx = ctx.WithBlockGasMeter(gasMeter)
|
||||
app.finalizeBlockState.ctx = ctx
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (app *BaseApp) beginBlock(req *abci.RequestFinalizeBlock) (sdk.BeginBlock, error) {
|
||||
var (
|
||||
resp sdk.BeginBlock
|
||||
@@ -689,22 +696,7 @@ func (app *BaseApp) beginBlock(req *abci.RequestFinalizeBlock) (sdk.BeginBlock,
|
||||
)
|
||||
|
||||
if app.beginBlocker != nil {
|
||||
ctx := app.finalizeBlockState.ctx
|
||||
if app.migrationModuleManager != nil {
|
||||
if success, err := app.migrationModuleManager.RunMigrationBeginBlock(ctx); success {
|
||||
cp := ctx.ConsensusParams()
|
||||
// Manager skips this step if Block is non-nil since upgrade module is expected to set this params
|
||||
// and consensus parameters should not be overwritten.
|
||||
if cp.Block == nil {
|
||||
if cp = app.GetConsensusParams(ctx); cp.Block != nil {
|
||||
ctx = ctx.WithConsensusParams(cp)
|
||||
}
|
||||
}
|
||||
} else if err != nil {
|
||||
return sdk.BeginBlock{}, err
|
||||
}
|
||||
}
|
||||
resp, err = app.beginBlocker(ctx)
|
||||
resp, err = app.beginBlocker(app.finalizeBlockState.ctx)
|
||||
if err != nil {
|
||||
return resp, err
|
||||
}
|
||||
|
||||
@@ -427,6 +427,9 @@ func TestBaseAppOptionSeal(t *testing.T) {
|
||||
require.Panics(t, func() {
|
||||
suite.baseApp.SetInitChainer(nil)
|
||||
})
|
||||
require.Panics(t, func() {
|
||||
suite.baseApp.SetPreBlocker(nil)
|
||||
})
|
||||
require.Panics(t, func() {
|
||||
suite.baseApp.SetBeginBlocker(nil)
|
||||
})
|
||||
|
||||
@@ -176,6 +176,14 @@ func (app *BaseApp) SetInitChainer(initChainer sdk.InitChainer) {
|
||||
app.initChainer = initChainer
|
||||
}
|
||||
|
||||
func (app *BaseApp) SetPreBlocker(preBlocker sdk.PreBlocker) {
|
||||
if app.sealed {
|
||||
panic("SetPreBlocker() on sealed BaseApp")
|
||||
}
|
||||
|
||||
app.preBlocker = preBlocker
|
||||
}
|
||||
|
||||
func (app *BaseApp) SetBeginBlocker(beginBlocker sdk.BeginBlocker) {
|
||||
if app.sealed {
|
||||
panic("SetBeginBlocker() on sealed BaseApp")
|
||||
|
||||
Reference in New Issue
Block a user