From e8664d98e201fdcedcb2ed09a2ccf45c27431ad9 Mon Sep 17 00:00:00 2001 From: Jan Nanista Date: Wed, 30 Apr 2025 11:06:00 -0700 Subject: [PATCH 1/2] feat: Add support for multiple challengers --- README.md | 47 +++-- main.star | 38 ++-- network_params.yaml | 10 + src/challenger/input_parser.star | 83 ++++++++ src/challenger/op-challenger/launcher.star | 194 ++++++++++++++++++ .../op-challenger/op_challenger_launcher.star | 163 --------------- src/package_io/input_parser.star | 23 +-- src/package_io/sanity_check.star | 1 + test/challenger/input_parser_test.star | 67 ++++++ .../op-challenger/launcher_test.star} | 74 ++++--- 10 files changed, 449 insertions(+), 251 deletions(-) create mode 100644 src/challenger/input_parser.star create mode 100644 src/challenger/op-challenger/launcher.star delete mode 100644 src/challenger/op-challenger/op_challenger_launcher.star create mode 100644 test/challenger/input_parser_test.star rename test/{op_challenger_launcher_test.star => challenger/op-challenger/launcher_test.star} (54%) diff --git a/README.md b/README.md index 1cb22ec8..ef01aced 100644 --- a/README.md +++ b/README.md @@ -410,23 +410,6 @@ optimism_package: # A list of optional extra params that will be passed to the batcher container for modifying its behaviour extra_params: [] - # Default challenger configuration - challenger_params: - # Whether or not to enable the challenger - enabled: true - - # The Docker image that should be used for the challenger; leave blank to use the default op-challenger image - image: "" - - # A list of optional extra params that will be passed to the challenger container for modifying its behaviour - extra_params: [] - - # Path to folder containing cannon prestate-proof.json file - cannon_prestates_path: "static_files/prestates" - - # Base URL to absolute prestates to use when generating trace data. - cannon_prestates_url: "" - # Default proposer configuration proposer_params: # The Docker image that should be used for the proposer; leave blank to use the default op-proposer image @@ -477,6 +460,36 @@ optimism_package: - "--port=3100" - "--log.level=debug" + challengers: + my-challenger: + # Whether this challenger is active + enabled: true + + # The Docker image that should be used for the challenger; leave blank to use the default op-challenger image + image: "" + + # List of L2 chains that this challenger is connected to + # + # This field accepts several configuration types: + # + # A list of network IDs, in which case the challenger will connect to all the nodes in these network + participants: ["2151908"] + + # OR "*" meaning the challenger will connect to all nodes of all L2 networks + participants: "*" + + # A list of optional extra params that will be passed to the challenger container for modifying its behaviour + extra_params: [] + + # Path to folder containing cannon prestate-proof.json file + cannon_prestates_path: "static_files/prestates" + + # OR Base URL to absolute prestates to use when generating trace data. + cannon_prestates_url: "" + + # Directory in which the challenger will store its data + datadir: "/data/op-challenger/op-challenger-data" + # L2 contract deployer configuration - used for all L2 networks. # The docker image that should be used for the L2 contract deployer. # Locators can be http(s) URLs, or point to an enclave artifact with diff --git a/main.star b/main.star index 2698efd2..f6acadae 100644 --- a/main.star +++ b/main.star @@ -2,9 +2,7 @@ ethereum_package = import_module("github.com/ethpandaops/ethereum-package/main.s contract_deployer = import_module("./src/contracts/contract_deployer.star") l2_launcher = import_module("./src/l2.star") op_supervisor_launcher = import_module("./src/interop/op-supervisor/launcher.star") -op_challenger_launcher = import_module( - "./src/challenger/op-challenger/op_challenger_launcher.star" -) +op_challenger_launcher = import_module("./src/challenger/op-challenger/launcher.star") faucet = import_module("./src/faucet/op-faucet/op_faucet_launcher.star") observability = import_module("./src/observability/observability.star") @@ -123,8 +121,9 @@ def run(plan, args={}): ) ) + supervisor = None if interop_params.enabled: - op_supervisor_launcher.launch( + supervisor = op_supervisor_launcher.launch( plan, l1_config_env_vars, optimism_args.chains, @@ -134,29 +133,16 @@ def run(plan, args={}): observability_helper, ) - # challenger must launch after supervisor because it depends on it for interop - for l2_num, l2 in enumerate(l2s): - chain = optimism_args.chains[l2_num] - op_challenger_image = ( - chain.challenger_params.image - if chain.challenger_params.image != "" - else input_parser.DEFAULT_CHALLENGER_IMAGES["op-challenger"] + for challenger_params in optimism_args.challengers: + op_challenger_launcher.launch( + plan=plan, + params=challenger_params, + l2s=l2s, + supervisor=supervisor, + l1_config_env_vars=l1_config_env_vars, + deployment_output=deployment_output, + observability_helper=observability_helper, ) - if chain.challenger_params.enabled: - op_challenger_launcher.launch( - plan, - l2_num, - "op-challenger-{0}".format(chain.network_params.name), - chain.challenger_params.image, - l2.participants[0].el_context, - l2.participants[0].cl_context, - l1_config_env_vars, - deployment_output, - chain.network_params, - chain.challenger_params, - interop_params, - observability_helper, - ) if optimism_args.faucet.enabled: _install_faucet( diff --git a/network_params.yaml b/network_params.yaml index ba7dd6dd..356f06bc 100644 --- a/network_params.yaml +++ b/network_params.yaml @@ -26,6 +26,8 @@ optimism_package: node_selectors: {} tolerations: [] count: 1 + - el_type: op-reth + cl_type: op-node network_params: network: "kurtosis" network_id: "2151908" @@ -53,6 +55,14 @@ optimism_package: global_node_selectors: {} global_tolerations: [] persistent: false + challengers: + challenger-0: &x-challenger + participants: "*" + cannon_trace_types: ["super-cannon", "super-permissioned"] + challenger-1: + <<: *x-challenger + interop: + enabled: True ethereum_package: participants: - el_type: geth diff --git a/src/challenger/input_parser.star b/src/challenger/input_parser.star new file mode 100644 index 00000000..6b530fc1 --- /dev/null +++ b/src/challenger/input_parser.star @@ -0,0 +1,83 @@ +_expansion = import_module("/src/util/expansion.star") +_filter = import_module("/src/util/filter.star") + +_DEFAULT_ARGS = { + "enabled": True, + "image": "us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:develop", + "extra_params": [], + "participants": "*", + "cannon_prestate_path": "", + "cannon_prestates_url": "https://storage.googleapis.com/oplabs-network-data/proofs/op-program/cannon", + "cannon_trace_types": [], + "datadir": "/data/op-challenger/op-challenger-data", +} + + +def parse(args, chains): + return _filter.remove_none( + [ + _parse_instance(challenger_args or {}, challenger_name, chains) + for challenger_name, challenger_args in (args or {}).items() + ] + ) + + +def _parse_instance(challenger_args, challenger_name, chains): + # Any extra attributes will cause an error + extra_keys = _filter.remove_keys(challenger_args, _DEFAULT_ARGS.keys()) + if len(extra_keys) > 0: + fail( + "Invalid attributes in challenger configuration for {}: {}".format( + challenger_name, ",".join(extra_keys) + ) + ) + + # We filter the None values so that we can merge dicts easily + # and merge the config with the defaults + challenger_params = _DEFAULT_ARGS | _filter.remove_none(challenger_args) + + if not challenger_params["enabled"]: + return None + + # We expand the list of participants since we support a special "*" value to include all networks + network_ids = [c["network_params"]["network_id"] for c in chains] + challenger_params["participants"] = _expansion.expand_asterisc( + challenger_params["participants"], + network_ids, + missing_value_message="network ID {0} does not exist, please check challenger configuration for challenger " + + challenger_name, + ) + + # No participants means that the challenger is disabled + if len(challenger_params["participants"]) == 0: + return None + + # We add name & service name + challenger_params["name"] = challenger_name + challenger_params["service_name"] = "op-challenger-{}".format(challenger_name) + + # Now we make sure to cover the prestate arg combinations + # + # First we check we only have one of them defined + if ( + challenger_params["cannon_prestate_path"] + and challenger_params["cannon_prestates_url"] + ): + fail( + "Only one of cannon_prestate_path and cannon_prestates_url can be set for challenger {}".format( + challenger_name + ) + ) + + # And we also need to make sure we have at least one of them defined + if ( + not challenger_params["cannon_prestate_path"] + and not challenger_params["cannon_prestates_url"] + ): + fail( + "At least one of cannon_prestate_path and cannon_prestates_url must be set for challenger {}".format( + challenger_name + ) + ) + + return struct(**challenger_params) diff --git a/src/challenger/op-challenger/launcher.star b/src/challenger/op-challenger/launcher.star new file mode 100644 index 00000000..df375e2a --- /dev/null +++ b/src/challenger/op-challenger/launcher.star @@ -0,0 +1,194 @@ +ethereum_package_shared_utils = import_module( + "github.com/ethpandaops/ethereum-package/src/shared_utils/shared_utils.star" +) + +ethereum_package_constants = import_module( + "github.com/ethpandaops/ethereum-package/src/package_io/constants.star" +) + +observability = import_module("../../observability/observability.star") +prometheus = import_module("../../observability/prometheus/prometheus_launcher.star") + +constants = import_module("../../package_io/constants.star") +interop_constants = import_module("../../interop/constants.star") +util = import_module("../../util.star") + +# +# ---------------------------------- Challenger client ------------------------------------- + + +def launch( + plan, + params, + l2s, + # TODO Once the multiple supervisors are in, this will need to change + supervisor, + l1_config_env_vars, + deployment_output, + observability_helper, +): + # We need to only grab the networks this challenger is connected to + challenger_l2s = [l2 for l2 in l2s if l2.network_id in params.participants] + + config = get_challenger_config( + plan=plan, + params=params, + l2s=challenger_l2s, + supervisor=supervisor, + l1_config_env_vars=l1_config_env_vars, + deployment_output=deployment_output, + observability_helper=observability_helper, + ) + + service = plan.add_service(params.service_name, config) + + if observability_helper.enabled: + for l2 in challenger_l2s: + observability.register_op_service_metrics_job( + observability_helper, service, l2.name + ) + + return struct( + service=service, + l2s=challenger_l2s, + ) + + +def get_challenger_config( + plan, + params, + l2s, + supervisor, + l1_config_env_vars, + deployment_output, + observability_helper, +): + # We assume that all the participants share the L1 deployments + # + # TODO The "proper" solution for this is still somewhere out there: + # - op-deployer output might need to be restructured + # - we might need to do some additional checks to make sure the networks really do share the deployments + first_network_id = l2s[0].network_id + + # We'll grab the game factory address from the deployments + game_factory_address = util.read_network_config_value( + plan, + deployment_output, + "state", + '.opChainDeployments[] | select(.id=="{0}") | .disputeGameFactoryProxyAddress'.format( + util.to_hex_chain_id(first_network_id) + ), + ) + + # We assume that all the participants share the challenger account + challenger_key = util.read_network_config_value( + plan, + deployment_output, + # TODO Make sure this is decimal not hex + "challenger-{0}".format(first_network_id), + ".privateKey", + ) + + cmd = [ + "--cannon-l2-genesis={}".format( + ",".join( + [ + "{0}/genesis-{1}.json".format( + ethereum_package_constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS, + l2.network_id, + ) + for l2 in l2s + ] + ) + ), + "--cannon-rollup-config={}".format( + ",".join( + [ + "{0}/rollup-{1}.json".format( + ethereum_package_constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS, + l2.network_id, + ) + for l2 in l2s + ] + ) + ), + "--game-factory-address={}".format(game_factory_address), + "--datadir={}".format(params.datadir), + "--l1-beacon={}".format(l1_config_env_vars["CL_RPC_URL"]), + "--l1-eth-rpc={}".format(l1_config_env_vars["L1_RPC_URL"]), + "--l2-eth-rpc={}".format( + ",".join( + [ + ",".join([p.el_context.rpc_http_url for p in l2.participants]) + for l2 in l2s + ] + ) + ), + "--private-key={}".format(challenger_key), + "--rollup-rpc={}".format( + ",".join( + [ + ",".join([p.cl_context.beacon_http_url for p in l2.participants]) + for l2 in l2s + ] + ) + ), + ] + + if len(params.cannon_trace_types) > 0: + cmd.append( + # The trace types must be compatible with the number of networks - for 2+ networks, only the super-* trace types are allowed + # + # The error message that comes out when an incompatible type is used is not very clear and one needs to trace it to the challenger source code + # + # TODO It might be worth adding another validation to ensure compatibility. The problem is to keep it up to date with the source code + # as we don't want false positives to prevent people from launching the setup + "--trace-type={}".format(",".join(params.cannon_trace_types)), + ) + + # Now plug a supervisor in + if supervisor: + cmd.append( + "--supervisor-rpc={}".format( + supervisor.service.ports[constants.RPC_PORT_ID].url + ) + ) + # TraceTypeSupper{Cannon|Permissioned} needs --cannon-depset-config to be set + # Added at https://github.com/ethereum-optimism/optimism/pull/14666 + # Temporary fix: Add a dummy flag + # Tracked at issue https://github.com/ethpandaops/optimism-package/issues/189 + cmd.append("--cannon-depset-config=dummy-file.json") + + # configure files + + files = { + ethereum_package_constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: deployment_output, + params.datadir: Directory(persistent_key="datadir"), + } + + if params.cannon_prestate_path: + cannon_prestate_artifact = plan.upload_files( + src=params.cannon_prestate_path, + name="{}-prestates".format(params.service_name), + ) + files["/prestates"] = cannon_prestate_artifact + cmd.append("--cannon-prestate=/prestates/prestate-proof.json") + elif params.cannon_prestates_url: + cmd.append("--cannon-prestates-url=" + params.cannon_prestates_url) + else: + fail("One of cannon_prestate_path or cannon_prestates_url must be set") + + cmd += params.extra_params + + ports = {} + if observability_helper.enabled: + observability.configure_op_service_metrics(cmd, ports) + + return ServiceConfig( + image=params.image, + cmd=cmd, + entrypoint=["op-challenger"], + files=files, + private_ip_address_placeholder=ethereum_package_constants.PRIVATE_IP_ADDRESS_PLACEHOLDER, + ports=ports, + ) diff --git a/src/challenger/op-challenger/op_challenger_launcher.star b/src/challenger/op-challenger/op_challenger_launcher.star deleted file mode 100644 index e42852c4..00000000 --- a/src/challenger/op-challenger/op_challenger_launcher.star +++ /dev/null @@ -1,163 +0,0 @@ -ethereum_package_shared_utils = import_module( - "github.com/ethpandaops/ethereum-package/src/shared_utils/shared_utils.star" -) - -ethereum_package_constants = import_module( - "github.com/ethpandaops/ethereum-package/src/package_io/constants.star" -) - -observability = import_module("../../observability/observability.star") -prometheus = import_module("../../observability/prometheus/prometheus_launcher.star") - -interop_constants = import_module("../../interop/constants.star") -util = import_module("../../util.star") - -# -# ---------------------------------- Challenger client ------------------------------------- -CHALLENGER_DATA_DIRPATH_ON_SERVICE_CONTAINER = "/data/op-challenger/op-challenger-data" -ENTRYPOINT_ARGS = ["sh", "-c"] - - -def get_used_ports(): - used_ports = {} - return used_ports - - -def launch( - plan, - l2_num, - service_name, - image, - el_context, - cl_context, - l1_config_env_vars, - deployment_output, - network_params, - challenger_params, - interop_params, - observability_helper, -): - config = get_challenger_config( - plan, - l2_num, - service_name, - image, - el_context, - cl_context, - l1_config_env_vars, - deployment_output, - network_params, - challenger_params, - interop_params, - observability_helper, - ) - - service = plan.add_service(service_name, config) - - observability.register_op_service_metrics_job( - observability_helper, service, network_params.network - ) - - return "op_challenger" - - -def get_challenger_config( - plan, - l2_num, - service_name, - image, - el_context, - cl_context, - l1_config_env_vars, - deployment_output, - network_params, - challenger_params, - interop_params, - observability_helper, -): - ports = dict(get_used_ports()) - - game_factory_address = util.read_network_config_value( - plan, - deployment_output, - "state", - ".opChainDeployments[{0}].disputeGameFactoryProxyAddress".format(l2_num), - ) - challenger_key = util.read_network_config_value( - plan, - deployment_output, - "challenger-{0}".format(network_params.network_id), - ".privateKey", - ) - - cmd = [ - "op-challenger", - "--cannon-l2-genesis=" - + "{0}/genesis-{1}.json".format( - ethereum_package_constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS, - network_params.network_id, - ), - "--cannon-rollup-config=" - + "{0}/rollup-{1}.json".format( - ethereum_package_constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS, - network_params.network_id, - ), - "--game-factory-address=" + game_factory_address, - "--datadir=" + CHALLENGER_DATA_DIRPATH_ON_SERVICE_CONTAINER, - "--l1-beacon=" + l1_config_env_vars["CL_RPC_URL"], - "--l1-eth-rpc=" + l1_config_env_vars["L1_RPC_URL"], - "--l2-eth-rpc=" + el_context.rpc_http_url, - "--private-key=" + challenger_key, - "--rollup-rpc=" + cl_context.beacon_http_url, - "--trace-type=" + ",".join(challenger_params.cannon_trace_types), - ] - - # configure files - - files = { - ethereum_package_constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: deployment_output, - } - - # apply customizations - - if observability_helper.enabled: - observability.configure_op_service_metrics(cmd, ports) - - if interop_params.enabled: - cmd.append("--supervisor-rpc=" + interop_constants.SUPERVISOR_ENDPOINT) - # TraceTypeSupper{Cannon|Permissioned} needs --cannon-depset-config to be set - # Added at https://github.com/ethereum-optimism/optimism/pull/14666 - # Temporary fix: Add a dummy flag - # Tracked at issue https://github.com/ethpandaops/optimism-package/issues/189 - cmd.append("--cannon-depset-config=dummy-file.json") - - if ( - challenger_params.cannon_prestate_path - and challenger_params.cannon_prestates_url - ): - fail("Only one of cannon_prestate_path and cannon_prestates_url can be set") - elif challenger_params.cannon_prestate_path: - cannon_prestate_artifact = plan.upload_files( - src=challenger_params.cannon_prestate_path, - name="{}-prestates".format(service_name), - ) - files["/prestates"] = cannon_prestate_artifact - cmd.append("--cannon-prestate=/prestates/prestate-proof.json") - elif challenger_params.cannon_prestates_url: - cmd.append("--cannon-prestates-url=" + challenger_params.cannon_prestates_url) - else: - fail("One of cannon_prestate_path or cannon_prestates_url must be set") - - cmd += challenger_params.extra_params - cmd = "mkdir -p {0} && {1}".format( - CHALLENGER_DATA_DIRPATH_ON_SERVICE_CONTAINER, " ".join(cmd) - ) - - return ServiceConfig( - image=image, - ports=ports, - entrypoint=ENTRYPOINT_ARGS, - cmd=[cmd], - files=files, - private_ip_address_placeholder=ethereum_package_constants.PRIVATE_IP_ADDRESS_PLACEHOLDER, - ) diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index f46813fd..b044b5f5 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -2,6 +2,8 @@ ethereum_package_input_parser = import_module( "github.com/ethpandaops/ethereum-package/src/package_io/input_parser.star" ) +challenger_input_parser = import_module("/src/challenger/input_parser.star") + constants = import_module("../package_io/constants.star") sanity_check = import_module("./sanity_check.star") @@ -235,20 +237,6 @@ def input_parser(plan, input_args): image=result["batcher_params"]["image"], extra_params=result["batcher_params"]["extra_params"], ), - challenger_params=struct( - enabled=result["challenger_params"]["enabled"], - image=result["challenger_params"]["image"], - extra_params=result["challenger_params"]["extra_params"], - cannon_prestate_path=result["challenger_params"][ - "cannon_prestate_path" - ], - cannon_prestates_url=result["challenger_params"][ - "cannon_prestates_url" - ], - cannon_trace_types=result["challenger_params"][ - "cannon_trace_types" - ], - ), proposer_params=struct( image=result["proposer_params"]["image"], extra_params=result["proposer_params"]["extra_params"], @@ -275,6 +263,7 @@ def input_parser(plan, input_args): ) for result in results["chains"] ], + challengers=results["challengers"], op_contract_deployer_params=struct( image=results["op_contract_deployer_params"]["image"], l1_artifacts_locator=results["op_contract_deployer_params"][ @@ -456,6 +445,12 @@ def parse_network_params(plan, input_args): results["chains"] = chains + # configure op-challenger + + results["challengers"] = challenger_input_parser.parse( + input_args.get("challengers"), chains + ) + # configure op-deployer results["op_contract_deployer_params"] = default_op_contract_deployer_params() diff --git a/src/package_io/sanity_check.star b/src/package_io/sanity_check.star index 9ce158e0..1132d645 100644 --- a/src/package_io/sanity_check.star +++ b/src/package_io/sanity_check.star @@ -1,5 +1,6 @@ ROOT_PARAMS = [ "observability", + "challengers", "interop", "altda_deploy_config", "chains", diff --git a/test/challenger/input_parser_test.star b/test/challenger/input_parser_test.star new file mode 100644 index 00000000..3500ae5e --- /dev/null +++ b/test/challenger/input_parser_test.star @@ -0,0 +1,67 @@ +input_parser = import_module("/src/challenger/input_parser.star") + +_chains = [ + {"network_params": {"network_id": 1000}}, + {"network_params": {"network_id": 2000}}, +] + + +def test_challenger_input_parser_empty(plan): + expect.eq(input_parser.parse(None, _chains), []) + expect.eq(input_parser.parse({}, _chains), []) + + +def test_challenger_input_parser_disabled(plan): + expect.eq(input_parser.parse({"challenger": {"enabled": False}}, _chains), []) + + +def test_challenger_input_parser_no_participants(plan): + expect.eq(input_parser.parse({"challenger": {"participants": []}}, _chains), []) + + +def test_challenger_input_parser_extra_attrbites(plan): + expect.fails( + lambda: input_parser.parse({"challenger": {"extra": [], "name": ""}}, _chains), + "Invalid attributes in challenger configuration for challenger: extra,name", + ) + + +def test_challenger_input_parser_default_args(plan): + expected_params = struct( + name="challenger", + service_name="op-challenger-challenger", + enabled=True, + image="us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:develop", + extra_params=[], + participants=[1000, 2000], + cannon_prestate_path="", + cannon_prestates_url="https://storage.googleapis.com/oplabs-network-data/proofs/op-program/cannon", + cannon_trace_types=[], + datadir="/data/op-challenger/op-challenger-data", + ) + + expect.eq( + input_parser.parse({"challenger": None}, _chains), + [expected_params], + ) + expect.eq( + input_parser.parse({"challenger": {}}, _chains), + [expected_params], + ) + expect.eq( + input_parser.parse( + { + "challenger": { + "enabled": None, + "image": None, + "extra_params": None, + "participants": None, + "cannon_prestate_path": None, + "cannon_prestates_url": None, + "cannon_trace_types": None, + } + }, + _chains, + ), + [expected_params], + ) diff --git a/test/op_challenger_launcher_test.star b/test/challenger/op-challenger/launcher_test.star similarity index 54% rename from test/op_challenger_launcher_test.star rename to test/challenger/op-challenger/launcher_test.star index 63662308..2584a072 100644 --- a/test/op_challenger_launcher_test.star +++ b/test/challenger/op-challenger/launcher_test.star @@ -1,6 +1,4 @@ -op_challenger_launcher = import_module( - "/src/challenger/op-challenger/op_challenger_launcher.star" -) +op_challenger_launcher = import_module("/src/challenger/op-challenger/launcher.star") input_parser = import_module("/src/package_io/input_parser.star") observability = import_module("/src/observability/observability.star") ethereum_package_constants = import_module( @@ -9,12 +7,15 @@ ethereum_package_constants = import_module( util = import_module("/src/util.star") -def test_launch_with_defaults(plan): +def test_op_challenger_launch_with_defaults(plan): parsed_input_args = input_parser.input_parser( plan, { "chains": [ { + "network_params": { + "network_id": 1000, + }, "participants": [ { "el_type": "op-reth", @@ -23,29 +24,18 @@ def test_launch_with_defaults(plan): "cl_image": "op-node:latest", } ], - "challenger_params": { - "enabled": False, - }, } - ] + ], + "challengers": {"challenger": None}, }, ) - el_context = struct( - rpc_http_url="rpc_http_url", - ) - cl_context = struct( - beacon_http_url="beacon_http_url", - ) - # el_context, cl_context = launch_test_el_cl(plan, parsed_input_args) - observability_helper = observability.make_helper(parsed_input_args.observability) chains = parsed_input_args.chains chain = chains[0] - l2_num = 0 - challenger_service_name = "op-challenger" - challenger_image = input_parser.DEFAULT_CHALLENGER_IMAGES["op-challenger"] + challengers = parsed_input_args.challengers + challenger = challengers[0] deployment_output = "/path/to/deployment_output" l1_config_env_vars = { @@ -66,32 +56,54 @@ def test_launch_with_defaults(plan): op_challenger_launcher.launch( plan=plan, - l2_num=l2_num, - service_name=challenger_service_name, - image=challenger_image, - el_context=el_context, - cl_context=cl_context, + params=parsed_input_args.challengers[0], + l2s=[ + struct( + network_id=1000, + name="my-network", + participants=[ + struct( + cl_context=struct( + beacon_http_url="beacon_http_url", + ), + el_context=struct( + rpc_http_url="rpc_http_url", + ), + ) + ], + ) + ], + supervisor=None, l1_config_env_vars=l1_config_env_vars, deployment_output=deployment_output, - network_params=chain.network_params, - challenger_params=chain.challenger_params, - interop_params=parsed_input_args.interop, observability_helper=observability_helper, ) challenger_service_config = kurtosistest.get_service_config( - service_name=challenger_service_name + service_name=challenger.service_name ) expect.ne(challenger_service_config, None) - expect.eq(challenger_service_config.image, challenger_image) + expect.eq(challenger_service_config.image, challenger.image) expect.eq(challenger_service_config.env_vars, {}) expect.eq( challenger_service_config.entrypoint, - ["sh", "-c"], + ["op-challenger"], ) expect.eq( challenger_service_config.cmd, [ - "mkdir -p /data/op-challenger/op-challenger-data && op-challenger --cannon-l2-genesis=/network-configs/genesis-2151908.json --cannon-rollup-config=/network-configs/rollup-2151908.json --game-factory-address=challenger_private_key --datadir=/data/op-challenger/op-challenger-data --l1-beacon=CL_RPC_URL --l1-eth-rpc=L1_RPC_URL --l2-eth-rpc=rpc_http_url --private-key=challenger_private_key --rollup-rpc=beacon_http_url --trace-type=cannon,permissioned --metrics.enabled --metrics.addr=0.0.0.0 --metrics.port=9001 --cannon-prestates-url=https://storage.googleapis.com/oplabs-network-data/proofs/op-program/cannon" + "--cannon-l2-genesis=/network-configs/genesis-1000.json", + "--cannon-rollup-config=/network-configs/rollup-1000.json", + "--game-factory-address=challenger_private_key", + "--datadir=/data/op-challenger/op-challenger-data", + "--l1-beacon=CL_RPC_URL", + "--l1-eth-rpc=L1_RPC_URL", + "--l2-eth-rpc=rpc_http_url", + "--private-key=challenger_private_key", + "--rollup-rpc=beacon_http_url", + "--cannon-prestates-url=https://storage.googleapis.com/oplabs-network-data/proofs/op-program/cannon", + "--metrics.enabled", + "--metrics.addr=0.0.0.0", + "--metrics.port=9001", ], ) From 3a562e97246b78420190655f84b57712971283d4 Mon Sep 17 00:00:00 2001 From: Jan Nanista Date: Thu, 1 May 2025 08:31:45 -0700 Subject: [PATCH 2/2] fix: Remove remnants of challenger_params --- network_params.yaml | 3 --- src/package_io/input_parser.star | 16 ---------------- src/package_io/sanity_check.star | 8 -------- 3 files changed, 27 deletions(-) diff --git a/network_params.yaml b/network_params.yaml index 356f06bc..caa12b2b 100644 --- a/network_params.yaml +++ b/network_params.yaml @@ -38,9 +38,6 @@ optimism_package: fund_dev_accounts: true batcher_params: extra_params: [] - challenger_params: - enabled: true - extra_params: [] mev_params: builder_host: "" builder_port: "" diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index b044b5f5..d10d9361 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -348,9 +348,6 @@ def parse_network_params(plan, input_args): proposer_params = default_proposer_params() proposer_params.update(chain.get("proposer_params", {})) - challenger_params = default_challenger_params() - challenger_params.update(chain.get("challenger_params", {})) - mev_params = default_mev_params() mev_params.update(chain.get("mev_params", {})) da_server_params = default_da_server_params() @@ -432,7 +429,6 @@ def parse_network_params(plan, input_args): "network_params": network_params, "proxyd_params": proxyd_params, "batcher_params": batcher_params, - "challenger_params": challenger_params, "proposer_params": proposer_params, "mev_params": mev_params, "da_server_params": da_server_params, @@ -573,7 +569,6 @@ def default_chains(): "proxyd_params": default_proxyd_params(), "batcher_params": default_batcher_params(), "proposer_params": default_proposer_params(), - "challenger_params": default_challenger_params(), "mev_params": default_mev_params(), "da_server_params": default_da_server_params(), "additional_services": DEFAULT_ADDITIONAL_SERVICES, @@ -612,17 +607,6 @@ def default_proxyd_params(): } -def default_challenger_params(): - return { - "enabled": True, - "image": DEFAULT_CHALLENGER_IMAGES["op-challenger"], - "extra_params": [], - "cannon_prestate_path": "", - "cannon_prestates_url": "https://storage.googleapis.com/oplabs-network-data/proofs/op-program/cannon", - "cannon_trace_types": ["cannon", "permissioned"], - } - - def default_proposer_params(): return { "image": DEFAULT_PROPOSER_IMAGES["op-proposer"], diff --git a/src/package_io/sanity_check.star b/src/package_io/sanity_check.star index 1132d645..5ed0235a 100644 --- a/src/package_io/sanity_check.star +++ b/src/package_io/sanity_check.star @@ -154,14 +154,6 @@ SUBCATEGORY_PARAMS = { "proxyd_params": ["image", "tag", "extra_params"], "batcher_params": ["image", "extra_params"], "proposer_params": ["image", "extra_params", "game_type", "proposal_interval"], - "challenger_params": [ - "enabled", - "image", - "extra_params", - "cannon_prestate_path", - "cannon_prestates_url", - "cannon_trace_types", - ], "mev_params": ["rollup_boost_image", "builder_host", "builder_port"], "da_server_params": [ "enabled",