Skip to main content
Version: Next

Process Proposal

ProcessProposal handles the validation of a proposal from PrepareProposal, which also includes a block header. Meaning, that after a block has been proposed the other validators have the right to accept or reject that block. The validator in the default implementation of PrepareProposal runs basic validity checks on each transaction.

Note, ProcessProposal MAY NOT be non-deterministic, i.e. it must be deterministic. This means if ProcessProposal panics or fails and we reject, all honest validator processes should reject (i.e., prevote nil). If so, then CometBFT will start a new round with a new block proposal, and the same cycle will happen with PrepareProposal and ProcessProposal for the new proposal.

Here is the implementation of the default implementation:

baseapp/abci_utils.go
loading...

Like PrepareProposal this implementation is the default and can be modified by the application developer in app.go. If you decide to implement your own ProcessProposal handler, you must be sure to ensure that the transactions provided in the proposal DO NOT exceed the maximum block gas and maxtxbytes (if set).

processOpt := func(app *baseapp.BaseApp) {
abciPropHandler := baseapp.NewDefaultProposalHandler(mempool, app)
app.SetProcessProposal(abciPropHandler.ProcessProposalHandler())
}

baseAppOptions = append(baseAppOptions, processOpt)