diff --git a/common/geth/cli.go b/common/geth/cli.go index d62d07f7e..f87b0c461 100644 --- a/common/geth/cli.go +++ b/common/geth/cli.go @@ -7,6 +7,7 @@ import ( var ( rpcUrlFlagName = "chain.rpc" + rpcFallbackUrlFlagName = "chain.rpc_fallback" privateKeyFlagName = "chain.private-key" numConfirmationsFlagName = "chain.num-confirmations" numRetriesFlagName = "chain.num-retries" @@ -27,6 +28,13 @@ func EthClientFlags(envPrefix string) []cli.Flag { Required: true, EnvVar: common.PrefixEnvVar(envPrefix, "CHAIN_RPC"), }, + cli.StringFlag{ + Name: rpcFallbackUrlFlagName, + Usage: "Fallback chain rpc for Disperser/Batcher/Dataapi", + Required: false, + Value: "", + EnvVar: common.PrefixEnvVar(envPrefix, "CHAIN_RPC_FALLBACK"), + }, cli.StringFlag{ Name: privateKeyFlagName, Usage: "Ethereum private key for disperser", @@ -57,6 +65,11 @@ func ReadEthClientConfig(ctx *cli.Context) EthClientConfig { cfg.NumConfirmations = ctx.GlobalInt(numConfirmationsFlagName) cfg.NumRetries = ctx.GlobalInt(numRetriesFlagName) + fallbackRPCURL := ctx.GlobalString(rpcFallbackUrlFlagName) + if len(fallbackRPCURL) > 0 { + cfg.RPCURLs = append(cfg.RPCURLs, []string{fallbackRPCURL}...) + } + return cfg } @@ -68,5 +81,10 @@ func ReadEthClientConfigRPCOnly(ctx *cli.Context) EthClientConfig { cfg.NumConfirmations = ctx.GlobalInt(numConfirmationsFlagName) cfg.NumRetries = ctx.GlobalInt(numRetriesFlagName) + fallbackRPCURL := ctx.GlobalString(rpcFallbackUrlFlagName) + if len(fallbackRPCURL) > 0 { + cfg.RPCURLs = append(cfg.RPCURLs, []string{fallbackRPCURL}...) + } + return cfg } diff --git a/common/geth/multihoming_client.go b/common/geth/multihoming_client.go index 1ee7f51d9..a96aaf16e 100644 --- a/common/geth/multihoming_client.go +++ b/common/geth/multihoming_client.go @@ -34,6 +34,12 @@ var _ dacommon.EthClient = (*MultiHomingClient)(nil) func NewMultiHomingClient(config EthClientConfig, senderAddress gethcommon.Address, logger logging.Logger) (*MultiHomingClient, error) { rpcUrls := config.RPCURLs + if len(config.RPCURLs) > 1 { + logger.Info("Fallback chain RPC enabled") + } else { + logger.Info("Fallback chain RPC not available") + } + FailoverController, err := NewFailoverController(logger, rpcUrls) if err != nil { return nil, err diff --git a/disperser/cmd/apiserver/main.go b/disperser/cmd/apiserver/main.go index 44c63453b..5394ac1d8 100644 --- a/disperser/cmd/apiserver/main.go +++ b/disperser/cmd/apiserver/main.go @@ -59,6 +59,7 @@ func RunDisperserServer(ctx *cli.Context) error { if err != nil { return err } + client, err := geth.NewMultiHomingClient(config.EthClientConfig, gethcommon.Address{}, logger) if err != nil { logger.Error("Cannot create chain.Client", "err", err)