Skip to content

Commit 35767df

Browse files
committed
cmd, eth: separate out FakePeer for future reuse
1 parent 3453329 commit 35767df

File tree

3 files changed

+192
-152
lines changed

3 files changed

+192
-152
lines changed

cmd/geth/chaincmd.go

Lines changed: 18 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package main
1919
import (
2020
"encoding/json"
2121
"fmt"
22-
"math/big"
2322
"os"
2423
"runtime"
2524
"strconv"
@@ -97,13 +96,15 @@ if already existing.`,
9796
copydbCommand = cli.Command{
9897
Action: utils.MigrateFlags(copyDb),
9998
Name: "copydb",
100-
Usage: "Copy from one chain DB into another using the downloader",
101-
ArgsUsage: "<filename>",
99+
Usage: "Create a local chain from a target chaindata folder",
100+
ArgsUsage: "<sourceChaindataDir>",
102101
Flags: []cli.Flag{
103102
utils.DataDirFlag,
104103
utils.CacheFlag,
105104
utils.SyncModeFlag,
106105
utils.FakePoWFlag,
106+
utils.TestnetFlag,
107+
utils.RinkebyFlag,
107108
},
108109
Category: "BLOCKCHAIN COMMANDS",
109110
Description: `
@@ -286,172 +287,44 @@ func exportChain(ctx *cli.Context) error {
286287
return nil
287288
}
288289

289-
type localPeer struct {
290-
chainDb ethdb.Database
291-
hc *core.HeaderChain
292-
dl *downloader.Downloader
293-
}
294-
295-
func (lp *localPeer) Head() (common.Hash, *big.Int) {
296-
header := lp.hc.CurrentHeader()
297-
return header.Hash(), header.Number
298-
}
299-
300-
func (lp *localPeer) RequestHeadersByHash(hash common.Hash, amount int, skip int, reverse bool) error {
301-
var (
302-
headers []*types.Header
303-
unknown bool
304-
)
305-
306-
for !unknown && len(headers) < amount {
307-
origin := lp.hc.GetHeaderByHash(hash)
308-
if origin == nil {
309-
break
310-
}
311-
312-
number := origin.Number.Uint64()
313-
headers = append(headers, origin)
314-
if reverse {
315-
for i := 0; i < int(skip)+1; i++ {
316-
if header := lp.hc.GetHeader(hash, number); header != nil {
317-
hash = header.ParentHash
318-
number--
319-
} else {
320-
unknown = true
321-
break
322-
}
323-
}
324-
} else {
325-
var (
326-
current = origin.Number.Uint64()
327-
next = current + uint64(skip) + 1
328-
)
329-
if header := lp.hc.GetHeaderByNumber(next); header != nil {
330-
if lp.hc.GetBlockHashesFromHash(header.Hash(), uint64(skip+1))[skip] == hash {
331-
hash = header.Hash()
332-
} else {
333-
unknown = true
334-
}
335-
} else {
336-
unknown = true
337-
}
338-
}
339-
}
340-
341-
lp.dl.DeliverHeaders("local", headers)
342-
return nil
343-
}
344-
345-
func (lp *localPeer) RequestHeadersByNumber(num uint64, amount int, skip int, reverse bool) error {
346-
var (
347-
headers []*types.Header
348-
unknown bool
349-
)
350-
351-
for !unknown && len(headers) < amount {
352-
origin := lp.hc.GetHeaderByNumber(num)
353-
if origin == nil {
354-
break
355-
}
356-
357-
if reverse {
358-
if num >= uint64(skip+1) {
359-
num -= uint64(skip + 1)
360-
} else {
361-
unknown = true
362-
}
363-
} else {
364-
num += uint64(skip + 1)
365-
}
366-
headers = append(headers, origin)
367-
}
368-
369-
lp.dl.DeliverHeaders("local", headers)
370-
return nil
371-
}
372-
373-
func (lp *localPeer) RequestBodies(hashes []common.Hash) error {
374-
var (
375-
transactions [][]*types.Transaction
376-
uncles [][]*types.Header
377-
)
378-
379-
for _, hash := range hashes {
380-
block := core.GetBlock(lp.chainDb, hash, lp.hc.GetBlockNumber(hash))
381-
transactions = append(transactions, block.Transactions())
382-
uncles = append(uncles, block.Uncles())
383-
}
384-
385-
lp.dl.DeliverBodies("local", transactions, uncles)
386-
return nil
387-
}
388-
389-
func (lp *localPeer) RequestReceipts(hashes []common.Hash) error {
390-
var receipts [][]*types.Receipt
391-
392-
for _, hash := range hashes {
393-
receipts = append(receipts, core.GetBlockReceipts(lp.chainDb, hash, lp.hc.GetBlockNumber(hash)))
394-
}
395-
396-
lp.dl.DeliverReceipts("local", receipts)
397-
return nil
398-
}
399-
400-
func (lp *localPeer) RequestNodeData(hashes []common.Hash) error {
401-
var data [][]byte
402-
403-
for _, hash := range hashes {
404-
if entry, err := lp.chainDb.Get(hash.Bytes()); err == nil {
405-
data = append(data, entry)
406-
}
407-
}
408-
409-
lp.dl.DeliverNodeData("local", data)
410-
return nil
411-
}
412-
413290
func copyDb(ctx *cli.Context) error {
291+
// Ensure we have a source chain directory to copy
414292
if len(ctx.Args()) != 1 {
415-
utils.Fatalf("This command requires an argument.")
293+
utils.Fatalf("Source chaindata directory path argument missing")
416294
}
417-
295+
// Initialize a new chain for the running node to sync into
418296
stack := makeFullNode(ctx)
419297
chain, chainDb := utils.MakeChain(ctx, stack)
420-
start := time.Now()
421298

422299
syncmode := *utils.GlobalTextMarshaler(ctx, utils.SyncModeFlag.Name).(*downloader.SyncMode)
423-
mux := new(event.TypeMux)
424-
dl := downloader.New(syncmode, chainDb, mux, chain, nil, nil)
300+
dl := downloader.New(syncmode, chainDb, new(event.TypeMux), chain, nil, nil)
425301

426-
var err error
427-
filename := ctx.Args().First()
428-
cache := ctx.GlobalInt(utils.CacheFlag.Name)
429-
handles := 256
430-
localdb, err := ethdb.NewLDBDatabase(filename, cache, handles)
302+
// Create a source peer to satisfy downloader requests from
303+
db, err := ethdb.NewLDBDatabase(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name), 256)
431304
if err != nil {
432305
return err
433306
}
434-
435-
hc, err := core.NewHeaderChain(localdb, chain.Config(), chain.Engine(), func() bool { return false })
307+
hc, err := core.NewHeaderChain(db, chain.Config(), chain.Engine(), func() bool { return false })
436308
if err != nil {
437309
return err
438310
}
439-
440-
peer := &localPeer{localdb, hc, dl}
441-
if err := dl.RegisterPeer("local", 63, peer); err != nil {
311+
peer := downloader.NewFakePeer("local", db, hc, dl)
312+
if err = dl.RegisterPeer("local", 63, peer); err != nil {
442313
return err
443314
}
315+
// Synchronise with the simulated peer
316+
start := time.Now()
444317

445318
currentHeader := hc.CurrentHeader()
446-
if err := dl.Synchronise("local", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncmode); err != nil {
319+
if err = dl.Synchronise("local", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncmode); err != nil {
447320
return err
448321
}
449322
for dl.Synchronising() {
450323
time.Sleep(10 * time.Millisecond)
451324
}
325+
fmt.Printf("Database copy done in %v\n", time.Since(start))
452326

453-
fmt.Printf("Database copy done in %v", time.Since(start))
454-
327+
// Compact the entire database to remove any sync overhead
455328
start = time.Now()
456329
fmt.Println("Compacting entire database...")
457330
if err = chainDb.(*ethdb.LDBDatabase).LDB().CompactRange(util.Range{}); err != nil {

cmd/utils/flags.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import (
3131
"github.com/ethereum/go-ethereum/accounts"
3232
"github.com/ethereum/go-ethereum/accounts/keystore"
3333
"github.com/ethereum/go-ethereum/common"
34+
"github.com/ethereum/go-ethereum/consensus"
35+
"github.com/ethereum/go-ethereum/consensus/clique"
3436
"github.com/ethereum/go-ethereum/consensus/ethash"
3537
"github.com/ethereum/go-ethereum/core"
3638
"github.com/ethereum/go-ethereum/core/state"
@@ -1086,17 +1088,22 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai
10861088
var err error
10871089
chainDb = MakeChainDatabase(ctx, stack)
10881090

1089-
engine := ethash.NewFaker()
1090-
if !ctx.GlobalBool(FakePoWFlag.Name) {
1091-
engine = ethash.New(
1092-
stack.ResolvePath(eth.DefaultConfig.EthashCacheDir), eth.DefaultConfig.EthashCachesInMem, eth.DefaultConfig.EthashCachesOnDisk,
1093-
stack.ResolvePath(eth.DefaultConfig.EthashDatasetDir), eth.DefaultConfig.EthashDatasetsInMem, eth.DefaultConfig.EthashDatasetsOnDisk,
1094-
)
1095-
}
10961091
config, _, err := core.SetupGenesisBlock(chainDb, MakeGenesis(ctx))
10971092
if err != nil {
10981093
Fatalf("%v", err)
10991094
}
1095+
var engine consensus.Engine
1096+
if config.Clique != nil {
1097+
engine = clique.New(config.Clique, chainDb)
1098+
} else {
1099+
engine = ethash.NewFaker()
1100+
if !ctx.GlobalBool(FakePoWFlag.Name) {
1101+
engine = ethash.New(
1102+
stack.ResolvePath(eth.DefaultConfig.EthashCacheDir), eth.DefaultConfig.EthashCachesInMem, eth.DefaultConfig.EthashCachesOnDisk,
1103+
stack.ResolvePath(eth.DefaultConfig.EthashDatasetDir), eth.DefaultConfig.EthashDatasetsInMem, eth.DefaultConfig.EthashDatasetsOnDisk,
1104+
)
1105+
}
1106+
}
11001107
vmcfg := vm.Config{EnablePreimageRecording: ctx.GlobalBool(VMEnableDebugFlag.Name)}
11011108
chain, err = core.NewBlockChain(chainDb, config, engine, vmcfg)
11021109
if err != nil {

0 commit comments

Comments
 (0)