Some checks are pending
docker-build-cometbft / vars (push) Waiting to run
docker-build-cometbft / build-images (amd64, ubuntu-24.04) (push) Blocked by required conditions
docker-build-cometbft / build-images (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
docker-build-cometbft / merge-images (push) Blocked by required conditions
docker-build-e2e-node / vars (push) Waiting to run
docker-build-e2e-node / build-images (amd64, ubuntu-24.04) (push) Blocked by required conditions
docker-build-e2e-node / build-images (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
docker-build-e2e-node / merge-images (push) Blocked by required conditions
61 lines
2.2 KiB
Markdown
61 lines
2.2 KiB
Markdown
---
|
|
order: 2
|
|
---
|
|
# Creating a proposal
|
|
|
|
A block consists of a header, transactions, votes (the commit),
|
|
and a list of evidence of malfeasance (eg. signing conflicting votes).
|
|
|
|
Outstanding evidence items get priority over outstanding transactions in the mempool.
|
|
All in all, the block MUST NOT exceed `ConsensusParams.Block.MaxBytes`,
|
|
or 100MB if `ConsensusParams.Block.MaxBytes == -1`.
|
|
|
|
## Reaping transactions from the mempool
|
|
|
|
When we reap transactions from the mempool, we calculate maximum data
|
|
size by subtracting maximum header size (`MaxHeaderBytes`), the maximum
|
|
protobuf overhead for a block (`MaxOverheadForBlock`), the size of
|
|
the last commit (if present) and evidence (if present). While reaping
|
|
we account for protobuf overhead for each transaction.
|
|
|
|
```go
|
|
func MaxDataBytes(maxBytes, evidenceBytes int64, valsCount int) int64 {
|
|
return maxBytes -
|
|
MaxOverheadForBlock -
|
|
MaxHeaderBytes -
|
|
MaxCommitBytes(valsCount) -
|
|
evidenceBytes
|
|
}
|
|
```
|
|
|
|
If `ConsensusParams.Block.MaxBytes == -1`, we reap *all* outstanding transactions from the mempool
|
|
|
|
## Preparing the proposal
|
|
|
|
Once the transactions have been reaped from the mempool according to the rules described above,
|
|
CometBFT calls `PrepareProposal` to the application with the transaction list that has just been reaped.
|
|
As part of this call the application can remove, add, or reorder transactions in the transaction list.
|
|
|
|
The `RequestPrepareProposal` contains two important fields:
|
|
|
|
* `MaxTxBytes`, which contains the value returned by `MaxDataBytes` described above.
|
|
The application MUST NOT return a list of transactions whose size exceeds this number.
|
|
* `Txs`, which contains the list of reaped transactions.
|
|
|
|
For more details on `PrepareProposal`, please see the
|
|
[relevant part of the spec](../abci/abci%2B%2B_methods.md#prepareproposal)
|
|
|
|
## Validating transactions in the mempool
|
|
|
|
Before we accept a transaction in the mempool, we check if its size is no more
|
|
than {MaxDataSize}. {MaxDataSize} is calculated using the same formula as
|
|
above, except we assume there is no evidence.
|
|
|
|
```go
|
|
func MaxDataBytesNoEvidence(maxBytes int64, valsCount int) int64 {
|
|
return maxBytes -
|
|
MaxOverheadForBlock -
|
|
MaxHeaderBytes -
|
|
MaxCommitBytes(valsCount)
|
|
}
|
|
```
|