main.go 3.54 KB
Newer Older
1 2 3 4
package main

import (
	"context"
5 6
	"net"
	"net/http"
7 8 9
	"os"
	"os/signal"
	"syscall"
10
	"time"
11

12
	"github.com/ethereum-optimism/optimism/op-node/cmd/genesis"
13 14
	"github.com/ethereum-optimism/optimism/op-node/cmd/p2p"

15 16
	"github.com/ethereum-optimism/optimism/op-node/metrics"

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
	opnode "github.com/ethereum-optimism/optimism/op-node"

	"github.com/ethereum-optimism/optimism/op-node/version"

	"github.com/ethereum-optimism/optimism/op-node/flags"

	"github.com/ethereum-optimism/optimism/op-node/node"
	"github.com/ethereum/go-ethereum/log"
	"github.com/urfave/cli"
)

var (
	GitCommit = ""
	GitDate   = ""
)

// VersionWithMeta holds the textual version string including the metadata.
var VersionWithMeta = func() string {
	v := version.Version
	if GitCommit != "" {
		v += "-" + GitCommit[:8]
	}
	if GitDate != "" {
		v += "-" + GitDate
	}
	if version.Meta != "" {
		v += "-" + version.Meta
	}
	return v
}()

func main() {
	// Set up logger with a default INFO level in case we fail to parse flags,
	// otherwise the final critical log won't show what the parsing error was.
	log.Root().SetHandler(
		log.LvlFilterHandler(
			log.LvlInfo,
			log.StreamHandler(os.Stdout, log.TerminalFormat(true)),
		),
	)

	app := cli.NewApp()
	app.Version = VersionWithMeta
60
	app.Flags = flags.Flags
61
	app.Name = "op-node"
62
	app.Usage = "Optimism Rollup Node"
63
	app.Description = "The Optimism Rollup Node derives L2 block inputs from L1 data and drives an external L2 Execution Engine to build a L2 chain."
64
	app.Action = RollupNodeMain
65 66 67 68 69
	app.Commands = []cli.Command{
		{
			Name:        "p2p",
			Subcommands: p2p.Subcommands,
		},
70 71 72 73
		{
			Name:        "genesis",
			Subcommands: genesis.Subcommands,
		},
74 75
	}

76 77 78 79 80 81 82 83
	err := app.Run(os.Args)
	if err != nil {
		log.Crit("Application failed", "message", err)
	}
}

func RollupNodeMain(ctx *cli.Context) error {
	log.Info("Initializing Rollup Node")
84
	logCfg, err := opnode.NewLogConfig(ctx)
85
	if err != nil {
86
		log.Error("Unable to create the log config", "error", err)
87 88
		return err
	}
89
	log := logCfg.NewLogger()
90
	m := metrics.NewMetrics("default")
91 92

	cfg, err := opnode.NewConfig(ctx, log)
93
	if err != nil {
94
		log.Error("Unable to create the rollup node config", "error", err)
95 96 97 98 99 100 101 102
		return err
	}
	snapshotLog, err := opnode.NewSnapshotLogger(ctx)
	if err != nil {
		log.Error("Unable to create snapshot root logger", "error", err)
		return err
	}

103
	n, err := node.New(context.Background(), cfg, log, snapshotLog, VersionWithMeta, m)
104 105 106 107 108 109 110 111 112 113 114 115
	if err != nil {
		log.Error("Unable to create the rollup node", "error", err)
		return err
	}
	log.Info("Starting rollup node")

	if err := n.Start(context.Background()); err != nil {
		log.Error("Unable to start rollup node", "error", err)
		return err
	}
	defer n.Close()

116 117
	m.RecordInfo(VersionWithMeta)
	m.RecordUp()
118 119
	log.Info("Rollup node started")

120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
	if cfg.Pprof.Enabled {
		var srv http.Server
		srv.Addr = net.JoinHostPort(cfg.Pprof.ListenAddr, cfg.Pprof.ListenPort)
		// Start pprof server + register it's shutdown
		go func() {
			log.Info("pprof server started", "addr", srv.Addr)
			if err := srv.ListenAndServe(); err != http.ErrServerClosed {
				log.Error("error in pprof server", "err", err)
			} else {
				log.Info("pprof server shutting down")
			}

		}()
		defer func() {
			shutCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
			defer cancel()
			err := srv.Shutdown(shutCtx)
			log.Info("pprof server shut down", "err", err)
		}()
	}

141 142 143 144 145 146 147 148 149 150 151 152
	interruptChannel := make(chan os.Signal, 1)
	signal.Notify(interruptChannel, []os.Signal{
		os.Interrupt,
		os.Kill,
		syscall.SIGTERM,
		syscall.SIGQUIT,
	}...)
	<-interruptChannel

	return nil

}