Skip to content

Commit

Permalink
op-challenger: Introduce --prestates-url to specify prestates source …
Browse files Browse the repository at this point in the history
…for all game types at once (ethereum-optimism#12440)

* op-challenger: Introduce --prestates-url to specify prestates source for all game types at once.

* op-challenger: Add required config validation for asterisc kona.

Allow specify both prestate and prestates url to allow overriding. Prestate takes priority.

* op-challenger: Introduce vm-flag to make default with overrides pattern easier.

* op-challenger: Add vm type info to override flags.
  • Loading branch information
ajsutton authored Oct 16, 2024
1 parent 99021b5 commit cb9e667
Show file tree
Hide file tree
Showing 7 changed files with 430 additions and 91 deletions.
109 changes: 102 additions & 7 deletions op-challenger/cmd/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ func TestAsteriscOpProgramRequiredArgs(t *testing.T) {
})

t.Run("Required", func(t *testing.T) {
verifyArgsInvalid(t, "flag asterisc-prestates-url or asterisc-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-prestate"))
verifyArgsInvalid(t, "flag prestates-url or asterisc-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-prestate"))
})

t.Run("Valid", func(t *testing.T) {
Expand All @@ -296,13 +296,42 @@ func TestAsteriscOpProgramRequiredArgs(t *testing.T) {
})
})

t.Run(fmt.Sprintf("TestPrestateBaseURL-%v", traceType), func(t *testing.T) {
allPrestateOptions := []string{"--prestates-url", "--asterisc-prestates-url", "--asterisc-prestate"}
t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
configForArgs(t, addRequiredArgsExceptArr(types.TraceTypeAlphabet, allPrestateOptions))
})

t.Run("NotRequiredIfAsteriscPrestatesBaseURLSet", func(t *testing.T) {
configForArgs(t, addRequiredArgsExceptArr(traceType, allPrestateOptions, "--asterisc-prestates-url=http://localhost/foo"))
})

t.Run("AsteriscPrestatesBaseURLTakesPrecedence", func(t *testing.T) {
cfg := configForArgs(t, addRequiredArgsExceptArr(traceType, allPrestateOptions, "--asterisc-prestates-url=http://localhost/foo", "--prestates-url=http://localhost/bar"))
require.Equal(t, "http://localhost/foo", cfg.AsteriscAbsolutePreStateBaseURL.String())
})

t.Run("RequiredIfAsteriscPrestatesBaseURLNotSet", func(t *testing.T) {
verifyArgsInvalid(t, "flag prestates-url or asterisc-prestate is required", addRequiredArgsExceptArr(traceType, allPrestateOptions))
})

t.Run("Invalid", func(t *testing.T) {
verifyArgsInvalid(t, "invalid prestates-url (:foo/bar)", addRequiredArgsExceptArr(traceType, allPrestateOptions, "--prestates-url=:foo/bar"))
})

t.Run("Valid", func(t *testing.T) {
cfg := configForArgs(t, addRequiredArgsExceptArr(traceType, allPrestateOptions, "--prestates-url=http://localhost/foo"))
require.Equal(t, "http://localhost/foo", cfg.AsteriscAbsolutePreStateBaseURL.String())
})
})

t.Run(fmt.Sprintf("TestAsteriscAbsolutePrestateBaseURL-%v", traceType), func(t *testing.T) {
t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--asterisc-prestates-url"))
})

t.Run("Required", func(t *testing.T) {
verifyArgsInvalid(t, "flag asterisc-prestates-url or asterisc-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-prestate"))
verifyArgsInvalid(t, "flag prestates-url or asterisc-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-prestate"))
})

t.Run("Valid", func(t *testing.T) {
Expand Down Expand Up @@ -335,7 +364,7 @@ func TestAsteriscKonaRequiredArgs(t *testing.T) {
})

t.Run("Required", func(t *testing.T) {
verifyArgsInvalid(t, "flag asterisc-kona-prestates-url or asterisc-kona-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-kona-prestate"))
verifyArgsInvalid(t, "flag prestates-url or asterisc-kona-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-kona-prestate"))
})

t.Run("Valid", func(t *testing.T) {
Expand All @@ -350,14 +379,43 @@ func TestAsteriscKonaRequiredArgs(t *testing.T) {
})

t.Run("Required", func(t *testing.T) {
verifyArgsInvalid(t, "flag asterisc-kona-prestates-url or asterisc-kona-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-kona-prestate"))
verifyArgsInvalid(t, "flag prestates-url or asterisc-kona-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-kona-prestate"))
})

t.Run("Valid", func(t *testing.T) {
cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-kona-prestates-url", "--asterisc-kona-prestates-url=http://localhost/bar"))
require.Equal(t, "http://localhost/bar", cfg.AsteriscKonaAbsolutePreStateBaseURL.String())
})
})

t.Run(fmt.Sprintf("TestPrestateBaseURL-%v", traceType), func(t *testing.T) {
allPrestateOptions := []string{"--prestates-url", "--asterisc-kona-prestates-url", "--asterisc-kona-prestate"}
t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
configForArgs(t, addRequiredArgsExceptArr(types.TraceTypeAlphabet, allPrestateOptions))
})

t.Run("NotRequiredIfAsteriscKonaPrestatesBaseURLSet", func(t *testing.T) {
configForArgs(t, addRequiredArgsExceptArr(traceType, allPrestateOptions, "--asterisc-kona-prestates-url=http://localhost/foo"))
})

t.Run("AsteriscKonaPrestatesBaseURLTakesPrecedence", func(t *testing.T) {
cfg := configForArgs(t, addRequiredArgsExceptArr(traceType, allPrestateOptions, "--asterisc-kona-prestates-url=http://localhost/foo", "--prestates-url=http://localhost/bar"))
require.Equal(t, "http://localhost/foo", cfg.AsteriscKonaAbsolutePreStateBaseURL.String())
})

t.Run("RequiredIfAsteriscKonaPrestatesBaseURLNotSet", func(t *testing.T) {
verifyArgsInvalid(t, "flag prestates-url or asterisc-kona-prestate is required", addRequiredArgsExceptArr(traceType, allPrestateOptions))
})

t.Run("Invalid", func(t *testing.T) {
verifyArgsInvalid(t, "invalid prestates-url (:foo/bar)", addRequiredArgsExceptArr(traceType, allPrestateOptions, "--prestates-url=:foo/bar"))
})

t.Run("Valid", func(t *testing.T) {
cfg := configForArgs(t, addRequiredArgsExceptArr(traceType, allPrestateOptions, "--prestates-url=http://localhost/foo"))
require.Equal(t, "http://localhost/foo", cfg.AsteriscKonaAbsolutePreStateBaseURL.String())
})
})
}

func TestAsteriscBaseRequiredArgs(t *testing.T) {
Expand Down Expand Up @@ -579,7 +637,7 @@ func TestCannonRequiredArgs(t *testing.T) {
})

t.Run("Required", func(t *testing.T) {
verifyArgsInvalid(t, "flag cannon-prestates-url or cannon-prestate is required", addRequiredArgsExcept(traceType, "--cannon-prestate"))
verifyArgsInvalid(t, "flag prestates-url or cannon-prestate is required", addRequiredArgsExcept(traceType, "--cannon-prestate"))
})

t.Run("Valid", func(t *testing.T) {
Expand All @@ -588,13 +646,13 @@ func TestCannonRequiredArgs(t *testing.T) {
})
})

t.Run(fmt.Sprintf("TestCannonAbsolutePrestateBaseURL-%v", traceType), func(t *testing.T) {
t.Run(fmt.Sprintf("TestCannonPrestatesBaseURL-%v", traceType), func(t *testing.T) {
t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--cannon-prestates-url"))
})

t.Run("Required", func(t *testing.T) {
verifyArgsInvalid(t, "flag cannon-prestates-url or cannon-prestate is required", addRequiredArgsExcept(traceType, "--cannon-prestate"))
verifyArgsInvalid(t, "flag prestates-url or cannon-prestate is required", addRequiredArgsExcept(traceType, "--cannon-prestate"))
})

t.Run("Valid", func(t *testing.T) {
Expand All @@ -603,6 +661,35 @@ func TestCannonRequiredArgs(t *testing.T) {
})
})

t.Run(fmt.Sprintf("TestPrestateBaseURL-%v", traceType), func(t *testing.T) {
allPrestateOptions := []string{"--prestates-url", "--cannon-prestates-url", "--cannon-prestate"}
t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) {
configForArgs(t, addRequiredArgsExceptArr(types.TraceTypeAlphabet, allPrestateOptions))
})

t.Run("NotRequiredIfCannonPrestatesBaseURLSet", func(t *testing.T) {
configForArgs(t, addRequiredArgsExceptArr(traceType, allPrestateOptions, "--cannon-prestates-url=http://localhost/foo"))
})

t.Run("CannonPrestatesBaseURLTakesPrecedence", func(t *testing.T) {
cfg := configForArgs(t, addRequiredArgsExceptArr(traceType, allPrestateOptions, "--cannon-prestates-url=http://localhost/foo", "--prestates-url=http://localhost/bar"))
require.Equal(t, "http://localhost/foo", cfg.CannonAbsolutePreStateBaseURL.String())
})

t.Run("RequiredIfCannonPrestatesBaseURLNotSet", func(t *testing.T) {
verifyArgsInvalid(t, "flag prestates-url or cannon-prestate is required", addRequiredArgsExceptArr(traceType, allPrestateOptions))
})

t.Run("Invalid", func(t *testing.T) {
verifyArgsInvalid(t, "invalid prestates-url (:foo/bar)", addRequiredArgsExceptArr(traceType, allPrestateOptions, "--prestates-url=:foo/bar"))
})

t.Run("Valid", func(t *testing.T) {
cfg := configForArgs(t, addRequiredArgsExceptArr(traceType, allPrestateOptions, "--prestates-url=http://localhost/foo"))
require.Equal(t, "http://localhost/foo", cfg.CannonAbsolutePreStateBaseURL.String())
})
})

