2018-09-21 13:00:36 +04:00
|
|
|
# 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
|
2019-03-04 13:24:44 +04:00
|
|
|
(`ConsensusParams.Block.MaxBytes`) of evidence with each block.
|
2018-09-21 13:00:36 +04:00
|
|
|
|
|
|
|
## 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.
|
|
|
|
|
|
|
|
```go
|
|
|
|
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).
|
|
|
|
|
|
|
|
```go
|
|
|
|
func MaxDataBytesUnknownEvidence(maxBytes int64, valsCount int) int64 {
|
|
|
|
return maxBytes -
|
|
|
|
MaxAminoOverheadForBlock -
|
|
|
|
MaxHeaderBytes -
|
|
|
|
int64(valsCount)*MaxVoteBytes -
|
|
|
|
MaxEvidenceBytesPerBlock(maxBytes)
|
|
|
|
}
|
|
|
|
```
|