# 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.

Copy func MaxDataBytes(maxBytes int64, valsCount, evidenceCount int) int64 { return maxBytes - MaxOverheadForBlock - MaxHeaderBytes - int64(valsCount)*MaxVoteBytes - int64(evidenceCount)*MaxEvidenceBytes }

# 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 we subtract the max number of evidence, {MaxNum} by the maximum size of evidence

Copy func MaxDataBytesUnknownEvidence(maxBytes int64, valsCount int) int64 { return maxBytes - MaxOverheadForBlock - MaxHeaderBytes - (maxNumEvidence * MaxEvidenceBytes) }