From 8d872e86401c484fabdff3bf3d20663674e97484 Mon Sep 17 00:00:00 2001 From: Edwin Date: Mon, 14 Aug 2017 11:45:03 +0800 Subject: [PATCH 1/5] core, container: refactor environment config with docker --- container/ethereum.go | 9 ++------- container/ethereum_test.go | 1 + core/cluster.go | 25 ++++++++++++++++++++----- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/container/ethereum.go b/container/ethereum.go index 9f6badcc..03479a6f 100644 --- a/container/ethereum.go +++ b/container/ethereum.go @@ -46,14 +46,9 @@ type Ethereum interface { Stop() error } -func NewEthereum(options ...Option) *ethereum { - client, err := client.NewEnvClient() - if err != nil { - log.Fatalf("Cannot connect to Docker daemon, err: %v", err) - } - +func NewEthereum(c *client.Client, options ...Option) *ethereum { geth := ðereum{ - client: client, + client: c, } for _, opt := range options { diff --git a/container/ethereum_test.go b/container/ethereum_test.go index d98f9bdb..3b7b080b 100644 --- a/container/ethereum_test.go +++ b/container/ethereum_test.go @@ -35,6 +35,7 @@ func TestEthereumContainer(t *testing.T) { for _, env := range envs { geth := NewEthereum( + env.Client, ImageName("quay.io/maicoin/ottoman_geth:istanbul_develop"), HostDataDir(env.DataDir), DataDir("/data"), diff --git a/core/cluster.go b/core/cluster.go index 034230cc..8bff4aba 100644 --- a/core/cluster.go +++ b/core/cluster.go @@ -23,9 +23,11 @@ import ( "io/ioutil" "log" "net" + "net/url" "os" "path/filepath" + "github.com/docker/docker/client" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/p2p/discover" @@ -44,10 +46,6 @@ const ( GenesisJson = "genesis.json" ) -var ( - defaultIP = net.IPv4(127, 0, 0, 1) -) - func GenerateClusterKeys(numbers int) []*ecdsa.PrivateKey { keys := make([]*ecdsa.PrivateKey, numbers) for i := 0; i < len(keys); i++ { @@ -66,6 +64,7 @@ type Env struct { RpcPort uint16 DataDir string Key *ecdsa.PrivateKey + Client *client.Client } func Teardown(envs []*Env) { @@ -80,6 +79,11 @@ func SetupEnv(prvKeys []*ecdsa.PrivateKey) []*Env { httpPort := defaultHttpPort for i := 0; i < len(envs); i++ { + client, err := client.NewEnvClient() + if err != nil { + log.Fatalf("Cannot connect to Docker daemon, err: %v", err) + } + dataDir, err := saveNodeKey(prvKeys[i]) if err != nil { panic("Failed to save node key") @@ -91,6 +95,7 @@ func SetupEnv(prvKeys []*ecdsa.PrivateKey) []*Env { RpcPort: rpcPort, DataDir: dataDir, Key: prvKeys[i], + Client: client, } rpcPort = rpcPort + 1 @@ -159,8 +164,18 @@ func transformToStaticNodes(envs []*Env) []string { nodes := make([]string, len(envs)) for i, env := range envs { + daemonHost := env.Client.DaemonHost() + url, err := url.Parse(daemonHost) + if err != nil { + log.Fatalf("Failed to parse daemon host, err: %v", err) + } + host, _, err := net.SplitHostPort(url.Host) + if err != nil { + log.Fatalf("Failed to split host and port, err: %v", err) + } + nodeID := discover.PubkeyID(&env.Key.PublicKey) - nodes[i] = discover.NewNode(nodeID, defaultIP, 0, env.HttpPort).String() + nodes[i] = discover.NewNode(nodeID, net.ParseIP(host), 0, env.HttpPort).String() } return nodes } From 67025d76fc39cc026a666e5c1dddcb1915d552c4 Mon Sep 17 00:00:00 2001 From: Edwin Date: Mon, 14 Aug 2017 13:13:24 +0800 Subject: [PATCH 2/5] core, container: rename HttpPort to P2PPort --- container/ethereum_test.go | 2 +- core/cluster.go | 32 ++++++++++++++++---------------- tests/integration_test.go | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/container/ethereum_test.go b/container/ethereum_test.go index 3b7b080b..4d8bda1f 100644 --- a/container/ethereum_test.go +++ b/container/ethereum_test.go @@ -39,7 +39,7 @@ func TestEthereumContainer(t *testing.T) { ImageName("quay.io/maicoin/ottoman_geth:istanbul_develop"), HostDataDir(env.DataDir), DataDir("/data"), - Port(fmt.Sprintf("%d", env.HttpPort)), + Port(fmt.Sprintf("%d", env.P2PPort)), RPC(), RPCAddress("0.0.0.0"), RPCAPI("eth,net,web3,personal"), diff --git a/core/cluster.go b/core/cluster.go index 8bff4aba..2593b7ee 100644 --- a/core/cluster.go +++ b/core/cluster.go @@ -36,7 +36,7 @@ import ( const ( defaultBaseRpcPort = uint16(8545) - defaultHttpPort = uint16(30303) + defaultP2PPort = uint16(30303) defaultLocalDir = "/tmp/gdata" datadirPrivateKey = "nodekey" @@ -59,12 +59,12 @@ func GenerateClusterKeys(numbers int) []*ecdsa.PrivateKey { } type Env struct { - GethID int - HttpPort uint16 - RpcPort uint16 - DataDir string - Key *ecdsa.PrivateKey - Client *client.Client + GethID int + P2PPort uint16 + RpcPort uint16 + DataDir string + Key *ecdsa.PrivateKey + Client *client.Client } func Teardown(envs []*Env) { @@ -76,7 +76,7 @@ func Teardown(envs []*Env) { func SetupEnv(prvKeys []*ecdsa.PrivateKey) []*Env { envs := make([]*Env, len(prvKeys)) rpcPort := defaultBaseRpcPort - httpPort := defaultHttpPort + p2pPort := defaultP2PPort for i := 0; i < len(envs); i++ { client, err := client.NewEnvClient() @@ -90,16 +90,16 @@ func SetupEnv(prvKeys []*ecdsa.PrivateKey) []*Env { } envs[i] = &Env{ - GethID: i, - HttpPort: httpPort, - RpcPort: rpcPort, - DataDir: dataDir, - Key: prvKeys[i], - Client: client, + GethID: i, + P2PPort: p2pPort, + RpcPort: rpcPort, + DataDir: dataDir, + Key: prvKeys[i], + Client: client, } rpcPort = rpcPort + 1 - httpPort = httpPort + 1 + p2pPort = p2pPort + 1 } return envs } @@ -175,7 +175,7 @@ func transformToStaticNodes(envs []*Env) []string { } nodeID := discover.PubkeyID(&env.Key.PublicKey) - nodes[i] = discover.NewNode(nodeID, net.ParseIP(host), 0, env.HttpPort).String() + nodes[i] = discover.NewNode(nodeID, net.ParseIP(host), 0, env.P2PPort).String() } return nodes } diff --git a/tests/integration_test.go b/tests/integration_test.go index 2e6149f4..a0d189f1 100644 --- a/tests/integration_test.go +++ b/tests/integration_test.go @@ -53,7 +53,7 @@ var _ = Describe("4 validators Istanbul", func() { container.ImageName("quay.io/maicoin/ottoman_geth:istanbul_develop"), container.HostDataDir(env.DataDir), container.DataDir("/data"), - container.Port(fmt.Sprintf("%d", env.HttpPort)), + container.Port(fmt.Sprintf("%d", env.P2PPort)), container.RPC(), container.RPCAddress("0.0.0.0"), container.RPCAPI("eth,net,web3,personal"), From 0a5122635374e3067fb4e56c64f213134ece2bd0 Mon Sep 17 00:00:00 2001 From: Edwin Date: Mon, 14 Aug 2017 13:34:42 +0800 Subject: [PATCH 3/5] core: hide the key generated method --- container/ethereum_test.go | 3 +-- core/cluster.go | 27 ++++++++++----------------- core/cluster_test.go | 4 ++-- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/container/ethereum_test.go b/container/ethereum_test.go index 4d8bda1f..045ce519 100644 --- a/container/ethereum_test.go +++ b/container/ethereum_test.go @@ -25,8 +25,7 @@ import ( ) func TestEthereumContainer(t *testing.T) { - keys := core.GenerateClusterKeys(1) - envs := core.SetupEnv(keys) + envs := core.SetupEnv(1) defer core.Teardown(envs) err := core.SetupNodes(envs) if err != nil { diff --git a/core/cluster.go b/core/cluster.go index 2593b7ee..28fa136c 100644 --- a/core/cluster.go +++ b/core/cluster.go @@ -46,18 +46,6 @@ const ( GenesisJson = "genesis.json" ) -func GenerateClusterKeys(numbers int) []*ecdsa.PrivateKey { - keys := make([]*ecdsa.PrivateKey, numbers) - for i := 0; i < len(keys); i++ { - key, err := crypto.GenerateKey() - if err != nil { - panic("couldn't generate key: " + err.Error()) - } - keys[i] = key - } - return keys -} - type Env struct { GethID int P2PPort uint16 @@ -73,8 +61,8 @@ func Teardown(envs []*Env) { } } -func SetupEnv(prvKeys []*ecdsa.PrivateKey) []*Env { - envs := make([]*Env, len(prvKeys)) +func SetupEnv(numbers int) []*Env { + envs := make([]*Env, numbers) rpcPort := defaultBaseRpcPort p2pPort := defaultP2PPort @@ -84,9 +72,14 @@ func SetupEnv(prvKeys []*ecdsa.PrivateKey) []*Env { log.Fatalf("Cannot connect to Docker daemon, err: %v", err) } - dataDir, err := saveNodeKey(prvKeys[i]) + key, err := crypto.GenerateKey() if err != nil { - panic("Failed to save node key") + log.Fatalf("couldn't generate key: " + err.Error()) + } + + dataDir, err := saveNodeKey(key) + if err != nil { + log.Fatalf("Failed to save node key") } envs[i] = &Env{ @@ -94,7 +87,7 @@ func SetupEnv(prvKeys []*ecdsa.PrivateKey) []*Env { P2PPort: p2pPort, RpcPort: rpcPort, DataDir: dataDir, - Key: prvKeys[i], + Key: key, Client: client, } diff --git a/core/cluster_test.go b/core/cluster_test.go index f5088101..1009623d 100644 --- a/core/cluster_test.go +++ b/core/cluster_test.go @@ -22,12 +22,12 @@ import ( ) func TestWriteFile(t *testing.T) { - keys := GenerateClusterKeys(4) - envs := SetupEnv(keys) + envs := SetupEnv(4) err := SetupNodes(envs) if err != nil { t.Fatal("failed to setup nodes", err) } + defer Teardown(envs) for _, env := range envs { fmt.Println(fmt.Sprintf("%s%d%s%s", "geth ID:", env.GethID, ", dataDir:", env.DataDir)) } From 19b2eb266d5e5b16cbc5e8f9f1c615bb1cff122f Mon Sep 17 00:00:00 2001 From: Edwin Date: Mon, 14 Aug 2017 13:47:16 +0800 Subject: [PATCH 4/5] core: remove prefix 'transform' --- core/cluster.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/cluster.go b/core/cluster.go index 28fa136c..8b95aebe 100644 --- a/core/cluster.go +++ b/core/cluster.go @@ -98,14 +98,14 @@ func SetupEnv(numbers int) []*Env { } func SetupNodes(envs []*Env) error { - nodes := transformToStaticNodes(envs) + nodes := toStaticNodes(envs) for _, env := range envs { if err := saveStaticNode(env.DataDir, nodes); err != nil { return err } } - addrs := transformToAddress(envs) + addrs := toAddress(envs) genesis := GenerateGenesis(addrs) for _, env := range envs { if err := saveGenesis(env.DataDir, genesis); err != nil { @@ -153,7 +153,7 @@ func saveStaticNode(dataDir string, nodes []string) error { return ioutil.WriteFile(keyPath, raw, 0600) } -func transformToStaticNodes(envs []*Env) []string { +func toStaticNodes(envs []*Env) []string { nodes := make([]string, len(envs)) for i, env := range envs { @@ -173,7 +173,7 @@ func transformToStaticNodes(envs []*Env) []string { return nodes } -func transformToAddress(envs []*Env) []common.Address { +func toAddress(envs []*Env) []common.Address { addrs := make([]common.Address, len(envs)) for i, env := range envs { From 149d8b4700d62bde0beee065a694a59b34f4984a Mon Sep 17 00:00:00 2001 From: Edwin Date: Mon, 14 Aug 2017 14:05:36 +0800 Subject: [PATCH 5/5] core: move genesis.go into core/genesis package --- container/ethereum.go | 6 +++--- container/ethereum_test.go | 3 ++- core/cluster.go | 6 +++--- core/{ => genesis}/genesis.go | 15 ++++++++++----- 4 files changed, 18 insertions(+), 12 deletions(-) rename core/{ => genesis}/genesis.go (87%) diff --git a/container/ethereum.go b/container/ethereum.go index 03479a6f..8eba7575 100644 --- a/container/ethereum.go +++ b/container/ethereum.go @@ -32,7 +32,7 @@ import ( "github.com/docker/go-connections/nat" "github.com/getamis/go-ethereum/cmd/utils" "github.com/getamis/go-ethereum/ethclient" - "github.com/getamis/istanbul-tools/core" + "github.com/getamis/istanbul-tools/core/genesis" ) const ( @@ -101,12 +101,12 @@ func (eth *ethereum) Init(genesisFile string) error { "init", "--" + utils.DataDirFlag.Name, eth.dataDir, - filepath.Join("/", core.GenesisJson), + filepath.Join("/", genesis.FileName), }, }, &container.HostConfig{ Binds: []string{ - genesisFile + ":" + filepath.Join("/", core.GenesisJson), + genesisFile + ":" + filepath.Join("/", genesis.FileName), eth.hostDataDir + ":" + eth.dataDir, }, }, nil, "") diff --git a/container/ethereum_test.go b/container/ethereum_test.go index 045ce519..103a6a11 100644 --- a/container/ethereum_test.go +++ b/container/ethereum_test.go @@ -22,6 +22,7 @@ import ( "testing" "github.com/getamis/istanbul-tools/core" + "github.com/getamis/istanbul-tools/core/genesis" ) func TestEthereumContainer(t *testing.T) { @@ -46,7 +47,7 @@ func TestEthereumContainer(t *testing.T) { Logging(true), ) - err := geth.Init(filepath.Join(env.DataDir, core.GenesisJson)) + err := geth.Init(filepath.Join(env.DataDir, genesis.FileName)) if err != nil { t.Error(err) } diff --git a/core/cluster.go b/core/cluster.go index 8b95aebe..7d5eb7b1 100644 --- a/core/cluster.go +++ b/core/cluster.go @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/getamis/istanbul-tools/core/genesis" "github.com/satori/go.uuid" ) @@ -43,7 +44,6 @@ const ( clientIdentifier = "geth" staticNodeJson = "static-nodes.json" - GenesisJson = "genesis.json" ) type Env struct { @@ -106,9 +106,9 @@ func SetupNodes(envs []*Env) error { } addrs := toAddress(envs) - genesis := GenerateGenesis(addrs) + g := genesis.New(addrs) for _, env := range envs { - if err := saveGenesis(env.DataDir, genesis); err != nil { + if err := genesis.Save(env.DataDir, g); err != nil { return err } } diff --git a/core/genesis.go b/core/genesis/genesis.go similarity index 87% rename from core/genesis.go rename to core/genesis/genesis.go index 4c932d10..d3cb63e1 100644 --- a/core/genesis.go +++ b/core/genesis/genesis.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package core +package genesis import ( "encoding/json" @@ -23,6 +23,7 @@ import ( "math/big" "path/filepath" "time" + "log" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -33,10 +34,14 @@ import ( "github.com/getamis/istanbul-tools/cmd/istanbul/extradata" ) -func GenerateGenesis(addrs []common.Address) *core.Genesis { +const ( + FileName = "genesis.json" +) + +func New(addrs []common.Address) *core.Genesis { extraData, err := extradata.Encode("0x00", addrs) if err != nil { - panic(fmt.Sprintf("%s%s", "Failed to generate genesis", err)) + log.Fatalf("Failed to generate genesis, err:%s", err) } return &core.Genesis{ @@ -59,8 +64,8 @@ func GenerateGenesis(addrs []common.Address) *core.Genesis { } } -func saveGenesis(dataDir string, genesis *core.Genesis) error { - filePath := filepath.Join(dataDir, GenesisJson) +func Save(dataDir string, genesis *core.Genesis) error { + filePath := filepath.Join(dataDir, FileName) raw, err := json.Marshal(genesis) if err != nil {