github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/docs/building-modules/beginblock-endblock.md (about)

     1  <!--
     2  order: 6
     3  synopsis: "`BeginBlocker` and `EndBlocker` are optional methods module developers can implement in their module. They will be triggered at the beginning and at the end of each block respectively, when the [`BeginBlock`](../core/baseapp.md#beginblock) and [`EndBlock`](../core/baseapp.md#endblock) ABCI messages are received from the underlying consensus engine."
     4  -->
     5  
     6  # BeginBlocker and EndBlocker
     7  
     8  ## Pre-requisite Readings {hide}
     9  
    10  - [Module Manager](./module-manager.md) {prereq}
    11  
    12  ## BeginBlocker and EndBlocker
    13  
    14  `BeginBlocker` and `EndBlocker` are a way for module developers to add automatic execution of logic to their module. This is a powerful tool that should be used carefully, as complex automatic functions can slow down or even halt the chain. 
    15  
    16  When needed, `BeginBlocker` and `EndBlocker` are implemented as part of the [`AppModule` interface](./module-manager.md#appmodule). The `BeginBlock` and `EndBlock` methods of the interface implemented in `module.go` generally defer to `BeginBlocker` and `EndBlocker` methods respectively, which are usually implemented in a **`abci.go`** file. 
    17  
    18  The actual implementation of `BeginBlocker` and `EndBlocker` in `./abci.go` are very similar to that of a [`handler`](./handler.md):
    19  
    20  - They generally use the [`keeper`](./keeper.md) and [`ctx`](../core/context.md) to retrieve information about the latest state. 
    21  - If needed, they use the `keeper` and `ctx` to trigger state-transitions. 
    22  - If needed, they can emit [`events`](../core/events.md) via the `ctx`'s `EventManager`. 
    23  
    24  A specificity of the `EndBlocker` is that it can return validator updates to the underlying consensus engine in the form of an [`[]abci.ValidatorUpdates`](https://tendermint.com/docs/app-dev/abci-spec.html#validatorupdate). This is the preferred way to implement custom validator changes. 
    25  
    26  It is possible for developers to defined the order of execution between the `BeginBlocker`/`EndBlocker` functions of each of their application's modules via the module's manager `SetOrderBeginBlocker`/`SetOrderEndBlocker` methods. For more on the module manager, click [here](./module-manager.md#manager). 
    27  
    28  See an example implementation of `BeginBlocker` from the `distr` module:
    29  
    30  +++ https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/x/distribution/abci.go#L10-L32
    31  
    32  and an example implementation of `EndBlocker` from the `staking` module:
    33  
    34  +++ https://github.com/cosmos/cosmos-sdk/blob/7d7821b9af132b0f6131640195326aa02b6751db/x/staking/handler.go#L44-L96
    35  
    36  ## Next {hide}
    37  
    38  Learn about [`keeper`s](./keeper.md) {hide}