forked from cerc-io/plugeth
core: Add BadHashErr and test for BadHashes handling
This commit is contained in:
parent
36f46a61a7
commit
bfde1a4305
@ -642,7 +642,7 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if BadHashes[block.Hash()] {
|
if BadHashes[block.Hash()] {
|
||||||
err := fmt.Errorf("Found known bad hash in chain %x", block.Hash())
|
err := BadHashError(block.Hash())
|
||||||
blockErr(block, err)
|
blockErr(block, err)
|
||||||
return i, err
|
return i, err
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,7 @@ func testFork(t *testing.T, bman *BlockProcessor, i, N int, f func(td1, td2 *big
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("could not make new canonical in testFork", err)
|
t.Fatal("could not make new canonical in testFork", err)
|
||||||
}
|
}
|
||||||
// asert the bmans have the same block at i
|
// assert the bmans have the same block at i
|
||||||
bi1 := bman.bc.GetBlockByNumber(uint64(i)).Hash()
|
bi1 := bman.bc.GetBlockByNumber(uint64(i)).Hash()
|
||||||
bi2 := bman2.bc.GetBlockByNumber(uint64(i)).Hash()
|
bi2 := bman2.bc.GetBlockByNumber(uint64(i)).Hash()
|
||||||
if bi1 != bi2 {
|
if bi1 != bi2 {
|
||||||
@ -421,6 +421,59 @@ func TestReorgLongest(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBadHashes(t *testing.T) {
|
||||||
|
db, _ := ethdb.NewMemDatabase()
|
||||||
|
genesis, err := WriteTestNetGenesisBlock(db, 0)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
bc := chm(genesis, db)
|
||||||
|
|
||||||
|
chain := makeChainWithDiff(genesis, []int{1, 2, 4}, 10)
|
||||||
|
BadHashes[chain[2].Header().Hash()] = true
|
||||||
|
|
||||||
|
_, err = bc.InsertChain(chain)
|
||||||
|
if !IsBadHashError(err) {
|
||||||
|
t.Errorf("error mismatch: want: BadHashError, have: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReorgBadHashes(t *testing.T) {
|
||||||
|
db, _ := ethdb.NewMemDatabase()
|
||||||
|
genesis, err := WriteTestNetGenesisBlock(db, 0)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
bc := chm(genesis, db)
|
||||||
|
|
||||||
|
chain := makeChainWithDiff(genesis, []int{1, 2, 3, 4}, 11)
|
||||||
|
bc.InsertChain(chain)
|
||||||
|
|
||||||
|
if chain[3].Header().Hash() != bc.LastBlockHash() {
|
||||||
|
t.Errorf("last block hash mismatch: want: %x, have: %x", chain[3].Header().Hash(), bc.LastBlockHash())
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewChainManager should check BadHashes when loading it db
|
||||||
|
BadHashes[chain[3].Header().Hash()] = true
|
||||||
|
|
||||||
|
var eventMux event.TypeMux
|
||||||
|
ncm, err := NewChainManager(db, FakePow{}, &eventMux)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("NewChainManager err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// check it set head to (valid) parent of bad hash block
|
||||||
|
if chain[2].Header().Hash() != ncm.LastBlockHash() {
|
||||||
|
t.Errorf("last block hash mismatch: want: %x, have: %x", chain[2].Header().Hash(), ncm.LastBlockHash())
|
||||||
|
}
|
||||||
|
|
||||||
|
if chain[2].Header().GasLimit.Cmp(ncm.GasLimit()) != 0 {
|
||||||
|
t.Errorf("current block gasLimit mismatch: want: %x, have: %x", chain[2].Header().GasLimit, ncm.GasLimit())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestReorgShortest(t *testing.T) {
|
func TestReorgShortest(t *testing.T) {
|
||||||
db, _ := ethdb.NewMemDatabase()
|
db, _ := ethdb.NewMemDatabase()
|
||||||
genesis, err := WriteTestNetGenesisBlock(db, 0)
|
genesis, err := WriteTestNetGenesisBlock(db, 0)
|
||||||
|
@ -177,3 +177,14 @@ func IsValueTransferErr(e error) bool {
|
|||||||
_, ok := e.(*ValueTransferError)
|
_, ok := e.(*ValueTransferError)
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type BadHashError common.Hash
|
||||||
|
|
||||||
|
func (h BadHashError) Error() string {
|
||||||
|
return fmt.Sprintf("Found known bad hash in chain %x", h)
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsBadHashError(err error) bool {
|
||||||
|
_, ok := err.(BadHashError)
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user