# ABCI
# InitGenesis
InitGenesis
initializes the EVM module genesis state by setting the GenesisState
fields to the
store. In particular it sets the parameters, configuration, accounts and transaction logs.
The function also performs the invariant that the EVM balance from the GenesisAccount
matches the
balance amount from the EthAccount
as defined on the auth
module.
# ExportGenesis
The ExportGenesis
ABCI function exports the genesis state of the EVM module. In particular, it
retrieves all the accounts with their bytecode, balance and storage, the transaction logs, and the
EVM parameters and chain configuration.
# BeginBlock
The EVM module BeginBlock
logic is executed prior to handling the state transitions from the
transactions. The main objective of this function is to:
Set the block header hash mappings to the module state (
hash -> height
andheight -> hash
). This workaround is due to the fact that until thev0.34.0
Tendermint version it wasn't possible to query and subscribe to a block by hash.Reset bloom filter and block transaction count. These variables, which are fields of the EVM
Keeper
, are updated on every EVM transaction.
# EndBlock
The EVM module EndBlock
logic occurs after executing all the state transitions from the
transactions. The main objective of this function is to:
- Update the accounts. This operation retrieves the current account and balance values for each
state object and updates the account represented on the stateObject with the given values. This is
done since the account might have been updated by transactions other than the ones defined by the
x/evm
module, such as bank send or IBC transfers. - Commit dirty state objects and delete empty ones from the store. This operation writes the
contract code to the key value store in the case of contracts and updates the account's balance,
which is set to the the bank module's
Keeper
. - Clear account cache. This clears cache of state objects to handle account changes outside of the EVM.
- Store the block bloom to state. This is due for Web3 compatibility as the Ethereum headers contain this type as a field. The Ethermint RPC uses this query to construct an Ethereum Header from a Tendermint Header.