mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 18:32:23 +00:00
Merge 8b3b2d77c0 into 2e98631c5e
This commit is contained in:
commit
1c2fa50f6f
1 changed files with 48 additions and 6 deletions
|
|
@ -101,6 +101,48 @@ func newTester() *downloadTester {
|
||||||
return tester
|
return tester
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// makeLongChain creates a chain of n blocks starting at and including parent.
|
||||||
|
// the returned hash chain is ordered head->parent. The chain contains no transactions,
|
||||||
|
// and only one uncle every 500 blocks
|
||||||
|
func (dl *downloadTester) makeLongChain(n int, seed byte, parent *types.Block, parentReceipts types.Receipts, heavy bool) ([]common.Hash, map[common.Hash]*types.Header, map[common.Hash]*types.Block, map[common.Hash]types.Receipts) {
|
||||||
|
// Generate the block chain
|
||||||
|
blocks, receipts := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), dl.peerDb, n, func(i int, block *core.BlockGen) {
|
||||||
|
block.SetCoinbase(common.Address{seed})
|
||||||
|
|
||||||
|
// If a heavy chain is requested, delay blocks to raise difficulty
|
||||||
|
if heavy {
|
||||||
|
block.OffsetTime(-1)
|
||||||
|
}
|
||||||
|
// If the block number is a multiple of 500, add a bonus uncle to the block
|
||||||
|
if i > 0 && i%500 == 0 {
|
||||||
|
block.AddUncle(&types.Header{
|
||||||
|
ParentHash: block.PrevBlock(i - 1).Hash(),
|
||||||
|
Number: big.NewInt(block.Number().Int64() - 1),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// Convert the block-chain into a hash-chain and header/block maps
|
||||||
|
hashes := make([]common.Hash, n+1)
|
||||||
|
hashes[len(hashes)-1] = parent.Hash()
|
||||||
|
|
||||||
|
headerm := make(map[common.Hash]*types.Header, n+1)
|
||||||
|
headerm[parent.Hash()] = parent.Header()
|
||||||
|
|
||||||
|
blockm := make(map[common.Hash]*types.Block, n+1)
|
||||||
|
blockm[parent.Hash()] = parent
|
||||||
|
|
||||||
|
receiptm := make(map[common.Hash]types.Receipts, n+1)
|
||||||
|
receiptm[parent.Hash()] = parentReceipts
|
||||||
|
|
||||||
|
for i, b := range blocks {
|
||||||
|
hashes[len(hashes)-i-2] = b.Hash()
|
||||||
|
headerm[b.Hash()] = b.Header()
|
||||||
|
blockm[b.Hash()] = b
|
||||||
|
receiptm[b.Hash()] = receipts[i]
|
||||||
|
}
|
||||||
|
return hashes, headerm, blockm, receiptm
|
||||||
|
}
|
||||||
|
|
||||||
// makeChain creates a chain of n blocks starting at and including parent.
|
// makeChain creates a chain of n blocks starting at and including parent.
|
||||||
// the returned hash chain is ordered head->parent. In addition, every 3rd block
|
// the returned hash chain is ordered head->parent. In addition, every 3rd block
|
||||||
// contains a transaction and every 5th an uncle to allow testing correct block
|
// contains a transaction and every 5th an uncle to allow testing correct block
|
||||||
|
|
@ -157,17 +199,17 @@ func (dl *downloadTester) makeChain(n int, seed byte, parent *types.Block, paren
|
||||||
// h2[:f] are different but have a common suffix of length n-f.
|
// h2[:f] are different but have a common suffix of length n-f.
|
||||||
func (dl *downloadTester) makeChainFork(n, f int, parent *types.Block, parentReceipts types.Receipts, balanced bool) ([]common.Hash, []common.Hash, map[common.Hash]*types.Header, map[common.Hash]*types.Header, map[common.Hash]*types.Block, map[common.Hash]*types.Block, map[common.Hash]types.Receipts, map[common.Hash]types.Receipts) {
|
func (dl *downloadTester) makeChainFork(n, f int, parent *types.Block, parentReceipts types.Receipts, balanced bool) ([]common.Hash, []common.Hash, map[common.Hash]*types.Header, map[common.Hash]*types.Header, map[common.Hash]*types.Block, map[common.Hash]*types.Block, map[common.Hash]types.Receipts, map[common.Hash]types.Receipts) {
|
||||||
// Create the common suffix
|
// Create the common suffix
|
||||||
hashes, headers, blocks, receipts := dl.makeChain(n-f, 0, parent, parentReceipts, false)
|
hashes, headers, blocks, receipts := dl.makeLongChain(n-f, 0, parent, parentReceipts, false)
|
||||||
|
|
||||||
// Create the forks, making the second heavier if non balanced forks were requested
|
// Create the forks, making the second heavier if non balanced forks were requested
|
||||||
hashes1, headers1, blocks1, receipts1 := dl.makeChain(f, 1, blocks[hashes[0]], receipts[hashes[0]], false)
|
hashes1, headers1, blocks1, receipts1 := dl.makeLongChain(f, 1, blocks[hashes[0]], receipts[hashes[0]], false)
|
||||||
hashes1 = append(hashes1, hashes[1:]...)
|
hashes1 = append(hashes1, hashes[1:]...)
|
||||||
|
|
||||||
heavy := false
|
heavy := false
|
||||||
if !balanced {
|
if !balanced {
|
||||||
heavy = true
|
heavy = true
|
||||||
}
|
}
|
||||||
hashes2, headers2, blocks2, receipts2 := dl.makeChain(f, 2, blocks[hashes[0]], receipts[hashes[0]], heavy)
|
hashes2, headers2, blocks2, receipts2 := dl.makeLongChain(f, 2, blocks[hashes[0]], receipts[hashes[0]], heavy)
|
||||||
hashes2 = append(hashes2, hashes[1:]...)
|
hashes2 = append(hashes2, hashes[1:]...)
|
||||||
|
|
||||||
for hash, header := range headers {
|
for hash, header := range headers {
|
||||||
|
|
@ -700,7 +742,7 @@ func testThrottling(t *testing.T, protocol int, mode SyncMode) {
|
||||||
|
|
||||||
// Create a long block chain to download and the tester
|
// Create a long block chain to download and the tester
|
||||||
targetBlocks := 8 * blockCacheItems
|
targetBlocks := 8 * blockCacheItems
|
||||||
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
|
hashes, headers, blocks, receipts := tester.makeLongChain(targetBlocks, 0, tester.genesis, nil, false)
|
||||||
|
|
||||||
tester.newPeer("peer", protocol, hashes, headers, blocks, receipts)
|
tester.newPeer("peer", protocol, hashes, headers, blocks, receipts)
|
||||||
|
|
||||||
|
|
@ -1006,7 +1048,7 @@ func testMultiSynchronisation(t *testing.T, protocol int, mode SyncMode) {
|
||||||
// Create various peers with various parts of the chain
|
// Create various peers with various parts of the chain
|
||||||
targetPeers := 8
|
targetPeers := 8
|
||||||
targetBlocks := targetPeers*blockCacheItems - 15
|
targetBlocks := targetPeers*blockCacheItems - 15
|
||||||
hashes, headers, blocks, receipts := tester.makeChain(targetBlocks, 0, tester.genesis, nil, false)
|
hashes, headers, blocks, receipts := tester.makeLongChain(targetBlocks, 0, tester.genesis, nil, false)
|
||||||
|
|
||||||
for i := 0; i < targetPeers; i++ {
|
for i := 0; i < targetPeers; i++ {
|
||||||
id := fmt.Sprintf("peer #%d", i)
|
id := fmt.Sprintf("peer #%d", i)
|
||||||
|
|
@ -1358,7 +1400,7 @@ func testBlockHeaderAttackerDropping(t *testing.T, protocol int) {
|
||||||
func TestSyncProgress62(t *testing.T) { testSyncProgress(t, 62, FullSync) }
|
func TestSyncProgress62(t *testing.T) { testSyncProgress(t, 62, FullSync) }
|
||||||
func TestSyncProgress63Full(t *testing.T) { testSyncProgress(t, 63, FullSync) }
|
func TestSyncProgress63Full(t *testing.T) { testSyncProgress(t, 63, FullSync) }
|
||||||
func TestSyncProgress63Fast(t *testing.T) { testSyncProgress(t, 63, FastSync) }
|
func TestSyncProgress63Fast(t *testing.T) { testSyncProgress(t, 63, FastSync) }
|
||||||
func TestSyncProgress64Full(t *testing.T) { testSyncProgress(t, 64, FullSync) }
|
func TestSyncProgrefss64Full(t *testing.T) { testSyncProgress(t, 64, FullSync) }
|
||||||
func TestSyncProgress64Fast(t *testing.T) { testSyncProgress(t, 64, FastSync) }
|
func TestSyncProgress64Fast(t *testing.T) { testSyncProgress(t, 64, FastSync) }
|
||||||
func TestSyncProgress64Light(t *testing.T) { testSyncProgress(t, 64, LightSync) }
|
func TestSyncProgress64Light(t *testing.T) { testSyncProgress(t, 64, LightSync) }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue