From e4240acb490f6f213193459de66182ca24ff2810 Mon Sep 17 00:00:00 2001 From: Kirill Date: Mon, 4 Nov 2024 18:13:02 +0400 Subject: [PATCH] Make eth-node flag as required (#2249) --- cmd/juno/juno.go | 15 ++++++++++----- node/node.go | 23 ++++++++++++++--------- node/node_test.go | 44 +++++++++++++++++++++++--------------------- 3 files changed, 47 insertions(+), 35 deletions(-) diff --git a/cmd/juno/juno.go b/cmd/juno/juno.go index 08ce3f840e..1b973f8eff 100644 --- a/cmd/juno/juno.go +++ b/cmd/juno/juno.go @@ -47,6 +47,7 @@ const ( dbPathF = "db-path" networkF = "network" ethNodeF = "eth-node" + disableL1VerificationF = "disable-l1-verification" pprofF = "pprof" pprofHostF = "pprof-host" pprofPortF = "pprof-port" @@ -91,6 +92,7 @@ const ( defaultWS = false defaultWSPort = 6061 defaultEthNode = "" + defaultDisableL1Verification = false defaultPprof = false defaultPprofPort = 6062 defaultColour = true @@ -145,11 +147,12 @@ const ( colourUsage = "Use `--colour=false` command to disable colourized outputs (ANSI Escape Codes)." ethNodeUsage = "WebSocket endpoint of the Ethereum node. To verify the correctness of the L2 chain, " + "Juno must connect to an Ethereum node and parse events in the Starknet contract." - pendingPollIntervalUsage = "Sets how frequently pending block will be updated (0s will disable fetching of pending block)." - p2pUsage = "EXPERIMENTAL: Enables p2p server." - p2pAddrUsage = "EXPERIMENTAL: Specify p2p listening source address as multiaddr. Example: /ip4/0.0.0.0/tcp/7777" - p2pPublicAddrUsage = "EXPERIMENTAL: Specify p2p public address as multiaddr. Example: /ip4/35.243.XXX.XXX/tcp/7777" - p2pPeersUsage = "EXPERIMENTAL: Specify list of p2p peers split by a comma. " + + disableL1VerificationUsage = "Disables L1 verification since an Ethereum node is not provided." + pendingPollIntervalUsage = "Sets how frequently pending block will be updated (0s will disable fetching of pending block)." + p2pUsage = "EXPERIMENTAL: Enables p2p server." + p2pAddrUsage = "EXPERIMENTAL: Specify p2p listening source address as multiaddr. Example: /ip4/0.0.0.0/tcp/7777" + p2pPublicAddrUsage = "EXPERIMENTAL: Specify p2p public address as multiaddr. Example: /ip4/35.243.XXX.XXX/tcp/7777" + p2pPeersUsage = "EXPERIMENTAL: Specify list of p2p peers split by a comma. " + "These peers can be either Feeder or regular nodes." p2pFeederNodeUsage = "EXPERIMENTAL: Run juno as a feeder node which will only sync from feeder gateway and gossip the new" + " blocks to the network." @@ -327,6 +330,8 @@ func NewCmd(config *node.Config, run func(*cobra.Command, []string) error) *cobr junoCmd.Flags().String(cnCoreContractAddressF, defaultCNCoreContractAddressStr, networkCustomCoreContractAddressUsage) junoCmd.Flags().IntSlice(cnUnverifiableRangeF, defaultCNUnverifiableRange, networkCustomUnverifiableRange) junoCmd.Flags().String(ethNodeF, defaultEthNode, ethNodeUsage) + junoCmd.Flags().Bool(disableL1VerificationF, defaultDisableL1Verification, disableL1VerificationUsage) + junoCmd.MarkFlagsMutuallyExclusive(ethNodeF, disableL1VerificationF) junoCmd.Flags().Bool(pprofF, defaultPprof, pprofUsage) junoCmd.Flags().String(pprofHostF, defaulHost, pprofHostUsage) junoCmd.Flags().Uint16(pprofPortF, defaultPprofPort, pprofPortUsage) diff --git a/node/node.go b/node/node.go index 63f0bb132a..c048b5302b 100644 --- a/node/node.go +++ b/node/node.go @@ -60,6 +60,7 @@ type Config struct { DatabasePath string `mapstructure:"db-path"` Network utils.Network `mapstructure:"network"` EthNode string `mapstructure:"eth-node"` + DisableL1Verification bool `mapstructure:"disable-l1-verification"` Pprof bool `mapstructure:"pprof"` PprofHost string `mapstructure:"pprof-host"` PprofPort uint16 `mapstructure:"pprof-port"` @@ -272,11 +273,15 @@ func New(cfg *Config, version string) (*Node, error) { //nolint:gocyclo,funlen metricsService: metricsService, } - if n.cfg.EthNode == "" { - n.log.Warnw("Ethereum node address not found; will not verify against L1") - } else { + if !n.cfg.DisableL1Verification { + // Due to mutually exclusive flag we can do the following. + if n.cfg.EthNode == "" { + //nolint:lll + return nil, fmt.Errorf("ethereum node address not found; will not verify against L1. Use --Let rename it disable-l1-verification flag if L1 verification is not required") + } + var l1Client *l1.Client - l1Client, err = newL1Client(cfg, n.blockchain, n.log) + l1Client, err = newL1Client(cfg.EthNode, cfg.Metrics, n.blockchain, n.log) if err != nil { return nil, fmt.Errorf("create L1 client: %w", err) } @@ -293,26 +298,26 @@ func New(cfg *Config, version string) (*Node, error) { //nolint:gocyclo,funlen return n, nil } -func newL1Client(cfg *Config, chain *blockchain.Blockchain, log utils.SimpleLogger) (*l1.Client, error) { - ethNodeURL, err := url.Parse(cfg.EthNode) +func newL1Client(ethNode string, includeMetrics bool, chain *blockchain.Blockchain, log utils.SimpleLogger) (*l1.Client, error) { + ethNodeURL, err := url.Parse(ethNode) if err != nil { return nil, fmt.Errorf("parse Ethereum node URL: %w", err) } if ethNodeURL.Scheme != "wss" && ethNodeURL.Scheme != "ws" { - return nil, errors.New("non-websocket Ethereum node URL (need wss://... or ws://...): " + cfg.EthNode) + return nil, errors.New("non-websocket Ethereum node URL (need wss://... or ws://...): " + ethNode) } network := chain.Network() var ethSubscriber *l1.EthSubscriber - ethSubscriber, err = l1.NewEthSubscriber(cfg.EthNode, network.CoreContractAddress) + ethSubscriber, err = l1.NewEthSubscriber(ethNode, network.CoreContractAddress) if err != nil { return nil, fmt.Errorf("set up ethSubscriber: %w", err) } l1Client := l1.NewClient(ethSubscriber, chain, log) - if cfg.Metrics { + if includeMetrics { l1Client.WithEventListener(makeL1Metrics()) } return l1Client, nil diff --git a/node/node_test.go b/node/node_test.go index a9287e0e4e..1879bbb900 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -18,25 +18,26 @@ import ( // Create a new node with all services enabled. func TestNewNode(t *testing.T) { config := &node.Config{ - LogLevel: utils.INFO, - HTTP: true, - HTTPPort: 0, - Websocket: true, - WebsocketPort: 0, - GRPC: true, - GRPCPort: 0, - DatabasePath: t.TempDir(), - Network: utils.Sepolia, // P2P will only work with Sepolia (for the time being) - EthNode: "", - Pprof: true, - PprofPort: 0, - Colour: true, - PendingPollInterval: time.Second, - Metrics: true, - MetricsPort: 0, - P2P: true, - P2PAddr: "", - P2PPeers: "", + LogLevel: utils.INFO, + HTTP: true, + HTTPPort: 0, + Websocket: true, + WebsocketPort: 0, + GRPC: true, + GRPCPort: 0, + DatabasePath: t.TempDir(), + Network: utils.Sepolia, // P2P will only work with Sepolia (for the time being) + EthNode: "", + DisableL1Verification: true, + Pprof: true, + PprofPort: 0, + Colour: true, + PendingPollInterval: time.Second, + Metrics: true, + MetricsPort: 0, + P2P: true, + P2PAddr: "", + P2PPeers: "", } n, err := node.New(config, "v0.3") @@ -77,8 +78,9 @@ func TestNetworkVerificationOnNonEmptyDB(t *testing.T) { require.NoError(t, database.Close()) _, err = node.New(&node.Config{ - DatabasePath: dbPath, - Network: test.network, + DatabasePath: dbPath, + Network: test.network, + DisableL1Verification: true, }, "v0.1") if test.errString == "" { require.NoError(t, err)