* follow up to removing some consensus params Refs #2382
* change args type to int64 in state#makeParams
* make valsCount and evidenceCount ints again
* MaxEvidenceBytesPerBlock: include magic number in godoc
* [spec] creating a proposal
* test state#TxFilter
* panic if MaxDataBytes is less than 0
* fixes after review
* use amino#UvarintSize to calculate overhead
0c74291f3b/encoder.go (L85-L90)
* avoid cyclic imports
* you can do better Go, come on
* remove testdouble package
1.4 KiB
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.BlockSize.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
}
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)
}