From b1d11d083c54a8b9a611a303977055ec62f9a15c Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Mon, 22 Jun 2020 00:53:00 -0500 Subject: [PATCH 01/17] parent c837dfb2f26d82abf4dfbd184189d57c5b0ddedf author dv8silencer <dv8silencer+github@gmail.com> 1592805180 -0500 committer dv8silencer <dv8silencer+github@gmail.com> 1592855989 -0500 Create a bootstrap-node-file flag which reads nodes from a YAML file and make the flag mutually exclusive to the bootstrap-node flag --- beacon-chain/main.go | 1 + beacon-chain/node/node.go | 12 +++++++++++- beacon-chain/usage.go | 1 + shared/cmd/flags.go | 8 +++++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/beacon-chain/main.go b/beacon-chain/main.go index 44dacce297cd..744cfd4872a0 100644 --- a/beacon-chain/main.go +++ b/beacon-chain/main.go @@ -55,6 +55,7 @@ var appFlags = []cli.Flag{ flags.SlotsPerArchivedPoint, flags.EnableDebugRPCEndpoints, cmd.BootstrapNode, + cmd.BootStrapNodeFile, cmd.NoDiscovery, cmd.StaticPeers, cmd.RelayNode, diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 80e7ceb93c50..6890a439841f 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -48,6 +48,7 @@ import ( "github.com/prysmaticlabs/prysm/shared/version" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" + "gopkg.in/yaml.v2" ) var log = logrus.WithField("prefix", "node") @@ -297,7 +298,6 @@ func (b *BeaconNode) startStateGen() { } func (b *BeaconNode) registerP2P(cliCtx *cli.Context) error { - // Bootnode ENR may be a filepath to an ENR file. bootnodeAddrs := strings.Split(cliCtx.String(cmd.BootstrapNode.Name), ",") for i, addr := range bootnodeAddrs { if filepath.Ext(addr) == ".enr" { @@ -308,6 +308,16 @@ func (b *BeaconNode) registerP2P(cliCtx *cli.Context) error { bootnodeAddrs[i] = string(b) } } + if bootstrapFile := cliCtx.String(cmd.BootStrapNodeFile.Name); bootstrapFile != "" { + bootnodeAddrs = make([]string, 0) + fileContent, err := ioutil.ReadFile(bootstrapFile) + if err != nil { + return err + } + listNodes := make([]string, 0) + yaml.Unmarshal(fileContent, &listNodes) + bootnodeAddrs = append(bootnodeAddrs, listNodes...) + } datadir := cliCtx.String(cmd.DataDirFlag.Name) if datadir == "" { diff --git a/beacon-chain/usage.go b/beacon-chain/usage.go index 1743eb974301..48cf449e43a6 100644 --- a/beacon-chain/usage.go +++ b/beacon-chain/usage.go @@ -46,6 +46,7 @@ var appHelpFlagGroups = []flagGroup{ Flags: []cli.Flag{ cmd.NoDiscovery, cmd.BootstrapNode, + cmd.BootStrapNodeFile, cmd.RelayNode, cmd.P2PUDPPort, cmd.P2PTCPPort, diff --git a/shared/cmd/flags.go b/shared/cmd/flags.go index d36076ded07b..6f60dab0c288 100644 --- a/shared/cmd/flags.go +++ b/shared/cmd/flags.go @@ -66,9 +66,15 @@ var ( // BootstrapNode tells the beacon node which bootstrap node to connect to BootstrapNode = &cli.StringFlag{ Name: "bootstrap-node", - Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be separated with a comma", + Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be separated with a comma. Ignored if the bootstrap-node-file flag is used.", Value: "enr:-Ku4QMKVC_MowDsmEa20d5uGjrChI0h8_KsKXDmgVQbIbngZV0idV6_RL7fEtZGo-kTNZ5o7_EJI_vCPJ6scrhwX0Z4Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQJxCnE6v_x2ekgY_uoE1rtwzvGy40mq9eD66XfHPBWgIIN1ZHCCD6A", } + //BootStrapNodeFile identifies a YAML file that lists bootstrap nodes + BootStrapNodeFile = &cli.StringFlag{ + Name: "bootstrap-node-file", + Usage: "Path to a YAML file that lists bootstrap nodes that the beacon node will connect for peer discovery via DHT. Setting this flag will cause the bootstrap-node flag to be ignored. One line per node in YAML list format.", + Value: "", + } // RelayNode tells the beacon node which relay node to connect to. RelayNode = &cli.StringFlag{ Name: "relay-node", From 77e923376b49ab692bd9adc139f9b97c7bf6ff0c Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Mon, 22 Jun 2020 19:06:10 -0500 Subject: [PATCH 02/17] Refactor so that boot node reading is in its own function. Added test --- beacon-chain/node/node.go | 32 ++++++++++++++++---------------- beacon-chain/node/node_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 6890a439841f..e4b567edd859 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -297,26 +297,26 @@ func (b *BeaconNode) startStateGen() { b.stateGen = stategen.New(b.db, b.stateSummaryCache) } -func (b *BeaconNode) registerP2P(cliCtx *cli.Context) error { - bootnodeAddrs := strings.Split(cliCtx.String(cmd.BootstrapNode.Name), ",") - for i, addr := range bootnodeAddrs { - if filepath.Ext(addr) == ".enr" { - b, err := ioutil.ReadFile(addr) - if err != nil { - return err - } - bootnodeAddrs[i] = string(b) - } +func readbootNodes(fileName string) ([]string, error) { + fileContent, err := ioutil.ReadFile(fileName) + if err != nil { + return nil, err } - if bootstrapFile := cliCtx.String(cmd.BootStrapNodeFile.Name); bootstrapFile != "" { - bootnodeAddrs = make([]string, 0) - fileContent, err := ioutil.ReadFile(bootstrapFile) + listNodes := make([]string, 0) + yaml.Unmarshal(fileContent, &listNodes) + return listNodes, nil +} + +func (b *BeaconNode) registerP2P(cliCtx *cli.Context) error { + bootnodeAddrs := make([]string, 0) + var err error + if bootstrapfileName := cliCtx.String(cmd.BootStrapNodeFile.Name); bootstrapfileName != "" { + bootnodeAddrs, err = readbootNodes(bootstrapfileName) if err != nil { return err } - listNodes := make([]string, 0) - yaml.Unmarshal(fileContent, &listNodes) - bootnodeAddrs = append(bootnodeAddrs, listNodes...) + } else { + bootnodeAddrs = strings.Split(cliCtx.String(cmd.BootstrapNode.Name), ",") } datadir := cliCtx.String(cmd.DataDirFlag.Name) diff --git a/beacon-chain/node/node_test.go b/beacon-chain/node/node_test.go index 3569bcd6094b..b122184eab9c 100644 --- a/beacon-chain/node/node_test.go +++ b/beacon-chain/node/node_test.go @@ -3,6 +3,7 @@ package node import ( "flag" "fmt" + "io/ioutil" "os" "testing" @@ -47,3 +48,31 @@ func TestNodeClose_OK(t *testing.T) { t.Log(err) } } +func TestBootStrapNodeFile(t *testing.T) { + if _, err := os.Stat("sampleNodes.enr"); os.IsExist(err) { + t.Fatalf("File sampleNodes.enr already exists. Aborting test so that file is not altered.") + } + + defer func() { + err := os.Remove("sampleNodes.enr") + if err != nil { + t.Error("Could not delete temporary file sampleNodes.enr") + } + }() + + sampleNode0 := "- enr:-Ku4QMKVC_MowDsmEa20d5uGjrChI0h8_KsKXDmgVQbIbngZV0i" + + "dV6_RL7fEtZGo-kTNZ5o7_EJI_vCPJ6scrhwX0Z4Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD" + + "1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQJxCnE6v_x2ekgY_uo" + + "E1rtwzvGy40mq9eD66XfHPBWgIIN1ZHCCD6A" + sampleNode1 := "- enr:-TESTNODE2" + sampleNode2 := "- enr:-TESTNODE3" + err := ioutil.WriteFile("sampleNodes.enr", []byte(sampleNode0+"\n"+sampleNode1+"\n"+sampleNode2), 0644) + if err != nil { + t.Fatalf("Could not write sample file sampleNodes.enr") + } + nodeList, err := readbootNodes("sampleNodes.enr") + if nodeList[0] != sampleNode0[2:] || nodeList[1] != sampleNode1[2:] || nodeList[2] != sampleNode2[2:] { + // nodeList's YAML parsing will have removed the leading "- " + t.Fatalf("TestBootStrapNodeFile failed. Nodes do not match") + } +} From 0fc7f9fa709ebfb80042b74ead8d620573d39a94 Mon Sep 17 00:00:00 2001 From: dv8silencer <15720668+dv8silencer@users.noreply.github.com> Date: Mon, 22 Jun 2020 19:20:38 -0500 Subject: [PATCH 03/17] Added period Co-authored-by: terence tsao <terence@prysmaticlabs.com> --- shared/cmd/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/cmd/flags.go b/shared/cmd/flags.go index 6f60dab0c288..61a000a3936a 100644 --- a/shared/cmd/flags.go +++ b/shared/cmd/flags.go @@ -69,7 +69,7 @@ var ( Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be separated with a comma. Ignored if the bootstrap-node-file flag is used.", Value: "enr:-Ku4QMKVC_MowDsmEa20d5uGjrChI0h8_KsKXDmgVQbIbngZV0idV6_RL7fEtZGo-kTNZ5o7_EJI_vCPJ6scrhwX0Z4Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQJxCnE6v_x2ekgY_uoE1rtwzvGy40mq9eD66XfHPBWgIIN1ZHCCD6A", } - //BootStrapNodeFile identifies a YAML file that lists bootstrap nodes + //BootStrapNodeFile identifies a YAML file that lists bootstrap nodes. BootStrapNodeFile = &cli.StringFlag{ Name: "bootstrap-node-file", Usage: "Path to a YAML file that lists bootstrap nodes that the beacon node will connect for peer discovery via DHT. Setting this flag will cause the bootstrap-node flag to be ignored. One line per node in YAML list format.", From 01abde274e2e25306b278043a9f8dfb4eb92c584 Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Mon, 22 Jun 2020 20:49:21 -0500 Subject: [PATCH 04/17] Edit Bazel to include go-yaml dep --- beacon-chain/node/BUILD.bazel | 1 + 1 file changed, 1 insertion(+) diff --git a/beacon-chain/node/BUILD.bazel b/beacon-chain/node/BUILD.bazel index 0d0f562d7b00..0704a3f5d34c 100644 --- a/beacon-chain/node/BUILD.bazel +++ b/beacon-chain/node/BUILD.bazel @@ -36,6 +36,7 @@ go_library( "//shared/sliceutil:go_default_library", "//shared/tracing:go_default_library", "//shared/version:go_default_library", + "@com_github_go_yaml_yaml//:go_default_library", "@com_github_ethereum_go_ethereum//common:go_default_library", "@com_github_pkg_errors//:go_default_library", "@com_github_sirupsen_logrus//:go_default_library", From 33a959b14433f3507dffb3084ba06063ccf52c50 Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Mon, 22 Jun 2020 21:01:55 -0500 Subject: [PATCH 05/17] Help Bazel build successfully --- beacon-chain/BUILD.bazel | 1 + 1 file changed, 1 insertion(+) diff --git a/beacon-chain/BUILD.bazel b/beacon-chain/BUILD.bazel index 2f4a049306d4..1058b99996f3 100644 --- a/beacon-chain/BUILD.bazel +++ b/beacon-chain/BUILD.bazel @@ -21,6 +21,7 @@ go_library( "//shared/featureconfig:go_default_library", "//shared/logutil:go_default_library", "//shared/version:go_default_library", + "@com_github_go_yaml_yaml//:go_default_library", "@com_github_ethereum_go_ethereum//log:go_default_library", "@com_github_ipfs_go_log_v2//:go_default_library", "@com_github_joonix_log//:go_default_library", From eb0a658b155fc1ef3e8c5d60ac121e67d87dc784 Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Mon, 22 Jun 2020 21:40:43 -0500 Subject: [PATCH 06/17] bazel run //:gazella -- fix --- beacon-chain/BUILD.bazel | 1 - beacon-chain/node/BUILD.bazel | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/beacon-chain/BUILD.bazel b/beacon-chain/BUILD.bazel index 1058b99996f3..2f4a049306d4 100644 --- a/beacon-chain/BUILD.bazel +++ b/beacon-chain/BUILD.bazel @@ -21,7 +21,6 @@ go_library( "//shared/featureconfig:go_default_library", "//shared/logutil:go_default_library", "//shared/version:go_default_library", - "@com_github_go_yaml_yaml//:go_default_library", "@com_github_ethereum_go_ethereum//log:go_default_library", "@com_github_ipfs_go_log_v2//:go_default_library", "@com_github_joonix_log//:go_default_library", diff --git a/beacon-chain/node/BUILD.bazel b/beacon-chain/node/BUILD.bazel index 0704a3f5d34c..470f7919ac8f 100644 --- a/beacon-chain/node/BUILD.bazel +++ b/beacon-chain/node/BUILD.bazel @@ -36,11 +36,11 @@ go_library( "//shared/sliceutil:go_default_library", "//shared/tracing:go_default_library", "//shared/version:go_default_library", - "@com_github_go_yaml_yaml//:go_default_library", "@com_github_ethereum_go_ethereum//common:go_default_library", "@com_github_pkg_errors//:go_default_library", "@com_github_sirupsen_logrus//:go_default_library", "@com_github_urfave_cli_v2//:go_default_library", + "@in_gopkg_yaml_v2//:go_default_library", ], ) From c29bad41e2e99649bbe3409a28d2e6a6e9cd5fb1 Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Mon, 22 Jun 2020 21:59:41 -0500 Subject: [PATCH 07/17] Handle error from YAML parser to address build checks --- beacon-chain/node/node.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index e4b567edd859..499f01b09dde 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -303,7 +303,10 @@ func readbootNodes(fileName string) ([]string, error) { return nil, err } listNodes := make([]string, 0) - yaml.Unmarshal(fileContent, &listNodes) + err = yaml.Unmarshal(fileContent, &listNodes) + if err != nil { + return nil, err + } return listNodes, nil } From a374c0b52a4e404b7c8145991db19d4ea07cb050 Mon Sep 17 00:00:00 2001 From: dv8silencer <15720668+dv8silencer@users.noreply.github.com> Date: Tue, 23 Jun 2020 00:43:16 -0500 Subject: [PATCH 08/17] Updated flags.go to refine the Usage for the BootStrapNodeFile flag Co-authored-by: Nishant Das <nish1993@hotmail.com> --- shared/cmd/flags.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/cmd/flags.go b/shared/cmd/flags.go index 61a000a3936a..6701a71941c4 100644 --- a/shared/cmd/flags.go +++ b/shared/cmd/flags.go @@ -72,7 +72,7 @@ var ( //BootStrapNodeFile identifies a YAML file that lists bootstrap nodes. BootStrapNodeFile = &cli.StringFlag{ Name: "bootstrap-node-file", - Usage: "Path to a YAML file that lists bootstrap nodes that the beacon node will connect for peer discovery via DHT. Setting this flag will cause the bootstrap-node flag to be ignored. One line per node in YAML list format.", + Usage: "Path to a YAML file that lists bootstrap nodes that the beacon node will connect for peer discovery via DiscoveryV5. Setting this flag will cause the bootstrap-node flag to be ignored.", Value: "", } // RelayNode tells the beacon node which relay node to connect to. From 0492cad38991b32f2907c106adf1cc40e88d4e08 Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Tue, 23 Jun 2020 09:43:31 -0500 Subject: [PATCH 09/17] Utilize stdlib TempFile to avoid polluting --- beacon-chain/node/node_test.go | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/beacon-chain/node/node_test.go b/beacon-chain/node/node_test.go index b122184eab9c..9b448bcf9124 100644 --- a/beacon-chain/node/node_test.go +++ b/beacon-chain/node/node_test.go @@ -49,14 +49,13 @@ func TestNodeClose_OK(t *testing.T) { } } func TestBootStrapNodeFile(t *testing.T) { - if _, err := os.Stat("sampleNodes.enr"); os.IsExist(err) { - t.Fatalf("File sampleNodes.enr already exists. Aborting test so that file is not altered.") + file, err := ioutil.TempFile(testutil.TempDir(), "bootstrapFile") + if err != nil { + t.Fatalf("Error in TempFile call: %v", err) } - defer func() { - err := os.Remove("sampleNodes.enr") - if err != nil { - t.Error("Could not delete temporary file sampleNodes.enr") + if err := os.Remove(file.Name()); err != nil { + t.Log(err) } }() @@ -66,11 +65,14 @@ func TestBootStrapNodeFile(t *testing.T) { "E1rtwzvGy40mq9eD66XfHPBWgIIN1ZHCCD6A" sampleNode1 := "- enr:-TESTNODE2" sampleNode2 := "- enr:-TESTNODE3" - err := ioutil.WriteFile("sampleNodes.enr", []byte(sampleNode0+"\n"+sampleNode1+"\n"+sampleNode2), 0644) + err = ioutil.WriteFile(file.Name(), []byte(sampleNode0+"\n"+sampleNode1+"\n"+sampleNode2), 0644) + if err != nil { + t.Fatalf("Error in WriteFile call: %v", err) + } + nodeList, err := readbootNodes(file.Name()) if err != nil { - t.Fatalf("Could not write sample file sampleNodes.enr") + t.Fatalf("Error in readbootNodes call: %v", err) } - nodeList, err := readbootNodes("sampleNodes.enr") if nodeList[0] != sampleNode0[2:] || nodeList[1] != sampleNode1[2:] || nodeList[2] != sampleNode2[2:] { // nodeList's YAML parsing will have removed the leading "- " t.Fatalf("TestBootStrapNodeFile failed. Nodes do not match") From a7923fa881be293e703e23527a7fe3d24d905dd3 Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Thu, 25 Jun 2020 20:13:40 -0500 Subject: [PATCH 10/17] Changed bootstrap-node to StringSlice flag to allow multiple nodes to be passed. Each value can be .enr file which will be YAML parsed to extract nodes --- beacon-chain/node/BUILD.bazel | 1 + beacon-chain/node/node.go | 23 ++++++++++++++++++----- shared/cmd/flags.go | 9 +++++---- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/beacon-chain/node/BUILD.bazel b/beacon-chain/node/BUILD.bazel index 0d0f562d7b00..470f7919ac8f 100644 --- a/beacon-chain/node/BUILD.bazel +++ b/beacon-chain/node/BUILD.bazel @@ -40,6 +40,7 @@ go_library( "@com_github_pkg_errors//:go_default_library", "@com_github_sirupsen_logrus//:go_default_library", "@com_github_urfave_cli_v2//:go_default_library", + "@in_gopkg_yaml_v2//:go_default_library", ], ) diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 9fa5602ba2e3..1d9566e39970 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -48,6 +48,7 @@ import ( "github.com/prysmaticlabs/prysm/shared/version" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" + "gopkg.in/yaml.v2" ) var log = logrus.WithField("prefix", "node") @@ -114,7 +115,7 @@ func NewBeaconNode(cliCtx *cli.Context) (*BeaconNode, error) { } if cliCtx.IsSet(cmd.BootstrapNode.Name) { c := params.BeaconNetworkConfig() - c.BootstrapNodes = strings.Split(cliCtx.String(cmd.BootstrapNode.Name), ",") + c.BootstrapNodes = cliCtx.StringSlice(cmd.BootstrapNode.Name) params.OverrideBeaconNetworkConfig(c) } if cliCtx.IsSet(flags.ContractDeploymentBlock.Name) { @@ -317,16 +318,28 @@ func (b *BeaconNode) startStateGen() { func (b *BeaconNode) registerP2P(cliCtx *cli.Context) error { // Bootnode ENR may be a filepath to an ENR file. - bootnodeAddrs := params.BeaconNetworkConfig().BootstrapNodes - for i, addr := range bootnodeAddrs { + bootnodesTemp := params.BeaconNetworkConfig().BootstrapNodes + bootnodeAddrs := make([]string, 0) //final list of nodes pending creation + allNodesTemp := make([][]string, 0) //each potential .enr file will end up as slice of strings + for i, addr := range bootnodesTemp { + innerList := make([]string, 0) + allNodesTemp = append(allNodesTemp, innerList) if filepath.Ext(addr) == ".enr" { - b, err := ioutil.ReadFile(addr) + fileContent, err := ioutil.ReadFile(addr) if err != nil { return err } - bootnodeAddrs[i] = string(b) + err = yaml.Unmarshal(fileContent, &(allNodesTemp[i])) + if err != nil { + return err + } + } else { + allNodesTemp[i] = []string{bootnodesTemp[i]} } } + for _, nodeSlice := range allNodesTemp { + bootnodeAddrs = append(bootnodeAddrs, nodeSlice...) + } datadir := cliCtx.String(cmd.DataDirFlag.Name) if datadir == "" { diff --git a/shared/cmd/flags.go b/shared/cmd/flags.go index 462f58be24ad..f728f9905753 100644 --- a/shared/cmd/flags.go +++ b/shared/cmd/flags.go @@ -80,10 +80,11 @@ var ( Usage: "Connect with this peer. This flag may be used multiple times.", } // BootstrapNode tells the beacon node which bootstrap node to connect to - BootstrapNode = &cli.StringFlag{ - Name: "bootstrap-node", - Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be separated with a comma", - Value: "enr:-Ku4QMKVC_MowDsmEa20d5uGjrChI0h8_KsKXDmgVQbIbngZV0idV6_RL7fEtZGo-kTNZ5o7_EJI_vCPJ6scrhwX0Z4Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQJxCnE6v_x2ekgY_uoE1rtwzvGy40mq9eD66XfHPBWgIIN1ZHCCD6A", + BootstrapNode = &cli.StringSliceFlag{ + Name: "bootstrap-node", + Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be passed by using the flag multiple times instead of comma-separated." + + " You can also pass YAML files ending with .enr", + Value: cli.NewStringSlice("enr:-Ku4QMKVC_MowDsmEa20d5uGjrChI0h8_KsKXDmgVQbIbngZV0idV6_RL7fEtZGo-kTNZ5o7_EJI_vCPJ6scrhwX0Z4Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQJxCnE6v_x2ekgY_uoE1rtwzvGy40mq9eD66XfHPBWgIIN1ZHCCD6A"), } // RelayNode tells the beacon node which relay node to connect to. RelayNode = &cli.StringFlag{ From 97597f613ed07d17c48b5845409550b1d5b43f5a Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Thu, 25 Jun 2020 20:26:28 -0500 Subject: [PATCH 11/17] Refactored to create separate readbootNodes function and added a test for it. --- beacon-chain/node/node.go | 20 +++++++++++++++----- beacon-chain/node/node_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 1d9566e39970..a337d704835b 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -316,6 +316,19 @@ func (b *BeaconNode) startStateGen() { b.stateGen = stategen.New(b.db, b.stateSummaryCache) } +func readbootNodes(fileName string) ([]string, error) { + fileContent, err := ioutil.ReadFile(fileName) + if err != nil { + return nil, err + } + listNodes := make([]string, 0) + err = yaml.Unmarshal(fileContent, &listNodes) + if err != nil { + return nil, err + } + return listNodes, nil +} + func (b *BeaconNode) registerP2P(cliCtx *cli.Context) error { // Bootnode ENR may be a filepath to an ENR file. bootnodesTemp := params.BeaconNetworkConfig().BootstrapNodes @@ -325,11 +338,8 @@ func (b *BeaconNode) registerP2P(cliCtx *cli.Context) error { innerList := make([]string, 0) allNodesTemp = append(allNodesTemp, innerList) if filepath.Ext(addr) == ".enr" { - fileContent, err := ioutil.ReadFile(addr) - if err != nil { - return err - } - err = yaml.Unmarshal(fileContent, &(allNodesTemp[i])) + var err error + allNodesTemp[i], err = readbootNodes(addr) if err != nil { return err } diff --git a/beacon-chain/node/node_test.go b/beacon-chain/node/node_test.go index 3569bcd6094b..98456da1e259 100644 --- a/beacon-chain/node/node_test.go +++ b/beacon-chain/node/node_test.go @@ -3,6 +3,7 @@ package node import ( "flag" "fmt" + "io/ioutil" "os" "testing" @@ -47,3 +48,34 @@ func TestNodeClose_OK(t *testing.T) { t.Log(err) } } + +func TestBootStrapNodeFile(t *testing.T) { + file, err := ioutil.TempFile(testutil.TempDir(), "bootstrapFile") + if err != nil { + t.Fatalf("Error in TempFile call: %v", err) + } + defer func() { + if err := os.Remove(file.Name()); err != nil { + t.Log(err) + } + }() + + sampleNode0 := "- enr:-Ku4QMKVC_MowDsmEa20d5uGjrChI0h8_KsKXDmgVQbIbngZV0i" + + "dV6_RL7fEtZGo-kTNZ5o7_EJI_vCPJ6scrhwX0Z4Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD" + + "1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQJxCnE6v_x2ekgY_uo" + + "E1rtwzvGy40mq9eD66XfHPBWgIIN1ZHCCD6A" + sampleNode1 := "- enr:-TESTNODE2" + sampleNode2 := "- enr:-TESTNODE3" + err = ioutil.WriteFile(file.Name(), []byte(sampleNode0+"\n"+sampleNode1+"\n"+sampleNode2), 0644) + if err != nil { + t.Fatalf("Error in WriteFile call: %v", err) + } + nodeList, err := readbootNodes(file.Name()) + if err != nil { + t.Fatalf("Error in readbootNodes call: %v", err) + } + if nodeList[0] != sampleNode0[2:] || nodeList[1] != sampleNode1[2:] || nodeList[2] != sampleNode2[2:] { + // nodeList's YAML parsing will have removed the leading "- " + t.Fatalf("TestBootStrapNodeFile failed. Nodes do not match") + } +} From 6f28169308a89443de9f04d0eff8738733fea7bb Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Thu, 25 Jun 2020 20:44:43 -0500 Subject: [PATCH 12/17] More cleaning up --- beacon-chain/node/node.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index a337d704835b..618be4765764 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -331,25 +331,19 @@ func readbootNodes(fileName string) ([]string, error) { func (b *BeaconNode) registerP2P(cliCtx *cli.Context) error { // Bootnode ENR may be a filepath to an ENR file. - bootnodesTemp := params.BeaconNetworkConfig().BootstrapNodes - bootnodeAddrs := make([]string, 0) //final list of nodes pending creation - allNodesTemp := make([][]string, 0) //each potential .enr file will end up as slice of strings - for i, addr := range bootnodesTemp { - innerList := make([]string, 0) - allNodesTemp = append(allNodesTemp, innerList) + bootnodesTemp := params.BeaconNetworkConfig().BootstrapNodes //actual CLI values + bootnodeAddrs := make([]string, 0) //dest of final list of nodes + for _, addr := range bootnodesTemp { if filepath.Ext(addr) == ".enr" { - var err error - allNodesTemp[i], err = readbootNodes(addr) + fileNodes, err := readbootNodes(addr) if err != nil { return err } + bootnodeAddrs = append(bootnodeAddrs, fileNodes...) } else { - allNodesTemp[i] = []string{bootnodesTemp[i]} + bootnodeAddrs = append(bootnodeAddrs, addr) } } - for _, nodeSlice := range allNodesTemp { - bootnodeAddrs = append(bootnodeAddrs, nodeSlice...) - } datadir := cliCtx.String(cmd.DataDirFlag.Name) if datadir == "" { From 2b4136640ca5e2b50dd84e6ca6f590f7ed4411d5 Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Thu, 25 Jun 2020 20:54:30 -0500 Subject: [PATCH 13/17] Changed wording in the cli help for --bootstrap-node --- shared/cmd/flags.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/cmd/flags.go b/shared/cmd/flags.go index f728f9905753..1a46907bf5d7 100644 --- a/shared/cmd/flags.go +++ b/shared/cmd/flags.go @@ -82,8 +82,8 @@ var ( // BootstrapNode tells the beacon node which bootstrap node to connect to BootstrapNode = &cli.StringSliceFlag{ Name: "bootstrap-node", - Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be passed by using the flag multiple times instead of comma-separated." + - " You can also pass YAML files ending with .enr", + Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be passed by using the flag multiple times but not comma-separated." + + " You can also pass YAML files ending with .enr containing multiple nodes.", Value: cli.NewStringSlice("enr:-Ku4QMKVC_MowDsmEa20d5uGjrChI0h8_KsKXDmgVQbIbngZV0idV6_RL7fEtZGo-kTNZ5o7_EJI_vCPJ6scrhwX0Z4Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQJxCnE6v_x2ekgY_uoE1rtwzvGy40mq9eD66XfHPBWgIIN1ZHCCD6A"), } // RelayNode tells the beacon node which relay node to connect to. From 6bd15cb3a79a735ccc60b52dd2977aa4a7f88afe Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Thu, 25 Jun 2020 21:53:48 -0500 Subject: [PATCH 14/17] Since we are taking YAML files, got rid of .enr check and instead we check for the string prefix of a enr record or not to determine if file. --- beacon-chain/node/node.go | 4 ++-- shared/cmd/flags.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 618be4765764..59d09277fa1d 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -330,11 +330,11 @@ func readbootNodes(fileName string) ([]string, error) { } func (b *BeaconNode) registerP2P(cliCtx *cli.Context) error { - // Bootnode ENR may be a filepath to an ENR file. + // Bootnode ENR may be a filepath to a YAML file bootnodesTemp := params.BeaconNetworkConfig().BootstrapNodes //actual CLI values bootnodeAddrs := make([]string, 0) //dest of final list of nodes for _, addr := range bootnodesTemp { - if filepath.Ext(addr) == ".enr" { + if addr[:5] != "enr:-" { fileNodes, err := readbootNodes(addr) if err != nil { return err diff --git a/shared/cmd/flags.go b/shared/cmd/flags.go index 1a46907bf5d7..015f7ef9084e 100644 --- a/shared/cmd/flags.go +++ b/shared/cmd/flags.go @@ -83,7 +83,7 @@ var ( BootstrapNode = &cli.StringSliceFlag{ Name: "bootstrap-node", Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be passed by using the flag multiple times but not comma-separated." + - " You can also pass YAML files ending with .enr containing multiple nodes.", + " You can also pass YAML files containing multiple nodes.", Value: cli.NewStringSlice("enr:-Ku4QMKVC_MowDsmEa20d5uGjrChI0h8_KsKXDmgVQbIbngZV0idV6_RL7fEtZGo-kTNZ5o7_EJI_vCPJ6scrhwX0Z4Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQJxCnE6v_x2ekgY_uoE1rtwzvGy40mq9eD66XfHPBWgIIN1ZHCCD6A"), } // RelayNode tells the beacon node which relay node to connect to. From a2d48c7ca534cc82f41df2fd848d25c3151931b4 Mon Sep 17 00:00:00 2001 From: dv8silencer <15720668+dv8silencer@users.noreply.github.com> Date: Thu, 25 Jun 2020 22:23:45 -0500 Subject: [PATCH 15/17] Correct spacing Co-authored-by: Preston Van Loon <preston@prysmaticlabs.com> --- shared/cmd/flags.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/cmd/flags.go b/shared/cmd/flags.go index 015f7ef9084e..a91f73ca84b5 100644 --- a/shared/cmd/flags.go +++ b/shared/cmd/flags.go @@ -82,8 +82,8 @@ var ( // BootstrapNode tells the beacon node which bootstrap node to connect to BootstrapNode = &cli.StringSliceFlag{ Name: "bootstrap-node", - Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be passed by using the flag multiple times but not comma-separated." + - " You can also pass YAML files containing multiple nodes.", + Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be passed by using the flag multiple times but not comma-separated. " + + "You can also pass YAML files containing multiple nodes.", Value: cli.NewStringSlice("enr:-Ku4QMKVC_MowDsmEa20d5uGjrChI0h8_KsKXDmgVQbIbngZV0idV6_RL7fEtZGo-kTNZ5o7_EJI_vCPJ6scrhwX0Z4Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQJxCnE6v_x2ekgY_uoE1rtwzvGy40mq9eD66XfHPBWgIIN1ZHCCD6A"), } // RelayNode tells the beacon node which relay node to connect to. From 4ce0fff167ca934b3681c6ca81e82da37a1b35e9 Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Thu, 25 Jun 2020 22:33:28 -0500 Subject: [PATCH 16/17] Changed how we check for YAML file vs CLI-direct ENR --- beacon-chain/node/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 59d09277fa1d..12bbf72dfcc7 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -334,7 +334,7 @@ func (b *BeaconNode) registerP2P(cliCtx *cli.Context) error { bootnodesTemp := params.BeaconNetworkConfig().BootstrapNodes //actual CLI values bootnodeAddrs := make([]string, 0) //dest of final list of nodes for _, addr := range bootnodesTemp { - if addr[:5] != "enr:-" { + if filepath.Ext(addr) == ".yaml" { fileNodes, err := readbootNodes(addr) if err != nil { return err From 4c0714d03dfece8871bae837b1eb90ed35021f7f Mon Sep 17 00:00:00 2001 From: dv8silencer <dv8silencer+github@gmail.com> Date: Thu, 25 Jun 2020 22:42:28 -0500 Subject: [PATCH 17/17] Minor: Changed to 1 string from concatenating 2 --- shared/cmd/flags.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/shared/cmd/flags.go b/shared/cmd/flags.go index a91f73ca84b5..4a113b2ab339 100644 --- a/shared/cmd/flags.go +++ b/shared/cmd/flags.go @@ -81,9 +81,8 @@ var ( } // BootstrapNode tells the beacon node which bootstrap node to connect to BootstrapNode = &cli.StringSliceFlag{ - Name: "bootstrap-node", - Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be passed by using the flag multiple times but not comma-separated. " + - "You can also pass YAML files containing multiple nodes.", + Name: "bootstrap-node", + Usage: "The address of bootstrap node. Beacon node will connect for peer discovery via DHT. Multiple nodes can be passed by using the flag multiple times but not comma-separated. You can also pass YAML files containing multiple nodes.", Value: cli.NewStringSlice("enr:-Ku4QMKVC_MowDsmEa20d5uGjrChI0h8_KsKXDmgVQbIbngZV0idV6_RL7fEtZGo-kTNZ5o7_EJI_vCPJ6scrhwX0Z4Bh2F0dG5ldHOIAAAAAAAAAACEZXRoMpD1pf1CAAAAAP__________gmlkgnY0gmlwhBLf22SJc2VjcDI1NmsxoQJxCnE6v_x2ekgY_uoE1rtwzvGy40mq9eD66XfHPBWgIIN1ZHCCD6A"), } // RelayNode tells the beacon node which relay node to connect to.