erigon-pulse/cmd/tester/main.go
ledgerwatch 48d4ac202c
Revive devp2p tester for further simulation testing (#387)
* First fixes

* Fixes in the tester

* fix hash announcement

* Tester fixes

* Fix lint

* After-merge fixes

* Fix lint

* Fix lint

* Fix lint

* Fix lint

* Fix lint

* Fix lint

* Clean up fetchers in the test

* Make tests not run forever

* Fix test

* Fix tester

* Increase time a bit

* Fix lint

* Fix tests

* Removed log

* Fix test

* Remove commented out code
2020-03-04 22:25:40 +00:00

157 lines
4.0 KiB
Go

package main
import (
"fmt"
"io"
"os"
"runtime"
"sort"
"os/signal"
"syscall"
"github.com/ledgerwatch/turbo-geth/cmd/utils"
"github.com/ledgerwatch/turbo-geth/console"
"github.com/ledgerwatch/turbo-geth/crypto"
"github.com/ledgerwatch/turbo-geth/eth"
"github.com/ledgerwatch/turbo-geth/internal/debug"
"github.com/ledgerwatch/turbo-geth/log"
"github.com/ledgerwatch/turbo-geth/p2p"
"github.com/ledgerwatch/turbo-geth/p2p/enode"
"github.com/ledgerwatch/turbo-geth/params"
"github.com/mattn/go-colorable"
"github.com/mattn/go-isatty"
"github.com/urfave/cli"
"net/http"
//nolint:gosec
_ "net/http/pprof"
)
var (
// Git SHA1 commit hash of the release (set via linker flags)
gitCommit = ""
gitDate = ""
// The app that holds all commands and flags.
app = utils.NewApp(gitCommit, "", "Ethereum Tester")
// flags that configure the node
flags = []cli.Flag{}
)
func init() {
// Initialize the CLI app and start Geth
app.Action = tester
app.HideVersion = true // we have a command to print the version
app.Copyright = "Copyright 2018 The go-ethereum Authors"
app.Commands = []cli.Command{}
sort.Sort(cli.CommandsByName(app.Commands))
app.Flags = append(app.Flags, flags...)
app.Before = func(ctx *cli.Context) error {
runtime.GOMAXPROCS(runtime.NumCPU())
if err := debug.Setup(ctx); err != nil {
return err
}
return nil
}
app.After = func(ctx *cli.Context) error {
debug.Exit()
console.Stdin.Close() // Resets terminal mode.
return nil
}
}
func main() {
if err := app.Run(os.Args); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
func tester(ctx *cli.Context) error {
var (
ostream log.Handler
glogger *log.GlogHandler
)
usecolor := (isatty.IsTerminal(os.Stderr.Fd()) || isatty.IsCygwinTerminal(os.Stderr.Fd())) && os.Getenv("TERM") != "dumb"
output := io.Writer(os.Stderr)
if usecolor {
output = colorable.NewColorableStderr()
}
ostream = log.StreamHandler(output, log.TerminalFormat(usecolor))
glogger = log.NewGlogHandler(ostream)
log.Root().SetHandler(glogger)
glogger.Verbosity(log.LvlTrace)
go func() {
log.Info("HTTP", "error", http.ListenAndServe("localhost:6060", nil))
}()
if len(ctx.Args()) < 1 {
fmt.Printf("Usage: tester <enode>\n")
return nil
}
nodeToConnect, err := enode.ParseV4(ctx.Args()[0])
if err != nil {
panic(fmt.Sprintf("Could not parse the node info: %v", err))
}
fmt.Printf("Parsed node: %s, IP: %s\n", nodeToConnect, nodeToConnect.IP())
//fmt.Printf("%s %s\n", ctx.Args()[0], ctx.Args()[1])
tp := NewTesterProtocol()
//tp.blockFeeder, err = NewBlockAccessor(ctx.Args()[0]/*, ctx.Args()[1]*/)
blockGen, err := NewBlockGenerator("blocks", 50000)
defer blockGen.Close()
if err != nil {
panic(fmt.Sprintf("Failed to create block generator: %v", err))
}
tp.blockFeeder = blockGen
tp.forkBase = 49998
tp.forkHeight = 5
tp.forkFeeder, err = NewForkGenerator(blockGen, "forkblocks", tp.forkBase, tp.forkHeight)
defer tp.forkFeeder.Close()
if err != nil {
panic(fmt.Sprintf("Failed to create fork generator: %v", err))
}
tp.protocolVersion = uint32(eth.ProtocolVersions[2])
tp.networkId = 1 // Mainnet
tp.genesisBlockHash = params.MainnetGenesisHash
serverKey, err := crypto.GenerateKey()
if err != nil {
panic(fmt.Sprintf("Failed to generate server key: %v", err))
}
p2pConfig := p2p.Config{}
p2pConfig.PrivateKey = serverKey
p2pConfig.Name = "geth tester"
p2pConfig.Logger = log.New()
p2pConfig.MaxPeers = 1
p2pConfig.Protocols = []p2p.Protocol{
{
Name: eth.ProtocolName,
Version: eth.ProtocolVersions[2],
Length: eth.ProtocolLengths[eth.ProtocolVersions[2]],
Run: tp.protocolRun,
},
}
server := &p2p.Server{Config: p2pConfig}
// Add protocol
if err := server.Start(); err != nil {
panic(fmt.Sprintf("Could not start server: %v", err))
}
server.AddPeer(nodeToConnect)
sigs := make(chan os.Signal, 1)
interruptCh := make(chan bool, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
interruptCh <- true
}()
_ = <-interruptCh
return nil
}