From efdc955ad9b3fc887749a519fac47a8497c3f4cc Mon Sep 17 00:00:00 2001 From: Marko Date: Fri, 2 Jun 2023 16:46:47 +0200 Subject: [PATCH] chore: change prepare and process proposal to be NoOps by default (#16407) Co-authored-by: Sergio Mena Co-authored-by: Aleksandr Bezobchuk --- baseapp/abci_utils.go | 9 ++++++++- docs/docs/building-apps/02-app-mempool.md | 6 +++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/baseapp/abci_utils.go b/baseapp/abci_utils.go index 3ba22fcadc..465dfa5164 100644 --- a/baseapp/abci_utils.go +++ b/baseapp/abci_utils.go @@ -179,7 +179,7 @@ func NewDefaultProposalHandler(mp mempool.Mempool, txVerifier ProposalTxVerifier // FIFO order. func (h DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHandler { return func(ctx sdk.Context, req *abci.RequestPrepareProposal) (*abci.ResponsePrepareProposal, error) { - // If the mempool is nil or a no-op mempool, we simply return the transactions + // If the mempool is nil or NoOp we simply return the transactions // requested from CometBFT, which, by default, should be in FIFO order. _, isNoOp := h.mempool.(mempool.NoOpMempool) if h.mempool == nil || isNoOp { @@ -236,6 +236,13 @@ func (h DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHand // is used in both steps, and applications must ensure that this is the case in // non-default handlers. func (h DefaultProposalHandler) ProcessProposalHandler() sdk.ProcessProposalHandler { + // If the mempool is nil or NoOp we simply return ACCEPT, + // because PrepareProposal may have included txs that could fail verification. + _, isNoOp := h.mempool.(mempool.NoOpMempool) + if h.mempool == nil || isNoOp { + return NoOpProcessProposal() + } + return func(ctx sdk.Context, req *abci.RequestProcessProposal) (*abci.ResponseProcessProposal, error) { for _, txBytes := range req.Txs { _, err := h.txVerifier.ProcessProposalVerifyTx(txBytes) diff --git a/docs/docs/building-apps/02-app-mempool.md b/docs/docs/building-apps/02-app-mempool.md index 031d065641..a8083f76f4 100644 --- a/docs/docs/building-apps/02-app-mempool.md +++ b/docs/docs/building-apps/02-app-mempool.md @@ -43,7 +43,8 @@ all transactions, it can provide greater control over transaction ordering. Allowing the application to handle ordering enables the application to define how it would like the block constructed. -Currently, there is a default `PrepareProposal` implementation provided by the application. +The Cosmos SDK defines the `DefaultProposalHandler` type, which provides applications with +`PrepareProposal` and `ProcessProposal` handlers. ```go reference https://github.com/cosmos/cosmos-sdk/blob/v0.47.0-rc1/baseapp/baseapp.go#L868-L916 @@ -116,6 +117,9 @@ A no-op mempool is a mempool where transactions are completely discarded and ign When this mempool is used, it assumed that an application will rely on CometBFT's transaction ordering defined in `RequestPrepareProposal`, which is FIFO-ordered by default. +> Note: If a NoOp mempool is used, PrepareProposal and ProcessProposal both should be aware of this as +> PrepareProposal could include transactions that could fail verification in ProcessProposal. + ### Sender Nonce Mempool The nonce mempool is a mempool that keeps transactions from an sorted by nonce in order to avoid the issues with nonces.