Commit 6f0d98c5 authored by Adrian Sutton's avatar Adrian Sutton Committed by GitHub

op-challenger: Simplify flags and validation (#13756)

* op-challenger: Remove duplicate validation for vm.Config instances

* op-challenger: Remove cannon-network and asterisc-network flags.

* op-challenger: Use vm flags for rollup-config and l2-genesis

* op-challenger: Deduplicate prestates URL parsing

* op-challenger: Remove legacy --cannon-l2 flag

* op-challenger: Show generic and trace type specific names in error messages.

* Update expected error messages.
parent 107948cc
This diff is collapsed.
......@@ -4,15 +4,12 @@ import (
"errors"
"fmt"
"net/url"
"os"
"runtime"
"slices"
"strconv"
"time"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm"
"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
"github.com/ethereum-optimism/optimism/op-node/chaincfg"
opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
"github.com/ethereum-optimism/optimism/op-service/oppprof"
"github.com/ethereum-optimism/optimism/op-service/txmgr"
......@@ -24,42 +21,22 @@ var (
ErrMissingDatadir = errors.New("missing datadir")
ErrMaxConcurrencyZero = errors.New("max concurrency must not be 0")
ErrMissingL2Rpc = errors.New("missing L2 rpc url")
ErrMissingCannonBin = errors.New("missing cannon bin")
ErrMissingCannonServer = errors.New("missing cannon server")
ErrMissingCannonAbsolutePreState = errors.New("missing cannon absolute pre-state")
ErrMissingL1EthRPC = errors.New("missing l1 eth rpc url")
ErrMissingL1Beacon = errors.New("missing l1 beacon url")
ErrMissingGameFactoryAddress = errors.New("missing game factory address")
ErrMissingCannonSnapshotFreq = errors.New("missing cannon snapshot freq")
ErrMissingCannonInfoFreq = errors.New("missing cannon info freq")
ErrMissingCannonRollupConfig = errors.New("missing cannon network or rollup config path")
ErrMissingCannonL2Genesis = errors.New("missing cannon network or l2 genesis path")
ErrCannonNetworkAndRollupConfig = errors.New("only specify one of network or rollup config path")
ErrCannonNetworkAndL2Genesis = errors.New("only specify one of network or l2 genesis path")
ErrCannonNetworkUnknown = errors.New("unknown cannon network")
ErrMissingRollupRpc = errors.New("missing rollup rpc url")
ErrMissingAsteriscBin = errors.New("missing asterisc bin")
ErrMissingAsteriscServer = errors.New("missing asterisc server")
ErrMissingRollupRpc = errors.New("missing rollup rpc url")
ErrMissingAsteriscAbsolutePreState = errors.New("missing asterisc absolute pre-state")
ErrMissingAsteriscSnapshotFreq = errors.New("missing asterisc snapshot freq")
ErrMissingAsteriscInfoFreq = errors.New("missing asterisc info freq")
ErrMissingAsteriscRollupConfig = errors.New("missing asterisc network or rollup config path")
ErrMissingAsteriscL2Genesis = errors.New("missing asterisc network or l2 genesis path")
ErrAsteriscNetworkAndRollupConfig = errors.New("only specify one of network or rollup config path")
ErrAsteriscNetworkAndL2Genesis = errors.New("only specify one of network or l2 genesis path")
ErrAsteriscNetworkUnknown = errors.New("unknown asterisc network")
ErrMissingAsteriscKonaBin = errors.New("missing asterisc kona bin")
ErrMissingAsteriscKonaServer = errors.New("missing asterisc kona server")
ErrMissingAsteriscKonaAbsolutePreState = errors.New("missing asterisc kona absolute pre-state")
ErrMissingAsteriscKonaSnapshotFreq = errors.New("missing asterisc kona snapshot freq")
ErrMissingAsteriscKonaInfoFreq = errors.New("missing asterisc kona info freq")
ErrMissingAsteriscKonaRollupConfig = errors.New("missing asterisc kona network or rollup config path")
ErrMissingAsteriscKonaL2Genesis = errors.New("missing asterisc kona network or l2 genesis path")
ErrAsteriscKonaNetworkAndRollupConfig = errors.New("only specify one of network or rollup config path")
ErrAsteriscKonaNetworkAndL2Genesis = errors.New("only specify one of network or l2 genesis path")
ErrAsteriscKonaNetworkUnknown = errors.New("unknown asterisc kona network")
)
const (
......@@ -73,7 +50,7 @@ const (
// The default value is 28 days. The worst case duration for a game is 16 days
// (due to clock extension), plus 7 days WETH withdrawal delay leaving a 5 day
// buffer to monitor games to ensure bonds are claimed.
DefaultGameWindow = time.Duration(28 * 24 * time.Hour)
DefaultGameWindow = 28 * 24 * time.Hour
DefaultMaxPendingTx = 10
)
......@@ -211,40 +188,8 @@ func (c Config) Check() error {
return ErrMaxConcurrencyZero
}
if c.TraceTypeEnabled(types.TraceTypeCannon) || c.TraceTypeEnabled(types.TraceTypePermissioned) {
if c.Cannon.VmBin == "" {
return ErrMissingCannonBin
}
if c.Cannon.Server == "" {
return ErrMissingCannonServer
}
if _, err := os.Stat(c.Cannon.VmBin); err != nil {
return fmt.Errorf("%w: %w", ErrMissingCannonBin, err)
}
if _, err := os.Stat(c.Cannon.Server); err != nil {
return fmt.Errorf("%w: %w", ErrMissingCannonServer, err)
}
if c.Cannon.Network == "" {
if c.Cannon.RollupConfigPath == "" {
return ErrMissingCannonRollupConfig
}
if c.Cannon.L2GenesisPath == "" {
return ErrMissingCannonL2Genesis
}
} else {
if c.Cannon.RollupConfigPath != "" {
return ErrCannonNetworkAndRollupConfig
}
if c.Cannon.L2GenesisPath != "" {
return ErrCannonNetworkAndL2Genesis
}
if ch := chaincfg.ChainByName(c.Cannon.Network); ch == nil {
// Check if this looks like a chain ID that could be a custom chain configuration.
if _, err := strconv.ParseUint(c.Cannon.Network, 10, 32); err != nil {
return fmt.Errorf("%w: %v", ErrCannonNetworkUnknown, c.Cannon.Network)
}
}
if err := c.Cannon.Check(); err != nil {
return fmt.Errorf("cannon: %w", err)
}
if c.CannonAbsolutePreState == "" && c.CannonAbsolutePreStateBaseURL == nil {
return ErrMissingCannonAbsolutePreState
......@@ -257,37 +202,8 @@ func (c Config) Check() error {
}
}
if c.TraceTypeEnabled(types.TraceTypeAsterisc) {
if c.Asterisc.VmBin == "" {
return ErrMissingAsteriscBin
}
if c.Asterisc.Server == "" {
return ErrMissingAsteriscServer
}
if _, err := os.Stat(c.Asterisc.VmBin); err != nil {
return fmt.Errorf("%w: %w", ErrMissingAsteriscBin, err)
}
if _, err := os.Stat(c.Asterisc.Server); err != nil {
return fmt.Errorf("%w: %w", ErrMissingAsteriscServer, err)
}
if c.Asterisc.Network == "" {
if c.Asterisc.RollupConfigPath == "" {
return ErrMissingAsteriscRollupConfig
}
if c.Asterisc.L2GenesisPath == "" {
return ErrMissingAsteriscL2Genesis
}
} else {
if c.Asterisc.RollupConfigPath != "" {
return ErrAsteriscNetworkAndRollupConfig
}
if c.Asterisc.L2GenesisPath != "" {
return ErrAsteriscNetworkAndL2Genesis
}
if ch := chaincfg.ChainByName(c.Asterisc.Network); ch == nil {
return fmt.Errorf("%w: %v", ErrAsteriscNetworkUnknown, c.Asterisc.Network)
}
if err := c.Asterisc.Check(); err != nil {
return fmt.Errorf("asterisc: %w", err)
}
if c.AsteriscAbsolutePreState == "" && c.AsteriscAbsolutePreStateBaseURL == nil {
return ErrMissingAsteriscAbsolutePreState
......@@ -300,37 +216,8 @@ func (c Config) Check() error {
}
}
if c.TraceTypeEnabled(types.TraceTypeAsteriscKona) {
if c.AsteriscKona.VmBin == "" {
return ErrMissingAsteriscKonaBin
}
if c.AsteriscKona.Server == "" {
return ErrMissingAsteriscKonaServer
}
if _, err := os.Stat(c.AsteriscKona.VmBin); err != nil {
return fmt.Errorf("%w: %w", ErrMissingAsteriscKonaBin, err)
}
if _, err := os.Stat(c.AsteriscKona.Server); err != nil {
return fmt.Errorf("%w: %w", ErrMissingAsteriscKonaServer, err)
}
if c.AsteriscKona.Network == "" {
if c.AsteriscKona.RollupConfigPath == "" {
return ErrMissingAsteriscKonaRollupConfig
}
if c.AsteriscKona.L2GenesisPath == "" {
return ErrMissingAsteriscKonaL2Genesis
}
} else {
if c.AsteriscKona.RollupConfigPath != "" {
return ErrAsteriscKonaNetworkAndRollupConfig
}
if c.AsteriscKona.L2GenesisPath != "" {
return ErrAsteriscKonaNetworkAndL2Genesis
}
if ch := chaincfg.ChainByName(c.AsteriscKona.Network); ch == nil {
return fmt.Errorf("%w: %v", ErrAsteriscKonaNetworkUnknown, c.AsteriscKona.Network)
}
if err := c.AsteriscKona.Check(); err != nil {
return fmt.Errorf("asterisc kona: %w", err)
}
if c.AsteriscKonaAbsolutePreState == "" && c.AsteriscKonaAbsolutePreStateBaseURL == nil {
return ErrMissingAsteriscKonaAbsolutePreState
......
This diff is collapsed.
This diff is collapsed.
......@@ -34,7 +34,7 @@ func (f *VMFlag) Flags() []cli.Flag {
defaultEnvVar := opservice.FlagNameToEnvVarName(f.name, f.envVarPrefix)
flags = append(flags, f.flagCreator(f.name, []string{defaultEnvVar}, ""))
for _, vm := range f.vms {
name := f.flagName(vm)
name := f.TraceSpecificFlagName(vm)
envVar := opservice.FlagNameToEnvVarName(name, f.envVarPrefix)
flags = append(flags, f.flagCreator(name, []string{envVar}, fmt.Sprintf("(%v trace type only)", vm)))
}
......@@ -46,11 +46,11 @@ func (f *VMFlag) DefaultName() string {
}
func (f *VMFlag) IsSet(ctx *cli.Context, vm types.TraceType) bool {
return ctx.IsSet(f.flagName(vm)) || ctx.IsSet(f.name)
return ctx.IsSet(f.TraceSpecificFlagName(vm)) || ctx.IsSet(f.name)
}
func (f *VMFlag) String(ctx *cli.Context, vm types.TraceType) string {
val := ctx.String(f.flagName(vm))
val := ctx.String(f.TraceSpecificFlagName(vm))
if val == "" {
val = ctx.String(f.name)
}
......@@ -58,13 +58,17 @@ func (f *VMFlag) String(ctx *cli.Context, vm types.TraceType) string {
}
func (f *VMFlag) SourceFlagName(ctx *cli.Context, vm types.TraceType) string {
vmFlag := f.flagName(vm)
vmFlag := f.TraceSpecificFlagName(vm)
if ctx.IsSet(vmFlag) {
return vmFlag
}
return f.name
}
func (f *VMFlag) flagName(vm types.TraceType) string {
func (f *VMFlag) EitherFlagName(vm types.TraceType) string {
return fmt.Sprintf("%s/%s", f.DefaultName(), f.TraceSpecificFlagName(vm))
}
func (f *VMFlag) TraceSpecificFlagName(vm types.TraceType) string {
return fmt.Sprintf("%v-%v", vm, f.name)
}
......@@ -2,6 +2,7 @@ package vm
import (
"context"
"errors"
"fmt"
"math"
"os"
......@@ -10,6 +11,7 @@ import (
"strings"
"time"
"github.com/ethereum-optimism/optimism/op-node/chaincfg"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/log"
......@@ -23,6 +25,17 @@ const (
debugFilename = "debug-info.json"
)
var (
ErrMissingBin = errors.New("missing bin")
ErrMissingServer = errors.New("missing server")
ErrMissingRollupConfig = errors.New("missing network or rollup config path")
ErrMissingL2Genesis = errors.New("missing network or l2 genesis path")
ErrNetworkAndRollupConfig = errors.New("only specify one of network or rollup config path")
ErrNetworkAndL2Genesis = errors.New("only specify one of network or l2 genesis path")
ErrNetworkUnknown = errors.New("unknown network")
)
type Metricer = metrics.TypedVmMetricer
type Config struct {
......@@ -45,6 +58,45 @@ type Config struct {
L2GenesisPath string
}
func (c *Config) Check() error {
if c.VmBin == "" {
return ErrMissingBin
}
if c.Server == "" {
return ErrMissingServer
}
if _, err := os.Stat(c.VmBin); err != nil {
return fmt.Errorf("%w: %w", ErrMissingBin, err)
}
if _, err := os.Stat(c.Server); err != nil {
return fmt.Errorf("%w: %w", ErrMissingServer, err)
}
if c.Network == "" {
if c.RollupConfigPath == "" {
return ErrMissingRollupConfig
}
if c.L2GenesisPath == "" {
return ErrMissingL2Genesis
}
} else {
if c.RollupConfigPath != "" {
return ErrNetworkAndRollupConfig
}
if c.L2GenesisPath != "" {
return ErrNetworkAndL2Genesis
}
if ch := chaincfg.ChainByName(c.Network); ch == nil {
// Check if this looks like a chain ID that could be a custom chain configuration.
if _, err := strconv.ParseUint(c.Network, 10, 32); err != nil {
return fmt.Errorf("%w: %v", ErrNetworkUnknown, c.Network)
}
}
}
return nil
}
type OracleServerExecutor interface {
OracleCommand(cfg Config, dataDir string, inputs utils.LocalGameInputs) ([]string, error)
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment