mukan-consensus/spec/consensus/creating-proposal.md
Mukan Erkin Törük ef24c0b67e
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
initial: sovereign Mukan Network fork
2026-05-11 03:18:27 +03:00

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)
}
```