|
|
- package types
-
- import (
- "testing"
-
- "github.com/stretchr/testify/require"
- crypto "github.com/tendermint/go-crypto"
- cmn "github.com/tendermint/tmlibs/common"
- )
-
- func TestValidateBlock(t *testing.T) {
- txs := []Tx{Tx("foo"), Tx("bar")}
- lastID := makeBlockIDRandom()
- h := int64(3)
-
- voteSet, _, vals := randVoteSet(h-1, 1, VoteTypePrecommit, 10, 1)
- commit, err := MakeCommit(lastID, h-1, 1, voteSet, vals)
- require.NoError(t, err)
-
- block := MakeBlock(h, txs, commit)
- require.NotNil(t, block)
-
- // proper block must pass
- err = block.ValidateBasic()
- require.NoError(t, err)
-
- // tamper with NumTxs
- block = MakeBlock(h, txs, commit)
- block.NumTxs += 1
- err = block.ValidateBasic()
- require.Error(t, err)
-
- // remove 1/2 the commits
- block = MakeBlock(h, txs, commit)
- block.LastCommit.Precommits = commit.Precommits[:commit.Size()/2]
- block.LastCommit.hash = nil // clear hash or change wont be noticed
- err = block.ValidateBasic()
- require.Error(t, err)
-
- // tamper with LastCommitHash
- block = MakeBlock(h, txs, commit)
- block.LastCommitHash = []byte("something else")
- err = block.ValidateBasic()
- require.Error(t, err)
-
- // tamper with data
- block = MakeBlock(h, txs, commit)
- block.Data.Txs[0] = Tx("something else")
- block.Data.hash = nil // clear hash or change wont be noticed
- err = block.ValidateBasic()
- require.Error(t, err)
-
- // tamper with DataHash
- block = MakeBlock(h, txs, commit)
- block.DataHash = cmn.RandBytes(len(block.DataHash))
- err = block.ValidateBasic()
- require.Error(t, err)
- }
-
- func makeBlockIDRandom() BlockID {
- blockHash, blockPartsHeader := crypto.CRandBytes(32), PartSetHeader{123, crypto.CRandBytes(32)}
- return BlockID{blockHash, blockPartsHeader}
- }
-
- func makeBlockID(hash string, partSetSize int, partSetHash string) BlockID {
- return BlockID{
- Hash: []byte(hash),
- PartsHeader: PartSetHeader{
- Total: partSetSize,
- Hash: []byte(partSetHash),
- },
- }
-
- }
|