aboutsummaryrefslogtreecommitdiffstats
path: root/core/blockchain_test.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2019-02-20 16:48:12 +0800
committerGitHub <noreply@github.com>2019-02-20 16:48:12 +0800
commitc942700427557e3ff6de3aaf6b916e2f056c1ec2 (patch)
treecadf68e7206d6de42b1eefc6967214cf86e35ff2 /core/blockchain_test.go
parent7fa3509e2eaf1a4ebc12344590e5699406690f15 (diff)
parentcde35439e058b4f9579830fec9fb65ae0b998346 (diff)
downloaddexon-c942700427557e3ff6de3aaf6b916e2f056c1ec2.tar
dexon-c942700427557e3ff6de3aaf6b916e2f056c1ec2.tar.gz
dexon-c942700427557e3ff6de3aaf6b916e2f056c1ec2.tar.bz2
dexon-c942700427557e3ff6de3aaf6b916e2f056c1ec2.tar.lz
dexon-c942700427557e3ff6de3aaf6b916e2f056c1ec2.tar.xz
dexon-c942700427557e3ff6de3aaf6b916e2f056c1ec2.tar.zst
dexon-c942700427557e3ff6de3aaf6b916e2f056c1ec2.zip
Merge pull request #19029 from holiman/update1.8
Update1.8
Diffstat (limited to 'core/blockchain_test.go')
-rw-r--r--core/blockchain_test.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/core/blockchain_test.go b/core/blockchain_test.go
index 5ab29e205..504ad0eaf 100644
--- a/core/blockchain_test.go
+++ b/core/blockchain_test.go
@@ -1483,3 +1483,58 @@ func BenchmarkBlockChain_1x1000Executions(b *testing.B) {
benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn)
}
+
+// 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.
+//
+// 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})
+ b.OffsetTime(-9)
+ })
+
+ // Import the canonical chain
+ diskdb := ethdb.NewMemDatabase()
+ new(Genesis).MustCommit(diskdb)
+
+ chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil)
+ if err != nil {
+ t.Fatalf("failed to create tester chain: %v", err)
+ }
+ if n, err := chain.InsertChain(blocks); err != nil {
+ t.Fatalf("block %d: failed to insert into chain: %v", n, err)
+ }
+ // Generate fork chain, starting from an early block
+ parent := blocks[10]
+ 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 {
+ t.Fatalf("block %d: failed to insert into chain: %v", i, err)
+ }
+ head := chain.CurrentBlock()
+ if got := fork[len(fork)-1].Hash(); got != head.Hash() {
+ t.Fatalf("head wrong, expected %x got %x", head.Hash(), got)
+ }
+ // 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)
+ }
+}