t.Run(fmt.Sprintf("TestL2Rpc-%v", traceType), func(t *testing.T) {
t.Run("RequiredForCannonTrace", func(t *testing.T) {
verifyArgsInvalid(t, "flag l2-eth-rpc is required", addRequiredArgsExcept(traceType, "--l2-eth-rpc"))
Expand Down Expand Up @@ -889,6 +976,14 @@ func addRequiredArgsExcept(traceType types.TraceType, name string, optionalArgs
return append(toArgList(req), optionalArgs...)
}

func addRequiredArgsExceptArr(traceType types.TraceType, names []string, optionalArgs ...string) []string {
req := requiredArgs(traceType)
for _, name := range names {
delete(req, name)
}
return append(toArgList(req), optionalArgs...)
}

func requiredArgs(traceType types.TraceType) map[string]string {
args := map[string]string{
"--l1-eth-rpc": l1EthRpc,
Expand Down
110 changes: 74 additions & 36 deletions op-challenger/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,37 +18,46 @@ import (
)

var (
ErrMissingTraceType = errors.New("no supported trace types specified")
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")
ErrCannonAbsolutePreStateAndBaseURL = errors.New("only specify one of cannon absolute pre-state and cannon absolute pre-state base URL")
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")
ErrMissingTraceType = errors.New("no supported trace types specified")
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")
ErrMissingAsteriscAbsolutePreState = errors.New("missing asterisc absolute pre-state")
ErrAsteriscAbsolutePreStateAndBaseURL = errors.New("only specify one of asterisc absolute pre-state and asterisc absolute pre-state base URL")
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")
ErrMissingAsteriscBin = errors.New("missing asterisc bin")
ErrMissingAsteriscServer = errors.New("missing asterisc server")
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 (
Expand Down Expand Up @@ -225,9 +234,6 @@ func (c Config) Check() error {
if c.CannonAbsolutePreState == "" && c.CannonAbsolutePreStateBaseURL == nil {
return ErrMissingCannonAbsolutePreState
}
if c.CannonAbsolutePreState != "" && c.CannonAbsolutePreStateBaseURL != nil {
return ErrCannonAbsolutePreStateAndBaseURL
}
if c.Cannon.SnapshotFreq == 0 {
return ErrMissingCannonSnapshotFreq
}
Expand Down Expand Up @@ -263,16 +269,48 @@ func (c Config) Check() error {
if c.AsteriscAbsolutePreState == "" && c.AsteriscAbsolutePreStateBaseURL == nil {
return ErrMissingAsteriscAbsolutePreState
}
if c.AsteriscAbsolutePreState != "" && c.AsteriscAbsolutePreStateBaseURL != nil {
return ErrAsteriscAbsolutePreStateAndBaseURL
}
if c.Asterisc.SnapshotFreq == 0 {
return ErrMissingAsteriscSnapshotFreq
}
if c.Asterisc.InfoFreq == 0 {
return ErrMissingAsteriscInfoFreq
}
}
if c.TraceTypeEnabled(types.TraceTypeAsteriscKona) {
if c.AsteriscKona.VmBin == "" {
return ErrMissingAsteriscKonaBin
}
if c.AsteriscKona.Server == "" {
return ErrMissingAsteriscKonaServer
}
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 c.AsteriscKonaAbsolutePreState == "" && c.AsteriscKonaAbsolutePreStateBaseURL == nil {
return ErrMissingAsteriscKonaAbsolutePreState
}
if c.AsteriscKona.SnapshotFreq == 0 {
return ErrMissingAsteriscKonaSnapshotFreq
}
if c.AsteriscKona.InfoFreq == 0 {
return ErrMissingAsteriscKonaInfoFreq
}
}
if err := c.TxMgrConfig.Check(); err != nil {
return err
}
Expand Down
Loading

0 comments on commit cb9e667

Please sign in to comment.