From d843e374960c0c84b48a8bfd7ae0650c72dabaa7 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Fri, 18 Jan 2019 11:26:57 +0100 Subject: [PATCH] cmd/swarm, swarm: add bootnode mode --- cmd/swarm/config.go | 23 +++++++++++++++++------ cmd/swarm/flags.go | 4 ++++ cmd/swarm/main.go | 2 ++ swarm/api/config.go | 1 + swarm/swarm.go | 24 ++++++++++++++++++------ 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/cmd/swarm/config.go b/cmd/swarm/config.go index 3eea3057b3..0203a67984 100644 --- a/cmd/swarm/config.go +++ b/cmd/swarm/config.go @@ -79,6 +79,7 @@ const ( SWARM_ENV_STORE_PATH = "SWARM_STORE_PATH" SWARM_ENV_STORE_CAPACITY = "SWARM_STORE_CAPACITY" SWARM_ENV_STORE_CACHE_CAPACITY = "SWARM_STORE_CACHE_CAPACITY" + SWARM_ENV_BOOTNODE_MODE = "SWARM_BOOTNODE_MODE" SWARM_ACCESS_PASSWORD = "SWARM_ACCESS_PASSWORD" SWARM_AUTO_DEFAULTPATH = "SWARM_AUTO_DEFAULTPATH" GETH_ENV_DATADIR = "GETH_DATADIR" @@ -164,10 +165,9 @@ func configFileOverride(config *bzzapi.Config, ctx *cli.Context) (*bzzapi.Config return config, err } -//override the current config with whatever is provided through the command line -//most values are not allowed a zero value (empty string), if not otherwise noted +// cmdLineOverride overrides the current config with whatever is provided through the command line +// most values are not allowed a zero value (empty string), if not otherwise noted func cmdLineOverride(currentConfig *bzzapi.Config, ctx *cli.Context) *bzzapi.Config { - if keyid := ctx.GlobalString(SwarmAccountFlag.Name); keyid != "" { currentConfig.BzzAccount = keyid } @@ -258,14 +258,17 @@ func cmdLineOverride(currentConfig *bzzapi.Config, ctx *cli.Context) *bzzapi.Con currentConfig.LocalStoreParams.CacheCapacity = storeCacheCapacity } + if ctx.GlobalIsSet(SwarmBootnodeModeFlag.Name) { + currentConfig.BootnodeMode = ctx.GlobalBool(SwarmBootnodeModeFlag.Name) + } + return currentConfig } -//override the current config with whatver is provided in environment variables -//most values are not allowed a zero value (empty string), if not otherwise noted +// envVarsOverride overrides the current config with whatver is provided in environment variables +// most values are not allowed a zero value (empty string), if not otherwise noted func envVarsOverride(currentConfig *bzzapi.Config) (config *bzzapi.Config) { - if keyid := os.Getenv(SWARM_ENV_ACCOUNT); keyid != "" { currentConfig.BzzAccount = keyid } @@ -364,6 +367,14 @@ func envVarsOverride(currentConfig *bzzapi.Config) (config *bzzapi.Config) { currentConfig.Cors = cors } + if bm := os.Getenv(SWARM_ENV_BOOTNODE_MODE); bm != "" { + bootnodeMode, err := strconv.ParseBool(bm) + if err != nil { + utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_BOOTNODE_MODE, err) + } + currentConfig.BootnodeMode = bootnodeMode + } + return currentConfig } diff --git a/cmd/swarm/flags.go b/cmd/swarm/flags.go index 12edc8cc98..4c186cc310 100644 --- a/cmd/swarm/flags.go +++ b/cmd/swarm/flags.go @@ -156,6 +156,10 @@ var ( Name: "compressed", Usage: "Prints encryption keys in compressed form", } + SwarmBootnodeModeFlag = cli.BoolFlag{ + Name: "bootnode-mode", + Usage: "Run Swarm in Bootnode mode", + } SwarmFeedNameFlag = cli.StringFlag{ Name: "name", Usage: "User-defined name for the new feed, limited to 32 characters. If combined with topic, it will refer to a subtopic with this name", diff --git a/cmd/swarm/main.go b/cmd/swarm/main.go index ccbb24eec3..327c1e5c23 100644 --- a/cmd/swarm/main.go +++ b/cmd/swarm/main.go @@ -187,6 +187,8 @@ func init() { SwarmUploadDefaultPath, SwarmUpFromStdinFlag, SwarmUploadMimeType, + // bootnode mode + SwarmBootnodeModeFlag, // storage flags SwarmStorePath, SwarmStoreCapacity, diff --git a/swarm/api/config.go b/swarm/api/config.go index be73854087..54dd67ba83 100644 --- a/swarm/api/config.go +++ b/swarm/api/config.go @@ -66,6 +66,7 @@ type Config struct { DeliverySkipCheck bool MaxStreamPeerServers int LightNodeEnabled bool + BootnodeMode bool SyncUpdateDelay time.Duration SwapAPI string Cors string diff --git a/swarm/swarm.go b/swarm/swarm.go index db52675fdb..38e8a3d424 100644 --- a/swarm/swarm.go +++ b/swarm/swarm.go @@ -84,12 +84,11 @@ type Swarm struct { tracerClose io.Closer } -// creates a new swarm service instance +// NewSwarm creates a new swarm service instance // implements node.Service // If mockStore is not nil, it will be used as the storage for chunk data. // MockStore should be used only for testing. func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err error) { - if bytes.Equal(common.FromHex(config.PublicKey), storage.ZeroAddr) { return nil, fmt.Errorf("empty public key") } @@ -455,12 +454,25 @@ func (self *Swarm) Stop() error { return err } -// implements the node.Service interface +// Protocols implements the node.Service interface func (self *Swarm) Protocols() (protos []p2p.Protocol) { - protos = append(protos, self.bzz.Protocols()...) + if self.config.BootnodeMode { + protos = []p2p.Protocol{ + { + Name: network.DiscoverySpec.Name, + Version: network.DiscoverySpec.Version, + Length: network.DiscoverySpec.Length(), + Run: self.bzz.RunProtocol(network.DiscoverySpec, self.bzz.Hive.Run), + NodeInfo: self.bzz.Hive.NodeInfo, + PeerInfo: self.bzz.Hive.PeerInfo, + }, + } + } else { + protos = append(protos, self.bzz.Protocols()...) - if self.ps != nil { - protos = append(protos, self.ps.Protocols()...) + if self.ps != nil { + protos = append(protos, self.ps.Protocols()...) + } } return }