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