diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 122bcac87..75062dc03 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -30,3 +30,4 @@ Friendly reminder, we have a [bug bounty program](https://hackerone.com/tendermi - [abci/grpc] \#5520 Return async responses in order, to avoid mempool panics. (@erikgrinaker) - [blockchain/v2] \#5530 Fix "processed height 4541 but expected height 4540" panic (@melekes) - [consensus/wal] Fix WAL autorepair by opening target WAL in read/write mode (@erikgrinaker) +- [block] \#5567 Fix MaxCommitSigBytes (@cmwaters) diff --git a/state/tx_filter_test.go b/state/tx_filter_test.go index c1bbfd346..7936d94c7 100644 --- a/state/tx_filter_test.go +++ b/state/tx_filter_test.go @@ -25,8 +25,8 @@ func TestTxFilter(t *testing.T) { tx types.Tx isErr bool }{ - {types.Tx(tmrand.Bytes(2187)), false}, - {types.Tx(tmrand.Bytes(2188)), true}, + {types.Tx(tmrand.Bytes(2155)), false}, + {types.Tx(tmrand.Bytes(2156)), true}, {types.Tx(tmrand.Bytes(3000)), true}, } diff --git a/types/block.go b/types/block.go index bf48abad8..0bdb2be67 100644 --- a/types/block.go +++ b/types/block.go @@ -24,6 +24,8 @@ import ( const ( // MaxHeaderBytes is a maximum header size. + // NOTE: Because app hash can be of arbitrary size, the header is therefore not + // capped in size and thus this number should be seen as a soft max MaxHeaderBytes int64 = 626 // MaxOverheadForBlock - maximum overhead to encode a block (up to @@ -583,9 +585,9 @@ const ( const ( // Max size of commit without any commitSigs -> 82 for BlockID, 8 for Height, 4 for Round. MaxCommitOverheadBytes int64 = 94 - // Commit sig size is made up of 32 bytes for the signature, 20 bytes for the address, + // Commit sig size is made up of 64 bytes for the signature, 20 bytes for the address, // 1 byte for the flag and 14 bytes for the timestamp - MaxCommitSigBytes int64 = 77 + MaxCommitSigBytes int64 = 109 ) // CommitSig is a part of the Vote included in a Commit. diff --git a/types/block_test.go b/types/block_test.go index 1565f5be0..2bdeac7f0 100644 --- a/types/block_test.go +++ b/types/block_test.go @@ -257,33 +257,22 @@ func TestCommitValidateBasic(t *testing.T) { } } -func TestMaxCommitSigBytes(t *testing.T) { +func TestMaxCommitBytes(t *testing.T) { // time is varint encoded so need to pick the max. // year int, month Month, day, hour, min, sec, nsec int, loc *Location timestamp := time.Date(math.MaxInt64, 0, 0, 0, 0, 0, math.MaxInt64, time.UTC) - cs := &CommitSig{ - BlockIDFlag: BlockIDFlagNil, - ValidatorAddress: crypto.AddressHash([]byte("validator_address")), - Timestamp: timestamp, - Signature: tmhash.Sum([]byte("signature")), - } - - pb := cs.ToProto() - - assert.EqualValues(t, MaxCommitSigBytes, pb.Size()) -} - -func TestMaxCommitBytes(t *testing.T) { - timestamp := time.Date(math.MaxInt64, 0, 0, 0, 0, 0, math.MaxInt64, time.UTC) - cs := CommitSig{ BlockIDFlag: BlockIDFlagNil, ValidatorAddress: crypto.AddressHash([]byte("validator_address")), Timestamp: timestamp, - Signature: tmhash.Sum([]byte("signature")), + Signature: crypto.CRandBytes(MaxSignatureSize), } + pbSig := cs.ToProto() + // test that a single commit sig doesn't exceed max commit sig bytes + assert.EqualValues(t, MaxCommitSigBytes, pbSig.Size()) + // check size with a single commit commit := &Commit{ Height: math.MaxInt64, @@ -463,9 +452,11 @@ func TestBlockMaxDataBytes(t *testing.T) { }{ 0: {-10, 1, 0, true, 0}, 1: {10, 1, 0, true, 0}, - 2: {809, 1, 0, true, 0}, - 3: {810, 1, 0, false, 0}, - 4: {811, 1, 0, false, 1}, + 2: {841, 1, 0, true, 0}, + 3: {842, 1, 0, false, 0}, + 4: {843, 1, 0, false, 1}, + 5: {954, 2, 0, false, 1}, + 6: {1053, 2, 100, false, 0}, } for i, tc := range testCases { @@ -492,9 +483,9 @@ func TestBlockMaxDataBytesNoEvidence(t *testing.T) { }{ 0: {-10, 1, true, 0}, 1: {10, 1, true, 0}, - 2: {809, 1, true, 0}, - 3: {810, 1, false, 0}, - 4: {811, 1, false, 1}, + 2: {841, 1, true, 0}, + 3: {842, 1, false, 0}, + 4: {843, 1, false, 1}, } for i, tc := range testCases {