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.