diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go index b438b47971..5926ddc6b1 100644 --- a/cmd/bootnode/main.go +++ b/cmd/bootnode/main.go @@ -12,7 +12,11 @@ import ( "time" "github.com/ethereum/go-ethereum/log" + //cmdharmony "github.com/harmony-one/harmony/cmd/harmony" + harmonyConfigs "github.com/harmony-one/harmony/cmd/config" + nodeConfigs "github.com/harmony-one/harmony/internal/configs/node" "github.com/harmony-one/harmony/internal/utils" + bootnode "github.com/harmony-one/harmony/node/boot" "github.com/harmony-one/harmony/p2p" net "github.com/libp2p/go-libp2p/core/network" ma "github.com/multiformats/go-multiaddr" @@ -87,8 +91,7 @@ var ( ) func printVersion(me string) { - fmt.Fprintf(os.Stderr, "Harmony (C) 2019. %v, version %v-%v (%v %v)\n", path.Base(me), version, commit, builtBy, builtAt) - os.Exit(0) + fmt.Fprintf(os.Stderr, "Harmony (C) 2024. %v, version %v-%v (%v %v)\n", path.Base(me), version, commit, builtBy, builtAt) } func main() { @@ -97,6 +100,8 @@ func main() { ip := flag.String("ip", "127.0.0.1", "IP of the node") port := flag.String("port", "9876", "port of the node.") + httpPort := flag.Int("rpc_http_port", 9500, "port of the rpc http") + wsPort := flag.Int("rpc_ws_port", 9800, "port of the rpc ws") console := flag.Bool("console_only", false, "Output to console only") logFolder := flag.String("log_folder", "latest", "the folder collecting the logs of this execution") logMaxSize := flag.Int("log_max_size", 100, "the max size in megabytes of the log file before it gets rotated") @@ -113,7 +118,7 @@ func main() { muxer := flag.String("muxer", "mplex, yamux", "protocol muxer to mux per-protocol streams (mplex, yamux)") userAgent := flag.String("user_agent", defUserAgent, "explicitly set the user-agent, so we can differentiate from other Go libp2p users") noRelay := flag.Bool("no_relay", true, "no relay services, direct connections between peers only") - + networkType := flag.String("network", "mainnet", "network type (mainnet, testnet, pangaea, partner, stressnet, devnet, localnet)") pprof := flag.Bool("pprof", false, "enabled pprof") pprofAddr := flag.String("pprof.addr", "127.0.0.1:6060", "http pprof address") //keyFile := flag.String("pprof.profile.names", "", "the private key file of the bootnode") @@ -124,12 +129,13 @@ func main() { if *versionFlag { printVersion(os.Args[0]) + os.Exit(0) } // Logging setup utils.SetLogContext(*port, *ip) utils.SetLogVerbosity(log.Lvl(*verbosity)) - if *console != true { + if !*console { utils.AddLogFile(fmt.Sprintf("%v/bootnode-%v-%v.log", *logFolder, *ip, *port), *logMaxSize, *logRotateCount, *logRotateMaxAge) } @@ -165,8 +171,19 @@ func main() { fmt.Sprintf("/ip4/%s/tcp/%s/p2p/%s\n", *ip, *port, host.GetID().String()), ) + nt := nodeConfigs.NetworkType(*networkType) + nodeConfigs.SetNetworkType(nt) + harmonyConfigs.VersionMetaData = append(harmonyConfigs.VersionMetaData, path.Base(os.Args[0]), version, commit, builtBy, builtAt) + nodeConfigs.SetVersion(harmonyConfigs.GetHarmonyVersion()) + nodeConfigs.SetPeerID(host.GetID()) + hc := harmonyConfigs.GetDefaultConfigCopy() + host.Start() + utils.Logger().Info(). + Interface("network", nt). + Msg("boot node host started") + if *logConn { host.GetP2PHost().Network().Notify(NewConnLogger(utils.GetLogInstance())) } @@ -176,5 +193,31 @@ func main() { http.ListenAndServe(*pprofAddr, nil) } + currentBootNode := bootnode.New(host, &hc) + rpcConfigs := currentBootNode.GetRPCServerConfig() + rpcConfigs.HTTPPort = *httpPort + rpcConfigs.WSPort = *wsPort + + // TODO: enable boot services + /* + if err := currentBootNode.StartServices(); err != nil { + fmt.Fprint(os.Stderr, err.Error()) + os.Exit(-1) + } + */ + + if err := currentBootNode.StartRPC(); err != nil { + utils.Logger().Error(). + Err(err). + Msg("StartRPC failed") + } + + utils.Logger().Info(). + Interface("network", nt). + Interface("ip", currentBootNode.SelfPeer.IP). + Interface("port", currentBootNode.SelfPeer.Port). + Interface("PeerID", currentBootNode.SelfPeer.PeerID). + Msg("boot node RPC started") + select {} } diff --git a/cmd/harmony/config.go b/cmd/config/config.go similarity index 68% rename from cmd/harmony/config.go rename to cmd/config/config.go index 0d2632d8aa..5cb14e4d77 100644 --- a/cmd/harmony/config.go +++ b/cmd/config/config.go @@ -1,8 +1,9 @@ -package main +package config import ( "errors" "fmt" + "math/rand" "os" "strings" "time" @@ -19,7 +20,7 @@ func validateHarmonyConfig(config harmonyconfig.HarmonyConfig) error { var accepts []string nodeType := config.General.NodeType - accepts = []string{nodeTypeValidator, nodeTypeExplorer} + accepts = []string{NodeTypeValidator, NodeTypeExplorer} if err := checkStringAccepted("--run", nodeType, accepts); err != nil { return err } @@ -42,7 +43,7 @@ func validateHarmonyConfig(config harmonyconfig.HarmonyConfig) error { return err } - if config.General.NodeType == nodeTypeExplorer && config.General.ShardID < 0 { + if config.General.NodeType == NodeTypeExplorer && config.General.ShardID < 0 { return errors.New("flag --run.shard must be specified for explorer node") } @@ -76,7 +77,7 @@ func checkStringAccepted(flag string, val string, accepts []string) error { return fmt.Errorf("unknown arg for %s: %s (%v)", flag, val, acceptsStr) } -func getDefaultDNSSyncConfig(nt nodeconfig.NetworkType) harmonyconfig.DnsSync { +func GetDefaultDNSSyncConfig(nt nodeconfig.NetworkType) harmonyconfig.DnsSync { zone := nodeconfig.GetDefaultDNSZone(nt) port := nodeconfig.GetDefaultDNSPort(nt) dnsSync := harmonyconfig.DnsSync{ @@ -101,7 +102,7 @@ func getDefaultDNSSyncConfig(nt nodeconfig.NetworkType) harmonyconfig.DnsSync { return dnsSync } -func getDefaultNetworkConfig(nt nodeconfig.NetworkType) harmonyconfig.NetworkConfig { +func GetDefaultNetworkConfig(nt nodeconfig.NetworkType) harmonyconfig.NetworkConfig { bn := nodeconfig.GetDefaultBootNodes(nt) return harmonyconfig.NetworkConfig{ NetworkType: string(nt), @@ -130,7 +131,7 @@ func parseNetworkType(nt string) nodeconfig.NetworkType { } } -func getDefaultSyncConfig(nt nodeconfig.NetworkType) harmonyconfig.SyncConfig { +func GetDefaultSyncConfig(nt nodeconfig.NetworkType) harmonyconfig.SyncConfig { switch nt { case nodeconfig.Mainnet: return defaultMainnetSyncConfig @@ -145,7 +146,7 @@ func getDefaultSyncConfig(nt nodeconfig.NetworkType) harmonyconfig.SyncConfig { } } -func getDefaultCacheConfig(nt nodeconfig.NetworkType) harmonyconfig.CacheConfig { +func GetDefaultCacheConfig(nt nodeconfig.NetworkType) harmonyconfig.CacheConfig { cacheConfig := harmonyconfig.CacheConfig{ Disabled: defaultCacheConfig.Disabled, TrieNodeLimit: defaultCacheConfig.TrieNodeLimit, @@ -203,7 +204,7 @@ var updateConfigCmd = &cobra.Command{ func dumpConfig(cmd *cobra.Command, args []string) { nt := getNetworkType(cmd) - config := getDefaultHmyConfigCopy(nt) + config := GetDefaultHmyConfigCopy(nt) if err := writeHarmonyConfigToFile(config, args[0]); err != nil { fmt.Println(err) @@ -296,3 +297,117 @@ func writeHarmonyConfigToFile(config harmonyconfig.HarmonyConfig, file string) e } return os.WriteFile(file, b, 0644) } + +var configFlag = cli.StringFlag{ + Name: "config", + Usage: "load node config from the config toml file.", + Shorthand: "c", + DefValue: "", +} + +func applyRootFlags(cmd *cobra.Command, config *harmonyconfig.HarmonyConfig) { + // Misc flags shall be applied first since legacy ip / port is overwritten + // by new ip / port flags + applyLegacyMiscFlags(cmd, config) + applyGeneralFlags(cmd, config) + applyNetworkFlags(cmd, config) + applyDNSSyncFlags(cmd, config) + applyP2PFlags(cmd, config) + applyHTTPFlags(cmd, config) + applyWSFlags(cmd, config) + applyRPCOptFlags(cmd, config) + applyBLSFlags(cmd, config) + applyConsensusFlags(cmd, config) + applyTxPoolFlags(cmd, config) + applyPprofFlags(cmd, config) + applyLogFlags(cmd, config) + applySysFlags(cmd, config) + applyDevnetFlags(cmd, config) + applyRevertFlags(cmd, config) + applyPreimageFlags(cmd, config) + applyPrometheusFlags(cmd, config) + applySyncFlags(cmd, config) + applyShardDataFlags(cmd, config) + applyGPOFlags(cmd, config) + applyCacheFlags(cmd, config) +} + +func registerRootCmdFlags(rootCmd *cobra.Command) error { + flags := getRootFlags() + + return cli.RegisterFlags(rootCmd, flags) +} + +func GetHarmonyConfig(cmd *cobra.Command) (harmonyconfig.HarmonyConfig, error) { + var ( + config harmonyconfig.HarmonyConfig + err error + migratedFrom string + configFile string + isUsingDefault bool + ) + if cli.IsFlagChanged(cmd, configFlag) { + configFile = cli.GetStringFlagValue(cmd, configFlag) + config, migratedFrom, err = loadHarmonyConfig(configFile) + } else { + nt := getNetworkType(cmd) + config = GetDefaultHmyConfigCopy(nt) + isUsingDefault = true + } + if err != nil { + return harmonyconfig.HarmonyConfig{}, err + } + if migratedFrom != defaultConfig.Version && !isUsingDefault { + fmt.Printf("Old config version detected %s\n", + migratedFrom) + stat, _ := os.Stdin.Stat() + // Ask to update if only using terminal + if stat.Mode()&os.ModeCharDevice != 0 { + if promptConfigUpdate() { + err := updateConfigFile(configFile) + if err != nil { + fmt.Printf("Could not update config - %s", err.Error()) + fmt.Println("Update config manually with `./harmony config update [config_file]`") + } + } + + } else { + fmt.Println("Update saved config with `./harmony config update [config_file]`") + } + } + + applyRootFlags(cmd, &config) + + if err := validateHarmonyConfig(config); err != nil { + return harmonyconfig.HarmonyConfig{}, err + } + sanityFixHarmonyConfig(&config) + return config, nil +} + +func Init(rootCmd *cobra.Command) { + rand.Seed(time.Now().UnixNano()) + cli.SetParseErrorHandle(func(err error) { + os.Exit(128) // 128 - invalid command line arguments + }) + configCmd.AddCommand(dumpConfigCmd) + configCmd.AddCommand(updateConfigCmd) + rootCmd.AddCommand(configCmd) + rootCmd.AddCommand(versionCmd) + rootCmd.AddCommand(dumpConfigLegacyCmd) + rootCmd.AddCommand(dumpDBCmd) + rootCmd.AddCommand(inspectDBCmd) + + if err := registerRootCmdFlags(rootCmd); err != nil { + os.Exit(2) + } + if err := registerDumpConfigFlags(); err != nil { + os.Exit(2) + } + if err := registerDumpDBFlags(); err != nil { + os.Exit(2) + } + if err := registerInspectionFlags(); err != nil { + os.Exit(2) + } +} diff --git a/cmd/harmony/config_migrations.go b/cmd/config/config_migrations.go similarity index 99% rename from cmd/harmony/config_migrations.go rename to cmd/config/config_migrations.go index c8a59c722d..69e2b4d236 100644 --- a/cmd/harmony/config_migrations.go +++ b/cmd/config/config_migrations.go @@ -1,4 +1,4 @@ -package main +package config import ( "errors" @@ -83,8 +83,8 @@ func init() { ntStr := confTree.Get("Network.NetworkType").(string) nt := parseNetworkType(ntStr) - defDNSSyncConf := getDefaultDNSSyncConfig(nt) - defSyncConfig := getDefaultSyncConfig(nt) + defDNSSyncConf := GetDefaultDNSSyncConfig(nt) + defSyncConfig := GetDefaultSyncConfig(nt) // Legacy conf missing fields if confTree.Get("Sync") == nil { diff --git a/cmd/harmony/config_migrations_test.go b/cmd/config/config_migrations_test.go similarity index 98% rename from cmd/harmony/config_migrations_test.go rename to cmd/config/config_migrations_test.go index e52c7347b2..edceaa42e4 100644 --- a/cmd/harmony/config_migrations_test.go +++ b/cmd/config/config_migrations_test.go @@ -1,4 +1,4 @@ -package main +package config import ( "testing" @@ -343,8 +343,8 @@ Version = "1.0.4" ) func Test_migrateConf(t *testing.T) { - defConf := getDefaultHmyConfigCopy(nodeconfig.Mainnet) - legacyDefConf := getDefaultHmyConfigCopy(nodeconfig.Mainnet) + defConf := GetDefaultHmyConfigCopy(nodeconfig.Mainnet) + legacyDefConf := GetDefaultHmyConfigCopy(nodeconfig.Mainnet) // Versions prior to 1.0.3 use different BootNodes legacyDefConf.Network.BootNodes = []string{ "/ip4/100.26.90.187/tcp/9874/p2p/Qmdfjtk6hPoyrH1zVD9PEH4zfWLo38dP2mDvvKXfh3tnEv", diff --git a/cmd/harmony/config_test.go b/cmd/config/config_test.go similarity index 93% rename from cmd/harmony/config_test.go rename to cmd/config/config_test.go index 2711041de8..302f4b7840 100644 --- a/cmd/harmony/config_test.go +++ b/cmd/config/config_test.go @@ -1,4 +1,4 @@ -package main +package config import ( "fmt" @@ -16,7 +16,7 @@ import ( type testCfgOpt func(config *harmonyconfig.HarmonyConfig) func makeTestConfig(nt nodeconfig.NetworkType, opt testCfgOpt) harmonyconfig.HarmonyConfig { - cfg := getDefaultHmyConfigCopy(nt) + cfg := GetDefaultHmyConfigCopy(nt) if opt != nil { opt(&cfg) } @@ -127,7 +127,7 @@ Version = "1.0.4" if err != nil { t.Fatal(err) } - defConf := getDefaultHmyConfigCopy(nodeconfig.Mainnet) + defConf := GetDefaultHmyConfigCopy(nodeconfig.Mainnet) if config.HTTP.RosettaEnabled { t.Errorf("Expected rosetta http server to be disabled when loading old config") } @@ -160,13 +160,13 @@ func TestPersistConfig(t *testing.T) { }, { config: makeTestConfig("mainnet", func(cfg *harmonyconfig.HarmonyConfig) { - consensus := getDefaultConsensusConfigCopy() + consensus := GetDefaultConsensusConfigCopy() cfg.Consensus = &consensus - devnet := getDefaultDevnetConfigCopy() + devnet := GetDefaultDevnetConfigCopy() cfg.Devnet = &devnet - revert := getDefaultRevertConfigCopy() + revert := GetDefaultRevertConfigCopy() cfg.Revert = &revert webHook := "web hook" @@ -175,7 +175,7 @@ func TestPersistConfig(t *testing.T) { TPBroadcastInvalidTxn: &trueBool, } - logCtx := getDefaultLogContextCopy() + logCtx := GetDefaultLogContextCopy() cfg.Log.Context = &logCtx }), }, diff --git a/cmd/harmony/default.go b/cmd/config/default.go similarity index 89% rename from cmd/harmony/default.go rename to cmd/config/default.go index 5d8349d72b..7d6cb0e06f 100644 --- a/cmd/harmony/default.go +++ b/cmd/config/default.go @@ -1,4 +1,4 @@ -package main +package config import ( "time" @@ -27,7 +27,7 @@ var defaultConfig = harmonyconfig.HarmonyConfig{ DataDir: "./", TraceEnable: false, }, - Network: getDefaultNetworkConfig(defNetworkType), + Network: GetDefaultNetworkConfig(defNetworkType), P2P: harmonyconfig.P2pConfig{ Port: nodeconfig.DefaultP2PPort, IP: nodeconfig.DefaultPublicListenIP, @@ -100,7 +100,7 @@ var defaultConfig = harmonyconfig.HarmonyConfig{ PriceLimit: harmonyconfig.PriceLimit(core.DefaultTxPoolConfig.PriceLimit), PriceBump: core.DefaultTxPoolConfig.PriceBump, }, - Sync: getDefaultSyncConfig(defNetworkType), + Sync: GetDefaultSyncConfig(defNetworkType), Pprof: harmonyconfig.PprofConfig{ Enabled: false, ListenAddr: "127.0.0.1:6060", @@ -121,7 +121,7 @@ var defaultConfig = harmonyconfig.HarmonyConfig{ Config: true, }, }, - DNSSync: getDefaultDNSSyncConfig(defNetworkType), + DNSSync: GetDefaultDNSSyncConfig(defNetworkType), ShardData: harmonyconfig.ShardDataConfig{ EnableShardData: false, DiskCount: 8, @@ -138,7 +138,7 @@ var defaultConfig = harmonyconfig.HarmonyConfig{ LowUsageThreshold: hmy.DefaultGPOConfig.LowUsageThreshold, BlockGasLimit: hmy.DefaultGPOConfig.BlockGasLimit, }, - Cache: getDefaultCacheConfig(defNetworkType), + Cache: GetDefaultCacheConfig(defNetworkType), } var defaultSysConfig = harmonyconfig.SysConfig{ @@ -291,67 +291,72 @@ var defaultCacheConfig = harmonyconfig.CacheConfig{ } const ( - defaultBroadcastInvalidTx = false + DefaultBroadcastInvalidTx = false ) -func getDefaultHmyConfigCopy(nt nodeconfig.NetworkType) harmonyconfig.HarmonyConfig { +func GetDefaultConfigCopy() harmonyconfig.HarmonyConfig { + config := defaultConfig + return config +} + +func GetDefaultHmyConfigCopy(nt nodeconfig.NetworkType) harmonyconfig.HarmonyConfig { config := defaultConfig - config.Network = getDefaultNetworkConfig(nt) + config.Network = GetDefaultNetworkConfig(nt) if nt == nodeconfig.Devnet { - devnet := getDefaultDevnetConfigCopy() + devnet := GetDefaultDevnetConfigCopy() config.Devnet = &devnet } - config.Sync = getDefaultSyncConfig(nt) - config.DNSSync = getDefaultDNSSyncConfig(nt) - config.Cache = getDefaultCacheConfig(nt) + config.Sync = GetDefaultSyncConfig(nt) + config.DNSSync = GetDefaultDNSSyncConfig(nt) + config.Cache = GetDefaultCacheConfig(nt) return config } -func getDefaultSysConfigCopy() harmonyconfig.SysConfig { +func GetDefaultSysConfigCopy() harmonyconfig.SysConfig { config := defaultSysConfig return config } -func getDefaultDevnetConfigCopy() harmonyconfig.DevnetConfig { +func GetDefaultDevnetConfigCopy() harmonyconfig.DevnetConfig { config := defaultDevnetConfig return config } -func getDefaultRevertConfigCopy() harmonyconfig.RevertConfig { +func GetDefaultRevertConfigCopy() harmonyconfig.RevertConfig { config := defaultRevertConfig return config } -func getDefaultPreimageConfigCopy() harmonyconfig.PreimageConfig { +func GetDefaultPreimageConfigCopy() harmonyconfig.PreimageConfig { config := defaultPreimageConfig return config } -func getDefaultLogContextCopy() harmonyconfig.LogContext { +func GetDefaultLogContextCopy() harmonyconfig.LogContext { config := defaultLogContext return config } -func getDefaultConsensusConfigCopy() harmonyconfig.ConsensusConfig { +func GetDefaultConsensusConfigCopy() harmonyconfig.ConsensusConfig { config := defaultConsensusConfig return config } -func getDefaultPrometheusConfigCopy() harmonyconfig.PrometheusConfig { +func GetDefaultPrometheusConfigCopy() harmonyconfig.PrometheusConfig { config := defaultPrometheusConfig return config } -func getDefaultCacheConfigCopy() harmonyconfig.CacheConfig { +func GetDefaultCacheConfigCopy() harmonyconfig.CacheConfig { config := defaultCacheConfig return config } const ( - nodeTypeValidator = "validator" - nodeTypeExplorer = "explorer" + NodeTypeValidator = "validator" + NodeTypeExplorer = "explorer" ) const ( diff --git a/cmd/harmony/dumpdb.go b/cmd/config/dumpdb.go similarity index 99% rename from cmd/harmony/dumpdb.go rename to cmd/config/dumpdb.go index fd506ee05b..7e8a87f278 100644 --- a/cmd/harmony/dumpdb.go +++ b/cmd/config/dumpdb.go @@ -1,4 +1,4 @@ -package main +package config import ( "fmt" diff --git a/cmd/harmony/flags.go b/cmd/config/flags.go similarity index 99% rename from cmd/harmony/flags.go rename to cmd/config/flags.go index 255520b356..95ab3f8c8e 100644 --- a/cmd/harmony/flags.go +++ b/cmd/config/flags.go @@ -1,4 +1,4 @@ -package main +package config import ( "fmt" @@ -1215,7 +1215,7 @@ var ( func applyConsensusFlags(cmd *cobra.Command, config *harmonyconfig.HarmonyConfig) { if config.Consensus == nil && cli.HasFlagsChanged(cmd, consensusValidFlags) { - cfg := getDefaultConsensusConfigCopy() + cfg := GetDefaultConsensusConfigCopy() config.Consensus = &cfg } @@ -1544,7 +1544,7 @@ func applyLogFlags(cmd *cobra.Command, config *harmonyconfig.HarmonyConfig) { } if cli.HasFlagsChanged(cmd, []cli.Flag{logContextIPFlag, logContextPortFlag}) { - ctx := getDefaultLogContextCopy() + ctx := GetDefaultLogContextCopy() config.Log.Context = &ctx if cli.IsFlagChanged(cmd, logContextIPFlag) { @@ -1567,7 +1567,7 @@ var ( func applySysFlags(cmd *cobra.Command, config *harmonyconfig.HarmonyConfig) { if cli.HasFlagsChanged(cmd, sysFlags) || config.Sys == nil { - cfg := getDefaultSysConfigCopy() + cfg := GetDefaultSysConfigCopy() config.Sys = &cfg } @@ -1617,7 +1617,7 @@ var ( func applyDevnetFlags(cmd *cobra.Command, config *harmonyconfig.HarmonyConfig) { if cli.HasFlagsChanged(cmd, devnetFlags) && config.Devnet == nil { - cfg := getDefaultDevnetConfigCopy() + cfg := GetDefaultDevnetConfigCopy() config.Devnet = &cfg } @@ -1692,7 +1692,7 @@ var ( func applyRevertFlags(cmd *cobra.Command, config *harmonyconfig.HarmonyConfig) { if cli.HasFlagsChanged(cmd, revertFlags) { - cfg := getDefaultRevertConfigCopy() + cfg := GetDefaultRevertConfigCopy() config.Revert = &cfg } @@ -1750,7 +1750,7 @@ var ( func applyPreimageFlags(cmd *cobra.Command, config *harmonyconfig.HarmonyConfig) { if cli.HasFlagsChanged(cmd, preimageFlags) { - cfg := getDefaultPreimageConfigCopy() + cfg := GetDefaultPreimageConfigCopy() config.Preimage = &cfg } if cli.IsFlagChanged(cmd, preimageImportFlag) { @@ -1795,7 +1795,7 @@ var ( legacyTPBroadcastInvalidTxFlag = cli.BoolFlag{ Name: "broadcast_invalid_tx", Usage: "broadcast invalid transactions to sync pool state", - DefValue: defaultBroadcastInvalidTx, + DefValue: DefaultBroadcastInvalidTx, Deprecated: "use --txpool.broadcast-invalid-tx", } ) @@ -1889,7 +1889,7 @@ var ( func applyPrometheusFlags(cmd *cobra.Command, config *harmonyconfig.HarmonyConfig) { if config.Prometheus == nil { - cfg := getDefaultPrometheusConfigCopy() + cfg := GetDefaultPrometheusConfigCopy() config.Prometheus = &cfg // enable pushgateway for mainnet nodes by default if config.Network.NetworkType == "mainnet" { diff --git a/cmd/harmony/flags_test.go b/cmd/config/flags_test.go similarity index 99% rename from cmd/harmony/flags_test.go rename to cmd/config/flags_test.go index 980ddbafd9..abcc74b65e 100644 --- a/cmd/harmony/flags_test.go +++ b/cmd/config/flags_test.go @@ -1,4 +1,4 @@ -package main +package config import ( "fmt" @@ -314,7 +314,7 @@ func TestNetworkFlags(t *testing.T) { NetworkType: defNetworkType, BootNodes: nodeconfig.GetDefaultBootNodes(defNetworkType), }, - DNSSync: getDefaultDNSSyncConfig(defNetworkType)}, + DNSSync: GetDefaultDNSSyncConfig(defNetworkType)}, }, { args: []string{"-n", "stn"}, @@ -323,7 +323,7 @@ func TestNetworkFlags(t *testing.T) { NetworkType: nodeconfig.Stressnet, BootNodes: nodeconfig.GetDefaultBootNodes(nodeconfig.Stressnet), }, - DNSSync: getDefaultDNSSyncConfig(nodeconfig.Stressnet), + DNSSync: GetDefaultDNSSyncConfig(nodeconfig.Stressnet), }, }, { @@ -366,8 +366,8 @@ func TestNetworkFlags(t *testing.T) { ts := newFlagTestSuite(t, neededFlags, func(cmd *cobra.Command, config *harmonyconfig.HarmonyConfig) { // This is the network related logic in function getharmonyconfig.HarmonyConfig nt := getNetworkType(cmd) - config.Network = getDefaultNetworkConfig(nt) - config.DNSSync = getDefaultDNSSyncConfig(nt) + config.Network = GetDefaultNetworkConfig(nt) + config.DNSSync = GetDefaultDNSSyncConfig(nt) applyNetworkFlags(cmd, config) applyDNSSyncFlags(cmd, config) }) @@ -1826,18 +1826,18 @@ func TestDNSSyncFlags(t *testing.T) { { args: []string{}, network: "mainnet", - expConfig: getDefaultDNSSyncConfig(nodeconfig.Mainnet), + expConfig: GetDefaultDNSSyncConfig(nodeconfig.Mainnet), }, { args: []string{"--sync.legacy.server", "--sync.legacy.client"}, network: "mainnet", - expConfig: getDefaultDNSSyncConfig(nodeconfig.Mainnet), + expConfig: GetDefaultDNSSyncConfig(nodeconfig.Mainnet), }, { args: []string{"--sync.legacy.server", "--sync.legacy.client"}, network: "testnet", expConfig: func() harmonyconfig.DnsSync { - cfg := getDefaultDNSSyncConfig(nodeconfig.Mainnet) + cfg := GetDefaultDNSSyncConfig(nodeconfig.Mainnet) cfg.Client = true cfg.Server = true return cfg @@ -1846,7 +1846,7 @@ func TestDNSSyncFlags(t *testing.T) { { args: []string{"--dns.server", "--dns.client"}, network: "mainnet", - expConfig: getDefaultDNSSyncConfig(nodeconfig.Mainnet), + expConfig: GetDefaultDNSSyncConfig(nodeconfig.Mainnet), }, } @@ -1976,7 +1976,7 @@ type flagTestSuite struct { func newFlagTestSuite(t *testing.T, flags []cli.Flag, applyFlags func(*cobra.Command, *harmonyconfig.HarmonyConfig)) *flagTestSuite { cli.SetParseErrorHandle(func(err error) { t.Fatal(err) }) - ts := &flagTestSuite{hc: getDefaultHmyConfigCopy(defNetworkType)} + ts := &flagTestSuite{hc: GetDefaultHmyConfigCopy(defNetworkType)} ts.cmd = makeTestCommand(func(cmd *cobra.Command, args []string) { applyFlags(cmd, &ts.hc) }) diff --git a/cmd/harmony/inspectdb.go b/cmd/config/inspectdb.go similarity index 98% rename from cmd/harmony/inspectdb.go rename to cmd/config/inspectdb.go index 89f8c28271..f08e7872dc 100644 --- a/cmd/harmony/inspectdb.go +++ b/cmd/config/inspectdb.go @@ -1,4 +1,4 @@ -package main +package config import ( "fmt" diff --git a/cmd/harmony/version.go b/cmd/config/version.go similarity index 62% rename from cmd/harmony/version.go rename to cmd/config/version.go index 4f9d3521e6..49b7b1bfbe 100644 --- a/cmd/harmony/version.go +++ b/cmd/config/version.go @@ -1,4 +1,4 @@ -package main +package config import ( "fmt" @@ -12,13 +12,7 @@ const ( versionFormat = "Harmony (C) 2023. %v, version %v-%v (%v %v)" ) -// Version string variables -var ( - version string - builtBy string - builtAt string - commit string -) +var VersionMetaData []interface{} var versionFlag = cli.BoolFlag{ Name: "version", @@ -32,15 +26,19 @@ var versionCmd = &cobra.Command{ Long: "print version of the harmony binary", Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - printVersion() + PrintVersion() os.Exit(0) }, } -func getHarmonyVersion() string { - return fmt.Sprintf(versionFormat, "harmony", version, commit, builtBy, builtAt) +func VersionFlag() cli.BoolFlag { + return versionFlag +} + +func GetHarmonyVersion() string { + return fmt.Sprintf(versionFormat, VersionMetaData[:5]...) // "harmony", version, commit, builtBy, builtAt } -func printVersion() { - fmt.Println(getHarmonyVersion()) +func PrintVersion() { + fmt.Println(GetHarmonyVersion()) } diff --git a/cmd/harmony/main.go b/cmd/harmony/main.go index 9629bee0aa..c0c07641f1 100644 --- a/cmd/harmony/main.go +++ b/cmd/harmony/main.go @@ -3,7 +3,6 @@ package main import ( "fmt" "math/big" - "math/rand" _ "net/http/pprof" "os" "os/signal" @@ -24,6 +23,7 @@ import ( "github.com/harmony-one/harmony/api/service/prometheus" "github.com/harmony-one/harmony/api/service/stagedstreamsync" "github.com/harmony-one/harmony/api/service/synchronize" + harmonyConfigs "github.com/harmony-one/harmony/cmd/config" "github.com/harmony-one/harmony/common/fdlimit" "github.com/harmony-one/harmony/common/ntp" "github.com/harmony-one/harmony/consensus" @@ -45,17 +45,25 @@ import ( "github.com/harmony-one/harmony/internal/tikv/statedb_cache" "github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/multibls" - "github.com/harmony-one/harmony/node" + node "github.com/harmony-one/harmony/node/harmony" "github.com/harmony-one/harmony/numeric" "github.com/harmony-one/harmony/p2p" rosetta_common "github.com/harmony-one/harmony/rosetta/common" - rpc_common "github.com/harmony-one/harmony/rpc/common" + rpc_common "github.com/harmony-one/harmony/rpc/harmony/common" "github.com/harmony-one/harmony/shard" "github.com/harmony-one/harmony/webhooks" "github.com/pkg/errors" "github.com/spf13/cobra" ) +// Version string variables +var ( + version string + builtBy string + builtAt string + commit string +) + // Host var ( myHost p2p.Host @@ -87,53 +95,18 @@ Examples usage: Run: runHarmonyNode, } -var configFlag = cli.StringFlag{ - Name: "config", - Usage: "load node config from the config toml file.", - Shorthand: "c", - DefValue: "", -} - func init() { - rand.Seed(time.Now().UnixNano()) - cli.SetParseErrorHandle(func(err error) { - os.Exit(128) // 128 - invalid command line arguments - }) - configCmd.AddCommand(dumpConfigCmd) - configCmd.AddCommand(updateConfigCmd) - rootCmd.AddCommand(configCmd) - rootCmd.AddCommand(versionCmd) - rootCmd.AddCommand(dumpConfigLegacyCmd) - rootCmd.AddCommand(dumpDBCmd) - rootCmd.AddCommand(inspectDBCmd) - - if err := registerRootCmdFlags(); err != nil { - os.Exit(2) - } - if err := registerDumpConfigFlags(); err != nil { - os.Exit(2) - } - if err := registerDumpDBFlags(); err != nil { - os.Exit(2) - } - if err := registerInspectionFlags(); err != nil { - os.Exit(2) - } + harmonyConfigs.VersionMetaData = append(harmonyConfigs.VersionMetaData, "harmony", version, commit, builtBy, builtAt) + harmonyConfigs.Init(rootCmd) } func main() { rootCmd.Execute() } -func registerRootCmdFlags() error { - flags := getRootFlags() - - return cli.RegisterFlags(rootCmd, flags) -} - func runHarmonyNode(cmd *cobra.Command, args []string) { - if cli.GetBoolFlagValue(cmd, versionFlag) { - printVersion() + if cli.GetBoolFlagValue(cmd, harmonyConfigs.VersionFlag()) { + harmonyConfigs.PrintVersion() os.Exit(0) } @@ -141,7 +114,7 @@ func runHarmonyNode(cmd *cobra.Command, args []string) { fmt.Fprint(os.Stderr, err) os.Exit(128) } - cfg, err := getHarmonyConfig(cmd) + cfg, err := harmonyConfigs.GetHarmonyConfig(cmd) if err != nil { fmt.Fprint(os.Stderr, err) os.Exit(128) @@ -174,80 +147,6 @@ func raiseFdLimits() error { return nil } -func getHarmonyConfig(cmd *cobra.Command) (harmonyconfig.HarmonyConfig, error) { - var ( - config harmonyconfig.HarmonyConfig - err error - migratedFrom string - configFile string - isUsingDefault bool - ) - if cli.IsFlagChanged(cmd, configFlag) { - configFile = cli.GetStringFlagValue(cmd, configFlag) - config, migratedFrom, err = loadHarmonyConfig(configFile) - } else { - nt := getNetworkType(cmd) - config = getDefaultHmyConfigCopy(nt) - isUsingDefault = true - } - if err != nil { - return harmonyconfig.HarmonyConfig{}, err - } - if migratedFrom != defaultConfig.Version && !isUsingDefault { - fmt.Printf("Old config version detected %s\n", - migratedFrom) - stat, _ := os.Stdin.Stat() - // Ask to update if only using terminal - if stat.Mode()&os.ModeCharDevice != 0 { - if promptConfigUpdate() { - err := updateConfigFile(configFile) - if err != nil { - fmt.Printf("Could not update config - %s", err.Error()) - fmt.Println("Update config manually with `./harmony config update [config_file]`") - } - } - - } else { - fmt.Println("Update saved config with `./harmony config update [config_file]`") - } - } - - applyRootFlags(cmd, &config) - - if err := validateHarmonyConfig(config); err != nil { - return harmonyconfig.HarmonyConfig{}, err - } - sanityFixHarmonyConfig(&config) - return config, nil -} - -func applyRootFlags(cmd *cobra.Command, config *harmonyconfig.HarmonyConfig) { - // Misc flags shall be applied first since legacy ip / port is overwritten - // by new ip / port flags - applyLegacyMiscFlags(cmd, config) - applyGeneralFlags(cmd, config) - applyNetworkFlags(cmd, config) - applyDNSSyncFlags(cmd, config) - applyP2PFlags(cmd, config) - applyHTTPFlags(cmd, config) - applyWSFlags(cmd, config) - applyRPCOptFlags(cmd, config) - applyBLSFlags(cmd, config) - applyConsensusFlags(cmd, config) - applyTxPoolFlags(cmd, config) - applyPprofFlags(cmd, config) - applyLogFlags(cmd, config) - applySysFlags(cmd, config) - applyDevnetFlags(cmd, config) - applyRevertFlags(cmd, config) - applyPreimageFlags(cmd, config) - applyPrometheusFlags(cmd, config) - applySyncFlags(cmd, config) - applyShardDataFlags(cmd, config) - applyGPOFlags(cmd, config) - applyCacheFlags(cmd, config) -} - func setupNodeLog(config harmonyconfig.HarmonyConfig) { logPath := filepath.Join(config.Log.Folder, config.Log.FileName) verbosity := config.Log.Verbosity @@ -292,7 +191,7 @@ func setupNodeAndRun(hc harmonyconfig.HarmonyConfig) { nodeconfigSetShardSchedule(hc) nodeconfig.SetShardingSchedule(shard.Schedule) - nodeconfig.SetVersion(getHarmonyVersion()) + nodeconfig.SetVersion(harmonyConfigs.GetHarmonyVersion()) if hc.General.NodeType == "validator" { var err error @@ -430,7 +329,7 @@ func setupNodeAndRun(hc harmonyconfig.HarmonyConfig) { } startMsg := "==== New Harmony Node ====" - if hc.General.NodeType == nodeTypeExplorer { + if hc.General.NodeType == harmonyConfigs.NodeTypeExplorer { startMsg = "==== New Explorer Node ====" } @@ -441,7 +340,7 @@ func setupNodeAndRun(hc harmonyconfig.HarmonyConfig) { Str("BeaconGroupID", nodeConfig.GetBeaconGroupID().String()). Str("ClientGroupID", nodeConfig.GetClientGroupID().String()). Str("Role", currentNode.NodeConfig.Role().String()). - Str("Version", getHarmonyVersion()). + Str("Version", harmonyConfigs.GetHarmonyVersion()). Str("multiaddress", fmt.Sprintf("/ip4/%s/tcp/%d/p2p/%s", hc.P2P.IP, hc.P2P.Port, myHost.GetID().String()), ). @@ -555,7 +454,7 @@ func nodeconfigSetShardSchedule(config harmonyconfig.HarmonyConfig) { if config.Devnet != nil { dnConfig = *config.Devnet } else { - dnConfig = getDefaultDevnetConfigCopy() + dnConfig = harmonyConfigs.GetDefaultDevnetConfigCopy() } devnetConfig, err := shardingconfig.NewInstance( @@ -645,7 +544,7 @@ func createGlobalConfig(hc harmonyconfig.HarmonyConfig) (*nodeconfig.ConfigType, initialAccounts = append(initialAccounts, &genesis.DeployAccount{ShardID: uint32(hc.General.ShardID)}) } nodeConfig := nodeconfig.GetShardConfig(initialAccounts[0].ShardID) - if hc.General.NodeType == nodeTypeValidator { + if hc.General.NodeType == harmonyConfigs.NodeTypeValidator { // Set up consensus keys. setupConsensusKeys(hc, nodeConfig) } else { @@ -802,6 +701,7 @@ func setupConsensusAndNode(hc harmonyconfig.HarmonyConfig, nodeConfig *nodeconfi minPeers = hc.Consensus.MinPeers aggregateSig = hc.Consensus.AggregateSig } else { + defaultConsensusConfig := harmonyConfigs.GetDefaultConsensusConfigCopy() minPeers = defaultConsensusConfig.MinPeers aggregateSig = defaultConsensusConfig.AggregateSig } @@ -842,7 +742,7 @@ func setupConsensusAndNode(hc harmonyconfig.HarmonyConfig, nodeConfig *nodeconfi if hc.Legacy != nil && hc.Legacy.TPBroadcastInvalidTxn != nil { currentNode.BroadcastInvalidTx = *hc.Legacy.TPBroadcastInvalidTxn } else { - currentNode.BroadcastInvalidTx = defaultBroadcastInvalidTx + currentNode.BroadcastInvalidTx = harmonyConfigs.DefaultBroadcastInvalidTx } // Syncing provider is provided by following rules: @@ -917,11 +817,11 @@ func setupTiKV(hc harmonyconfig.HarmonyConfig) shardchain.DBFactory { func processNodeType(hc harmonyconfig.HarmonyConfig, nodeConfig *nodeconfig.ConfigType) { switch hc.General.NodeType { - case nodeTypeExplorer: + case harmonyConfigs.NodeTypeExplorer: nodeconfig.SetDefaultRole(nodeconfig.ExplorerNode) nodeConfig.SetRole(nodeconfig.ExplorerNode) - case nodeTypeValidator: + case harmonyConfigs.NodeTypeValidator: nodeconfig.SetDefaultRole(nodeconfig.Validator) nodeConfig.SetRole(nodeconfig.Validator) } @@ -929,9 +829,9 @@ func processNodeType(hc harmonyconfig.HarmonyConfig, nodeConfig *nodeconfig.Conf func isBackup(hc harmonyconfig.HarmonyConfig) (isBackup bool) { switch hc.General.NodeType { - case nodeTypeExplorer: + case harmonyConfigs.NodeTypeExplorer: - case nodeTypeValidator: + case harmonyConfigs.NodeTypeValidator: return hc.General.IsBackup } return false @@ -1002,7 +902,7 @@ func setupSyncService(node *node.Node, host p2p.Host, hc harmonyconfig.HarmonyCo node.RegisterService(service.Synchronize, s) d := s.Downloaders.GetShardDownloader(node.Blockchain().ShardID()) - if hc.Sync.Downloader && hc.General.NodeType != nodeTypeExplorer { + if hc.Sync.Downloader && hc.General.NodeType != harmonyConfigs.NodeTypeExplorer { node.Consensus.SetDownloader(d) // Set downloader when stream client is active } } @@ -1044,7 +944,7 @@ func setupStagedSyncService(node *node.Node, host p2p.Host, hc harmonyconfig.Har node.RegisterService(service.StagedStreamSync, s) d := s.Downloaders.GetShardDownloader(node.Blockchain().ShardID()) - if hc.Sync.Downloader && hc.General.NodeType != nodeTypeExplorer { + if hc.Sync.Downloader && hc.General.NodeType != harmonyConfigs.NodeTypeExplorer { node.Consensus.SetDownloader(d) // Set downloader when stream client is active } } diff --git a/consensus/consensus_block_proposing.go b/consensus/consensus_block_proposing.go index aeb892aaeb..927b707e6d 100644 --- a/consensus/consensus_block_proposing.go +++ b/consensus/consensus_block_proposing.go @@ -11,7 +11,7 @@ import ( "github.com/harmony-one/harmony/core/types" "github.com/harmony-one/harmony/crypto/bls" "github.com/harmony-one/harmony/internal/utils" - "github.com/harmony-one/harmony/node/worker" + "github.com/harmony-one/harmony/node/harmony/worker" "github.com/harmony-one/harmony/shard" staking "github.com/harmony-one/harmony/staking/types" "github.com/pkg/errors" diff --git a/core_test/shardchain_test.go b/core_test/shardchain_test.go index a6a9238bab..ef4cc04cdb 100644 --- a/core_test/shardchain_test.go +++ b/core_test/shardchain_test.go @@ -15,7 +15,7 @@ import ( "github.com/harmony-one/harmony/internal/shardchain" "github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/multibls" - "github.com/harmony-one/harmony/node" + node "github.com/harmony-one/harmony/node/harmony" "github.com/harmony-one/harmony/p2p" "github.com/harmony-one/harmony/shard" "github.com/stretchr/testify/require" diff --git a/hmy/blockchain.go b/hmy/blockchain.go index 25a6d3aa7f..558d2a821d 100644 --- a/hmy/blockchain.go +++ b/hmy/blockchain.go @@ -6,6 +6,7 @@ import ( "math/big" v3 "github.com/harmony-one/harmony/block/v3" + "github.com/harmony-one/harmony/eth/rpc" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/bloombits" @@ -17,7 +18,6 @@ import ( "github.com/harmony-one/harmony/core/types" "github.com/harmony-one/harmony/crypto/bls" internal_bls "github.com/harmony-one/harmony/crypto/bls" - "github.com/harmony-one/harmony/eth/rpc" internal_common "github.com/harmony-one/harmony/internal/common" "github.com/harmony-one/harmony/internal/params" "github.com/harmony-one/harmony/internal/utils" diff --git a/hmy/hmy.go b/hmy/hmy.go index 097e597d02..12c3378844 100644 --- a/hmy/hmy.go +++ b/hmy/hmy.go @@ -18,7 +18,7 @@ import ( "github.com/harmony-one/harmony/core/types" "github.com/harmony-one/harmony/core/vm" nodeconfig "github.com/harmony-one/harmony/internal/configs/node" - commonRPC "github.com/harmony-one/harmony/rpc/common" + commonRPC "github.com/harmony-one/harmony/rpc/harmony/common" "github.com/harmony-one/harmony/shard" staking "github.com/harmony-one/harmony/staking/types" lru "github.com/hashicorp/golang-lru" diff --git a/hmy/net.go b/hmy/net.go index 754195d76d..c97e79c33c 100644 --- a/hmy/net.go +++ b/hmy/net.go @@ -2,7 +2,7 @@ package hmy import ( nodeconfig "github.com/harmony-one/harmony/internal/configs/node" - commonRPC "github.com/harmony-one/harmony/rpc/common" + commonRPC "github.com/harmony-one/harmony/rpc/harmony/common" "github.com/harmony-one/harmony/staking/network" "github.com/libp2p/go-libp2p/core/peer" ) diff --git a/hmy/staking.go b/hmy/staking.go index 83e800544c..f80f355886 100644 --- a/hmy/staking.go +++ b/hmy/staking.go @@ -16,7 +16,7 @@ import ( "github.com/harmony-one/harmony/internal/chain" internalCommon "github.com/harmony-one/harmony/internal/common" "github.com/harmony-one/harmony/numeric" - commonRPC "github.com/harmony-one/harmony/rpc/common" + commonRPC "github.com/harmony-one/harmony/rpc/harmony/common" "github.com/harmony-one/harmony/shard" "github.com/harmony-one/harmony/shard/committee" "github.com/harmony-one/harmony/staking/availability" diff --git a/hmy_boot/hmy_boot.go b/hmy_boot/hmy_boot.go new file mode 100644 index 0000000000..474ea44456 --- /dev/null +++ b/hmy_boot/hmy_boot.go @@ -0,0 +1,64 @@ +package hmy_boot + +import ( + "github.com/harmony-one/harmony/api/proto" + nodeconfig "github.com/harmony-one/harmony/internal/configs/node" + rpc_common "github.com/harmony-one/harmony/rpc/boot/common" + "github.com/libp2p/go-libp2p/core/peer" +) + +// BootService implements the BootService full node service. +type BootService struct { + // Channel for shutting down the service + ShutdownChan chan bool // Channel for shutting down the BootService + // Boot node API + BootNodeAPI BootNodeAPI + // Shard ID + ShardID uint32 +} + +// BootNodeAPI is the list of functions from node used to call rpc apis. +type BootNodeAPI interface { + GetNodeBootTime() int64 + PeerID() peer.ID + PeerConnectivity() (int, int, int) + ListKnownPeers() peer.IDSlice + ListConnectedPeers() []peer.ID + ListPeer(topic string) []peer.ID + ListTopic() []string + ListBlockedPeer() []peer.ID + GetConfig() rpc_common.Config + ShutDown() +} + +// New creates a new BootService object (including the +// initialisation of the common BootService object) +func New(nodeAPI BootNodeAPI) *BootService { + backend := &BootService{ + ShutdownChan: make(chan bool), + + BootNodeAPI: nodeAPI, + } + + return backend +} + +// ProtocolVersion ... +func (hmyboot *BootService) ProtocolVersion() int { + return proto.ProtocolVersion +} + +// GetNodeMetadata returns the node metadata. +func (hmyboot *BootService) GetNodeMetadata() rpc_common.BootNodeMetadata { + var c rpc_common.C + + c.TotalKnownPeers, c.Connected, c.NotConnected = hmyboot.BootNodeAPI.PeerConnectivity() + + return rpc_common.BootNodeMetadata{ + Version: nodeconfig.GetVersion(), + Network: string(nodeconfig.GetDefaultConfig().GetNetworkType()), + NodeBootTime: hmyboot.BootNodeAPI.GetNodeBootTime(), + PeerID: nodeconfig.GetPeerID(), + C: c, + } +} diff --git a/hmy_boot/net.go b/hmy_boot/net.go new file mode 100644 index 0000000000..c0db8c2b0d --- /dev/null +++ b/hmy_boot/net.go @@ -0,0 +1,22 @@ +package hmy_boot + +import ( + commonRPC "github.com/harmony-one/harmony/rpc/boot/common" +) + +// GetPeerInfo returns the peer info to the node, including blocked peer, connected peer, number of peers +func (hmyboot *BootService) GetPeerInfo() commonRPC.BootNodePeerInfo { + + var c commonRPC.C + c.TotalKnownPeers, c.Connected, c.NotConnected = hmyboot.BootNodeAPI.PeerConnectivity() + + knownPeers := hmyboot.BootNodeAPI.ListKnownPeers() + connectedPeers := hmyboot.BootNodeAPI.ListConnectedPeers() + + return commonRPC.BootNodePeerInfo{ + PeerID: hmyboot.BootNodeAPI.PeerID(), + KnownPeers: knownPeers, + ConnectedPeers: connectedPeers, + C: c, + } +} diff --git a/internal/configs/bootnode/bootnode.go b/internal/configs/bootnode/bootnode.go new file mode 100644 index 0000000000..6d0abfe821 --- /dev/null +++ b/internal/configs/bootnode/bootnode.go @@ -0,0 +1,186 @@ +package bootnode + +import ( + "reflect" + "strings" + "time" + + nodeconfig "github.com/harmony-one/harmony/internal/configs/node" + "github.com/harmony-one/harmony/internal/utils" +) + +// BootNodeConfig contains all the configs user can set for running harmony binary. Served as the bridge +// from user set flags to internal node configs. Also user can persist this structure to a toml file +// to avoid inputting all arguments. +type BootNodeConfig struct { + Version string + General GeneralConfig + P2P P2pConfig + HTTP HttpConfig + WS WsConfig + RPCOpt RpcOptConfig + Pprof PprofConfig + Log LogConfig + Sys *SysConfig `toml:",omitempty"` +} + +func (bnc BootNodeConfig) ToRPCServerConfig() nodeconfig.RPCServerConfig { + readTimeout, err := time.ParseDuration(bnc.HTTP.ReadTimeout) + if err != nil { + readTimeout, _ = time.ParseDuration(nodeconfig.DefaultHTTPTimeoutRead) + utils.Logger().Warn(). + Str("provided", bnc.HTTP.ReadTimeout). + Dur("updated", readTimeout). + Msg("Sanitizing invalid http read timeout") + } + writeTimeout, err := time.ParseDuration(bnc.HTTP.WriteTimeout) + if err != nil { + writeTimeout, _ = time.ParseDuration(nodeconfig.DefaultHTTPTimeoutWrite) + utils.Logger().Warn(). + Str("provided", bnc.HTTP.WriteTimeout). + Dur("updated", writeTimeout). + Msg("Sanitizing invalid http write timeout") + } + idleTimeout, err := time.ParseDuration(bnc.HTTP.IdleTimeout) + if err != nil { + idleTimeout, _ = time.ParseDuration(nodeconfig.DefaultHTTPTimeoutIdle) + utils.Logger().Warn(). + Str("provided", bnc.HTTP.IdleTimeout). + Dur("updated", idleTimeout). + Msg("Sanitizing invalid http idle timeout") + } + return nodeconfig.RPCServerConfig{ + HTTPEnabled: bnc.HTTP.Enabled, + HTTPIp: bnc.HTTP.IP, + HTTPPort: bnc.HTTP.Port, + HTTPTimeoutRead: readTimeout, + HTTPTimeoutWrite: writeTimeout, + HTTPTimeoutIdle: idleTimeout, + WSEnabled: bnc.WS.Enabled, + WSIp: bnc.WS.IP, + WSPort: bnc.WS.Port, + DebugEnabled: bnc.RPCOpt.DebugEnabled, + EthRPCsEnabled: bnc.RPCOpt.EthRPCsEnabled, + LegacyRPCsEnabled: bnc.RPCOpt.LegacyRPCsEnabled, + RpcFilterFile: bnc.RPCOpt.RpcFilterFile, + RateLimiterEnabled: bnc.RPCOpt.RateLimterEnabled, + RequestsPerSecond: bnc.RPCOpt.RequestsPerSecond, + } +} + +type P2pConfig struct { + Port int + IP string + KeyFile string + DHTDataStore *string `toml:",omitempty"` + DiscConcurrency int // Discovery Concurrency value + MaxConnsPerIP int + DisablePrivateIPScan bool + MaxPeers int64 + // In order to disable Connection Manager, it only needs to + // set both the high and low watermarks to zero. In this way, + // using Connection Manager will be an optional feature. + ConnManagerLowWatermark int + ConnManagerHighWatermark int + WaitForEachPeerToConnect bool + // to disable p2p security (tls and noise) + NoTransportSecurity bool + // enable p2p NAT. NAT Manager takes care of setting NAT port mappings, and discovering external addresses + NAT bool + // custom user agent; explicitly set the user-agent, so we can differentiate from other Go libp2p users + UserAgent string + // p2p dial timeout + DialTimeout time.Duration + // P2P multiplexer type, should be comma separated (mplex, Yamux) + Muxer string + // No relay services, direct connections between peers only + NoRelay bool +} + +type GeneralConfig struct { + NodeType string + ShardID int + TraceEnable bool +} + +type PprofConfig struct { + Enabled bool + ListenAddr string + Folder string + ProfileNames []string + ProfileIntervals []int + ProfileDebugValues []int +} + +type LogConfig struct { + Console bool + Folder string + FileName string + RotateSize int + RotateCount int + RotateMaxAge int + Verbosity int + VerbosePrints LogVerbosePrints + Context *LogContext `toml:",omitempty"` +} + +type LogVerbosePrints struct { + Config bool +} + +func FlagSliceToLogVerbosePrints(verbosePrintsFlagSlice []string) LogVerbosePrints { + verbosePrints := LogVerbosePrints{} + verbosePrintsReflect := reflect.Indirect(reflect.ValueOf(&verbosePrints)) + for _, verbosePrint := range verbosePrintsFlagSlice { + verbosePrint = strings.Title(verbosePrint) + field := verbosePrintsReflect.FieldByName(verbosePrint) + if field.IsValid() && field.CanSet() { + field.SetBool(true) + } + } + + return verbosePrints +} + +type LogContext struct { + IP string + Port int +} + +type SysConfig struct { + NtpServer string +} + +type HttpConfig struct { + Enabled bool + IP string + Port int + AuthPort int + ReadTimeout string + WriteTimeout string + IdleTimeout string +} + +type WsConfig struct { + Enabled bool + IP string + Port int + AuthPort int +} + +type RpcOptConfig struct { + DebugEnabled bool // Enables PrivateDebugService APIs, including the EVM tracer + EthRPCsEnabled bool // Expose Eth RPCs + LegacyRPCsEnabled bool // Expose Legacy RPCs + RpcFilterFile string // Define filters to enable/disable RPC exposure + RateLimterEnabled bool // Enable Rate limiter for RPC + RequestsPerSecond int // for RPC rate limiter +} + +type PrometheusConfig struct { + Enabled bool + IP string + Port int + EnablePush bool + Gateway string +} diff --git a/internal/configs/bootnode/bootnode_test.go b/internal/configs/bootnode/bootnode_test.go new file mode 100644 index 0000000000..5e99de78e4 --- /dev/null +++ b/internal/configs/bootnode/bootnode_test.go @@ -0,0 +1,71 @@ +package bootnode + +import ( + "fmt" + "testing" + "time" + + nodeconfig "github.com/harmony-one/harmony/internal/configs/node" + "github.com/stretchr/testify/assert" +) + +func TestToRPCServerConfig(t *testing.T) { + tests := []struct { + input BootNodeConfig + output nodeconfig.RPCServerConfig + }{ + { + input: BootNodeConfig{ + HTTP: HttpConfig{ + Enabled: true, + IP: "127.0.0.1", + Port: nodeconfig.DefaultRPCPort, + ReadTimeout: "-1", + WriteTimeout: "-2", + IdleTimeout: "-3", + }, + WS: WsConfig{ + Enabled: true, + IP: "127.0.0.1", + Port: nodeconfig.DefaultWSPort, + }, + RPCOpt: RpcOptConfig{ + DebugEnabled: false, + EthRPCsEnabled: true, + LegacyRPCsEnabled: true, + RpcFilterFile: "./.hmy/rpc_filter.txt", + RateLimterEnabled: true, + RequestsPerSecond: nodeconfig.DefaultRPCRateLimit, + }, + }, + output: nodeconfig.RPCServerConfig{ + HTTPEnabled: true, + HTTPIp: "127.0.0.1", + HTTPPort: nodeconfig.DefaultRPCPort, + HTTPTimeoutRead: 30 * time.Second, + HTTPTimeoutWrite: 30 * time.Second, + HTTPTimeoutIdle: 120 * time.Second, + WSEnabled: true, + WSIp: "127.0.0.1", + WSPort: nodeconfig.DefaultWSPort, + DebugEnabled: false, + EthRPCsEnabled: true, + LegacyRPCsEnabled: true, + RpcFilterFile: "./.hmy/rpc_filter.txt", + RateLimiterEnabled: true, + RequestsPerSecond: nodeconfig.DefaultRPCRateLimit, + }, + }, + } + for i, tt := range tests { + assertObject := assert.New(t) + name := fmt.Sprintf("TestToRPCServerConfig: #%d", i) + t.Run(name, func(t *testing.T) { + assertObject.Equal( + tt.input.ToRPCServerConfig(), + tt.output, + name, + ) + }) + } +} diff --git a/internal/configs/bootnode/config.go b/internal/configs/bootnode/config.go new file mode 100644 index 0000000000..75f2f783dd --- /dev/null +++ b/internal/configs/bootnode/config.go @@ -0,0 +1,191 @@ +// Package nodeconfig includes all the configuration variables for a node. +// It is a global configuration for node and other services. +// It will be included in node module, and other modules. +package bootnode + +import ( + "fmt" + "time" + + shardingconfig "github.com/harmony-one/harmony/internal/configs/sharding" + "github.com/harmony-one/harmony/internal/params" + "github.com/harmony-one/harmony/webhooks" + "github.com/libp2p/go-libp2p/core/peer" +) + +// Role defines a role of a node. +type Role byte + +// All constants for different node roles. +const ( + Unknown Role = iota + BootNode +) + +func (role Role) String() string { + switch role { + case BootNode: + return "BootNode" + default: + return "Unknown" + } +} + +// NetworkType describes the type of Harmony network +type NetworkType string + +// Constants for NetworkType +// TODO: replace this with iota. Leave the string parsing in command line +const ( + Mainnet = "mainnet" + Testnet = "testnet" + Pangaea = "pangaea" + Partner = "partner" + Stressnet = "stressnet" + Devnet = "devnet" + Localnet = "localnet" +) + +// ChainConfig returns the chain configuration for the network type. +func (t NetworkType) ChainConfig() params.ChainConfig { + switch t { + case Mainnet: + return *params.MainnetChainConfig + case Pangaea: + return *params.PangaeaChainConfig + case Partner: + return *params.PartnerChainConfig + case Stressnet: + return *params.StressnetChainConfig + case Localnet: + return *params.LocalnetChainConfig + default: + return *params.TestnetChainConfig + } +} + +func (n NetworkType) String() string { + if n == "" { + return Testnet // default to testnet + } + return string(n) +} + +var version string +var peerID peer.ID // PeerID of the node + +// ConfigType is the structure of all node related configuration variables +type ConfigType struct { + ShardID uint32 // ShardID of this node; TODO ek – revisit when resharding + role Role // Role of the node + Port string // Port of the node. + IP string // IP of the node. + RPCServer RPCServerConfig // RPC server port and ip + DebugMode bool // log every single process and error to help to debug the syncing issues + NtpServer string + + shardingSchedule shardingconfig.Schedule + networkType NetworkType + DNSZone string + WebHooks struct { + Hooks *webhooks.Hooks + } + TraceEnable bool +} + +// RPCServerConfig is the config for rpc listen addresses +type RPCServerConfig struct { + HTTPEnabled bool + HTTPIp string + HTTPPort int + + HTTPTimeoutRead time.Duration + HTTPTimeoutWrite time.Duration + HTTPTimeoutIdle time.Duration + + WSEnabled bool + WSIp string + WSPort int + + DebugEnabled bool + + NetworkRPCsEnabled bool + + RpcFilterFile string + + RateLimiterEnabled bool + RequestsPerSecond int +} + +// configs is a list of node configuration. +// It has at least one configuration. +// The first one is the default, global node configuration +var shardConfigs []ConfigType +var defaultConfig ConfigType + +// GetDefaultConfig returns default config. +func GetDefaultConfig() *ConfigType { + return &defaultConfig +} + +// SetDefaultRole .. +func SetDefaultRole(r Role) { + defaultConfig.role = r +} + +func (conf *ConfigType) String() string { + return fmt.Sprintf("%v", conf.ShardID) +} + +// SetShardID set the ShardID +func (conf *ConfigType) SetShardID(s uint32) { + conf.ShardID = s +} + +// SetRole set the role +func (conf *ConfigType) SetRole(r Role) { + conf.role = r +} + +// GetShardID returns the shardID. +func (conf *ConfigType) GetShardID() uint32 { + return conf.ShardID +} + +// Role returns the role +func (conf *ConfigType) Role() Role { + return conf.role +} + +// SetNetworkType set the networkType +func SetNetworkType(networkType NetworkType) { + defaultConfig.networkType = networkType + for i := range shardConfigs { + shardConfigs[i].networkType = networkType + } +} + +// GetNetworkType gets the networkType +func (conf *ConfigType) GetNetworkType() NetworkType { + return conf.networkType +} + +// SetVersion set the version of the node binary +func SetVersion(ver string) { + version = ver +} + +// GetVersion return the version of the node binary +func GetVersion() string { + return version +} + +// SetPeerID set the peer ID of the node +func SetPeerID(pid peer.ID) { + peerID = pid +} + +// GetPeerID returns the peer ID of the node +func GetPeerID() peer.ID { + return peerID +} diff --git a/internal/registry/registry.go b/internal/registry/registry.go index 760bb8d381..ab8e532e3c 100644 --- a/internal/registry/registry.go +++ b/internal/registry/registry.go @@ -11,7 +11,7 @@ import ( nodeconfig "github.com/harmony-one/harmony/internal/configs/node" "github.com/harmony-one/harmony/internal/shardchain" "github.com/harmony-one/harmony/multibls" - "github.com/harmony-one/harmony/node/worker" + "github.com/harmony-one/harmony/node/harmony/worker" "github.com/harmony-one/harmony/shard" "github.com/harmony-one/harmony/webhooks" ) diff --git a/node/boot/README.md b/node/boot/README.md new file mode 100644 index 0000000000..b987b730f3 --- /dev/null +++ b/node/boot/README.md @@ -0,0 +1,5 @@ +BootNode struct is the core entity that represents a bootstrap node participating in the Harmony protocol. + +New nodes in a p2p network often make their initial connection to the p2p network through a set of nodes known as boot nodes. Information (e.g. addresses) about these boot nodes is e.g. embedded in an application binary or provided as a configuration option. + +The boot nodes serve as an entry point, providing a list of other nodes in the network to newcomers. After connecting to the boot nodes, the new node can connect to those other nodes in the network, thereby no longer relying on the boot nodes. \ No newline at end of file diff --git a/node/boot/api.go b/node/boot/api.go new file mode 100644 index 0000000000..4f5887cb80 --- /dev/null +++ b/node/boot/api.go @@ -0,0 +1,138 @@ +package bootnode + +import ( + "time" + + "github.com/harmony-one/harmony/eth/rpc" + hmy_boot "github.com/harmony-one/harmony/hmy_boot" + bootnodeConfigs "github.com/harmony-one/harmony/internal/configs/bootnode" + nodeConfigs "github.com/harmony-one/harmony/internal/configs/node" + "github.com/harmony-one/harmony/internal/params" + "github.com/harmony-one/harmony/internal/utils" + boot_rpc "github.com/harmony-one/harmony/rpc/boot" + rpc_common "github.com/harmony-one/harmony/rpc/boot/common" + "github.com/libp2p/go-libp2p/core/peer" +) + +// PeerID returns self Peer ID +func (bootnode *BootNode) PeerID() peer.ID { + return bootnode.host.GetID() +} + +// PeerConnectivity .. +func (bootnode *BootNode) PeerConnectivity() (int, int, int) { + return bootnode.host.PeerConnectivity() +} + +// ListKnownPeers return known peers +func (bootnode *BootNode) ListKnownPeers() peer.IDSlice { + bs := bootnode.host.GetP2PHost().Peerstore() + if bs == nil { + return peer.IDSlice{} + } + return bs.Peers() +} + +// ListConnectedPeers return connected peers +func (bootnode *BootNode) ListConnectedPeers() []peer.ID { + return bootnode.host.Network().Peers() +} + +// ListPeer return list of peers for a certain topic +func (bootnode *BootNode) ListPeer(topic string) []peer.ID { + return bootnode.host.ListPeer(topic) +} + +// ListTopic return list of topics the node subscribed +func (bootnode *BootNode) ListTopic() []string { + return bootnode.host.ListTopic() +} + +// ListBlockedPeer return list of blocked peers +func (bootnode *BootNode) ListBlockedPeer() []peer.ID { + return bootnode.host.ListBlockedPeer() +} + +// GetNodeBootTime .. +func (bootnode *BootNode) GetNodeBootTime() int64 { + return bootnode.unixTimeAtNodeStart +} + +// StartRPC start RPC service +func (bootnode *BootNode) StartRPC() error { + bootService := hmy_boot.New(bootnode) + // Gather all the possible APIs to surface + apis := bootnode.APIs(bootService) + + err := boot_rpc.StartServers(bootService, apis, *bootnode.RPCConfig, bootnode.HarmonyConfig.RPCOpt) + + return err +} + +func (bootnode *BootNode) initRPCServerConfig() { + cfg := bootnode.HarmonyConfig + + readTimeout, err := time.ParseDuration(cfg.HTTP.ReadTimeout) + if err != nil { + readTimeout, _ = time.ParseDuration(nodeConfigs.DefaultHTTPTimeoutRead) + utils.Logger().Warn(). + Str("provided", cfg.HTTP.ReadTimeout). + Dur("updated", readTimeout). + Msg("Sanitizing invalid http read timeout") + } + writeTimeout, err := time.ParseDuration(cfg.HTTP.WriteTimeout) + if err != nil { + writeTimeout, _ = time.ParseDuration(nodeConfigs.DefaultHTTPTimeoutWrite) + utils.Logger().Warn(). + Str("provided", cfg.HTTP.WriteTimeout). + Dur("updated", writeTimeout). + Msg("Sanitizing invalid http write timeout") + } + idleTimeout, err := time.ParseDuration(cfg.HTTP.IdleTimeout) + if err != nil { + idleTimeout, _ = time.ParseDuration(nodeConfigs.DefaultHTTPTimeoutIdle) + utils.Logger().Warn(). + Str("provided", cfg.HTTP.IdleTimeout). + Dur("updated", idleTimeout). + Msg("Sanitizing invalid http idle timeout") + } + bootnode.RPCConfig = &bootnodeConfigs.RPCServerConfig{ + HTTPEnabled: cfg.HTTP.Enabled, + HTTPIp: cfg.HTTP.IP, + HTTPPort: cfg.HTTP.Port, + HTTPTimeoutRead: readTimeout, + HTTPTimeoutWrite: writeTimeout, + HTTPTimeoutIdle: idleTimeout, + WSEnabled: cfg.WS.Enabled, + WSIp: cfg.WS.IP, + WSPort: cfg.WS.Port, + DebugEnabled: cfg.RPCOpt.DebugEnabled, + RpcFilterFile: cfg.RPCOpt.RpcFilterFile, + RateLimiterEnabled: cfg.RPCOpt.RateLimterEnabled, + RequestsPerSecond: cfg.RPCOpt.RequestsPerSecond, + } +} + +func (bootnode *BootNode) GetRPCServerConfig() *bootnodeConfigs.RPCServerConfig { + return bootnode.RPCConfig +} + +// StopRPC stop RPC service +func (bootnode *BootNode) StopRPC() error { + return boot_rpc.StopServers() +} + +// APIs return the collection of local RPC services. +// NOTE, some of these services probably need to be moved to somewhere else. +func (bootnode *BootNode) APIs(harmony *hmy_boot.BootService) []rpc.API { + // Append all the local APIs and return + return []rpc.API{} +} + +func (bootnode *BootNode) GetConfig() rpc_common.Config { + return rpc_common.Config{ + HarmonyConfig: *bootnode.HarmonyConfig, + NodeConfig: *bootnode.NodeConfig, + ChainConfig: params.ChainConfig{}, + } +} diff --git a/node/boot/bootnode.go b/node/boot/bootnode.go new file mode 100644 index 0000000000..ce3c97fbd0 --- /dev/null +++ b/node/boot/bootnode.go @@ -0,0 +1,94 @@ +package bootnode + +import ( + "fmt" + "os" + "time" + + "github.com/harmony-one/harmony/api/service" + bootnodeConfigs "github.com/harmony-one/harmony/internal/configs/bootnode" + harmonyConfig "github.com/harmony-one/harmony/internal/configs/harmony" + nodeConfig "github.com/harmony-one/harmony/internal/configs/node" + "github.com/harmony-one/harmony/internal/utils" + "github.com/harmony-one/harmony/p2p" + "github.com/rcrowley/go-metrics" +) + +const ( + // NumTryBroadCast is the number of times trying to broadcast + NumTryBroadCast = 3 + // MsgChanBuffer is the buffer of consensus message handlers. + MsgChanBuffer = 1024 +) + +// BootNode represents a protocol-participating node in the network +type BootNode struct { + SelfPeer p2p.Peer + host p2p.Host + // Service manager. + serviceManager *service.Manager + // harmony configurations + HarmonyConfig *harmonyConfig.HarmonyConfig + // node configuration, including group ID, shard ID, etc + NodeConfig *nodeConfig.ConfigType + // RPC configurations + RPCConfig *bootnodeConfigs.RPCServerConfig + // node start time + unixTimeAtNodeStart int64 + // metrics + Metrics metrics.Registry +} + +// New creates a new boot node. +func New( + host p2p.Host, + hc *harmonyConfig.HarmonyConfig, +) *BootNode { + node := BootNode{ + unixTimeAtNodeStart: time.Now().Unix(), + HarmonyConfig: hc, + NodeConfig: &nodeConfig.ConfigType{}, + } + + if host != nil { + node.host = host + node.SelfPeer = host.GetSelfPeer() + } + + // init metrics + initMetrics() + nodeStringCounterVec.WithLabelValues("version", nodeConfig.GetVersion()).Inc() + + node.serviceManager = service.NewManager() + + node.initRPCServerConfig() + + return &node +} + +// ServiceManager ... +func (bootnode *BootNode) ServiceManager() *service.Manager { + return bootnode.serviceManager +} + +// ShutDown gracefully shut down the node server and dump the in-memory blockchain state into DB. +func (bootnode *BootNode) ShutDown() { + if err := bootnode.StopRPC(); err != nil { + utils.Logger().Error().Err(err).Msg("failed to stop boot RPC") + } + + utils.Logger().Info().Msg("stopping boot services") + if err := bootnode.StopServices(); err != nil { + utils.Logger().Error().Err(err).Msg("failed to stop boot services") + } + + utils.Logger().Info().Msg("stopping boot host") + if err := bootnode.host.Close(); err != nil { + utils.Logger().Error().Err(err).Msg("failed to stop boot p2p host") + } + + const msg = "Successfully shut down boot!\n" + utils.Logger().Print(msg) + fmt.Print(msg) + os.Exit(0) +} diff --git a/node/boot/metrics.go b/node/boot/metrics.go new file mode 100644 index 0000000000..80f94c921b --- /dev/null +++ b/node/boot/metrics.go @@ -0,0 +1,32 @@ +package bootnode + +import ( + "sync" + + prom "github.com/harmony-one/harmony/api/service/prometheus" + "github.com/prometheus/client_golang/prometheus" +) + +var ( + // nodeStringCounterVec is used to add version string or other static string + // info into the metrics api + nodeStringCounterVec = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "hmy", + Subsystem: "bootnode", + Name: "metadata", + Help: "a list of boot node metadata", + }, + []string{"key", "value"}, + ) + + onceMetrics sync.Once +) + +func initMetrics() { + onceMetrics.Do(func() { + prom.PromRegistry().MustRegister( + nodeStringCounterVec, + ) + }) +} diff --git a/node/boot/node_test.go b/node/boot/node_test.go new file mode 100644 index 0000000000..4c57b1abea --- /dev/null +++ b/node/boot/node_test.go @@ -0,0 +1,33 @@ +package bootnode + +import ( + "testing" + + harmonyConfigs "github.com/harmony-one/harmony/cmd/config" + "github.com/harmony-one/harmony/crypto/bls" + nodeconfig "github.com/harmony-one/harmony/internal/configs/node" + "github.com/harmony-one/harmony/internal/utils" + "github.com/harmony-one/harmony/p2p" +) + +func TestNewBootNode(t *testing.T) { + blsKey := bls.RandPrivateKey() + pubKey := blsKey.GetPublicKey() + leader := p2p.Peer{IP: "127.0.0.1", Port: "8882", ConsensusPubKey: pubKey} + priKey, _, _ := utils.GenKeyP2P("127.0.0.1", "9902") + host, err := p2p.NewHost(p2p.HostConfig{ + Self: &leader, + BLSKey: priKey, + BootNodes: nil, + }) + if err != nil { + t.Fatalf("new boot node host failure: %v", err) + } + + hc := harmonyConfigs.GetDefaultHmyConfigCopy(nodeconfig.NetworkType(nodeconfig.Devnet)) + node := New(host, &hc) + + if node == nil { + t.Error("boot node creation failed") + } +} diff --git a/node/boot/service_setup.go b/node/boot/service_setup.go new file mode 100644 index 0000000000..a7eae3ffb6 --- /dev/null +++ b/node/boot/service_setup.go @@ -0,0 +1,20 @@ +package bootnode + +import ( + "github.com/harmony-one/harmony/api/service" +) + +// RegisterService register a service to the node service manager +func (bootnode *BootNode) RegisterService(st service.Type, s service.Service) { + bootnode.serviceManager.Register(st, s) +} + +// StartServices runs registered services. +func (bootnode *BootNode) StartServices() error { + return bootnode.serviceManager.StartServices() +} + +// StopServices runs registered services. +func (bootnode *BootNode) StopServices() error { + return bootnode.serviceManager.StopServices() +} diff --git a/node/README.md b/node/harmony/README.md similarity index 100% rename from node/README.md rename to node/harmony/README.md diff --git a/node/addresses.go b/node/harmony/addresses.go similarity index 100% rename from node/addresses.go rename to node/harmony/addresses.go diff --git a/node/api.go b/node/harmony/api.go similarity index 97% rename from node/api.go rename to node/harmony/api.go index d49d40f076..56c4e0f4d2 100644 --- a/node/api.go +++ b/node/harmony/api.go @@ -9,9 +9,9 @@ import ( "github.com/harmony-one/harmony/hmy" "github.com/harmony-one/harmony/internal/tikv" "github.com/harmony-one/harmony/rosetta" - hmy_rpc "github.com/harmony-one/harmony/rpc" - rpc_common "github.com/harmony-one/harmony/rpc/common" - "github.com/harmony-one/harmony/rpc/filters" + hmy_rpc "github.com/harmony-one/harmony/rpc/harmony" + rpc_common "github.com/harmony-one/harmony/rpc/harmony/common" + "github.com/harmony-one/harmony/rpc/harmony/filters" "github.com/libp2p/go-libp2p/core/peer" ) diff --git a/node/double_signing.go b/node/harmony/double_signing.go similarity index 100% rename from node/double_signing.go rename to node/harmony/double_signing.go diff --git a/node/metrics.go b/node/harmony/metrics.go similarity index 100% rename from node/metrics.go rename to node/harmony/metrics.go diff --git a/node/node.go b/node/harmony/node.go similarity index 99% rename from node/node.go rename to node/harmony/node.go index 846eaecebb..19778506a6 100644 --- a/node/node.go +++ b/node/harmony/node.go @@ -33,7 +33,7 @@ import ( "github.com/harmony-one/harmony/internal/tikv/redis_helper" "github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/internal/utils/crosslinks" - "github.com/harmony-one/harmony/node/worker" + "github.com/harmony-one/harmony/node/harmony/worker" "github.com/harmony-one/harmony/p2p" "github.com/harmony-one/harmony/shard" "github.com/harmony-one/harmony/staking/reward" diff --git a/node/node.md b/node/harmony/node.md similarity index 100% rename from node/node.md rename to node/harmony/node.md diff --git a/node/node_cross_link.go b/node/harmony/node_cross_link.go similarity index 100% rename from node/node_cross_link.go rename to node/harmony/node_cross_link.go diff --git a/node/node_cross_shard.go b/node/harmony/node_cross_shard.go similarity index 100% rename from node/node_cross_shard.go rename to node/harmony/node_cross_shard.go diff --git a/node/node_explorer.go b/node/harmony/node_explorer.go similarity index 100% rename from node/node_explorer.go rename to node/harmony/node_explorer.go diff --git a/node/node_handler.go b/node/harmony/node_handler.go similarity index 100% rename from node/node_handler.go rename to node/harmony/node_handler.go diff --git a/node/node_handler_test.go b/node/harmony/node_handler_test.go similarity index 100% rename from node/node_handler_test.go rename to node/harmony/node_handler_test.go diff --git a/node/node_newblock.go b/node/harmony/node_newblock.go similarity index 100% rename from node/node_newblock.go rename to node/harmony/node_newblock.go diff --git a/node/node_newblock_test.go b/node/harmony/node_newblock_test.go similarity index 100% rename from node/node_newblock_test.go rename to node/harmony/node_newblock_test.go diff --git a/node/node_syncing.go b/node/harmony/node_syncing.go similarity index 100% rename from node/node_syncing.go rename to node/harmony/node_syncing.go diff --git a/node/node_test.go b/node/harmony/node_test.go similarity index 100% rename from node/node_test.go rename to node/harmony/node_test.go diff --git a/node/service_setup.go b/node/harmony/service_setup.go similarity index 100% rename from node/service_setup.go rename to node/harmony/service_setup.go diff --git a/node/worker/types.go b/node/harmony/worker/types.go similarity index 100% rename from node/worker/types.go rename to node/harmony/worker/types.go diff --git a/node/worker/worker.go b/node/harmony/worker/worker.go similarity index 100% rename from node/worker/worker.go rename to node/harmony/worker/worker.go diff --git a/node/worker/worker_test.go b/node/harmony/worker/worker_test.go similarity index 100% rename from node/worker/worker_test.go rename to node/harmony/worker/worker_test.go diff --git a/rosetta/common/operations.go b/rosetta/common/operations.go index c8e6014ded..a8269447ca 100644 --- a/rosetta/common/operations.go +++ b/rosetta/common/operations.go @@ -8,7 +8,7 @@ import ( "github.com/coinbase/rosetta-sdk-go/types" - rpcV2 "github.com/harmony-one/harmony/rpc/v2" + rpcV2 "github.com/harmony-one/harmony/rpc/harmony/v2" staking "github.com/harmony-one/harmony/staking/types" ) diff --git a/rosetta/services/account.go b/rosetta/services/account.go index da9a67c226..15b600e674 100644 --- a/rosetta/services/account.go +++ b/rosetta/services/account.go @@ -6,13 +6,13 @@ import ( "math/big" "github.com/harmony-one/harmony/core/vm" + "github.com/harmony-one/harmony/eth/rpc" "github.com/coinbase/rosetta-sdk-go/server" "github.com/coinbase/rosetta-sdk-go/types" ethCommon "github.com/ethereum/go-ethereum/common" hmyTypes "github.com/harmony-one/harmony/core/types" - "github.com/harmony-one/harmony/eth/rpc" "github.com/harmony-one/harmony/hmy" internalCommon "github.com/harmony-one/harmony/internal/common" "github.com/harmony-one/harmony/rosetta/common" diff --git a/rosetta/services/block.go b/rosetta/services/block.go index c488c5ff95..d187f2ea6d 100644 --- a/rosetta/services/block.go +++ b/rosetta/services/block.go @@ -7,6 +7,7 @@ import ( "sync" "time" + "github.com/harmony-one/harmony/eth/rpc" "github.com/harmony-one/harmony/hmy/tracers" "github.com/harmony-one/harmony/core" @@ -21,7 +22,6 @@ import ( "github.com/harmony-one/harmony/core/rawdb" hmytypes "github.com/harmony-one/harmony/core/types" "github.com/harmony-one/harmony/core/vm" - "github.com/harmony-one/harmony/eth/rpc" "github.com/harmony-one/harmony/hmy" "github.com/harmony-one/harmony/rosetta/common" stakingTypes "github.com/harmony-one/harmony/staking/types" diff --git a/rosetta/services/call_service.go b/rosetta/services/call_service.go index 9d26bab282..fd128a845e 100644 --- a/rosetta/services/call_service.go +++ b/rosetta/services/call_service.go @@ -11,7 +11,7 @@ import ( "github.com/harmony-one/harmony/hmy" internal_common "github.com/harmony-one/harmony/internal/common" "github.com/harmony-one/harmony/rosetta/common" - rpc2 "github.com/harmony-one/harmony/rpc" + rpc2 "github.com/harmony-one/harmony/rpc/harmony" "github.com/pkg/errors" ) diff --git a/rosetta/services/construction_check.go b/rosetta/services/construction_check.go index c842770ab7..b88e3bf6c5 100644 --- a/rosetta/services/construction_check.go +++ b/rosetta/services/construction_check.go @@ -15,7 +15,7 @@ import ( ethRpc "github.com/harmony-one/harmony/eth/rpc" "github.com/harmony-one/harmony/internal/params" "github.com/harmony-one/harmony/rosetta/common" - "github.com/harmony-one/harmony/rpc" + rpc "github.com/harmony-one/harmony/rpc/harmony" ) // ConstructMetadataOptions is constructed by ConstructionPreprocess for ConstructionMetadata options diff --git a/rosetta/services/network.go b/rosetta/services/network.go index 75ac52614c..a2879d9a8d 100644 --- a/rosetta/services/network.go +++ b/rosetta/services/network.go @@ -16,7 +16,7 @@ import ( "github.com/harmony-one/harmony/hmy" nodeconfig "github.com/harmony-one/harmony/internal/configs/node" "github.com/harmony-one/harmony/rosetta/common" - commonRPC "github.com/harmony-one/harmony/rpc/common" + commonRPC "github.com/harmony-one/harmony/rpc/harmony/common" "github.com/harmony-one/harmony/shard" ) diff --git a/rosetta/services/network_test.go b/rosetta/services/network_test.go index 3145df42c3..abdfd6b8fb 100644 --- a/rosetta/services/network_test.go +++ b/rosetta/services/network_test.go @@ -8,7 +8,7 @@ import ( "github.com/coinbase/rosetta-sdk-go/types" "github.com/harmony-one/harmony/rosetta/common" - commonRPC "github.com/harmony-one/harmony/rpc/common" + commonRPC "github.com/harmony-one/harmony/rpc/harmony/common" "github.com/libp2p/go-libp2p/core/peer" ) diff --git a/rosetta/services/tx_operation.go b/rosetta/services/tx_operation.go index 67da5227ad..1166af4811 100644 --- a/rosetta/services/tx_operation.go +++ b/rosetta/services/tx_operation.go @@ -16,7 +16,7 @@ import ( "github.com/harmony-one/harmony/hmy" "github.com/harmony-one/harmony/internal/params" "github.com/harmony-one/harmony/rosetta/common" - rpcV2 "github.com/harmony-one/harmony/rpc/v2" + rpcV2 "github.com/harmony-one/harmony/rpc/harmony/v2" "github.com/harmony-one/harmony/staking" stakingTypes "github.com/harmony-one/harmony/staking/types" ) diff --git a/rpc/boot/boot.go b/rpc/boot/boot.go new file mode 100644 index 0000000000..68756207b8 --- /dev/null +++ b/rpc/boot/boot.go @@ -0,0 +1,58 @@ +package rpc + +import ( + "context" + + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/harmony-one/harmony/eth/rpc" + hmyboot "github.com/harmony-one/harmony/hmy_boot" +) + +// PublicBootService provides an API to access Harmony related information. +// It offers only methods that operate on public data that is freely available to anyone. +type PublicBootService struct { + hmyboot *hmyboot.BootService + version Version +} + +// NewPublicBootAPI creates a new API for the RPC interface +func NewPublicBootAPI(hmyboot *hmyboot.BootService, version Version) rpc.API { + return rpc.API{ + Namespace: version.Namespace(), + Version: APIVersion, + Service: &PublicBootService{hmyboot, version}, + Public: true, + } +} + +// ProtocolVersion returns the current Harmony protocol version this node supports +// Note that the return type is an interface to account for the different versions +func (s *PublicBootService) ProtocolVersion( + ctx context.Context, +) (interface{}, error) { + // Format response according to version + switch s.version { + case V1, Eth: + return hexutil.Uint(s.hmyboot.ProtocolVersion()), nil + case V2: + return s.hmyboot.ProtocolVersion(), nil + default: + return nil, ErrUnknownRPCVersion + } +} + +// GetNodeMetadata produces a NodeMetadata record, data is from the answering RPC node +func (s *PublicBootService) GetNodeMetadata( + ctx context.Context, +) (StructuredResponse, error) { + // Response output is the same for all versions + return NewStructuredResponse(s.hmyboot.GetNodeMetadata()) +} + +// GetPeerInfo produces a NodePeerInfo record +func (s *PublicBootService) GetPeerInfo( + ctx context.Context, +) (StructuredResponse, error) { + // Response output is the same for all versions + return NewStructuredResponse(s.hmyboot.GetPeerInfo()) +} diff --git a/rpc/boot/common/types.go b/rpc/boot/common/types.go new file mode 100644 index 0000000000..e2c4c80005 --- /dev/null +++ b/rpc/boot/common/types.go @@ -0,0 +1,40 @@ +package rpc + +import ( + harmonyconfig "github.com/harmony-one/harmony/internal/configs/harmony" + nodeconfig "github.com/harmony-one/harmony/internal/configs/node" + "github.com/harmony-one/harmony/internal/params" + "github.com/libp2p/go-libp2p/core/peer" +) + +// StructuredResponse type of RPCs +type StructuredResponse = map[string]interface{} + +type C struct { + TotalKnownPeers int `json:"total-known-peers"` + Connected int `json:"connected"` + NotConnected int `json:"not-connected"` +} + +// BootNodeMetadata captures select metadata of the RPC answering boot node +type BootNodeMetadata struct { + Version string `json:"version"` + Network string `json:"network"` + NodeBootTime int64 `json:"node-unix-start-time"` + PeerID peer.ID `json:"peerid"` + C C `json:"p2p-connectivity"` +} + +// BootNodePeerInfo captures the peer connectivity info of the boot node +type BootNodePeerInfo struct { + PeerID peer.ID `json:"peerid"` + KnownPeers []peer.ID `json:"known-peers"` + ConnectedPeers []peer.ID `json:"connected-peers"` + C C `json:"c"` +} + +type Config struct { + HarmonyConfig harmonyconfig.HarmonyConfig + NodeConfig nodeconfig.ConfigType + ChainConfig params.ChainConfig +} diff --git a/rpc/boot/error.go b/rpc/boot/error.go new file mode 100644 index 0000000000..8ec9d73d4b --- /dev/null +++ b/rpc/boot/error.go @@ -0,0 +1,18 @@ +package rpc + +import ( + "errors" +) + +var ( + // ErrInvalidLogLevel when invalid log level is provided + ErrInvalidLogLevel = errors.New("invalid log level") + // ErrIncorrectChainID when ChainID does not match running node + ErrIncorrectChainID = errors.New("incorrect chain id") + // ErrInvalidChainID when ChainID of signer does not match that of running node + ErrInvalidChainID = errors.New("invalid chain id for signer") + // ErrNotBeaconShard when rpc is called on not beacon chain node + ErrNotBeaconShard = errors.New("cannot call this rpc on non beaconchain node") + // ErrUnknownRPCVersion when rpc method has an unknown or unhandled version + ErrUnknownRPCVersion = errors.New("API service has an unknown version") +) diff --git a/rpc/boot/rpc.go b/rpc/boot/rpc.go new file mode 100644 index 0000000000..a9da9ca119 --- /dev/null +++ b/rpc/boot/rpc.go @@ -0,0 +1,167 @@ +package rpc + +import ( + "fmt" + "net" + "strings" + + "github.com/harmony-one/harmony/eth/rpc" + hmyboot "github.com/harmony-one/harmony/hmy_boot" + bootnodeConfigs "github.com/harmony-one/harmony/internal/configs/bootnode" + "github.com/harmony-one/harmony/internal/configs/harmony" + "github.com/harmony-one/harmony/internal/utils" +) + +// Version enum +const ( + V1 Version = iota + V2 + Eth + Debug + Trace +) + +const ( + // APIVersion used for DApp's, bumped after RPC refactor (7/2020) + APIVersion = "1.0" + // LogTag is the tag found in the log for all RPC logs + LogTag = "[BOOT_RPC]" + // HTTPPortOffset .. + HTTPPortOffset = 500 + // WSPortOffset .. + WSPortOffset = 800 +) + +var ( + // HTTPModules .. + HTTPModules = []string{"hmyboot", "hmybootv2", "eth", "debug", "trace"} + // WSModules .. + WSModules = []string{"hmyboot", "hmybootv2", "eth", "debug", "trace"} + + httpListener net.Listener + httpHandler *rpc.Server + wsListener net.Listener + wsHandler *rpc.Server + httpEndpoint = "" + wsEndpoint = "" + httpVirtualHosts = []string{"*"} + httpOrigins = []string{"*"} + wsOrigins = []string{"*"} +) + +// Version of the RPC +type Version int + +// Namespace of the RPC version +func (n Version) Namespace() string { + return HTTPModules[n] +} + +// StartServers starts the http & ws servers +func StartServers(hmyboot *hmyboot.BootService, apis []rpc.API, config bootnodeConfigs.RPCServerConfig, rpcOpt harmony.RpcOptConfig) error { + apis = append(apis, getBootAPIs(hmyboot, config)...) + // load method filter from file (if exist) + var rmf rpc.RpcMethodFilter + rpcFilterFilePath := strings.TrimSpace(rpcOpt.RpcFilterFile) + if len(rpcFilterFilePath) > 0 { + if err := rmf.LoadRpcMethodFiltersFromFile(rpcFilterFilePath); err != nil { + return err + } + } else { + rmf.ExposeAll() + } + + if config.HTTPEnabled { + timeouts := rpc.HTTPTimeouts{ + ReadTimeout: config.HTTPTimeoutRead, + WriteTimeout: config.HTTPTimeoutWrite, + IdleTimeout: config.HTTPTimeoutIdle, + } + httpEndpoint = fmt.Sprintf("%v:%v", config.HTTPIp, config.HTTPPort) + if err := startBootServiceHTTP(apis, &rmf, timeouts); err != nil { + return err + } + } + + if config.WSEnabled { + wsEndpoint = fmt.Sprintf("%v:%v", config.WSIp, config.WSPort) + if err := startBootServiceWS(apis, &rmf); err != nil { + return err + } + } + + return nil +} + +// StopServers stops the http & ws servers +func StopServers() error { + if httpListener != nil { + if err := httpListener.Close(); err != nil { + return err + } + httpListener = nil + utils.Logger().Info(). + Str("url", fmt.Sprintf("http://%s", httpEndpoint)). + Msg("HTTP endpoint closed") + } + if httpHandler != nil { + httpHandler.Stop() + httpHandler = nil + } + if wsListener != nil { + if err := wsListener.Close(); err != nil { + return err + } + wsListener = nil + utils.Logger().Info(). + Str("url", fmt.Sprintf("http://%s", wsEndpoint)). + Msg("WS endpoint closed") + } + if wsHandler != nil { + wsHandler.Stop() + wsHandler = nil + } + return nil +} + +// getBootAPIs returns all the API methods for the RPC interface +func getBootAPIs(hmyboot *hmyboot.BootService, config bootnodeConfigs.RPCServerConfig) []rpc.API { + publicAPIs := []rpc.API{ + // Public methods + NewPublicBootAPI(hmyboot, V1), + NewPublicBootAPI(hmyboot, V2), + } + + return publicAPIs +} + +func startBootServiceHTTP(apis []rpc.API, rmf *rpc.RpcMethodFilter, httpTimeouts rpc.HTTPTimeouts) (err error) { + httpListener, httpHandler, err = rpc.StartHTTPEndpoint( + httpEndpoint, apis, HTTPModules, rmf, httpOrigins, httpVirtualHosts, httpTimeouts, + ) + if err != nil { + return err + } + + utils.Logger().Info(). + Str("url", fmt.Sprintf("http://%s", httpEndpoint)). + Str("cors", strings.Join(httpOrigins, ",")). + Str("vhosts", strings.Join(httpVirtualHosts, ",")). + Msg("HTTP endpoint opened") + + fmt.Printf("Started Boot Node RPC server at: %v\n", httpEndpoint) + return nil +} + +func startBootServiceWS(apis []rpc.API, rmf *rpc.RpcMethodFilter) (err error) { + wsListener, wsHandler, err = rpc.StartWSEndpoint(wsEndpoint, apis, WSModules, rmf, wsOrigins, true) + if err != nil { + return err + } + + utils.Logger().Info(). + Str("url", fmt.Sprintf("ws://%s", wsEndpoint)). + Msg("WebSocket endpoint opened") + fmt.Printf("Started Boot Node WS server at: %v\n", wsEndpoint) + return nil +} diff --git a/rpc/boot/types.go b/rpc/boot/types.go new file mode 100644 index 0000000000..014bda54e9 --- /dev/null +++ b/rpc/boot/types.go @@ -0,0 +1,27 @@ +package rpc + +import ( + "bytes" + + jsoniter "github.com/json-iterator/go" +) + +// StructuredResponse type of RPCs +type StructuredResponse = map[string]interface{} + +// NewStructuredResponse creates a structured response from the given input +func NewStructuredResponse(input interface{}) (StructuredResponse, error) { + var objMap StructuredResponse + var jsonIter = jsoniter.ConfigCompatibleWithStandardLibrary + dat, err := jsonIter.Marshal(input) + if err != nil { + return nil, err + } + d := jsonIter.NewDecoder(bytes.NewReader(dat)) + d.UseNumber() + err = d.Decode(&objMap) + if err != nil { + return nil, err + } + return objMap, nil +} diff --git a/rpc/blockchain.go b/rpc/harmony/blockchain.go similarity index 99% rename from rpc/blockchain.go rename to rpc/harmony/blockchain.go index c9a6a13138..64f84c709b 100644 --- a/rpc/blockchain.go +++ b/rpc/harmony/blockchain.go @@ -26,10 +26,10 @@ import ( nodeconfig "github.com/harmony-one/harmony/internal/configs/node" "github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/numeric" - rpc_common "github.com/harmony-one/harmony/rpc/common" - eth "github.com/harmony-one/harmony/rpc/eth" - v1 "github.com/harmony-one/harmony/rpc/v1" - v2 "github.com/harmony-one/harmony/rpc/v2" + rpc_common "github.com/harmony-one/harmony/rpc/harmony/common" + eth "github.com/harmony-one/harmony/rpc/harmony/eth" + v1 "github.com/harmony-one/harmony/rpc/harmony/v1" + v2 "github.com/harmony-one/harmony/rpc/harmony/v2" "github.com/harmony-one/harmony/shard" stakingReward "github.com/harmony-one/harmony/staking/reward" ) diff --git a/rpc/common/block.go b/rpc/harmony/common/block.go similarity index 100% rename from rpc/common/block.go rename to rpc/harmony/common/block.go diff --git a/rpc/common/hacks.go b/rpc/harmony/common/hacks.go similarity index 100% rename from rpc/common/hacks.go rename to rpc/harmony/common/hacks.go diff --git a/rpc/common/types.go b/rpc/harmony/common/types.go similarity index 100% rename from rpc/common/types.go rename to rpc/harmony/common/types.go diff --git a/rpc/contract.go b/rpc/harmony/contract.go similarity index 100% rename from rpc/contract.go rename to rpc/harmony/contract.go diff --git a/rpc/error.go b/rpc/harmony/error.go similarity index 100% rename from rpc/error.go rename to rpc/harmony/error.go diff --git a/rpc/eth/block.go b/rpc/harmony/eth/block.go similarity index 96% rename from rpc/eth/block.go rename to rpc/harmony/eth/block.go index 783734b74e..900fa62c21 100644 --- a/rpc/eth/block.go +++ b/rpc/harmony/eth/block.go @@ -3,7 +3,7 @@ package eth import ( "github.com/harmony-one/harmony/core/types" internal_common "github.com/harmony-one/harmony/internal/common" - rpc_common "github.com/harmony-one/harmony/rpc/common" + rpc_common "github.com/harmony-one/harmony/rpc/harmony/common" "github.com/pkg/errors" ) diff --git a/rpc/eth/rpc.go b/rpc/harmony/eth/rpc.go similarity index 100% rename from rpc/eth/rpc.go rename to rpc/harmony/eth/rpc.go diff --git a/rpc/eth/types.go b/rpc/harmony/eth/types.go similarity index 100% rename from rpc/eth/types.go rename to rpc/harmony/eth/types.go diff --git a/rpc/filters/api.go b/rpc/harmony/filters/api.go similarity index 99% rename from rpc/filters/api.go rename to rpc/harmony/filters/api.go index 84c171cc10..e95b81a881 100644 --- a/rpc/filters/api.go +++ b/rpc/harmony/filters/api.go @@ -6,6 +6,7 @@ import ( "sync" "time" + "github.com/harmony-one/harmony/eth/rpc" "github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/internal/tikv/redis_helper" @@ -14,8 +15,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/harmony-one/harmony/block" "github.com/harmony-one/harmony/core/types" - "github.com/harmony-one/harmony/eth/rpc" - hmy_rpc "github.com/harmony-one/harmony/rpc" + hmy_rpc "github.com/harmony-one/harmony/rpc/harmony" ) var ( diff --git a/rpc/filters/filter.go b/rpc/harmony/filters/filter.go similarity index 100% rename from rpc/filters/filter.go rename to rpc/harmony/filters/filter.go diff --git a/rpc/filters/filter_criteria.go b/rpc/harmony/filters/filter_criteria.go similarity index 100% rename from rpc/filters/filter_criteria.go rename to rpc/harmony/filters/filter_criteria.go diff --git a/rpc/filters/filter_system.go b/rpc/harmony/filters/filter_system.go similarity index 100% rename from rpc/filters/filter_system.go rename to rpc/harmony/filters/filter_system.go diff --git a/rpc/harmony.go b/rpc/harmony/harmony.go similarity index 100% rename from rpc/harmony.go rename to rpc/harmony/harmony.go diff --git a/rpc/metrics.go b/rpc/harmony/metrics.go similarity index 100% rename from rpc/metrics.go rename to rpc/harmony/metrics.go diff --git a/rpc/net.go b/rpc/harmony/net.go similarity index 100% rename from rpc/net.go rename to rpc/harmony/net.go diff --git a/rpc/pool.go b/rpc/harmony/pool.go similarity index 98% rename from rpc/pool.go rename to rpc/harmony/pool.go index ee4e34828f..91eea75b0a 100644 --- a/rpc/pool.go +++ b/rpc/harmony/pool.go @@ -20,9 +20,9 @@ import ( common2 "github.com/harmony-one/harmony/internal/common" nodeconfig "github.com/harmony-one/harmony/internal/configs/node" "github.com/harmony-one/harmony/internal/utils" - eth "github.com/harmony-one/harmony/rpc/eth" - v1 "github.com/harmony-one/harmony/rpc/v1" - v2 "github.com/harmony-one/harmony/rpc/v2" + eth "github.com/harmony-one/harmony/rpc/harmony/eth" + v1 "github.com/harmony-one/harmony/rpc/harmony/v1" + v2 "github.com/harmony-one/harmony/rpc/harmony/v2" staking "github.com/harmony-one/harmony/staking/types" ) diff --git a/rpc/preimages.go b/rpc/harmony/preimages.go similarity index 100% rename from rpc/preimages.go rename to rpc/harmony/preimages.go diff --git a/rpc/private_debug.go b/rpc/harmony/private_debug.go similarity index 100% rename from rpc/private_debug.go rename to rpc/harmony/private_debug.go diff --git a/rpc/public_debug.go b/rpc/harmony/public_debug.go similarity index 100% rename from rpc/public_debug.go rename to rpc/harmony/public_debug.go diff --git a/rpc/rpc.go b/rpc/harmony/rpc.go similarity index 98% rename from rpc/rpc.go rename to rpc/harmony/rpc.go index 15d7d93baf..a216f9843f 100644 --- a/rpc/rpc.go +++ b/rpc/harmony/rpc.go @@ -10,9 +10,9 @@ import ( "github.com/harmony-one/harmony/internal/configs/harmony" nodeconfig "github.com/harmony-one/harmony/internal/configs/node" "github.com/harmony-one/harmony/internal/utils" - eth "github.com/harmony-one/harmony/rpc/eth" - v1 "github.com/harmony-one/harmony/rpc/v1" - v2 "github.com/harmony-one/harmony/rpc/v2" + eth "github.com/harmony-one/harmony/rpc/harmony/eth" + v1 "github.com/harmony-one/harmony/rpc/harmony/v1" + v2 "github.com/harmony-one/harmony/rpc/harmony/v2" ) // Version enum diff --git a/rpc/staking.go b/rpc/harmony/staking.go similarity index 100% rename from rpc/staking.go rename to rpc/harmony/staking.go diff --git a/rpc/tracer.go b/rpc/harmony/tracer.go similarity index 100% rename from rpc/tracer.go rename to rpc/harmony/tracer.go diff --git a/rpc/tracerParity.go b/rpc/harmony/tracerParity.go similarity index 100% rename from rpc/tracerParity.go rename to rpc/harmony/tracerParity.go diff --git a/rpc/transaction.go b/rpc/harmony/transaction.go similarity index 99% rename from rpc/transaction.go rename to rpc/harmony/transaction.go index 4b45045851..5191566a36 100644 --- a/rpc/transaction.go +++ b/rpc/harmony/transaction.go @@ -20,9 +20,9 @@ import ( internal_common "github.com/harmony-one/harmony/internal/common" "github.com/harmony-one/harmony/internal/params" "github.com/harmony-one/harmony/internal/utils" - eth "github.com/harmony-one/harmony/rpc/eth" - v1 "github.com/harmony-one/harmony/rpc/v1" - v2 "github.com/harmony-one/harmony/rpc/v2" + eth "github.com/harmony-one/harmony/rpc/harmony/eth" + v1 "github.com/harmony-one/harmony/rpc/harmony/v1" + v2 "github.com/harmony-one/harmony/rpc/harmony/v2" staking "github.com/harmony-one/harmony/staking/types" ) diff --git a/rpc/types.go b/rpc/harmony/types.go similarity index 100% rename from rpc/types.go rename to rpc/harmony/types.go index 7bcd931831..e3a97afda4 100644 --- a/rpc/types.go +++ b/rpc/harmony/types.go @@ -10,6 +10,7 @@ import ( "strings" "time" + "github.com/harmony-one/harmony/eth/rpc" internal_common "github.com/harmony-one/harmony/internal/common" "github.com/pkg/errors" @@ -19,7 +20,6 @@ import ( "github.com/ethereum/go-ethereum/rlp" "github.com/harmony-one/harmony/block" "github.com/harmony-one/harmony/core/types" - "github.com/harmony-one/harmony/eth/rpc" "github.com/harmony-one/harmony/internal/utils" "github.com/harmony-one/harmony/numeric" "github.com/harmony-one/harmony/shard" diff --git a/rpc/types_test.go b/rpc/harmony/types_test.go similarity index 100% rename from rpc/types_test.go rename to rpc/harmony/types_test.go diff --git a/rpc/utils/utils.go b/rpc/harmony/utils/utils.go similarity index 100% rename from rpc/utils/utils.go rename to rpc/harmony/utils/utils.go diff --git a/rpc/v1/block.go b/rpc/harmony/v1/block.go similarity index 96% rename from rpc/v1/block.go rename to rpc/harmony/v1/block.go index 714816f91c..5437a07812 100644 --- a/rpc/v1/block.go +++ b/rpc/harmony/v1/block.go @@ -2,7 +2,7 @@ package v1 import ( "github.com/harmony-one/harmony/core/types" - rpc_common "github.com/harmony-one/harmony/rpc/common" + rpc_common "github.com/harmony-one/harmony/rpc/harmony/common" "github.com/pkg/errors" ) diff --git a/rpc/v1/legacy.go b/rpc/harmony/v1/legacy.go similarity index 100% rename from rpc/v1/legacy.go rename to rpc/harmony/v1/legacy.go diff --git a/rpc/v1/types.go b/rpc/harmony/v1/types.go similarity index 100% rename from rpc/v1/types.go rename to rpc/harmony/v1/types.go diff --git a/rpc/v2/block.go b/rpc/harmony/v2/block.go similarity index 96% rename from rpc/v2/block.go rename to rpc/harmony/v2/block.go index 0a1fed60ed..5c1b975a29 100644 --- a/rpc/v2/block.go +++ b/rpc/harmony/v2/block.go @@ -2,7 +2,7 @@ package v2 import ( "github.com/harmony-one/harmony/core/types" - rpc_common "github.com/harmony-one/harmony/rpc/common" + rpc_common "github.com/harmony-one/harmony/rpc/harmony/common" "github.com/pkg/errors" ) diff --git a/rpc/v2/legacy.go b/rpc/harmony/v2/legacy.go similarity index 100% rename from rpc/v2/legacy.go rename to rpc/harmony/v2/legacy.go diff --git a/rpc/v2/types.go b/rpc/harmony/v2/types.go similarity index 100% rename from rpc/v2/types.go rename to rpc/harmony/v2/types.go diff --git a/rpc/web3.go b/rpc/harmony/web3.go similarity index 100% rename from rpc/web3.go rename to rpc/harmony/web3.go diff --git a/test/chain/main.go b/test/chain/main.go index 4b935292f0..e523c0359a 100644 --- a/test/chain/main.go +++ b/test/chain/main.go @@ -19,7 +19,7 @@ import ( "github.com/harmony-one/harmony/core/vm" "github.com/harmony-one/harmony/crypto/hash" "github.com/harmony-one/harmony/internal/params" - pkgworker "github.com/harmony-one/harmony/node/worker" + pkgworker "github.com/harmony-one/harmony/node/harmony/worker" ) const ( diff --git a/test/deploy.sh b/test/deploy.sh index 470a4b4f13..0f3d3f56ad 100755 --- a/test/deploy.sh +++ b/test/deploy.sh @@ -54,7 +54,7 @@ function setup() { function launch_bootnode() { echo "launching boot node ..." - ${DRYRUN} ${ROOT}/bin/bootnode -port 19876 -max_conn_per_ip 100 -force_public true >"${log_folder}"/bootnode.log 2>&1 | tee -a "${LOG_FILE}" & + ${DRYRUN} ${ROOT}/bin/bootnode -port 19876 -rpc_http_port 8888 -rpc_ws_port 8889 -network "localnet" -max_conn_per_ip 100 -force_public true >"${log_folder}"/bootnode.log 2>&1 | tee -a "${LOG_FILE}" & sleep 1 BN_MA=$(grep "BN_MA" "${log_folder}"/bootnode.log | awk -F\= ' { print $2 } ') echo "bootnode launched." + " $BN_MA" diff --git a/test/helpers/transaction.go b/test/helpers/transaction.go index 11efd386f0..9367a957da 100644 --- a/test/helpers/transaction.go +++ b/test/helpers/transaction.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" hmytypes "github.com/harmony-one/harmony/core/types" - rpcV2 "github.com/harmony-one/harmony/rpc/v2" + rpcV2 "github.com/harmony-one/harmony/rpc/harmony/v2" stakingTypes "github.com/harmony-one/harmony/staking/types" )