From d10e6f2afc1a97100476c3d3bb544a3de64ddb3f Mon Sep 17 00:00:00 2001 From: otherview Date: Wed, 1 May 2024 16:54:34 +0100 Subject: [PATCH] genesis is a json + temp dirs --- environments/local/local.go | 54 ++++---- environments/local/local_node.go | 26 +++- environments/local/local_test.go | 225 +++++++++++++++++++++++++++++-- go.mod | 7 +- go.sum | 8 ++ network/node/node.go | 20 +-- 6 files changed, 291 insertions(+), 49 deletions(-) diff --git a/environments/local/local.go b/environments/local/local.go index d9b419d..2c86e6f 100644 --- a/environments/local/local.go +++ b/environments/local/local.go @@ -1,17 +1,17 @@ package local import ( - "bytes" "crypto/sha256" - "encoding/gob" "encoding/hex" + "encoding/json" "fmt" "log" + "os" + "path/filepath" "strings" "github.com/vechain/networkhub/environments" "github.com/vechain/networkhub/network" - "github.com/vechain/networkhub/network/node" ) type Local struct { @@ -28,23 +28,38 @@ func NewLocalEnv() environments.Actions { func (l *Local) LoadConfig(cfg *network.Network) (string, error) { l.networkCfg = cfg - l.id = hashObject(cfg) + l.id = hashObject(l.networkCfg) + baseTmpDir := filepath.Join(os.TempDir(), l.id) + + // ensure paths exist, use temp dirs if not defined + for _, n := range l.networkCfg.Nodes { + if n.ConfigDir == "" { + n.ConfigDir = filepath.Join(baseTmpDir, n.ID, "config") + } + + if n.DataDir == "" { + n.DataDir = filepath.Join(baseTmpDir, n.ID, "data") + } + } + return l.id, nil } func (l *Local) StartNetwork() error { + // speed up p2p bootstrap var enodes []string for _, node := range l.networkCfg.Nodes { enodes = append(enodes, node.Enode) } - enodeString := strings.Join(enodes, ",") - for _, node := range l.networkCfg.Nodes { - localNode, err := l.startNode(node, enodeString) - if err != nil { + + for _, nodeCfg := range l.networkCfg.Nodes { + localNode := NewLocalNode(nodeCfg, enodeString) + if err := localNode.Start(); err != nil { return fmt.Errorf("unable to start node - %w", err) } - l.localNodes[node.ID] = localNode + + l.localNodes[nodeCfg.ID] = localNode } return nil @@ -65,26 +80,17 @@ func (l *Local) Info() error { panic("implement me") } -func (l *Local) startNode(nodeCfg *node.Node, enodeString string) (*Node, error) { - localNode := NewLocalNode(nodeCfg, enodeString) - return localNode, localNode.Start() -} - func hashObject(obj interface{}) string { - // Create a buffer to hold the encoded data - var buf bytes.Buffer - - // New encoder that writes to the buffer - encoder := gob.NewEncoder(&buf) - // Encode the object; handle errors - if err := encoder.Encode(obj); err != nil { - log.Fatalf("Failed to encode object: %v", err) + // Serialize the object to JSON + jsonData, err := json.Marshal(obj) + if err != nil { + log.Fatalf("Failed to JSON encode object: %v", err) } - // Compute SHA-256 checksum on the buffer's bytes + // Compute SHA-256 checksum on the JSON data hash := sha256.New() - hash.Write(buf.Bytes()) + hash.Write(jsonData) hashBytes := hash.Sum(nil) // Convert hash bytes to hex string diff --git a/environments/local/local_node.go b/environments/local/local_node.go index 9f06774..8fce3b7 100644 --- a/environments/local/local_node.go +++ b/environments/local/local_node.go @@ -2,6 +2,7 @@ package local import ( "context" + "encoding/json" "fmt" "os" "os/exec" @@ -25,18 +26,39 @@ func NewLocalNode(nodeCfg *node.Node, enodes string) *Node { } func (n *Node) Start() error { + // ensure directories exist + if err := os.MkdirAll(n.nodeCfg.ConfigDir, 0777); err != nil { + return fmt.Errorf("unable to create configDir - %w", err) + } + if err := os.MkdirAll(n.nodeCfg.DataDir, 0777); err != nil { + return fmt.Errorf("unable to create configDir - %w", err) + } + + // write keys to disk if n.nodeCfg.Type == "masterNode" && n.nodeCfg.Key != "" { err := os.WriteFile(filepath.Join(n.nodeCfg.ConfigDir, "master.key"), []byte(n.nodeCfg.Key), 0644) if err != nil { - return fmt.Errorf("failed to write to file %s: %w", filepath.Join(n.nodeCfg.ConfigDir, "master.key"), err) + return fmt.Errorf("failed to write master key file - %w", err) } } + // write genesis to disk + genesisPath := filepath.Join(n.nodeCfg.ConfigDir, "genesis.json") + genesisBytes, err := json.Marshal(n.nodeCfg.Genesis) + if err != nil { + return fmt.Errorf("unable to marshal genesis - %w", err) + } + + err = os.WriteFile(genesisPath, genesisBytes, 0644) + if err != nil { + return fmt.Errorf("failed to write genesis file - %w", err) + } + cmd := &exec.Cmd{ Path: "/Users/pedro/go/src/github.com/vechain/thor/bin/thor", Args: []string{ "thor", - "--network", n.nodeCfg.Genesis, + "--network", genesisPath, "--data-dir", n.nodeCfg.DataDir, "--config-dir", n.nodeCfg.ConfigDir, "--api-addr", n.nodeCfg.APIAddr, diff --git a/environments/local/local_test.go b/environments/local/local_test.go index 10466b6..bfd4b2c 100644 --- a/environments/local/local_test.go +++ b/environments/local/local_test.go @@ -16,38 +16,239 @@ var networkJSON = `{ { "id": "node1", "p2pListenPort": 8081, - "genesis": "/Users/pedro/tmp/multiple-nodes/custom_genesis.json", - "dataDir": "/Users/pedro/tmp/multiple-nodes/node1", - "configDir": "/Users/pedro/tmp/multiple-nodes/node1/config", "apiAddr": "127.0.0.1:8181", "apiCORS": "*", "type": "masterNode", "key": "01a4107bfb7d5141ec519e75788c34295741a1eefbfe460320efd2ada944071e", - "enode": "enode://2ac08a2c35f090e5c47fe99bb0b2956d5b3366c61a83ef30719d393b5984227f4a5bb35b42fef94c3c03c1797ddd97546bb6eeb627b040c4c8dd554b4289024d@127.0.0.1:8081" + "enode": "enode://2ac08a2c35f090e5c47fe99bb0b2956d5b3366c61a83ef30719d393b5984227f4a5bb35b42fef94c3c03c1797ddd97546bb6eeb627b040c4c8dd554b4289024d@127.0.0.1:8081", + "genesis": { + "launchTime": 1703180212, + "gasLimit": 10000000, + "extraData": "My custom VeChain", + "forkConfig": { + "VIP191": 0, + "ETH_CONST": 0, + "BLOCKLIST": 0, + "ETH_IST": 0, + "VIP214": 0, + "FINALITY": 0 + }, + "accounts": [ + { + "address": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": 0, + "code": "0x6060604052600256", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000002" + } + }, + { + "address": "0x61fF580B63D3845934610222245C116E013717ec", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "address": "0x327931085B4cCbCE0baABb5a5E1C678707C51d90", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "address": "0x084E48c8AE79656D7e27368AE5317b5c2D6a7497", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + ], + "authority": [ + { + "masterAddress": "0x61fF580B63D3845934610222245C116E013717ec", + "endorsorAddress": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "identity": "0x000000000000000068747470733a2f2f636f6e6e65782e76656368612e696e2f" + }, + { + "masterAddress": "0x327931085B4cCbCE0baABb5a5E1C678707C51d90", + "endorsorAddress": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "identity": "0x000000000000000068747470733a2f2f656e762e7665636861696e2e6f72672f" + }, + { + "masterAddress": "0x084E48c8AE79656D7e27368AE5317b5c2D6a7497", + "endorsorAddress": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "identity": "0x0000000000000068747470733a2f2f617070732e7665636861696e2e6f72672f" + } + ], + "params": { + "rewardRatio": 300000000000000000, + "baseGasPrice": 1000000000000000, + "proposerEndorsement": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "executorAddress": "0x0000000000000000000000004578656375746f72" + }, + "executor": { + "approvers": [ + { + "address": "0x199b836d8a57365baccd4f371c1fabb7be77d389", + "identity": "0x00000000000067656e6572616c20707572706f736520626c6f636b636861696e" + } + ] + } + } }, { "id": "node2", "p2pListenPort": 8082, - "genesis": "/Users/pedro/tmp/multiple-nodes/custom_genesis.json", - "dataDir": "/Users/pedro/tmp/multiple-nodes/node2", - "configDir": "/Users/pedro/tmp/multiple-nodes/node2/config", "apiAddr": "127.0.0.1:8182", "apiCORS": "*", "type": "masterNode", "key": "7072249b800ddac1d29a3cd06468cc1a917cbcd110dde358a905d03dad51748d", - "enode": "enode://ca36cbb2e9ad0ed582350ee04f49408f4fa409a8ca39982a34e4d5bb82418c45f3fd74bc4861f5aaecd986f1697f28010e1f6af7fadf08c6f529188752f47bee@127.0.0.1:8082" + "enode": "enode://ca36cbb2e9ad0ed582350ee04f49408f4fa409a8ca39982a34e4d5bb82418c45f3fd74bc4861f5aaecd986f1697f28010e1f6af7fadf08c6f529188752f47bee@127.0.0.1:8082", + "genesis": { + "launchTime": 1703180212, + "gasLimit": 10000000, + "extraData": "My custom VeChain", + "forkConfig": { + "VIP191": 0, + "ETH_CONST": 0, + "BLOCKLIST": 0, + "ETH_IST": 0, + "VIP214": 0, + "FINALITY": 0 + }, + "accounts": [ + { + "address": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": 0, + "code": "0x6060604052600256", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000002" + } + }, + { + "address": "0x61fF580B63D3845934610222245C116E013717ec", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "address": "0x327931085B4cCbCE0baABb5a5E1C678707C51d90", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "address": "0x084E48c8AE79656D7e27368AE5317b5c2D6a7497", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + ], + "authority": [ + { + "masterAddress": "0x61fF580B63D3845934610222245C116E013717ec", + "endorsorAddress": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "identity": "0x000000000000000068747470733a2f2f636f6e6e65782e76656368612e696e2f" + }, + { + "masterAddress": "0x327931085B4cCbCE0baABb5a5E1C678707C51d90", + "endorsorAddress": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "identity": "0x000000000000000068747470733a2f2f656e762e7665636861696e2e6f72672f" + }, + { + "masterAddress": "0x084E48c8AE79656D7e27368AE5317b5c2D6a7497", + "endorsorAddress": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "identity": "0x0000000000000068747470733a2f2f617070732e7665636861696e2e6f72672f" + } + ], + "params": { + "rewardRatio": 300000000000000000, + "baseGasPrice": 1000000000000000, + "proposerEndorsement": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "executorAddress": "0x0000000000000000000000004578656375746f72" + }, + "executor": { + "approvers": [ + { + "address": "0x199b836d8a57365baccd4f371c1fabb7be77d389", + "identity": "0x00000000000067656e6572616c20707572706f736520626c6f636b636861696e" + } + ] + } + } }, { "id": "node3", "p2pListenPort": 8083, - "genesis": "/Users/pedro/tmp/multiple-nodes/custom_genesis.json", - "dataDir": "/Users/pedro/tmp/multiple-nodes/node3", - "configDir": "/Users/pedro/tmp/multiple-nodes/node3/config", "apiAddr": "127.0.0.1:8183", "apiCORS": "*", "type": "masterNode", "key": "c55455943bf026dc44fcf189e8765eb0587c94e66029d580bae795386c0b737a", - "enode": "enode://2d5b5f39e906dd717d721e3f039326e55163697e99e0a9998193eddfbb42e21a457ab877c355ee89c2bdf2562c86f6946b1e98119e945c091cab1a5ded8ca027@127.0.0.1:8083" + "enode": "enode://2d5b5f39e906dd717d721e3f039326e55163697e99e0a9998193eddfbb42e21a457ab877c355ee89c2bdf2562c86f6946b1e98119e945c091cab1a5ded8ca027@127.0.0.1:8083", + "genesis": { + "launchTime": 1703180212, + "gasLimit": 10000000, + "extraData": "My custom VeChain", + "forkConfig": { + "VIP191": 0, + "ETH_CONST": 0, + "BLOCKLIST": 0, + "ETH_IST": 0, + "VIP214": 0, + "FINALITY": 0 + }, + "accounts": [ + { + "address": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": 0, + "code": "0x6060604052600256", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000002" + } + }, + { + "address": "0x61fF580B63D3845934610222245C116E013717ec", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "address": "0x327931085B4cCbCE0baABb5a5E1C678707C51d90", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "address": "0x084E48c8AE79656D7e27368AE5317b5c2D6a7497", + "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "energy": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + ], + "authority": [ + { + "masterAddress": "0x61fF580B63D3845934610222245C116E013717ec", + "endorsorAddress": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "identity": "0x000000000000000068747470733a2f2f636f6e6e65782e76656368612e696e2f" + }, + { + "masterAddress": "0x327931085B4cCbCE0baABb5a5E1C678707C51d90", + "endorsorAddress": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "identity": "0x000000000000000068747470733a2f2f656e762e7665636861696e2e6f72672f" + }, + { + "masterAddress": "0x084E48c8AE79656D7e27368AE5317b5c2D6a7497", + "endorsorAddress": "0x7567d83b7b8d80addcb281a71d54fc7b3364ffed", + "identity": "0x0000000000000068747470733a2f2f617070732e7665636861696e2e6f72672f" + } + ], + "params": { + "rewardRatio": 300000000000000000, + "baseGasPrice": 1000000000000000, + "proposerEndorsement": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "executorAddress": "0x0000000000000000000000004578656375746f72" + }, + "executor": { + "approvers": [ + { + "address": "0x199b836d8a57365baccd4f371c1fabb7be77d389", + "identity": "0x00000000000067656e6572616c20707572706f736520626c6f636b636861696e" + } + ] + } + } } ] }` diff --git a/go.mod b/go.mod index 9bc729b..3512334 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +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/ethereum/go-ethereum v1.13.14 + github.com/ethereum/go-ethereum v1.14.0 github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.9.0 github.com/vechain/thor v1.7.4 @@ -16,7 +16,9 @@ require ( github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/deckarep/golang-set v1.7.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f // indirect @@ -33,13 +35,16 @@ require ( github.com/pkg/errors v0.8.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/qianbin/directcache v0.9.6 // indirect + github.com/rs/cors v1.11.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 golang.org/x/crypto v0.17.0 // indirect + golang.org/x/net v0.10.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.15.0 // indirect gopkg.in/karalabe/cookiejar.v2 v2.0.0-20150724131613-8dcd6a7f4951 // indirect + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index ea6ba3e..d1ee476 100644 --- a/go.sum +++ b/go.sum @@ -13,10 +13,13 @@ github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t 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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= 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/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= +github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/elastic/gosigar v0.10.5/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -97,6 +100,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/qianbin/directcache v0.9.6 h1:SmA3fZYC2zQDcY/GD6otm4+Y+HyNPRNfzFmTYI4WfUk= github.com/qianbin/directcache v0.9.6/go.mod h1:gZBpa9NqO1Qz7wZKO7t7atBA76bT8X0eM01PdveW4qc= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= +github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= +github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= @@ -132,6 +137,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT 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.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -185,6 +191,8 @@ gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/karalabe/cookiejar.v2 v2.0.0-20150724131613-8dcd6a7f4951 h1:DMTcQRFbEH62YPRWwOI647s2e5mHda3oBPMHfrLs2bw= gopkg.in/karalabe/cookiejar.v2 v2.0.0-20150724131613-8dcd6a7f4951/go.mod h1:owOxCRGGeAx1uugABik6K9oeNu1cgxP/R9ItzLDxNWA= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= diff --git a/network/node/node.go b/network/node/node.go index 8da801d..b6d833f 100644 --- a/network/node/node.go +++ b/network/node/node.go @@ -1,14 +1,14 @@ package node type Node struct { - ID string `json:"id"` - Genesis string `json:"genesis,omitempty"` - P2PListenPort int `json:"p2pListenPort"` - DataDir string `json:"dataDir"` - ConfigDir string `json:"configDir"` - APIAddr string `json:"apiAddr"` - APICORS string `json:"apiCORS"` - Type string `json:"type"` - Key string `json:"key"` - Enode string `json:"enode"` + ID string `json:"id"` //TODO this is a mandatory field + Genesis interface{} `json:"genesis,omitempty"` //TODO would be nice to have validation in this format + DataDir string `json:"dataDir,omitempty"` + ConfigDir string `json:"configDir,omitempty"` + P2PListenPort int `json:"p2pListenPort"` + APIAddr string `json:"apiAddr"` + APICORS string `json:"apiCORS"` + Type string `json:"type"` + Key string `json:"key"` + Enode string `json:"enode"` }