core: Add BadHashErr and test for BadHashes handling
This commit is contained in:
		| @@ -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 | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user