p2p/discover: implement v5.1 wire protocol (#21647)
This change implements the Discovery v5.1 wire protocol and also adds an interactive test suite for this protocol.
This commit is contained in:
		@@ -18,9 +18,13 @@ package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/ethereum/go-ethereum/cmd/devp2p/internal/v5test"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/internal/utesting"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/log"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/p2p/discover"
 | 
			
		||||
	"gopkg.in/urfave/cli.v1"
 | 
			
		||||
)
 | 
			
		||||
@@ -33,6 +37,7 @@ var (
 | 
			
		||||
			discv5PingCommand,
 | 
			
		||||
			discv5ResolveCommand,
 | 
			
		||||
			discv5CrawlCommand,
 | 
			
		||||
			discv5TestCommand,
 | 
			
		||||
			discv5ListenCommand,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
@@ -53,6 +58,12 @@ var (
 | 
			
		||||
		Action: discv5Crawl,
 | 
			
		||||
		Flags:  []cli.Flag{bootnodesFlag, crawlTimeoutFlag},
 | 
			
		||||
	}
 | 
			
		||||
	discv5TestCommand = cli.Command{
 | 
			
		||||
		Name:   "test",
 | 
			
		||||
		Usage:  "Runs protocol tests against a node",
 | 
			
		||||
		Action: discv5Test,
 | 
			
		||||
		Flags:  []cli.Flag{testPatternFlag, testListen1Flag, testListen2Flag},
 | 
			
		||||
	}
 | 
			
		||||
	discv5ListenCommand = cli.Command{
 | 
			
		||||
		Name:   "listen",
 | 
			
		||||
		Usage:  "Runs a node",
 | 
			
		||||
@@ -103,6 +114,30 @@ func discv5Crawl(ctx *cli.Context) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func discv5Test(ctx *cli.Context) error {
 | 
			
		||||
	// Disable logging unless explicitly enabled.
 | 
			
		||||
	if !ctx.GlobalIsSet("verbosity") && !ctx.GlobalIsSet("vmodule") {
 | 
			
		||||
		log.Root().SetHandler(log.DiscardHandler())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Filter and run test cases.
 | 
			
		||||
	suite := &v5test.Suite{
 | 
			
		||||
		Dest:    getNodeArg(ctx),
 | 
			
		||||
		Listen1: ctx.String(testListen1Flag.Name),
 | 
			
		||||
		Listen2: ctx.String(testListen2Flag.Name),
 | 
			
		||||
	}
 | 
			
		||||
	tests := suite.AllTests()
 | 
			
		||||
	if ctx.IsSet(testPatternFlag.Name) {
 | 
			
		||||
		tests = utesting.MatchTests(tests, ctx.String(testPatternFlag.Name))
 | 
			
		||||
	}
 | 
			
		||||
	results := utesting.RunTests(tests, os.Stdout)
 | 
			
		||||
	if fails := utesting.CountFailures(results); fails > 0 {
 | 
			
		||||
		return fmt.Errorf("%v/%v tests passed.", len(tests)-fails, len(tests))
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Printf("%v/%v passed\n", len(tests), len(tests))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func discv5Listen(ctx *cli.Context) error {
 | 
			
		||||
	disc := startV5(ctx)
 | 
			
		||||
	defer disc.Close()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user