Documentation ¶
Index ¶
- Variables
- func CheatAction(readOnly bool, fn func(ctx *cli.Context, ch *cheat.Cheater) error) cli.ActionFunc
- func CheatRawDBAction(readOnly bool, fn func(ctx *cli.Context, db ethdb.Database) error) cli.ActionFunc
- func EngineAction(fn func(ctx *cli.Context, client client.RPC) error) cli.ActionFunc
- func ParseBuildingArgs(ctx *cli.Context) *engine.BlockBuildingSettings
- type Text
- type TextFlag
Constants ¶
This section is empty.
Variables ¶
View Source
var ( GlobalGethLogLvlFlag = &cli.StringFlag{ Name: "geth-log-level", Usage: "Set the global geth logging level", EnvVars: prefixEnvVars("GETH_LOG_LEVEL"), Value: "error", } DataDirFlag = &cli.StringFlag{ Name: "data-dir", Usage: "Geth data dir location.", Required: true, TakesFile: true, EnvVars: prefixEnvVars("DATA_DIR"), } EngineEndpoint = &cli.StringFlag{ Name: "engine", Usage: "Engine API RPC endpoint, can be HTTP/WS/IPC", Required: true, EnvVars: prefixEnvVars("ENGINE"), } EngineJWTPath = &cli.StringFlag{ Name: "engine.jwt-secret", Usage: "Path to JWT secret file used to authenticate Engine API communication with.", Required: true, TakesFile: true, EnvVars: prefixEnvVars("ENGINE_JWT_SECRET"), } FeeRecipientFlag = &cli.GenericFlag{ Name: "fee-recipient", Usage: "fee-recipient of the block building", EnvVars: prefixEnvVars("FEE_RECIPIENT"), Value: &TextFlag[*common.Address]{Value: &common.Address{1: 0x13, 2: 0x37}}, } RandaoFlag = &cli.GenericFlag{ Name: "randao", Usage: "randao value of the block building", EnvVars: prefixEnvVars("RANDAO"), Value: &TextFlag[*common.Hash]{Value: &common.Hash{1: 0x13, 2: 0x37}}, } BlockTimeFlag = &cli.Uint64Flag{ Name: "block-time", Usage: "block time, interval of timestamps between blocks to build, in seconds", EnvVars: prefixEnvVars("BLOCK_TIME"), Value: 12, } BuildingTime = &cli.DurationFlag{ Name: "building-time", Usage: "duration of of block building, this should be set to something lower than the block time.", EnvVars: prefixEnvVars("BUILDING_TIME"), Value: time.Second * 6, } AllowGaps = &cli.BoolFlag{ Name: "allow-gaps", Usage: "allow gaps in block building, like missed slots on the beacon chain.", EnvVars: prefixEnvVars("ALLOW_GAPS"), } )
View Source
var ( CheatStorageGetCmd = &cli.Command{ Name: "get", Aliases: []string{"read"}, Flags: []cli.Flag{ DataDirFlag, addrFlag("address", "Address to read storage of"), hashFlag("key", "key in storage of address to read value"), }, Action: CheatAction(true, func(ctx *cli.Context, ch *cheat.Cheater) error { return ch.RunAndClose(cheat.StorageGet(addrFlagValue("address", ctx), hashFlagValue("key", ctx), ctx.App.Writer)) }), } CheatStorageSetCmd = &cli.Command{ Name: "set", Aliases: []string{"write"}, Flags: []cli.Flag{ DataDirFlag, addrFlag("address", "Address to write storage of"), hashFlag("key", "key in storage of address to set value of"), hashFlag("value", "the value to write"), }, Action: CheatAction(false, func(ctx *cli.Context, ch *cheat.Cheater) error { return ch.RunAndClose(cheat.StorageSet(addrFlagValue("address", ctx), hashFlagValue("key", ctx), hashFlagValue("value", ctx))) }), } CheatStorageReadAll = &cli.Command{ Name: "read-all", Aliases: []string{"get-all"}, Usage: "Read all storage of the given account", Flags: []cli.Flag{DataDirFlag, addrFlag("address", "Address to read all storage of")}, Action: CheatAction(true, func(ctx *cli.Context, ch *cheat.Cheater) error { return ch.RunAndClose(cheat.StorageReadAll(addrFlagValue("address", ctx), ctx.App.Writer)) }), } CheatStorageDiffCmd = &cli.Command{ Name: "diff", Usage: "Diff the storage of accounts A and B", Flags: []cli.Flag{DataDirFlag, hashFlag("a", "address of account A"), hashFlag("b", "address of account B")}, Action: CheatAction(true, func(ctx *cli.Context, ch *cheat.Cheater) error { return ch.RunAndClose(cheat.StorageDiff(ctx.App.Writer, addrFlagValue("a", ctx), addrFlagValue("b", ctx))) }), } CheatStoragePatchCmd = &cli.Command{ Name: "patch", Usage: "Apply storage patch from STDIN to the given account address", Flags: []cli.Flag{DataDirFlag, addrFlag("address", "Address to patch storage of")}, Action: CheatAction(false, func(ctx *cli.Context, ch *cheat.Cheater) error { return ch.RunAndClose(cheat.StoragePatch(os.Stdin, addrFlagValue("address", ctx))) }), } CheatStorageCmd = &cli.Command{ Name: "storage", Subcommands: []*cli.Command{ CheatStorageGetCmd, CheatStorageSetCmd, CheatStorageReadAll, CheatStorageDiffCmd, CheatStoragePatchCmd, }, } CheatSetBalanceCmd = &cli.Command{ Name: "balance", Flags: []cli.Flag{ DataDirFlag, addrFlag("address", "Address to change balance of"), bigFlag("balance", "New balance of the account"), }, Action: CheatAction(false, func(ctx *cli.Context, ch *cheat.Cheater) error { return ch.RunAndClose(cheat.SetBalance(addrFlagValue("address", ctx), bigFlagValue("balance", ctx))) }), } CheatSetCodeCmd = &cli.Command{ Name: "code", Flags: []cli.Flag{ DataDirFlag, addrFlag("address", "Address to change code of"), bytesFlag("code", "New code of the account"), }, Action: CheatAction(false, func(ctx *cli.Context, ch *cheat.Cheater) error { return ch.RunAndClose(cheat.SetCode(addrFlagValue("address", ctx), bytesFlagValue("code", ctx))) }), } CheatSetNonceCmd = &cli.Command{ Name: "nonce", Flags: []cli.Flag{ DataDirFlag, addrFlag("address", "Address to change nonce of"), bigFlag("nonce", "New nonce of the account"), }, Action: CheatAction(false, func(ctx *cli.Context, ch *cheat.Cheater) error { return ch.RunAndClose(cheat.SetNonce(addrFlagValue("address", ctx), bigFlagValue("balance", ctx).Uint64())) }), } CheatOvmOwnersCmd = &cli.Command{ Name: "ovm-owners", Flags: []cli.Flag{ DataDirFlag, &cli.StringFlag{ Name: "config", Usage: "Path to JSON config of OVM address replacements to apply.", Required: true, EnvVars: prefixEnvVars("OVM_OWNERS"), Value: "ovm-owners.json", }, }, Action: CheatAction(false, func(ctx *cli.Context, ch *cheat.Cheater) error { confData, err := os.ReadFile(ctx.String("config")) if err != nil { return fmt.Errorf("failed to read OVM owners JSON config file: %w", err) } var conf cheat.OvmOwnersConfig if err := json.Unmarshal(confData, &conf); err != nil { return err } return ch.RunAndClose(cheat.OvmOwners(&conf)) }), } CheatPrintHeadBlock = &cli.Command{ Name: "head-block", Usage: "dump head block as JSON", Flags: []cli.Flag{ DataDirFlag, }, Action: CheatRawDBAction(true, func(c *cli.Context, db ethdb.Database) error { enc := json.NewEncoder(c.App.Writer) enc.SetIndent(" ", " ") block := rawdb.ReadHeadBlock(db) if block == nil { return enc.Encode(nil) } return enc.Encode(engine.RPCBlock{ Header: *block.Header(), Transactions: block.Transactions(), }) }), } CheatPrintHeadHeader = &cli.Command{ Name: "head-header", Usage: "dump head header as JSON", Flags: []cli.Flag{ DataDirFlag, }, Action: CheatRawDBAction(true, func(c *cli.Context, db ethdb.Database) error { enc := json.NewEncoder(c.App.Writer) enc.SetIndent(" ", " ") return enc.Encode(rawdb.ReadHeadHeader(db)) }), } EngineBlockCmd = &cli.Command{ Name: "block", Usage: "build the next block using the Engine API", Flags: []cli.Flag{ EngineEndpoint, EngineJWTPath, FeeRecipientFlag, RandaoFlag, BlockTimeFlag, BuildingTime, AllowGaps, }, Action: EngineAction(func(ctx *cli.Context, client client.RPC) error { settings := ParseBuildingArgs(ctx) status, err := engine.Status(context.Background(), client) if err != nil { return err } payload, err := engine.BuildBlock(context.Background(), client, status, settings) if err != nil { return err } _, err = io.WriteString(ctx.App.Writer, payload.BlockHash.String()) return err }), } EngineAutoCmd = &cli.Command{ Name: "auto", Usage: "Run a proof-of-nothing chain with fixed block time.", Description: "The block time can be changed. The execution engine must be synced to a post-Merge state first.", Flags: append(append([]cli.Flag{ EngineEndpoint, EngineJWTPath, FeeRecipientFlag, RandaoFlag, BlockTimeFlag, BuildingTime, AllowGaps, }, oplog.CLIFlags(envVarPrefix)...), opmetrics.CLIFlags(envVarPrefix)...), Action: EngineAction(func(ctx *cli.Context, client client.RPC) error { logCfg := oplog.ReadCLIConfig(ctx) if err := logCfg.Check(); err != nil { return fmt.Errorf("failed to parse log configuration: %w", err) } l := oplog.NewLogger(logCfg) settings := ParseBuildingArgs(ctx) metricsCfg := opmetrics.ReadCLIConfig(ctx) return opservice.CloseAction(func(ctx context.Context, shutdown <-chan struct{}) error { registry := opmetrics.NewRegistry() metrics := engine.NewMetrics("wheel", registry) if metricsCfg.Enabled { l.Info("starting metrics server", "addr", metricsCfg.ListenAddr, "port", metricsCfg.ListenPort) go func() { if err := opmetrics.ListenAndServe(ctx, registry, metricsCfg.ListenAddr, metricsCfg.ListenPort); err != nil { l.Error("error starting metrics server", err) } }() } return engine.Auto(ctx, metrics, client, l, shutdown, settings) }) }), } EngineStatusCmd = &cli.Command{ Name: "status", Flags: []cli.Flag{EngineEndpoint, EngineJWTPath}, Action: EngineAction(func(ctx *cli.Context, client client.RPC) error { stat, err := engine.Status(context.Background(), client) if err != nil { return err } enc := json.NewEncoder(ctx.App.Writer) enc.SetIndent("", " ") return enc.Encode(stat) }), } EngineCopyCmd = &cli.Command{ Name: "copy", Flags: []cli.Flag{ EngineEndpoint, EngineJWTPath, &cli.StringFlag{ Name: "source", Usage: "Unauthenticated regular eth JSON RPC to pull block data from, can be HTTP/WS/IPC.", Required: true, EnvVars: prefixEnvVars("ENGINE"), }, }, Action: EngineAction(func(ctx *cli.Context, dest client.RPC) error { rpcClient, err := rpc.DialOptions(context.Background(), ctx.String("source")) if err != nil { return fmt.Errorf("failed to dial engine source endpoint: %w", err) } source := client.NewBaseRPCClient(rpcClient) return engine.Copy(context.Background(), source, dest) }), } )
View Source
var CheatCmd = &cli.Command{ Name: "cheat", Usage: "Cheating commands to modify a Geth database.", Description: "Each sub-command opens a Geth database, applies the cheat, and then saves and closes the database." + "The Geth node will live in its own false reality, other nodes cannot sync the cheated state if they process the blocks.", Subcommands: []*cli.Command{ CheatStorageCmd, CheatSetBalanceCmd, CheatSetCodeCmd, CheatSetNonceCmd, CheatOvmOwnersCmd, CheatPrintHeadBlock, CheatPrintHeadHeader, }, }
View Source
var EngineCmd = &cli.Command{ Name: "engine", Usage: "Engine API commands to build/reorg/finalize blocks.", Description: "Each sub-command dials the engine API endpoint (with provided JWT secret) and then runs the action", Subcommands: []*cli.Command{ EngineBlockCmd, EngineAutoCmd, EngineStatusCmd, EngineCopyCmd, }, }
Functions ¶
func CheatAction ¶
func CheatRawDBAction ¶
func EngineAction ¶
func ParseBuildingArgs ¶
func ParseBuildingArgs(ctx *cli.Context) *engine.BlockBuildingSettings
Types ¶
type Text ¶
type Text interface { encoding.TextUnmarshaler fmt.Stringer comparable }
Click to show internal directories.
Click to hide internal directories.