Skip to content

Commit

Permalink
Make eth-node flag as required (#2249)
Browse files Browse the repository at this point in the history
  • Loading branch information
kirugan authored Nov 4, 2024
1 parent bf4aeda commit e4240ac
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 35 deletions.
15 changes: 10 additions & 5 deletions cmd/juno/juno.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -91,6 +92,7 @@ const (
defaultWS = false
defaultWSPort = 6061
defaultEthNode = ""
defaultDisableL1Verification = false
defaultPprof = false
defaultPprofPort = 6062
defaultColour = true
Expand Down Expand Up @@ -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."
Expand Down Expand Up @@ -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)
Expand Down
23 changes: 14 additions & 9 deletions node/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down Expand Up @@ -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)
}
Expand All @@ -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
Expand Down
44 changes: 23 additions & 21 deletions node/node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit e4240ac

Please sign in to comment.