forked from TrueCloudLab/neoneo-go
core: add tests for (*Blockchain).verifyHeader
This commit is contained in:
parent
e8cf4d96ce
commit
7f2a931fb6
2 changed files with 37 additions and 3 deletions
|
@ -1179,15 +1179,22 @@ func (bc *Blockchain) ApplyPolicyToTxSet(txes []*transaction.Transaction) []*tra
|
||||||
return txes
|
return txes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Various errors that could be returns upon header verification.
|
||||||
|
var (
|
||||||
|
ErrHdrHashMismatch = errors.New("previous header hash doesn't match")
|
||||||
|
ErrHdrIndexMismatch = errors.New("previous header index doesn't match")
|
||||||
|
ErrHdrInvalidTimestamp = errors.New("block is not newer than the previous one")
|
||||||
|
)
|
||||||
|
|
||||||
func (bc *Blockchain) verifyHeader(currHeader, prevHeader *block.Header) error {
|
func (bc *Blockchain) verifyHeader(currHeader, prevHeader *block.Header) error {
|
||||||
if prevHeader.Hash() != currHeader.PrevHash {
|
if prevHeader.Hash() != currHeader.PrevHash {
|
||||||
return errors.New("previous header hash doesn't match")
|
return ErrHdrHashMismatch
|
||||||
}
|
}
|
||||||
if prevHeader.Index+1 != currHeader.Index {
|
if prevHeader.Index+1 != currHeader.Index {
|
||||||
return errors.New("previous header index doesn't match")
|
return ErrHdrIndexMismatch
|
||||||
}
|
}
|
||||||
if prevHeader.Timestamp >= currHeader.Timestamp {
|
if prevHeader.Timestamp >= currHeader.Timestamp {
|
||||||
return errors.New("block is not newer than the previous one")
|
return ErrHdrInvalidTimestamp
|
||||||
}
|
}
|
||||||
return bc.verifyHeaderWitnesses(currHeader, prevHeader)
|
return bc.verifyHeaderWitnesses(currHeader, prevHeader)
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,33 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestVerifyHeader(t *testing.T) {
|
||||||
|
bc := newTestChain(t)
|
||||||
|
defer bc.Close()
|
||||||
|
prev := bc.topBlock.Load().(*block.Block).Header()
|
||||||
|
t.Run("Invalid", func(t *testing.T) {
|
||||||
|
t.Run("Hash", func(t *testing.T) {
|
||||||
|
h := prev.Hash()
|
||||||
|
h[0] = ^h[0]
|
||||||
|
hdr := newBlock(bc.config, 1, h).Header()
|
||||||
|
require.True(t, errors.Is(bc.verifyHeader(hdr, prev), ErrHdrHashMismatch))
|
||||||
|
})
|
||||||
|
t.Run("Index", func(t *testing.T) {
|
||||||
|
hdr := newBlock(bc.config, 3, prev.Hash()).Header()
|
||||||
|
require.True(t, errors.Is(bc.verifyHeader(hdr, prev), ErrHdrIndexMismatch))
|
||||||
|
})
|
||||||
|
t.Run("Timestamp", func(t *testing.T) {
|
||||||
|
hdr := newBlock(bc.config, 1, prev.Hash()).Header()
|
||||||
|
hdr.Timestamp = 0
|
||||||
|
require.True(t, errors.Is(bc.verifyHeader(hdr, prev), ErrHdrInvalidTimestamp))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
t.Run("Valid", func(t *testing.T) {
|
||||||
|
hdr := newBlock(bc.config, 1, prev.Hash()).Header()
|
||||||
|
require.NoError(t, bc.verifyHeader(hdr, prev))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestAddHeaders(t *testing.T) {
|
func TestAddHeaders(t *testing.T) {
|
||||||
bc := newTestChain(t)
|
bc := newTestChain(t)
|
||||||
defer bc.Close()
|
defer bc.Close()
|
||||||
|
|
Loading…
Reference in a new issue