# Creating a proposal

A block consists of a header, transactions, votes (the commit), and a list of evidence of malfeasance (ie. signing conflicting votes).

We include no more than 1/10th of the maximum block size (ConsensusParams.Block.MaxBytes) of evidence with each block.

# 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 amino overhead for a block (MaxAminoOverheadForBlock), the size of the last commit (if present) and evidence (if present). While reaping we account for amino overhead for each transaction.

func MaxDataBytes(maxBytes int64, valsCount, evidenceCount int) int64 {
	return maxBytes -
		MaxAminoOverheadForBlock -
		MaxHeaderBytes -
		int64(valsCount)*MaxVoteBytes -
		int64(evidenceCount)*MaxEvidenceBytes
}
1
2
3
4
5
6
7

# Validating transactions in the mempool

Before we accept a transaction in the mempool, we check if it's size is no more than {MaxDataSize}. {MaxDataSize} is calculated using the same formula as above, except because the evidence size is unknown at the moment, we subtract maximum evidence size (1/10th of the maximum block size).

func MaxDataBytesUnknownEvidence(maxBytes int64, valsCount int) int64 {
	return maxBytes -
		MaxAminoOverheadForBlock -
		MaxHeaderBytes -
		int64(valsCount)*MaxVoteBytes -
		MaxEvidenceBytesPerBlock(maxBytes)
}
1
2
3
4
5
6
7