aboutsummaryrefslogtreecommitdiffstats
path: root/core/blockchain_test.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2019-02-08 17:11:31 +0800
committerMartin Holst Swende <martin@swende.se>2019-02-10 00:45:23 +0800
commit4da209290831720b0f61754b92dabefd5cb35b6d (patch)
treed9ceb8d0d69786e604376493a2697c94bc05aa06 /core/blockchain_test.go
parent3ab9dcc3bd17cdbb731ca7da829a3bd7b5e1bc1e (diff)
downloaddexon-4da209290831720b0f61754b92dabefd5cb35b6d.tar
dexon-4da209290831720b0f61754b92dabefd5cb35b6d.tar.gz
dexon-4da209290831720b0f61754b92dabefd5cb35b6d.tar.bz2
dexon-4da209290831720b0f61754b92dabefd5cb35b6d.tar.lz
dexon-4da209290831720b0f61754b92dabefd5cb35b6d.tar.xz
dexon-4da209290831720b0f61754b92dabefd5cb35b6d.tar.zst
dexon-4da209290831720b0f61754b92dabefd5cb35b6d.zip
core: fix pruner panic when importing low-diff-large-sidechain
Diffstat (limited to 'core/blockchain_test.go')
-rw-r--r--core/blockchain_test.go43
1 files changed, 25 insertions, 18 deletions
diff --git a/core/blockchain_test.go b/core/blockchain_test.go
index 641f1ecd4..504ad0eaf 100644
--- a/core/blockchain_test.go
+++ b/core/blockchain_test.go
@@ -1487,16 +1487,22 @@ func BenchmarkBlockChain_1x1000Executions(b *testing.B) {
// Tests that importing a very large side fork, which is larger than the canon chain,
// but where the difficulty per block is kept low: this means that it will not
// overtake the 'canon' chain until after it's passed canon by about 200 blocks.
-func TestLargeOldSidechainWithALowTdChain(t *testing.T) {
-
+//
+// Details at:
+// - https://github.com/ethereum/go-ethereum/issues/18977
+// - https://github.com/ethereum/go-ethereum/pull/18988
+func TestLowDiffLongChain(t *testing.T) {
// Generate a canonical chain to act as the main dataset
engine := ethash.NewFaker()
-
db := ethdb.NewMemDatabase()
genesis := new(Genesis).MustCommit(db)
- // We must use a pretty long chain to ensure that the fork
- // doesn't overtake us until after at least 128 blocks post tip
- blocks, _ := generateChain(params.TestChainConfig, genesis, engine, db, 6*triesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }, makeHeaderWithLargeDifficulty)
+
+ // We must use a pretty long chain to ensure that the fork doesn't overtake us
+ // until after at least 128 blocks post tip
+ blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 6*triesInMemory, func(i int, b *BlockGen) {
+ b.SetCoinbase(common.Address{1})
+ b.OffsetTime(-9)
+ })
// Import the canonical chain
diskdb := ethdb.NewMemDatabase()
@@ -1506,19 +1512,14 @@ func TestLargeOldSidechainWithALowTdChain(t *testing.T) {
if err != nil {
t.Fatalf("failed to create tester chain: %v", err)
}
- for i := 0; i < len(blocks); i++ {
- if _, err := chain.InsertChain(blocks[i : i+1]); err != nil {
- t.Fatalf("block %d: failed to insert into chain: %v", i, err)
- }
+ if n, err := chain.InsertChain(blocks); err != nil {
+ t.Fatalf("block %d: failed to insert into chain: %v", n, err)
}
- // Dereference all the recent tries and ensure no past trie is left in
- for i := 0; i < triesInMemory; i++ {
- chain.stateCache.TrieDB().Dereference(blocks[len(blocks)-1-i].Root())
- }
-
// Generate fork chain, starting from an early block
parent := blocks[10]
- fork, _ := generateChain(params.TestChainConfig, parent, engine, db, 256+6*triesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{2}) }, makeHeaderWithSmallDifficulty)
+ fork, _ := GenerateChain(params.TestChainConfig, parent, engine, db, 8*triesInMemory, func(i int, b *BlockGen) {
+ b.SetCoinbase(common.Address{2})
+ })
// And now import the fork
if i, err := chain.InsertChain(fork); err != nil {
@@ -1528,6 +1529,12 @@ func TestLargeOldSidechainWithALowTdChain(t *testing.T) {
if got := fork[len(fork)-1].Hash(); got != head.Hash() {
t.Fatalf("head wrong, expected %x got %x", head.Hash(), got)
}
- td := chain.GetTd(head.Hash(), head.NumberU64())
- fmt.Printf("td %v", td)
+ // Sanity check that all the canonical numbers are present
+ header := chain.CurrentHeader()
+ for number := head.NumberU64(); number > 0; number-- {
+ if hash := chain.GetHeaderByNumber(number).Hash(); hash != header.Hash() {
+ t.Fatalf("header %d: canonical hash mismatch: have %x, want %x", number, hash, header.Hash())
+ }
+ header = chain.GetHeader(header.ParentHash, number-1)
+ }
}