github.com/prysmaticlabs/prysm@v1.4.4/cmd/beacon-chain/main.go (about) 1 // Package beacon-chain defines the entire runtime of an Ethereum beacon node. 2 package main 3 4 import ( 5 "fmt" 6 "os" 7 "path/filepath" 8 "runtime" 9 runtimeDebug "runtime/debug" 10 11 gethlog "github.com/ethereum/go-ethereum/log" 12 golog "github.com/ipfs/go-log/v2" 13 joonix "github.com/joonix/log" 14 "github.com/prysmaticlabs/prysm/beacon-chain/node" 15 dbcommands "github.com/prysmaticlabs/prysm/cmd/beacon-chain/db" 16 "github.com/prysmaticlabs/prysm/cmd/beacon-chain/flags" 17 "github.com/prysmaticlabs/prysm/shared/cmd" 18 "github.com/prysmaticlabs/prysm/shared/debug" 19 "github.com/prysmaticlabs/prysm/shared/featureconfig" 20 "github.com/prysmaticlabs/prysm/shared/fileutil" 21 "github.com/prysmaticlabs/prysm/shared/journald" 22 "github.com/prysmaticlabs/prysm/shared/logutil" 23 _ "github.com/prysmaticlabs/prysm/shared/maxprocs" 24 "github.com/prysmaticlabs/prysm/shared/tos" 25 "github.com/prysmaticlabs/prysm/shared/version" 26 "github.com/sirupsen/logrus" 27 "github.com/urfave/cli/v2" 28 prefixed "github.com/x-cray/logrus-prefixed-formatter" 29 ) 30 31 var appFlags = []cli.Flag{ 32 flags.DepositContractFlag, 33 flags.HTTPWeb3ProviderFlag, 34 flags.FallbackWeb3ProviderFlag, 35 flags.RPCHost, 36 flags.RPCPort, 37 flags.CertFlag, 38 flags.KeyFlag, 39 flags.DisableGRPCGateway, 40 flags.GRPCGatewayHost, 41 flags.GRPCGatewayPort, 42 flags.EthApiPort, 43 flags.GPRCGatewayCorsDomain, 44 flags.MinSyncPeers, 45 flags.ContractDeploymentBlock, 46 flags.SetGCPercent, 47 flags.HeadSync, 48 flags.DisableSync, 49 flags.DisableDiscv5, 50 flags.BlockBatchLimit, 51 flags.BlockBatchLimitBurstFactor, 52 flags.InteropMockEth1DataVotesFlag, 53 flags.InteropGenesisStateFlag, 54 flags.InteropNumValidatorsFlag, 55 flags.InteropGenesisTimeFlag, 56 flags.SlotsPerArchivedPoint, 57 flags.EnableDebugRPCEndpoints, 58 flags.SubscribeToAllSubnets, 59 flags.HistoricalSlasherNode, 60 flags.ChainID, 61 flags.NetworkID, 62 flags.WeakSubjectivityCheckpt, 63 flags.Eth1HeaderReqLimit, 64 flags.GenesisStatePath, 65 cmd.EnableBackupWebhookFlag, 66 cmd.BackupWebhookOutputDir, 67 cmd.MinimalConfigFlag, 68 cmd.E2EConfigFlag, 69 cmd.RPCMaxPageSizeFlag, 70 cmd.BootstrapNode, 71 cmd.NoDiscovery, 72 cmd.StaticPeers, 73 cmd.RelayNode, 74 cmd.P2PUDPPort, 75 cmd.P2PTCPPort, 76 cmd.P2PIP, 77 cmd.P2PHost, 78 cmd.P2PHostDNS, 79 cmd.P2PMaxPeers, 80 cmd.P2PPrivKey, 81 cmd.P2PMetadata, 82 cmd.P2PAllowList, 83 cmd.P2PDenyList, 84 cmd.DataDirFlag, 85 cmd.VerbosityFlag, 86 cmd.EnableTracingFlag, 87 cmd.TracingProcessNameFlag, 88 cmd.TracingEndpointFlag, 89 cmd.TraceSampleFractionFlag, 90 cmd.MonitoringHostFlag, 91 flags.MonitoringPortFlag, 92 cmd.DisableMonitoringFlag, 93 cmd.ClearDB, 94 cmd.ForceClearDB, 95 cmd.LogFormat, 96 cmd.MaxGoroutines, 97 debug.PProfFlag, 98 debug.PProfAddrFlag, 99 debug.PProfPortFlag, 100 debug.MemProfileRateFlag, 101 debug.CPUProfileFlag, 102 debug.TraceFlag, 103 debug.BlockProfileRateFlag, 104 debug.MutexProfileFractionFlag, 105 cmd.LogFileName, 106 cmd.EnableUPnPFlag, 107 cmd.ConfigFileFlag, 108 cmd.ChainConfigFileFlag, 109 cmd.GrpcMaxCallRecvMsgSizeFlag, 110 cmd.AcceptTosFlag, 111 cmd.RestoreSourceFileFlag, 112 cmd.RestoreTargetDirFlag, 113 cmd.BoltMMapInitialSizeFlag, 114 } 115 116 func init() { 117 appFlags = cmd.WrapFlags(append(appFlags, featureconfig.BeaconChainFlags...)) 118 } 119 120 func main() { 121 app := cli.App{} 122 app.Name = "beacon-chain" 123 app.Usage = "this is a beacon chain implementation for Ethereum" 124 app.Action = startNode 125 app.Version = version.Version() 126 app.Commands = []*cli.Command{ 127 dbcommands.Commands, 128 } 129 130 app.Flags = appFlags 131 132 app.Before = func(ctx *cli.Context) error { 133 // Load flags from config file, if specified. 134 if err := cmd.LoadFlagsFromConfig(ctx, app.Flags); err != nil { 135 return err 136 } 137 138 format := ctx.String(cmd.LogFormat.Name) 139 switch format { 140 case "text": 141 formatter := new(prefixed.TextFormatter) 142 formatter.TimestampFormat = "2006-01-02 15:04:05" 143 formatter.FullTimestamp = true 144 // If persistent log files are written - we disable the log messages coloring because 145 // the colors are ANSI codes and seen as gibberish in the log files. 146 formatter.DisableColors = ctx.String(cmd.LogFileName.Name) != "" 147 logrus.SetFormatter(formatter) 148 case "fluentd": 149 f := joonix.NewFormatter() 150 if err := joonix.DisableTimestampFormat(f); err != nil { 151 panic(err) 152 } 153 logrus.SetFormatter(f) 154 case "json": 155 logrus.SetFormatter(&logrus.JSONFormatter{}) 156 case "journald": 157 if err := journald.Enable(); err != nil { 158 return err 159 } 160 default: 161 return fmt.Errorf("unknown log format %s", format) 162 } 163 164 logFileName := ctx.String(cmd.LogFileName.Name) 165 if logFileName != "" { 166 if err := logutil.ConfigurePersistentLogging(logFileName); err != nil { 167 log.WithError(err).Error("Failed to configuring logging to disk.") 168 } 169 } 170 if err := cmd.ExpandSingleEndpointIfFile(ctx, flags.HTTPWeb3ProviderFlag); err != nil { 171 return err 172 } 173 if err := cmd.ExpandWeb3EndpointsIfFile(ctx, flags.FallbackWeb3ProviderFlag); err != nil { 174 return err 175 } 176 if ctx.IsSet(flags.SetGCPercent.Name) { 177 runtimeDebug.SetGCPercent(ctx.Int(flags.SetGCPercent.Name)) 178 } 179 runtime.GOMAXPROCS(runtime.NumCPU()) 180 if err := debug.Setup(ctx); err != nil { 181 return err 182 } 183 return cmd.ValidateNoArgs(ctx) 184 } 185 186 defer func() { 187 if x := recover(); x != nil { 188 log.Errorf("Runtime panic: %v\n%v", x, string(runtimeDebug.Stack())) 189 panic(x) 190 } 191 }() 192 193 if err := app.Run(os.Args); err != nil { 194 log.Error(err.Error()) 195 } 196 } 197 198 func startNode(ctx *cli.Context) error { 199 // Fix data dir for Windows users. 200 outdatedDataDir := filepath.Join(fileutil.HomeDir(), "AppData", "Roaming", "Eth2") 201 currentDataDir := ctx.String(cmd.DataDirFlag.Name) 202 if err := cmd.FixDefaultDataDir(outdatedDataDir, currentDataDir); err != nil { 203 return err 204 } 205 206 // verify if ToS accepted 207 if err := tos.VerifyTosAcceptedOrPrompt(ctx); err != nil { 208 return err 209 } 210 211 verbosity := ctx.String(cmd.VerbosityFlag.Name) 212 level, err := logrus.ParseLevel(verbosity) 213 if err != nil { 214 return err 215 } 216 logrus.SetLevel(level) 217 if level == logrus.TraceLevel { 218 // libp2p specific logging. 219 golog.SetAllLoggers(golog.LevelDebug) 220 // Geth specific logging. 221 glogger := gethlog.NewGlogHandler(gethlog.StreamHandler(os.Stderr, gethlog.TerminalFormat(true))) 222 glogger.Verbosity(gethlog.LvlTrace) 223 gethlog.Root().SetHandler(glogger) 224 } 225 226 beacon, err := node.New(ctx) 227 if err != nil { 228 return err 229 } 230 beacon.Start() 231 return nil 232 }