From 6cb5e62868c2c08d9c3d7547d402c7b3b1f251c5 Mon Sep 17 00:00:00 2001
From: Jaynti Kanani <jdkanani@gmail.com>
Date: Sat, 14 Nov 2020 12:37:18 +0530
Subject: [PATCH] fix: import/export for bor

---
 cmd/utils/bor_flags.go | 75 ++++++++++++++++++++++++++++++++++++++++++
 cmd/utils/flags.go     | 15 +++++++--
 2 files changed, 88 insertions(+), 2 deletions(-)
 create mode 100644 cmd/utils/bor_flags.go

diff --git a/cmd/utils/bor_flags.go b/cmd/utils/bor_flags.go
new file mode 100644
index 000000000..5e2b31395
--- /dev/null
+++ b/cmd/utils/bor_flags.go
@@ -0,0 +1,75 @@
+package utils
+
+import (
+	"encoding/json"
+	"io/ioutil"
+	"os"
+
+	"github.com/ethereum/go-ethereum/core"
+	"github.com/ethereum/go-ethereum/eth"
+	"github.com/ethereum/go-ethereum/log"
+	"github.com/ethereum/go-ethereum/node"
+	"gopkg.in/urfave/cli.v1"
+)
+
+var (
+	//
+	// Bor Specific flags
+	//
+
+	// HeimdallURLFlag flag for heimdall url
+	HeimdallURLFlag = cli.StringFlag{
+		Name:  "bor.heimdall",
+		Usage: "URL of Heimdall service",
+		Value: "http://localhost:1317",
+	}
+
+	// WithoutHeimdallFlag no heimdall (for testing purpose)
+	WithoutHeimdallFlag = cli.BoolFlag{
+		Name:  "bor.withoutheimdall",
+		Usage: "Run without Heimdall service (for testing purpose)",
+	}
+)
+
+func getGenesis(genesisPath string) (*core.Genesis, error) {
+	log.Info("Reading genesis at ", "file", genesisPath)
+	file, err := os.Open(genesisPath)
+	if err != nil {
+		return nil, err
+	}
+	defer file.Close()
+
+	genesis := new(core.Genesis)
+	if err := json.NewDecoder(file).Decode(genesis); err != nil {
+		return nil, err
+	}
+	return genesis, nil
+}
+
+func createBorEthereum(ctx *cli.Context, cfg *eth.Config) *eth.Ethereum {
+	workspace, err := ioutil.TempDir("", "bor-command-node-")
+	if err != nil {
+		Fatalf("failed to create temporary keystore: %v", err)
+	}
+
+	// Create a networkless protocol stack and start an Ethereum service within
+	stack, err := node.New(&node.Config{DataDir: workspace, UseLightweightKDF: true, Name: "bor-command-node"})
+	if err != nil {
+		Fatalf("failed to create node: %v", err)
+	}
+	ethereum, err := eth.New(stack, cfg)
+	if err != nil {
+		Fatalf("failed to register Ethereum protocol: %v", err)
+	}
+
+	// Start the node and assemble the JavaScript console around it
+	if err = stack.Start(); err != nil {
+		Fatalf("failed to start test stack: %v", err)
+	}
+	_, err = stack.Attach()
+	if err != nil {
+		Fatalf("failed to attach to node: %v", err)
+	}
+
+	return ethereum
+}
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index 80da518c2..c6d84f601 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -1801,15 +1801,26 @@ func MakeGenesis(ctx *cli.Context) *core.Genesis {
 
 // MakeChain creates a chain manager from set command line flags.
 func MakeChain(ctx *cli.Context, stack *node.Node, readOnly bool) (chain *core.BlockChain, chainDb ethdb.Database) {
-	var err error
+	// expecting the last argument to be the genesis file
+	genesis, err := getGenesis(ctx.Args().Get(len(ctx.Args()) - 1))
+	if err != nil {
+		Fatalf("Valid genesis file is required as argument: {}", err)
+	}
+
 	chainDb = MakeChainDatabase(ctx, stack)
-	config, _, err := core.SetupGenesisBlock(chainDb, MakeGenesis(ctx))
+	config, _, err := core.SetupGenesisBlock(chainDb, genesis)
 	if err != nil {
 		Fatalf("%v", err)
 	}
 	var engine consensus.Engine
 	if config.Clique != nil {
 		engine = clique.New(config.Clique, chainDb)
+	} else if config.Bor != nil {
+		engine = createBorEthereum(ctx, &eth.Config{
+			Genesis:         genesis,
+			HeimdallURL:     ctx.GlobalString(HeimdallURLFlag.Name),
+			WithoutHeimdall: ctx.GlobalBool(WithoutHeimdallFlag.Name),
+		}).Engine()
 	} else {
 		engine = ethash.NewFaker()
 		if !ctx.GlobalBool(FakePoWFlag.Name) {
-- 
GitLab