Commit a0aa6564 authored by Qi Zhou's avatar Qi Zhou Committed by GitHub

feat: op-program --network flag accepts number as chainid (#12503)

* feat: op-program --network flag accepts number as chainid

* put common parse code into rollup.Config struct

* address comments

---------
Co-authored-by: default avatarQi Zhou <qizhou@ethstorage.io>
parent 02dd16aa
...@@ -2,8 +2,10 @@ package rollup ...@@ -2,8 +2,10 @@ package rollup
import ( import (
"context" "context"
"encoding/json"
"errors" "errors"
"fmt" "fmt"
"io"
"math/big" "math/big"
"time" "time"
...@@ -649,6 +651,15 @@ func (c *Config) LogDescription(log log.Logger, l2Chains map[string]string) { ...@@ -649,6 +651,15 @@ func (c *Config) LogDescription(log log.Logger, l2Chains map[string]string) {
) )
} }
func (c *Config) ParseRollupConfig(in io.Reader) error {
dec := json.NewDecoder(in)
dec.DisallowUnknownFields()
if err := dec.Decode(c); err != nil {
return fmt.Errorf("failed to decode rollup config: %w", err)
}
return nil
}
func fmtForkTimeOrUnset(v *uint64) string { func fmtForkTimeOrUnset(v *uint64) string {
if v == nil { if v == nil {
return "(not configured)" return "(not configured)"
......
...@@ -51,7 +51,7 @@ test: ...@@ -51,7 +51,7 @@ test:
verify-sepolia: op-program-host op-program-client verify-sepolia: op-program-host op-program-client
env GO111MODULE=on go run ./verify/sepolia/cmd/sepolia.go --l1 $$SEPOLIA_L1URL --l1.beacon $$SEPOLIA_BEACON_URL --l2 $$SEPOLIA_L2URL --datadir /tmp/test-sepolia env GO111MODULE=on go run ./verify/sepolia/cmd/sepolia.go --l1 $$SEPOLIA_L1URL --l1.beacon $$SEPOLIA_BEACON_URL --l2 $$SEPOLIA_L2URL --datadir /tmp/test-sepolia
verify-devnet: verify-devnet: op-program-host op-program-client
env GO111MODULE=on go run ./verify/devnet/cmd/devnet.go --l1 http://localhost:8545 --l1.beacon http://localhost:5052 --l2 http://localhost:9545 --datadir /tmp/test-devnet env GO111MODULE=on go run ./verify/devnet/cmd/devnet.go --l1 http://localhost:8545 --l1.beacon http://localhost:5052 --l2 http://localhost:9545 --datadir /tmp/test-devnet
capture-mainnet-genesis: op-program-host op-program-client capture-mainnet-genesis: op-program-host op-program-client
......
...@@ -37,13 +37,10 @@ func rollupConfigByChainID(chainID uint64, customChainFS embed.FS) (*rollup.Conf ...@@ -37,13 +37,10 @@ func rollupConfigByChainID(chainID uint64, customChainFS embed.FS) (*rollup.Conf
} else if err != nil { } else if err != nil {
return nil, fmt.Errorf("failed to get rollup config for chain ID %d: %w", chainID, err) return nil, fmt.Errorf("failed to get rollup config for chain ID %d: %w", chainID, err)
} }
dec := json.NewDecoder(file) defer file.Close()
dec.DisallowUnknownFields()
var customRollupConfig rollup.Config var customRollupConfig rollup.Config
if err := dec.Decode(&customRollupConfig); err != nil { return &customRollupConfig, customRollupConfig.ParseRollupConfig(file)
return nil, fmt.Errorf("failed to parse rollup config for chain ID %d: %w", chainID, err)
}
return &customRollupConfig, nil
} }
func ChainConfigByChainID(chainID uint64) (*params.ChainConfig, error) { func ChainConfigByChainID(chainID uint64) (*params.ChainConfig, error) {
......
...@@ -6,11 +6,12 @@ import ( ...@@ -6,11 +6,12 @@ import (
"fmt" "fmt"
"os" "os"
"slices" "slices"
"strconv"
"github.com/ethereum-optimism/optimism/op-node/chaincfg" "github.com/ethereum-optimism/optimism/op-node/chaincfg"
"github.com/ethereum-optimism/optimism/op-program/chainconfig"
"github.com/ethereum-optimism/optimism/op-program/host/types" "github.com/ethereum-optimism/optimism/op-program/host/types"
opnode "github.com/ethereum-optimism/optimism/op-node"
"github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-node/rollup"
"github.com/ethereum-optimism/optimism/op-program/host/flags" "github.com/ethereum-optimism/optimism/op-program/host/flags"
"github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum-optimism/optimism/op-service/sources"
...@@ -146,10 +147,7 @@ func NewConfigFromCLI(log log.Logger, ctx *cli.Context) (*Config, error) { ...@@ -146,10 +147,7 @@ func NewConfigFromCLI(log log.Logger, ctx *cli.Context) (*Config, error) {
if err := flags.CheckRequired(ctx); err != nil { if err := flags.CheckRequired(ctx); err != nil {
return nil, err return nil, err
} }
rollupCfg, err := opnode.NewRollupConfigFromCLI(log, ctx)
if err != nil {
return nil, err
}
l2Head := common.HexToHash(ctx.String(flags.L2Head.Name)) l2Head := common.HexToHash(ctx.String(flags.L2Head.Name))
if l2Head == (common.Hash{}) { if l2Head == (common.Hash{}) {
return nil, ErrInvalidL2Head return nil, ErrInvalidL2Head
...@@ -171,27 +169,46 @@ func NewConfigFromCLI(log log.Logger, ctx *cli.Context) (*Config, error) { ...@@ -171,27 +169,46 @@ func NewConfigFromCLI(log log.Logger, ctx *cli.Context) (*Config, error) {
if l1Head == (common.Hash{}) { if l1Head == (common.Hash{}) {
return nil, ErrInvalidL1Head return nil, ErrInvalidL1Head
} }
l2GenesisPath := ctx.String(flags.L2GenesisPath.Name)
var err error
var rollupCfg *rollup.Config
var l2ChainConfig *params.ChainConfig var l2ChainConfig *params.ChainConfig
var isCustomConfig bool var isCustomConfig bool
if l2GenesisPath == "" { networkName := ctx.String(flags.Network.Name)
networkName := ctx.String(flags.Network.Name) if networkName != "" {
ch := chaincfg.ChainByName(networkName) var chainID uint64
if ch == nil { if chainID, err = strconv.ParseUint(networkName, 10, 64); err != nil {
return nil, fmt.Errorf("flag %s is required for network %s", flags.L2GenesisPath.Name, networkName) ch := chaincfg.ChainByName(networkName)
if ch == nil {
return nil, fmt.Errorf("invalid network: %q", networkName)
}
chainID = ch.ChainID
} }
cfg, err := params.LoadOPStackChainConfig(ch.ChainID)
l2ChainConfig, err = chainconfig.ChainConfigByChainID(chainID)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to load chain config for chain %d: %w", ch.ChainID, err) return nil, fmt.Errorf("failed to load chain config for chain %d: %w", chainID, err)
}
rollupCfg, err = chainconfig.RollupConfigByChainID(chainID)
if err != nil {
return nil, fmt.Errorf("failed to load rollup config for chain %d: %w", chainID, err)
} }
l2ChainConfig = cfg
} else { } else {
l2GenesisPath := ctx.String(flags.L2GenesisPath.Name)
l2ChainConfig, err = loadChainConfigFromGenesis(l2GenesisPath) l2ChainConfig, err = loadChainConfigFromGenesis(l2GenesisPath)
if err != nil {
return nil, fmt.Errorf("invalid genesis: %w", err)
}
rollupConfigPath := ctx.String(flags.RollupConfig.Name)
rollupCfg, err = loadRollupConfig(rollupConfigPath)
if err != nil {
return nil, fmt.Errorf("invalid rollup config: %w", err)
}
isCustomConfig = true isCustomConfig = true
} }
if err != nil {
return nil, fmt.Errorf("invalid genesis: %w", err)
}
dbFormat := types.DataFormat(ctx.String(flags.DataFormat.Name)) dbFormat := types.DataFormat(ctx.String(flags.DataFormat.Name))
if !slices.Contains(types.SupportedDataFormats, dbFormat) { if !slices.Contains(types.SupportedDataFormats, dbFormat) {
return nil, fmt.Errorf("invalid %w: %v", ErrInvalidDataFormat, dbFormat) return nil, fmt.Errorf("invalid %w: %v", ErrInvalidDataFormat, dbFormat)
...@@ -229,3 +246,14 @@ func loadChainConfigFromGenesis(path string) (*params.ChainConfig, error) { ...@@ -229,3 +246,14 @@ func loadChainConfigFromGenesis(path string) (*params.ChainConfig, error) {
} }
return genesis.Config, nil return genesis.Config, nil
} }
func loadRollupConfig(rollupConfigPath string) (*rollup.Config, error) {
file, err := os.Open(rollupConfigPath)
if err != nil {
return nil, fmt.Errorf("failed to read rollup config: %w", err)
}
defer file.Close()
var rollupConfig rollup.Config
return &rollupConfig, rollupConfig.ParseRollupConfig(file)
}
...@@ -158,6 +158,9 @@ func CheckRequired(ctx *cli.Context) error { ...@@ -158,6 +158,9 @@ func CheckRequired(ctx *cli.Context) error {
if network == "" && ctx.String(L2GenesisPath.Name) == "" { if network == "" && ctx.String(L2GenesisPath.Name) == "" {
return fmt.Errorf("flag %s is required for custom networks", L2GenesisPath.Name) return fmt.Errorf("flag %s is required for custom networks", L2GenesisPath.Name)
} }
if ctx.String(L2GenesisPath.Name) != "" && network != "" {
return fmt.Errorf("cannot specify both %s and %s", L2GenesisPath.Name, Network.Name)
}
for _, flag := range requiredFlags { for _, flag := range requiredFlags {
if !ctx.IsSet(flag.Names()[0]) { if !ctx.IsSet(flag.Names()[0]) {
return fmt.Errorf("flag %s is required", flag.Names()[0]) return fmt.Errorf("flag %s is required", flag.Names()[0])
......
...@@ -43,8 +43,8 @@ func main() { ...@@ -43,8 +43,8 @@ func main() {
os.Exit(2) os.Exit(2)
} }
// Apply the custom configs by running op-program in the same process // Apply the custom configs by running op-program
runner, err := verify.NewRunner(l1RpcUrl, l1RpcKind, l1BeaconUrl, l2RpcUrl, dataDir, "", 901, true) runner, err := verify.NewRunner(l1RpcUrl, l1RpcKind, l1BeaconUrl, l2RpcUrl, dataDir, "901", 901, false)
if err != nil { if err != nil {
_, _ = fmt.Fprintf(os.Stderr, "Failed to create runner: %v\n", err.Error()) _, _ = fmt.Fprintf(os.Stderr, "Failed to create runner: %v\n", err.Error())
os.Exit(1) os.Exit(1)
......
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