main.go 3.41 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 13
	"github.com/ethereum-optimism/optimism/op-node/cmd/p2p"

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

16 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
	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
59
	app.Flags = flags.Flags
60
	app.Name = "op-node"
61
	app.Usage = "Optimism Rollup Node"
62
	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."
63
	app.Action = RollupNodeMain
64 65 66 67 68 69 70
	app.Commands = []cli.Command{
		{
			Name:        "p2p",
			Subcommands: p2p.Subcommands,
		},
	}

71 72 73 74 75 76 77 78
	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")
79
	logCfg, err := opnode.NewLogConfig(ctx)
80
	if err != nil {
81
		log.Error("Unable to create the log config", "error", err)
82 83
		return err
	}
84
	log := logCfg.NewLogger()
85
	m := metrics.NewMetrics("default")
86 87

	cfg, err := opnode.NewConfig(ctx, log)
88
	if err != nil {
89
		log.Error("Unable to create the rollup node config", "error", err)
90 91 92 93 94 95 96 97
		return err
	}
	snapshotLog, err := opnode.NewSnapshotLogger(ctx)
	if err != nil {
		log.Error("Unable to create snapshot root logger", "error", err)
		return err
	}

98
	n, err := node.New(context.Background(), cfg, log, snapshotLog, VersionWithMeta, m)
99 100 101 102 103 104 105 106 107 108 109 110
	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()

111 112
	m.RecordInfo(VersionWithMeta)
	m.RecordUp()
113 114
	log.Info("Rollup node started")

115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
	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)
		}()
	}

136 137 138 139 140 141 142 143 144 145 146 147
	interruptChannel := make(chan os.Signal, 1)
	signal.Notify(interruptChannel, []os.Signal{
		os.Interrupt,
		os.Kill,
		syscall.SIGTERM,
		syscall.SIGQUIT,
	}...)
	<-interruptChannel

	return nil

}