From 1cd6cde4277dd30deb5a533446e516649fb9fbce Mon Sep 17 00:00:00 2001 From: otherview Date: Thu, 13 Jun 2024 17:17:39 +0100 Subject: [PATCH 1/3] Docker Implementation --- .github/README.md | 19 +++- .github/README.old.md | 97 ---------------- cmd/cmd/api.go | 2 + cmd/cmd/cmd.go | 15 ++- entrypoint/api/http_api.go | 4 +- entrypoint/cmd/cmd.go | 4 +- environments/docker/docker.go | 172 +++++++++++++++++++++++++++++ environments/docker/docker_node.go | 166 ++++++++++++++++++++++++++++ environments/docker/docker_test.go | 73 ++++++++++++ environments/docker/ip_manager.go | 50 +++++++++ environments/local/local.go | 6 +- environments/local/local_node.go | 12 +- environments/local/local_test.go | 10 +- go.mod | 31 +++++- go.sum | 100 +++++++++++++++-- hub/hub.go | 2 +- network/node/node.go | 18 ++- preset/LocalSixNodes.go | 12 -- preset/LocalThreeMasterNodes.go | 14 +-- preset/preset.go | 3 + 20 files changed, 656 insertions(+), 154 deletions(-) delete mode 100644 .github/README.old.md create mode 100644 environments/docker/docker.go create mode 100644 environments/docker/docker_node.go create mode 100644 environments/docker/docker_test.go create mode 100644 environments/docker/ip_manager.go diff --git a/.github/README.md b/.github/README.md index 3fe249b..91a0ea4 100644 --- a/.github/README.md +++ b/.github/README.md @@ -7,7 +7,7 @@ networkHub is a versatile framework designed to streamline the process of launch ### **Launch Pre-configured Network via command line**: ```bash # Setup the preset network - > go run cmd/main.go cmd preset threeMasterNodesNetwork /Users/pedro/go/src/github.com/vechain/thor/bin/thor + > go run cmd/main.go cmd preset local threeMasterNodesNetwork /Users/pedro/go/src/github.com/vechain/thor/bin/thor ... 2024/06/07 17:31:43 INFO preset network config was successful... networkId=localthreeMaster @@ -18,6 +18,21 @@ networkHub is a versatile framework designed to streamline the process of launch 2024/06/07 17:31:57 INFO Starting network... ID=localthreeMaster ... ``` +### **Launch Pre-configured Network via command line using Docker**: + ```bash + # Setup the preset network + > go run cmd/main.go cmd preset docker threeMasterNodesNetwork vechain/thor:latest + ... + 2024/06/13 17:15:18 INFO Configuring network... + 2024/06/13 17:15:18 INFO Network saved to file filepath=/Users/pedro/go/src/github.com/vechain/networkhub/networks_db.json + 2024/06/13 17:15:18 INFO preset network config was successful... networkId=dockerthreeMaster + + # Start preset network + > go run cmd/main.go cmd start dockerthreeMaster + 2024/06/13 17:16:05 INFO Network created networkName=dockerthreeMaster-network + 2024/06/13 17:16:06 INFO network started successfully... + ... + ``` ### **Launch Pre-configured Network via API server**: @@ -32,7 +47,7 @@ networkHub is a versatile framework designed to streamline the process of launch # Start a local pre-setup configured network # Must specify the path to thor locally curl -X POST http://localhost:8080/preset/threeMasterNodesNetwork \ - -d '{"artifactPath":"/Users/pedro/go/src/github.com/vechain/thor/bin/thor"}' + -d '{"artifactPath":"/Users/pedro/go/src/github.com/vechain/thor/bin/thor", "environment":"local"}' # Response {"networkId": "localthreeMasterNodes"} diff --git a/.github/README.old.md b/.github/README.old.md deleted file mode 100644 index de326e0..0000000 --- a/.github/README.old.md +++ /dev/null @@ -1,97 +0,0 @@ -# Project - - - -![Project Logo](project-logo.png) - -## Introduction - -A brief description of your project, its purpose, and main features. - -This is a template repository, that allows you to quickly create new repos with the following templates: -1. [README.md](README.old) -2. [CONTRIBUTING.md](CONTRIBUTING.md) -3. [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) -4. [CODEOWNERS](CODEOWNERS) -5. [LICENSE.md](LICENSE.md) - -Consider turning on branch protection for `main` as follows: -1. Require a pull request before merging. - 1. Require 1 approval. - 2. Dismiss stale pull request approvals when new commits are pushed. - 3. Require review from Code Owners. - 4. Require approval of the most recent reviewable push. -2. Require status checks to pass before merging. -3. Require branches to be up to date before merging. -4. Require conversation resolution before merging. -5. Require deployments to succeed before merging. - -## Table of Contents - -- [Project](#project) - - [Introduction](#introduction) - - [Table of Contents](#table-of-contents) - - [Getting Started](#getting-started) - - [Prerequisites](#prerequisites) - - [Installation](#installation) - - [Configuration](#configuration) - - [Usage](#usage) - - [Documentation](#documentation) - - [Contributing](#contributing) - - [Roadmap](#roadmap) - - [Changelog](#changelog) - - [License](#license) - - [Credits](#credits) - -## Getting Started - -### Prerequisites - -List the required software, libraries, or tools needed to use or contribute to the project. - -### Installation - -Provide step-by-step instructions for installing the project, including any required dependencies. - -```bash -# Example installation commands -``` - -### Configuration - -Explain how to configure the project, if necessary. - -### Usage - -Include code examples or usage instructions to help users get started quickly. - -### Documentation - -Link to any additional documentation or tutorials, either within your repository or hosted externally. - -### Contributing - -Explain how others can contribute to the project. Include information on: - - How to submit bug reports or feature requests. - The process for submitting pull requests. - Any specific coding standards or guidelines. - The best way to get in touch with the maintainers, if needed. - -You may use [a separate `CONTRIBUTING` file](CONTRIBUTING.md) to keep your `README.md` short. - -### Roadmap - -Share the project's development roadmap, if available, including planned features and improvements. - -### Changelog - -Keep a log of all notable changes and updates in the project. - -### License - -This project is licensed under [the LICENSE](LICENSE.md). - -### Credits - -Recognize any significant contributors, sponsors, or organizations that have supported the project. diff --git a/cmd/cmd/api.go b/cmd/cmd/api.go index 7cf262c..feee166 100644 --- a/cmd/cmd/api.go +++ b/cmd/cmd/api.go @@ -2,6 +2,7 @@ package cmd import ( "fmt" + "github.com/vechain/networkhub/environments/docker" "github.com/vechain/networkhub/hub" "github.com/vechain/networkhub/preset" @@ -20,6 +21,7 @@ var apiCmd = &cobra.Command{ envManager := hub.NewNetworkHub() envManager.RegisterEnvironment("local", local.NewLocalEnv) + envManager.RegisterEnvironment("docker", docker.NewDockerEnv) presets := preset.NewPresetNetworks() presets.Register("threeMasterNodesNetwork", preset.LocalThreeMasterNodesNetwork) diff --git a/cmd/cmd/cmd.go b/cmd/cmd/cmd.go index 080bcfb..d6d05b6 100644 --- a/cmd/cmd/cmd.go +++ b/cmd/cmd/cmd.go @@ -2,6 +2,7 @@ package cmd import ( "fmt" + "github.com/vechain/networkhub/environments/docker" "io/ioutil" "log/slog" "os" @@ -21,6 +22,7 @@ import ( func setup() *cmdentrypoint.Cmd { envManager := hub.NewNetworkHub() envManager.RegisterEnvironment("local", local.NewLocalEnv) + envManager.RegisterEnvironment("docker", docker.NewDockerEnv) presets := preset.NewPresetNetworks() presets.Register("threeMasterNodesNetwork", preset.LocalThreeMasterNodesNetwork) @@ -104,19 +106,21 @@ var configureCmd = &cobra.Command{ }, } +// TODO add a preset list var presetCmd = &cobra.Command{ - Use: "preset [preset-name] [preset-thor-path]", + Use: "preset [environment] [preset-name] [preset-thor-path]", Short: "Configures a preset network", - Args: cobra.MinimumNArgs(2), + Args: cobra.MinimumNArgs(3), Run: func(cmd *cobra.Command, args []string) { cmdManager := setup() - presetNetwork := args[0] - presetArtifactPath := args[1] + presetEnv := args[0] + presetNetwork := args[1] + presetArtifactPath := args[2] slog.Info("Configuring network...") - networkID, err := cmdManager.Preset(presetNetwork, presetArtifactPath) + networkID, err := cmdManager.Preset(presetNetwork, presetEnv, presetArtifactPath) if err != nil { slog.Error("unable to config preset network", "err", err) return @@ -126,7 +130,6 @@ var presetCmd = &cobra.Command{ } func init() { - cmdCmd.AddCommand(startCmd, configureCmd, presetCmd) rootCmd.AddCommand(cmdCmd) } diff --git a/entrypoint/api/http_api.go b/entrypoint/api/http_api.go index d0c1063..162fee2 100644 --- a/entrypoint/api/http_api.go +++ b/entrypoint/api/http_api.go @@ -16,9 +16,9 @@ type Server struct { presets *preset.Networks } -func New(envMgr *hub.NetworkHub, presets *preset.Networks) *Server { +func New(networkHub *hub.NetworkHub, presets *preset.Networks) *Server { return &Server{ - networkHub: envMgr, + networkHub: networkHub, presets: presets, } } diff --git a/entrypoint/cmd/cmd.go b/entrypoint/cmd/cmd.go index 740a75c..9e30e6f 100644 --- a/entrypoint/cmd/cmd.go +++ b/entrypoint/cmd/cmd.go @@ -51,8 +51,8 @@ func (c *Cmd) LoadExistingNetworks() error { return nil } -func (c *Cmd) Preset(presetNetwork string, presetConfig string) (string, error) { - netCfg, err := c.presets.Load(presetNetwork, &preset.APIConfigPayload{ArtifactPath: presetConfig}) +func (c *Cmd) Preset(presetNetwork string, presetEnv, presetConfig string) (string, error) { + netCfg, err := c.presets.Load(presetNetwork, &preset.APIConfigPayload{ArtifactPath: presetConfig, Environment: presetEnv}) if err != nil { return "", fmt.Errorf("unable to load network preset: %w", err) } diff --git a/environments/docker/docker.go b/environments/docker/docker.go new file mode 100644 index 0000000..f047c61 --- /dev/null +++ b/environments/docker/docker.go @@ -0,0 +1,172 @@ +package docker + +import ( + "context" + "fmt" + "github.com/docker/docker/api/types" + "strconv" + "strings" + + "github.com/docker/docker/client" + "github.com/vechain/networkhub/environments" + "github.com/vechain/networkhub/network" + "log/slog" + + dockernetwork "github.com/docker/docker/api/types/network" +) + +type Docker struct { + dockerNodes map[string]*Node + networkCfg *network.Network + id string + networkID string + exposedPorts map[string]*exposedPort + ipManager *IpManager +} + +func NewDockerEnv() environments.Actions { + return &Docker{ + dockerNodes: map[string]*Node{}, + exposedPorts: map[string]*exposedPort{}, + ipManager: NewIPManagerRandom(), + } +} + +func (d *Docker) LoadConfig(cfg *network.Network) (string, error) { + d.networkCfg = cfg + d.id = d.networkCfg.Environment + d.networkCfg.ID + d.networkID = d.id + "-network" + + for i, node := range cfg.Nodes { + // use preset dirs if not defined + if node.ConfigDir == "" { + node.ConfigDir = "/home/thor" + } + if node.DataDir == "" { + node.DataDir = "/home/thor" + } + + // ensure API ports are exposed to the localhost + split := strings.Split(node.APIAddr, ":") + if len(split) != 2 { + return "", fmt.Errorf("unable to parse API Addr") + } + + exposedAPIPort, err := strconv.Atoi(split[1]) + if err != nil { + return "", err + } + + d.exposedPorts[node.ID] = &exposedPort{ + hostPort: fmt.Sprintf("%d", exposedAPIPort+i), + containerPort: split[1], + } + } + + return d.id, nil +} + +func (d *Docker) StartNetwork() error { + // create a network for fixed ip addresses (enodes cannot have dns names) + if err := d.checkOrCreateNetwork(d.networkID, d.ipManager.Subnet()); err != nil { + return fmt.Errorf("unable to create network: %w", err) + } + + for _, nodeCfg := range d.networkCfg.Nodes { + // calculate the node ip address + nextIpAddr, err := d.ipManager.NextIP(nodeCfg.ID) + if err != nil { + return err + } + + // speed up p2p bootstrap + var enodes []string + for _, node := range d.networkCfg.Nodes { + if node.ID == nodeCfg.ID { + break + } + enode, err := node.Enode(d.ipManager.GetNodeIP(node.ID)) + if err != nil { + return err + } + enodes = append(enodes, enode) + } + + dockerNode := NewDockerNode(nodeCfg, enodes, d.networkID, d.exposedPorts[nodeCfg.ID], nextIpAddr) + if err := dockerNode.Start(); err != nil { + return fmt.Errorf("unable to start node - %w", err) + } + + d.dockerNodes[nodeCfg.ID] = dockerNode + } + + return nil +} + +func (d *Docker) StopNetwork() error { + for s, dockerNode := range d.dockerNodes { + err := dockerNode.Stop() + if err != nil { + return fmt.Errorf("unable to stop node %s - %w", s, err) + } + } + return nil +} + +func (d *Docker) Info() error { + //TODO implement me + panic("implement me") +} + +func (d *Docker) checkOrCreateNetwork(networkName, subnet string) error { + // Create a Docker client + cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + if err != nil { + return fmt.Errorf("could not create Docker client: %v", err) + } + defer cli.Close() + + // List existing networks + networks, err := cli.NetworkList(context.Background(), types.NetworkListOptions{}) + if err != nil { + return fmt.Errorf("could not list Docker networks: %v", err) + } + + // Check if the network already exists + for _, net := range networks { + if net.Name == networkName { + slog.Info("Network already exists", "networkName", networkName) + err := cli.NetworkRemove(context.Background(), networkName) + if err != nil { + return err + } + slog.Info("Removed existing network", "networkName", networkName) + } + } + + // Network does not exist, create it + // Define the network configuration + networkCreate := dockernetwork.CreateOptions{ + Driver: "bridge", + IPAM: &dockernetwork.IPAM{ + Driver: "default", + Config: []dockernetwork.IPAMConfig{ + { + Subnet: subnet, + }, + }, + }, + } + _, err = cli.NetworkCreate(context.Background(), networkName, networkCreate) + if err != nil { + return fmt.Errorf("could not create Docker network: %v", err) + } + + slog.Info("Network created", "networkName", networkName) + return nil +} + +type exposedPort struct { + hostPort string + containerPort string +} diff --git a/environments/docker/docker_node.go b/environments/docker/docker_node.go new file mode 100644 index 0000000..4398b5e --- /dev/null +++ b/environments/docker/docker_node.go @@ -0,0 +1,166 @@ +package docker + +import ( + "context" + "encoding/json" + "fmt" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/image" + "github.com/docker/docker/api/types/network" + "github.com/docker/docker/client" + "github.com/docker/go-connections/nat" + "github.com/vechain/networkhub/network/node" + "strings" +) + +// NewDockerNode initializes a new DockerNode +func NewDockerNode(cfg *node.Node, enodes []string, networkID string, exposedPorts *exposedPort, ipAddr string) *Node { + return &Node{ + cfg: cfg, + enodes: enodes, + networkID: networkID, + exposedPorts: exposedPorts, + ipAddr: ipAddr, + } +} + +// Node represents a Docker container node +type Node struct { + cfg *node.Node + enodes []string + id string + networkID string + exposedPorts *exposedPort + ipAddr string +} + +// Start runs the node as a Docker container +func (n *Node) Start() error { + ctx := context.Background() + cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + if err != nil { + return fmt.Errorf("failed to create Docker client: %w", err) + } + + // Check if the Docker image is available locally + _, _, err = cli.ImageInspectWithRaw(ctx, n.cfg.ExecArtifact) + if err != nil { + if client.IsErrNotFound(err) { + // Pull the Docker image + _, err = cli.ImagePull(ctx, n.cfg.ExecArtifact, image.PullOptions{}) + if err != nil { + return fmt.Errorf("failed to pull Docker image: %w", err) + } + } else { + return fmt.Errorf("failed to inspect Docker image: %w", err) + } + } + + cleanEnode := []string{} // todo theres a clever way of doing this + for _, enode := range n.enodes { + nodeEnode, err := n.cfg.Enode(n.ipAddr) + if err != nil { + return err + } + if nodeEnode != enode { + cleanEnode = append(cleanEnode, enode) + } + } + enodeString := strings.Join(cleanEnode, ",") + + cmd := []string{ + "sh", "-c", + "cd /home/thor; " + + "echo $GENESIS > genesis.json;" + + "echo $PRIVATEKEY > master.key;" + + "echo $PRIVATEKEY > p2p.key;" + + "thor " + + "--network genesis.json " + + "--nat none " + + fmt.Sprintf("--config-dir='%s' ", n.cfg.ConfigDir) + + fmt.Sprintf("--api-addr='%s' ", n.cfg.APIAddr) + + fmt.Sprintf("--api-cors='%s' ", n.cfg.APICORS) + + fmt.Sprintf("--p2p-port=%d ", n.cfg.P2PListenPort) + + fmt.Sprintf("--bootnode=%s", enodeString), + } + + //serialize genesis + genesisBytes, err := json.Marshal(n.cfg.Genesis) + if err != nil { + return fmt.Errorf("unable to marshal genesis - %w", err) + } + + exposedPorts := nat.PortSet{ + nat.Port(fmt.Sprintf("%s/tcp", n.exposedPorts.containerPort)): struct{}{}, + } + portBindings := map[nat.Port][]nat.PortBinding{ + nat.Port(fmt.Sprintf("%s/tcp", n.exposedPorts.containerPort)): { + { + HostPort: n.exposedPorts.hostPort, + }, + }, + } + + // Construct Docker container configuration + config := &container.Config{ + Image: n.cfg.ExecArtifact, + Cmd: cmd, + Entrypoint: []string{}, + Env: []string{ + fmt.Sprintf("GENESIS=%s", string(genesisBytes)), + fmt.Sprintf("PRIVATEKEY=%s", n.cfg.Key), + }, + ExposedPorts: exposedPorts, + } + + hostConfig := &container.HostConfig{ + PortBindings: portBindings, + } + + // Define the network configuration + networkConfig := &network.NetworkingConfig{ + EndpointsConfig: map[string]*network.EndpointSettings{ + n.networkID: { + IPAMConfig: &network.EndpointIPAMConfig{ + IPv4Address: n.ipAddr, + }, + }, + }, + } + + // Create the Docker container + resp, err := cli.ContainerCreate(ctx, config, hostConfig, networkConfig, nil, n.cfg.ID) + if err != nil { + return fmt.Errorf("failed to create Docker container: %w", err) + } + + n.id = resp.ID + + // Start the Docker container + if err := cli.ContainerStart(ctx, n.id, container.StartOptions{}); err != nil { + return fmt.Errorf("failed to start Docker container: %w", err) + } + + return nil +} + +// Stop stops the Docker container +func (n *Node) Stop() error { + ctx := context.Background() + cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + if err != nil { + return fmt.Errorf("failed to create Docker client: %w", err) + } + + // Stop the Docker container + if err := cli.ContainerStop(ctx, n.id, container.StopOptions{}); err != nil { + return fmt.Errorf("failed to stop Docker container: %w", err) + } + + // Remove the Docker container + if err := cli.ContainerRemove(ctx, n.id, container.RemoveOptions{}); err != nil { + return fmt.Errorf("failed to remove Docker container: %w", err) + } + + return nil +} diff --git a/environments/docker/docker_test.go b/environments/docker/docker_test.go new file mode 100644 index 0000000..c9293e5 --- /dev/null +++ b/environments/docker/docker_test.go @@ -0,0 +1,73 @@ +package docker_test + +import ( + "github.com/stretchr/testify/assert" + "github.com/vechain/networkhub/environments/docker" + "github.com/vechain/networkhub/network" + "github.com/vechain/networkhub/network/node" + "github.com/vechain/networkhub/preset" + "testing" + "time" +) + +func TestDockerNetwork(t *testing.T) { + t.Skip() + // Create a mock network configuration + networkCfg := &network.Network{ + Environment: "docker", + ID: "test-id", + Nodes: []*node.Node{ + { + ID: "node1", + ExecArtifact: "vechain/thor:latest", + Genesis: preset.LocalThreeMasterNodesNetworkGenesis, + DataDir: "/home/thor", + ConfigDir: "/home/thor", + APIAddr: "0.0.0.0:8545", + APICORS: "*", + P2PListenPort: 30303, + Key: preset.LocalThreeMasterNodesNetwork.Nodes[0].Key, + }, + { + ID: "node2", + ExecArtifact: "vechain/thor:latest", + Genesis: preset.LocalThreeMasterNodesNetworkGenesis, + DataDir: "/home/thor", + ConfigDir: "/home/thor", + APIAddr: "0.0.0.0:8545", + APICORS: "*", + P2PListenPort: 30303, + Key: preset.LocalThreeMasterNodesNetwork.Nodes[1].Key, + }, + { + ID: "node3", + ExecArtifact: "vechain/thor:latest", + Genesis: preset.LocalThreeMasterNodesNetworkGenesis, + DataDir: "/home/thor", + ConfigDir: "/home/thor", + APIAddr: "0.0.0.0:8545", + APICORS: "*", + P2PListenPort: 30303, + Key: preset.LocalThreeMasterNodesNetwork.Nodes[2].Key, + }, + }, + } + + // Initialize Docker environment + dockerEnv := docker.NewDockerEnv() + assert.NotNil(t, dockerEnv) + + // Load configuration + id, err := dockerEnv.LoadConfig(networkCfg) + assert.NoError(t, err) + assert.Equal(t, "dockertest-id", id) + + // Start network + err = dockerEnv.StartNetwork() + assert.NoError(t, err) + + time.Sleep(time.Hour) + // Stop network + err = dockerEnv.StopNetwork() + assert.NoError(t, err) +} diff --git a/environments/docker/ip_manager.go b/environments/docker/ip_manager.go new file mode 100644 index 0000000..4c3280b --- /dev/null +++ b/environments/docker/ip_manager.go @@ -0,0 +1,50 @@ +package docker + +import ( + "errors" + "fmt" + "math/rand" + "time" +) + +type IpManager struct { + baseIP string + currentIP int + assignedIps map[string]string +} + +func NewIPManagerRandom() *IpManager { + rand.Seed(time.Now().UnixNano()) + // Generate random octets for a Class C subnet + a := rand.Intn(128) + b := rand.Intn(256) + c := rand.Intn(256) + return NewIPManager(fmt.Sprintf("%d.%d.%d.0", a, b, c)) +} + +func NewIPManager(subnet string) *IpManager { + // Start from 2 because .2 is the first available IP + return &IpManager{ + baseIP: subnet[:len(subnet)-1], // Remove the trailing zero + currentIP: 2, + assignedIps: map[string]string{}, + } +} + +func (im *IpManager) NextIP(nodeID string) (string, error) { + if im.currentIP > 253 { + return "", errors.New("no more available IP addresses") + } + ipAddr := fmt.Sprintf("%s%d", im.baseIP, im.currentIP) + im.currentIP++ + im.assignedIps[nodeID] = ipAddr + return ipAddr, nil +} + +func (im *IpManager) Subnet() string { + return fmt.Sprintf("%s0/24", im.baseIP) +} + +func (im *IpManager) GetNodeIP(nodeID string) string { + return im.assignedIps[nodeID] +} diff --git a/environments/local/local.go b/environments/local/local.go index f3798f4..7b6bdc1 100644 --- a/environments/local/local.go +++ b/environments/local/local.go @@ -44,7 +44,11 @@ func (l *Local) StartNetwork() error { // speed up p2p bootstrap var enodes []string for _, node := range l.networkCfg.Nodes { - enodes = append(enodes, node.Enode) + enode, err := node.Enode("127.0.0.1") + if err != nil { + return err + } + enodes = append(enodes, enode) } for _, nodeCfg := range l.networkCfg.Nodes { diff --git a/environments/local/local_node.go b/environments/local/local_node.go index acc6a3a..9b62eab 100644 --- a/environments/local/local_node.go +++ b/environments/local/local_node.go @@ -42,6 +42,10 @@ func (n *Node) Start() error { if err != nil { return fmt.Errorf("failed to write master key file - %w", err) } + err = os.WriteFile(filepath.Join(n.nodeCfg.ConfigDir, "p2p.key"), []byte(n.nodeCfg.Key), 0644) + if err != nil { + return fmt.Errorf("failed to p2p master key file - %w", err) + } } // write genesis to disk @@ -57,7 +61,11 @@ func (n *Node) Start() error { cleanEnode := []string{} // todo theres a clever way of doing this for _, enode := range n.enodes { - if n.nodeCfg.Enode != enode { + nodeEnode, err := n.nodeCfg.Enode("127.0.0.1") + if err != nil { + return err + } + if nodeEnode != enode { cleanEnode = append(cleanEnode, enode) } } @@ -72,6 +80,8 @@ func (n *Node) Start() error { "--config-dir", n.nodeCfg.ConfigDir, "--api-addr", n.nodeCfg.APIAddr, "--api-cors", n.nodeCfg.APICORS, + "--verbosity", "4", + "--nat", "none", "--p2p-port", fmt.Sprintf("%d", n.nodeCfg.P2PListenPort), "--bootnode", enodeString, }, diff --git a/environments/local/local_test.go b/environments/local/local_test.go index 68d0d8a..7a06e39 100644 --- a/environments/local/local_test.go +++ b/environments/local/local_test.go @@ -89,40 +89,40 @@ var networkJSON = fmt.Sprintf(`{ "id": "node1", "execArtifact": "/Users/pedro/go/src/github.com/vechain/thor/bin/thor", "p2pListenPort": 8081, + "host": "127.0.0.1", "apiAddr": "127.0.0.1:8181", "apiCORS": "*", "type": "masterNode", - "key": "01a4107bfb7d5141ec519e75788c34295741a1eefbfe460320efd2ada944071e", - "enode": "enode://2ac08a2c35f090e5c47fe99bb0b2956d5b3366c61a83ef30719d393b5984227f4a5bb35b42fef94c3c03c1797ddd97546bb6eeb627b040c4c8dd554b4289024d@127.0.0.1:8081", + "key": "01a4107bfb7d5141ec519e75788c34295741a1eefbfe460320efd2ada944071e", "genesis": %s }, { "id": "node2", "execArtifact": "/Users/pedro/go/src/github.com/vechain/thor/bin/thor", "p2pListenPort": 8082, + "host": "127.0.0.1", "apiAddr": "127.0.0.1:8182", "apiCORS": "*", "type": "masterNode", "key": "7072249b800ddac1d29a3cd06468cc1a917cbcd110dde358a905d03dad51748d", - "enode": "enode://ca36cbb2e9ad0ed582350ee04f49408f4fa409a8ca39982a34e4d5bb82418c45f3fd74bc4861f5aaecd986f1697f28010e1f6af7fadf08c6f529188752f47bee@127.0.0.1:8082", "genesis": %s }, { "id": "node3", "execArtifact": "/Users/pedro/go/src/github.com/vechain/thor/bin/thor", "p2pListenPort": 8083, + "host": "127.0.0.1", "apiAddr": "127.0.0.1:8183", "apiCORS": "*", "type": "masterNode", "key": "c55455943bf026dc44fcf189e8765eb0587c94e66029d580bae795386c0b737a", - "enode": "enode://2d5b5f39e906dd717d721e3f039326e55163697e99e0a9998193eddfbb42e21a457ab877c355ee89c2bdf2562c86f6946b1e98119e945c091cab1a5ded8ca027@127.0.0.1:8083", "genesis": %s } ] }`, genesis, genesis, genesis) func TestLocal(t *testing.T) { - //t.Skip() + t.Skip() networkCfg, err := network.NewNetwork( network.WithJSON(networkJSON), ) diff --git a/go.mod b/go.mod index 479d6fa..3afb2c3 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ replace github.com/syndtr/goleveldb => github.com/vechain/goleveldb v1.0.1-0.202 replace github.com/ethereum/go-ethereum => github.com/vechain/go-ethereum v1.8.15-0.20240308194045-2f457f0512c5 require ( + github.com/docker/docker v26.1.1-0.20240611113813-87794b3030c8+incompatible github.com/ethereum/go-ethereum v1.14.0 github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.9.0 @@ -13,13 +14,21 @@ require ( ) require ( + github.com/Microsoft/go-winio v0.4.14 // indirect github.com/aristanetworks/goarista v0.0.0-20180222005525-c41ed3986faa // indirect github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/containerd/log v0.1.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-stack/stack v1.8.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f // indirect github.com/gorilla/mux v1.6.0 // indirect @@ -32,18 +41,30 @@ require ( github.com/mattn/go-colorable v0.0.9 // indirect github.com/mattn/go-isatty v0.0.3 // indirect github.com/mattn/go-sqlite3 v1.14.9 // indirect - github.com/pkg/errors v0.8.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/qianbin/directcache v0.9.7 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/vechain/go-ecvrf v0.0.0-20220525125849-96fa0442e765 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect + go.opentelemetry.io/otel v1.27.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect + go.opentelemetry.io/otel/metric v1.27.0 // indirect + go.opentelemetry.io/otel/sdk v1.27.0 // indirect + go.opentelemetry.io/otel/trace v1.27.0 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/time v0.5.0 // indirect gopkg.in/karalabe/cookiejar.v2 v2.0.0-20150724131613-8dcd6a7f4951 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/v3 v3.5.1 // indirect ) -go 1.19 +go 1.22.4 diff --git a/go.sum b/go.sum index 2a6dc54..a347572 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,20 @@ +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/aristanetworks/goarista v0.0.0-20180222005525-c41ed3986faa h1:yCVE1EVBfyjHQn7TAfnD1Q4MMHGW/jdZjVJsXQeuRQw= github.com/aristanetworks/goarista v0.0.0-20180222005525-c41ed3986faa/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6 h1:Eey/GGQ/E5Xp1P2Lyx1qj007hLZfbi0+CoVeJruGCtI= github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -15,13 +22,30 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v26.1.1-0.20240611113813-87794b3030c8+incompatible h1:wRu3Hr2ZXisHUb6yaTbFxLGsAEFindqn7cHkxkgX3ik= +github.com/docker/docker v26.1.1-0.20240611113813-87794b3030c8+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -37,11 +61,15 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f h1:9oNbS1z4rVpbnkHBdPZU4jo9bSmrLpII768arSyMFgk= github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.0 h1:UykbtMB/w5No2LmE16gINgLj+r/vbziTgaoERQv6U+0= github.com/gorilla/mux v1.6.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad h1:eMxs9EL0PvIGS9TTtxg4R+JxuPGav82J8rA+GFnY7po= github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= @@ -56,12 +84,21 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA= github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -76,19 +113,28 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/qianbin/directcache v0.9.7 h1:DH6MdmU0fVjcKry57ju7U6akTFDBnLhHd0xOHZDq948= github.com/qianbin/directcache v0.9.7/go.mod h1:gZBpa9NqO1Qz7wZKO7t7atBA76bT8X0eM01PdveW4qc= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -102,31 +148,54 @@ github.com/vechain/goleveldb v1.0.1-0.20220809091043-51eb019c8655 h1:CbHcWpCi7wO github.com/vechain/goleveldb v1.0.1-0.20220809091043-51eb019c8655/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/vechain/thor/v2 v2.1.2-0.20240502163859-34dbe10a5c97 h1:eYQt29A6yF/X1bdxVy/80n0QxEuQl2lY7C6u+UQWd9Y= github.com/vechain/thor/v2 v2.1.2-0.20240502163859-34dbe10a5c97/go.mod h1:VPh5BD+3x/uIJEHEupEPLwenTdZ9GFIcRYtUb1GDurA= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= +go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= +go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= +go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= +go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= +go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= +go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -140,23 +209,34 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291 h1:AgADTJarZTBqgjiUzRgfaBchgYB3/WFTC80GPwsMcRI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -165,6 +245,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -179,3 +261,5 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= diff --git a/hub/hub.go b/hub/hub.go index d9cec42..61cb358 100644 --- a/hub/hub.go +++ b/hub/hub.go @@ -2,7 +2,6 @@ package hub import ( "fmt" - "github.com/vechain/networkhub/environments" "github.com/vechain/networkhub/network" ) @@ -43,6 +42,7 @@ func (e *NetworkHub) StartNetwork(networkID string) error { if !ok { return fmt.Errorf("network %s is not configured", networkID) } + return netwk.StartNetwork() } diff --git a/network/node/node.go b/network/node/node.go index 6aaf219..1b4ec08 100644 --- a/network/node/node.go +++ b/network/node/node.go @@ -1,6 +1,11 @@ package node -import "github.com/vechain/thor/v2/genesis" +import ( + "fmt" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/vechain/thor/v2/genesis" +) const ( MasterNode = "masterNode" @@ -17,7 +22,16 @@ type Node struct { APICORS string `json:"apiCORS"` Type string `json:"type"` Key string `json:"key"` - Enode string `json:"enode"` + EnodeData string `json:"enode"` // todo: this should be a generated method ExecArtifact string `json:"execArtifact"` // used to determine the executing version of the node ( path, dockerImage, etc) Verbosity int `json:"verbosity"` } + +func (n *Node) Enode(ipAddr string) (string, error) { + privKey, err := crypto.HexToECDSA(n.Key) + if err != nil { + return "", fmt.Errorf("unable to process key for node %s : %w", n.ID, err) + } + + return fmt.Sprintf("enode://%x@%s:%v", discover.PubkeyID(&privKey.PublicKey).Bytes(), ipAddr, n.P2PListenPort), nil +} diff --git a/preset/LocalSixNodes.go b/preset/LocalSixNodes.go index 3060a0c..b97c2fc 100644 --- a/preset/LocalSixNodes.go +++ b/preset/LocalSixNodes.go @@ -17,7 +17,6 @@ var LocalSixNodesNetwork = &network.Network{ Nodes: []*node.Node{ { ID: "node1", - ExecArtifact: "/app/thor", Genesis: localSixNodesNetworkGenesis, P2PListenPort: 8081, APIAddr: "0.0.0.0:8181", @@ -25,11 +24,9 @@ var LocalSixNodesNetwork = &network.Network{ Type: node.MasterNode, Verbosity: 4, Key: "b2c859e115ef4a3f5e4d32228b41de4c661c527a32f723ac37745bf860fd09cb", // 0x5F90f56c7b87E3d1acf9437f0E43E4d687AcEB7e - Enode: "enode://7f73b785e7c288a1c246b34f9ac4e323b53d759f1988d580dc6829b6a84cbdb0d315d65669b2312f2c60c940d7680badfe6c208be93ce8a8cfe063a034382328@127.0.0.1:8081", }, { ID: "node2", - ExecArtifact: "/app/thor", Genesis: localSixNodesNetworkGenesis, P2PListenPort: 8082, APIAddr: "0.0.0.0:8182", @@ -37,22 +34,18 @@ var LocalSixNodesNetwork = &network.Network{ Type: node.MasterNode, Verbosity: 4, Key: "4de650ca1c8beae4ed6a4358087f50c01b51f5c0002ae9836c55039ca9818d0c", // 0x5c29518F6a6124a2BeE89253347c8295f604710A - Enode: "enode://4f253253dfe997eb8b20f5ecfc25f6d3a646efd850f762c40947981c811d4553702b507589083144ae0784947b1abffe85ea533a81a90aa43637549104b4885c@127.0.0.1:8082", }, { ID: "node3", - ExecArtifact: "/app/thor", Genesis: localSixNodesNetworkGenesis, P2PListenPort: 8083, APIAddr: "0.0.0.0:8183", APICORS: "*", Type: node.RegularNode, Key: "1b310ea04afd6d14a8f142158873fc70bfd4ba12a19138cc5b309fce7c77105e", // 0x1b1c0055065b3ADee4B9a9e8297142Ba2cD34EfE - Enode: "enode://dfc6eaf3fd295980d74f8af726a66b849b1d017b7a8145570edb8a86744add5d1551bee4199cf3bc685ad2fb7824b8f36ecdd997100f3750dd474c1fcecdd4a7@127.0.0.1:8083", }, { ID: "node4", - ExecArtifact: "/app/thor", Genesis: localSixNodesNetworkGenesis, P2PListenPort: 8084, APIAddr: "0.0.0.0:8184", @@ -60,11 +53,9 @@ var LocalSixNodesNetwork = &network.Network{ Type: node.MasterNode, Verbosity: 4, Key: "c70dda88e779df10abbc7c5d37fbb3478c5cf8df2a70d6b0bfc551a5a9a17359", // 0x042306e116Dc301ecd7b83a04F4c8277Fbe41b6c - Enode: "enode://45bc18d543b6ae66b83bb6360e7d552f7749cc9143d00bd61c5665f7e9dcdd2287690b86737353d12ee1a3dd419ff828eb89b17585c9357d7833e8d6e9c6a2b1@127.0.0.1:8084", }, { ID: "node5", - ExecArtifact: "/app/thor", Genesis: localSixNodesNetworkGenesis, P2PListenPort: 8085, APIAddr: "0.0.0.0:8185", @@ -72,18 +63,15 @@ var LocalSixNodesNetwork = &network.Network{ Type: node.MasterNode, Verbosity: 4, Key: "ade54b623a4f4afc38f962a85df07a428204a67cee0c9b43a99ca255fd2fb9a6", // 0x0aeC31606e217895696771961de416Efa185Be66 - Enode: "enode://61fd9f3ae7e8daa2ced88a85cec097ad68e6c99af2688523cec0b2aab5b77f6a93bc138cafe97cb6b09cecf5248332669beac02add1eb6f45e1950597696a564@127.0.0.1:8085", }, { ID: "node6", - ExecArtifact: "/app/thor", Genesis: localSixNodesNetworkGenesis, P2PListenPort: 8086, APIAddr: "0.0.0.0:8186", APICORS: "*", Type: node.RegularNode, Key: "92ad65923d6782a43e6a1be01a8e52bce701967d78937e73da746a58f293ba30", // 0x9C2871C411CCe579B987E9b932C484dA8b901075 - Enode: "enode://ec9c4b2066b63b10f5b255f08967cb5f7829ee4583b0aed0cea29b452f235e7bcc80b778970a3079929a26abaab28b01ece33f48ca339061c2b6c0526fad557d@127.0.0.1:8086", }, }, } diff --git a/preset/LocalThreeMasterNodes.go b/preset/LocalThreeMasterNodes.go index 14a2d87..29a3b11 100644 --- a/preset/LocalThreeMasterNodes.go +++ b/preset/LocalThreeMasterNodes.go @@ -17,43 +17,37 @@ var LocalThreeMasterNodesNetwork = &network.Network{ Nodes: []*node.Node{ { ID: "node1", - ExecArtifact: "/app/thor", - Genesis: localThreeMasterNodesNetworkGenesis, + Genesis: LocalThreeMasterNodesNetworkGenesis, P2PListenPort: 8081, APIAddr: "0.0.0.0:8181", APICORS: "*", Type: node.MasterNode, Key: "01a4107bfb7d5141ec519e75788c34295741a1eefbfe460320efd2ada944071e", // 0x61fF580B63D3845934610222245C116E013717ec - Enode: "enode://2ac08a2c35f090e5c47fe99bb0b2956d5b3366c61a83ef30719d393b5984227f4a5bb35b42fef94c3c03c1797ddd97546bb6eeb627b040c4c8dd554b4289024d@127.0.0.1:8081", }, { ID: "node2", - ExecArtifact: "/app/thor", - Genesis: localThreeMasterNodesNetworkGenesis, + Genesis: LocalThreeMasterNodesNetworkGenesis, P2PListenPort: 8082, APIAddr: "0.0.0.0:8182", APICORS: "*", Type: node.MasterNode, Key: "7072249b800ddac1d29a3cd06468cc1a917cbcd110dde358a905d03dad51748d", // 0x327931085B4cCbCE0baABb5a5E1C678707C51d90 - Enode: "enode://ca36cbb2e9ad0ed582350ee04f49408f4fa409a8ca39982a34e4d5bb82418c45f3fd74bc4861f5aaecd986f1697f28010e1f6af7fadf08c6f529188752f47bee@127.0.0.1:8082", }, { ID: "node3", - ExecArtifact: "/app/thor", - Genesis: localThreeMasterNodesNetworkGenesis, + Genesis: LocalThreeMasterNodesNetworkGenesis, P2PListenPort: 8083, APIAddr: "0.0.0.0:8183", APICORS: "*", Type: node.MasterNode, Key: "c55455943bf026dc44fcf189e8765eb0587c94e66029d580bae795386c0b737a", // 0x084E48c8AE79656D7e27368AE5317b5c2D6a7497 - Enode: "enode://2d5b5f39e906dd717d721e3f039326e55163697e99e0a9998193eddfbb42e21a457ab877c355ee89c2bdf2562c86f6946b1e98119e945c091cab1a5ded8ca027@127.0.0.1:8083", }, }, } var localThreeMasterEndorser = thor.MustParseAddress("0x0000000000000000000000004578656375746f72") -var localThreeMasterNodesNetworkGenesis = &genesis.CustomGenesis{ +var LocalThreeMasterNodesNetworkGenesis = &genesis.CustomGenesis{ LaunchTime: 1703180212, GasLimit: 10000000, ExtraData: "", diff --git a/preset/preset.go b/preset/preset.go index b0d14cf..5fa9d55 100644 --- a/preset/preset.go +++ b/preset/preset.go @@ -11,6 +11,7 @@ import ( type APIConfigPayload struct { ArtifactPath string `json:"artifactPath"` + Environment string `json:"environment"` } type Networks struct { @@ -41,6 +42,8 @@ func (p *Networks) Load(id string, configPayload *APIConfigPayload) (*network.Ne for _, node := range preset.Nodes { node.ExecArtifact = configPayload.ArtifactPath } + // override the default environment + preset.Environment = configPayload.Environment return preset, nil } From 6ef5d3b0da11975ebac6e4b5547c301b91c2497e Mon Sep 17 00:00:00 2001 From: otherview Date: Fri, 14 Jun 2024 15:22:45 +0100 Subject: [PATCH 2/3] pr comments --- cmd/cmd/cmd.go | 1 - entrypoint/cmd/cmd.go | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cmd/cmd/cmd.go b/cmd/cmd/cmd.go index d6d05b6..52454a2 100644 --- a/cmd/cmd/cmd.go +++ b/cmd/cmd/cmd.go @@ -119,7 +119,6 @@ var presetCmd = &cobra.Command{ presetArtifactPath := args[2] slog.Info("Configuring network...") - networkID, err := cmdManager.Preset(presetNetwork, presetEnv, presetArtifactPath) if err != nil { slog.Error("unable to config preset network", "err", err) diff --git a/entrypoint/cmd/cmd.go b/entrypoint/cmd/cmd.go index 9e30e6f..d7b2148 100644 --- a/entrypoint/cmd/cmd.go +++ b/entrypoint/cmd/cmd.go @@ -51,8 +51,8 @@ func (c *Cmd) LoadExistingNetworks() error { return nil } -func (c *Cmd) Preset(presetNetwork string, presetEnv, presetConfig string) (string, error) { - netCfg, err := c.presets.Load(presetNetwork, &preset.APIConfigPayload{ArtifactPath: presetConfig, Environment: presetEnv}) +func (c *Cmd) Preset(presetNetwork string, environment, artifactPath string) (string, error) { + netCfg, err := c.presets.Load(presetNetwork, &preset.APIConfigPayload{Environment: environment, ArtifactPath: artifactPath}) if err != nil { return "", fmt.Errorf("unable to load network preset: %w", err) } From 676c250fe8a2b445f02395e7cf3edd8d8f53d1fe Mon Sep 17 00:00:00 2001 From: otherview Date: Fri, 14 Jun 2024 15:37:42 +0100 Subject: [PATCH 3/3] gha fixes --- .gitleaksignore | 1 + cmd/cmd/api.go | 10 ++++------ cmd/cmd/cmd.go | 8 +++----- entrypoint/api/http_api_test.go | 2 +- entrypoint/cmd/cmd.go | 1 + entrypoint/cmd/storage.go | 8 ++++---- environments/docker/docker.go | 5 ++--- environments/docker/docker_node.go | 3 ++- environments/docker/docker_test.go | 5 +++-- environments/docker/ip_manager.go | 2 +- environments/local/local_test.go | 4 +++- hub/hub.go | 1 + network/node/node.go | 1 + preset/genesis_test.go | 6 +++--- 14 files changed, 30 insertions(+), 27 deletions(-) create mode 100644 .gitleaksignore diff --git a/.gitleaksignore b/.gitleaksignore new file mode 100644 index 0000000..335abcc --- /dev/null +++ b/.gitleaksignore @@ -0,0 +1 @@ +1cd6cde4277dd30deb5a533446e516649fb9fbce:environments/local/local_test.go:generic-api-key:96 diff --git a/cmd/cmd/api.go b/cmd/cmd/api.go index feee166..8040bbd 100644 --- a/cmd/cmd/api.go +++ b/cmd/cmd/api.go @@ -2,15 +2,13 @@ package cmd import ( "fmt" - "github.com/vechain/networkhub/environments/docker" - - "github.com/vechain/networkhub/hub" - "github.com/vechain/networkhub/preset" + "github.com/spf13/cobra" "github.com/vechain/networkhub/entrypoint/api" + "github.com/vechain/networkhub/environments/docker" "github.com/vechain/networkhub/environments/local" - - "github.com/spf13/cobra" + "github.com/vechain/networkhub/hub" + "github.com/vechain/networkhub/preset" ) var apiCmd = &cobra.Command{ diff --git a/cmd/cmd/cmd.go b/cmd/cmd/cmd.go index 52454a2..b5d1a76 100644 --- a/cmd/cmd/cmd.go +++ b/cmd/cmd/cmd.go @@ -2,20 +2,18 @@ package cmd import ( "fmt" - "github.com/vechain/networkhub/environments/docker" - "io/ioutil" "log/slog" "os" "os/signal" "path/filepath" "syscall" + "github.com/spf13/cobra" + "github.com/vechain/networkhub/environments/docker" "github.com/vechain/networkhub/environments/local" "github.com/vechain/networkhub/hub" "github.com/vechain/networkhub/preset" - "github.com/spf13/cobra" - cmdentrypoint "github.com/vechain/networkhub/entrypoint/cmd" ) @@ -89,7 +87,7 @@ var configureCmd = &cobra.Command{ cmdManager := setup() // Read from the specified file - data, err := ioutil.ReadFile(args[0]) + data, err := os.ReadFile(args[0]) if err != nil { fmt.Printf("Error reading config file: %v\n", err) os.Exit(1) diff --git a/entrypoint/api/http_api_test.go b/entrypoint/api/http_api_test.go index 91c78e2..ecdb3ae 100644 --- a/entrypoint/api/http_api_test.go +++ b/entrypoint/api/http_api_test.go @@ -65,7 +65,7 @@ func TestStartStopHandler(t *testing.T) { { name: "Load existing preset network", target: "/preset/noop-network", - payload: "{ \"artifactPath\": \"noop/dir\" }", + payload: "{ \"artifactPath\": \"noop/dir\", \"environment\":\"noop\" }", method: http.MethodPost, wantStatus: http.StatusOK, wantBody: "{\"networkId\": \"noop\"}", diff --git a/entrypoint/cmd/cmd.go b/entrypoint/cmd/cmd.go index d7b2148..9d10689 100644 --- a/entrypoint/cmd/cmd.go +++ b/entrypoint/cmd/cmd.go @@ -3,6 +3,7 @@ package cmd import ( "encoding/json" "fmt" + "github.com/vechain/networkhub/hub" "github.com/vechain/networkhub/network" "github.com/vechain/networkhub/preset" diff --git a/entrypoint/cmd/storage.go b/entrypoint/cmd/storage.go index 7503d09..e830935 100644 --- a/entrypoint/cmd/storage.go +++ b/entrypoint/cmd/storage.go @@ -3,10 +3,10 @@ package cmd import ( "encoding/json" "fmt" - "github.com/vechain/networkhub/network" - "io/ioutil" "log/slog" "os" + + "github.com/vechain/networkhub/network" ) type StorageJson struct { @@ -33,7 +33,7 @@ func (s *Storage) Store(networkID string, net *network.Network) error { } // Write the updated data back to file - err = ioutil.WriteFile(s.path, data, 0644) + err = os.WriteFile(s.path, data, 0644) if err != nil { return err } @@ -49,7 +49,7 @@ func (s *Storage) LoadExistingNetworks() (map[string]*network.Network, error) { // Check if file exists if _, err := os.Stat(s.path); err == nil { // File exists, load the current data - fileData, err := ioutil.ReadFile(s.path) + fileData, err := os.ReadFile(s.path) if err != nil { return nil, err } diff --git a/environments/docker/docker.go b/environments/docker/docker.go index f047c61..c333977 100644 --- a/environments/docker/docker.go +++ b/environments/docker/docker.go @@ -3,14 +3,13 @@ package docker import ( "context" "fmt" - "github.com/docker/docker/api/types" + "log/slog" "strconv" "strings" "github.com/docker/docker/client" "github.com/vechain/networkhub/environments" "github.com/vechain/networkhub/network" - "log/slog" dockernetwork "github.com/docker/docker/api/types/network" ) @@ -127,7 +126,7 @@ func (d *Docker) checkOrCreateNetwork(networkName, subnet string) error { defer cli.Close() // List existing networks - networks, err := cli.NetworkList(context.Background(), types.NetworkListOptions{}) + networks, err := cli.NetworkList(context.Background(), dockernetwork.ListOptions{}) if err != nil { return fmt.Errorf("could not list Docker networks: %v", err) } diff --git a/environments/docker/docker_node.go b/environments/docker/docker_node.go index 4398b5e..0b6d155 100644 --- a/environments/docker/docker_node.go +++ b/environments/docker/docker_node.go @@ -4,13 +4,14 @@ import ( "context" "encoding/json" "fmt" + "strings" + "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/image" "github.com/docker/docker/api/types/network" "github.com/docker/docker/client" "github.com/docker/go-connections/nat" "github.com/vechain/networkhub/network/node" - "strings" ) // NewDockerNode initializes a new DockerNode diff --git a/environments/docker/docker_test.go b/environments/docker/docker_test.go index c9293e5..850e3c2 100644 --- a/environments/docker/docker_test.go +++ b/environments/docker/docker_test.go @@ -1,13 +1,14 @@ package docker_test import ( + "testing" + "time" + "github.com/stretchr/testify/assert" "github.com/vechain/networkhub/environments/docker" "github.com/vechain/networkhub/network" "github.com/vechain/networkhub/network/node" "github.com/vechain/networkhub/preset" - "testing" - "time" ) func TestDockerNetwork(t *testing.T) { diff --git a/environments/docker/ip_manager.go b/environments/docker/ip_manager.go index 4c3280b..e467151 100644 --- a/environments/docker/ip_manager.go +++ b/environments/docker/ip_manager.go @@ -14,7 +14,7 @@ type IpManager struct { } func NewIPManagerRandom() *IpManager { - rand.Seed(time.Now().UnixNano()) + rand.New(rand.NewSource(time.Now().UnixNano())) // Generate random octets for a Class C subnet a := rand.Intn(128) b := rand.Intn(256) diff --git a/environments/local/local_test.go b/environments/local/local_test.go index b2abff0..7affddc 100644 --- a/environments/local/local_test.go +++ b/environments/local/local_test.go @@ -3,13 +3,13 @@ package local import ( "encoding/json" "fmt" - "github.com/vechain/networkhub/preset" "strings" "testing" "time" "github.com/stretchr/testify/require" "github.com/vechain/networkhub/network" + "github.com/vechain/networkhub/preset" "github.com/vechain/networkhub/utils/client" "github.com/vechain/networkhub/utils/datagen" ) @@ -128,6 +128,8 @@ func TestLocalInvalidExecArtifact(t *testing.T) { ) require.NoError(t, err) + networkCfg.Nodes[0].ExecArtifact = "/some_fake_dir" + localEnv := NewLocalEnv() _, err = localEnv.LoadConfig(networkCfg) require.Error(t, err) diff --git a/hub/hub.go b/hub/hub.go index 61cb358..f839858 100644 --- a/hub/hub.go +++ b/hub/hub.go @@ -2,6 +2,7 @@ package hub import ( "fmt" + "github.com/vechain/networkhub/environments" "github.com/vechain/networkhub/network" ) diff --git a/network/node/node.go b/network/node/node.go index 1b4ec08..6d0ea28 100644 --- a/network/node/node.go +++ b/network/node/node.go @@ -2,6 +2,7 @@ package node import ( "fmt" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/p2p/discover" "github.com/vechain/thor/v2/genesis" diff --git a/preset/genesis_test.go b/preset/genesis_test.go index e56df03..267ea8c 100644 --- a/preset/genesis_test.go +++ b/preset/genesis_test.go @@ -3,14 +3,14 @@ package preset import ( "encoding/json" "fmt" - "github.com/stretchr/testify/require" - "github.com/vechain/thor/v2/genesis" "math/big" "testing" + + "github.com/stretchr/testify/require" + "github.com/vechain/thor/v2/genesis" ) func TestGenesisUnmarshal(t *testing.T) { - type derp struct { Hex *genesis.HexOrDecimal256 }