From 74b034bdd8ca5cf05dd9008e30875c68a10104d1 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 28 Nov 2025 12:54:52 +0100 Subject: [PATCH 1/2] feat: add checkpointz --- .github/tests/mix-with-tools.yaml | 1 + README.md | 7 + main.star | 22 +++ src/checkpointz/checkpointz_launcher.star | 145 ++++++++++++++++++ src/package_io/constants.star | 1 + src/package_io/input_parser.star | 8 + src/static_files/static_files.star | 3 + .../checkpointz-config/config.yaml.tmpl | 25 +++ 8 files changed, 212 insertions(+) create mode 100644 src/checkpointz/checkpointz_launcher.star create mode 100644 static_files/checkpointz-config/config.yaml.tmpl diff --git a/.github/tests/mix-with-tools.yaml b/.github/tests/mix-with-tools.yaml index 23c751864..09322923b 100644 --- a/.github/tests/mix-with-tools.yaml +++ b/.github/tests/mix-with-tools.yaml @@ -17,6 +17,7 @@ additional_services: - tx_fuzz - forkmon - dora + - checkpointz - prometheus - grafana - dugtrio diff --git a/README.md b/README.md index df7832853..4a927447e 100644 --- a/README.md +++ b/README.md @@ -816,6 +816,7 @@ additional_services: - blockscout - blutgang - broadcaster + - checkpointz - custom_flood - dora - dugtrio @@ -851,6 +852,12 @@ dora_params: # A list of optional extra env_vars the dora container should spin up with env: {} +# Configuration place for checkpointz - https://github.com/ethpandaops/checkpointz +checkpointz_params: + # Checkpointz docker image to use + # Defaults to the latest image + image: "ethpandaops/checkpointz:latest" + # Define custom file contents to be mounted into containers # These files are referenced by name in el_extra_mounts, cl_extra_mounts, and vc_extra_mounts extra_files: {} diff --git a/main.star b/main.star index 956ba567a..c5272961e 100644 --- a/main.star +++ b/main.star @@ -15,6 +15,7 @@ tx_fuzz = import_module("./src/tx_fuzz/tx_fuzz.star") forkmon = import_module("./src/forkmon/forkmon_launcher.star") dora = import_module("./src/dora/dora_launcher.star") +checkpointz = import_module("./src/checkpointz/checkpointz_launcher.star") dugtrio = import_module("./src/dugtrio/dugtrio_launcher.star") blutgang = import_module("./src/blutgang/blutgang_launcher.star") erpc = import_module("./src/erpc/erpc_launcher.star") @@ -569,6 +570,27 @@ def run(plan, args={}): el_cl_data_files_artifact_uuid, ) plan.print("Successfully launched dora") + elif additional_service == "checkpointz": + plan.print("Launching checkpointz") + checkpointz_config_template = read_file( + static_files.CHECKPOINTZ_CONFIG_TEMPLATE_FILEPATH + ) + checkpointz_params = args_with_right_defaults.checkpointz_params + checkpointz.launch_checkpointz( + plan, + checkpointz_config_template, + all_participants, + args_with_right_defaults.participants, + network_params, + checkpointz_params, + global_node_selectors, + global_tolerations, + args_with_right_defaults.port_publisher, + index, + args_with_right_defaults.docker_cache_params, + el_cl_data_files_artifact_uuid, + ) + plan.print("Successfully launched checkpointz") elif additional_service == "dugtrio": plan.print("Launching dugtrio") dugtrio_config_template = read_file( diff --git a/src/checkpointz/checkpointz_launcher.star b/src/checkpointz/checkpointz_launcher.star new file mode 100644 index 000000000..87cf0d2aa --- /dev/null +++ b/src/checkpointz/checkpointz_launcher.star @@ -0,0 +1,145 @@ +shared_utils = import_module("../shared_utils/shared_utils.star") +constants = import_module("../package_io/constants.star") + +SERVICE_NAME = "checkpointz" + +HTTP_PORT_NUMBER = 5555 +METRICS_PORT_NUMBER = 9090 + +CHECKPOINTZ_CONFIG_FILENAME = "checkpointz-config.yaml" + +CHECKPOINTZ_CONFIG_MOUNT_DIRPATH_ON_SERVICE = "/config" + +MIN_CPU = 100 +MAX_CPU = 1000 +MIN_MEMORY = 128 +MAX_MEMORY = 1024 + +USED_PORTS = { + constants.HTTP_PORT_ID: shared_utils.new_port_spec( + HTTP_PORT_NUMBER, + shared_utils.TCP_PROTOCOL, + shared_utils.HTTP_APPLICATION_PROTOCOL, + ), + constants.METRICS_PORT_ID: shared_utils.new_port_spec( + METRICS_PORT_NUMBER, + shared_utils.TCP_PROTOCOL, + shared_utils.HTTP_APPLICATION_PROTOCOL, + ), +} + + +def launch_checkpointz( + plan, + config_template, + participant_contexts, + participant_configs, + network_params, + checkpointz_params, + global_node_selectors, + global_tolerations, + port_publisher, + additional_service_index, + docker_cache_params, + el_cl_data_files_artifact_uuid, +): + tolerations = shared_utils.get_tolerations(global_tolerations=global_tolerations) + + all_cl_client_info = [] + for index, participant in enumerate(participant_contexts): + full_name, cl_client, _, _ = shared_utils.get_client_names( + participant, index, participant_contexts, participant_configs + ) + all_cl_client_info.append( + new_cl_client_info( + cl_client.beacon_http_url, + full_name, + ) + ) + + template_data = new_config_template_data( + network_params.network, + all_cl_client_info, + ) + + template_and_data = shared_utils.new_template_and_data( + config_template, template_data + ) + template_and_data_by_rel_dest_filepath = {} + template_and_data_by_rel_dest_filepath[ + CHECKPOINTZ_CONFIG_FILENAME + ] = template_and_data + + config_files_artifact_name = plan.render_templates( + template_and_data_by_rel_dest_filepath, "checkpointz-config" + ) + config = get_config( + config_files_artifact_name, + network_params, + checkpointz_params, + global_node_selectors, + tolerations, + port_publisher, + additional_service_index, + docker_cache_params, + el_cl_data_files_artifact_uuid, + ) + + plan.add_service(SERVICE_NAME, config) + + +def get_config( + config_files_artifact_name, + network_params, + checkpointz_params, + node_selectors, + tolerations, + port_publisher, + additional_service_index, + docker_cache_params, + el_cl_data_files_artifact_uuid, +): + config_file_path = shared_utils.path_join( + CHECKPOINTZ_CONFIG_MOUNT_DIRPATH_ON_SERVICE, + CHECKPOINTZ_CONFIG_FILENAME, + ) + + public_ports = shared_utils.get_additional_service_standard_public_port( + port_publisher, + constants.HTTP_PORT_ID, + additional_service_index, + 0, + ) + + IMAGE_NAME = checkpointz_params.image + + return ServiceConfig( + image=IMAGE_NAME, + ports=USED_PORTS, + public_ports=public_ports, + files={ + CHECKPOINTZ_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name, + constants.GENESIS_DATA_MOUNTPOINT_ON_CLIENTS: el_cl_data_files_artifact_uuid, + }, + cmd=["--config", config_file_path], + min_cpu=MIN_CPU, + max_cpu=MAX_CPU, + min_memory=MIN_MEMORY, + max_memory=MAX_MEMORY, + node_selectors=node_selectors, + tolerations=tolerations, + ) + + +def new_config_template_data(network, cl_client_info): + return { + "Network": network, + "CLClientInfo": cl_client_info, + } + + +def new_cl_client_info(beacon_http_url, full_name): + return { + "Beacon_HTTP_URL": beacon_http_url, + "FullName": full_name, + } diff --git a/src/package_io/constants.star b/src/package_io/constants.star index 64c3f489e..dfa1e5472 100644 --- a/src/package_io/constants.star +++ b/src/package_io/constants.star @@ -93,6 +93,7 @@ FLASHBOTS_MEV_TYPE = "flashbots" MEV_RS_MEV_TYPE = "mev-rs" COMMIT_BOOST_MEV_TYPE = "commit-boost" DEFAULT_DORA_IMAGE = "ethpandaops/dora:latest" +DEFAULT_CHECKPOINTZ_IMAGE = "ethpandaops/checkpointz:latest" DEFAULT_SPAMOOR_IMAGE = "ethpandaops/spamoor:latest" DEFAULT_ASSERTOOR_IMAGE = "ethpandaops/assertoor:latest" DEFAULT_SNOOPER_IMAGE = "ethpandaops/rpc-snooper:latest" diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index 50d936108..b59cafb4a 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -70,6 +70,7 @@ ATTR_TO_BE_SKIPPED_AT_ROOT = ( "mev_params", "blockscout_params", "dora_params", + "checkpointz_params", "docker_cache_params", "assertoor_params", "prometheus_params", @@ -90,6 +91,7 @@ def input_parser(plan, input_args): # add default eth2 input params result["blockscout_params"] = get_default_blockscout_params() result["dora_params"] = get_default_dora_params() + result["checkpointz_params"] = get_default_checkpointz_params() result["docker_cache_params"] = get_default_docker_cache_params() result["mev_params"] = get_default_mev_params( result.get("mev_type"), result["network_params"]["preset"] @@ -1422,6 +1424,12 @@ def get_default_dora_params(): } +def get_default_checkpointz_params(): + return { + "image": constants.DEFAULT_CHECKPOINTZ_IMAGE, + } + + def get_default_docker_cache_params(): return { "enabled": False, diff --git a/src/static_files/static_files.star b/src/static_files/static_files.star index 94646a556..1b4372532 100644 --- a/src/static_files/static_files.star +++ b/src/static_files/static_files.star @@ -37,6 +37,9 @@ DUGTRIO_CONFIG_TEMPLATE_FILEPATH = ( BLUTGANG_CONFIG_TEMPLATE_FILEPATH = ( STATIC_FILES_DIRPATH + "/blutgang-config/config.toml.tmpl" ) +CHECKPOINTZ_CONFIG_TEMPLATE_FILEPATH = ( + STATIC_FILES_DIRPATH + "/checkpointz-config/config.yaml.tmpl" +) ERPC_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + "/erpc-config/erpc.yaml.tmpl" FORKY_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + "/forky-config/config.yaml.tmpl" TRACOOR_CONFIG_TEMPLATE_FILEPATH = ( diff --git a/static_files/checkpointz-config/config.yaml.tmpl b/static_files/checkpointz-config/config.yaml.tmpl new file mode 100644 index 000000000..c2785fe76 --- /dev/null +++ b/static_files/checkpointz-config/config.yaml.tmpl @@ -0,0 +1,25 @@ +global: + listenAddr: ":5555" + logging: "info" + metricsAddr: ":9090" + +checkpointz: + mode: "light" + caches: + blocks: + max_items: 200 + states: + max_items: 5 + historical_epoch_count: 20 + frontend: + enabled: true + brand_name: "Checkpointz - {{ .Network }}" + public_url: "http://localhost:5555" + +beacon: + upstreams: +{{ range $clClient := .CLClientInfo }} + - name: "{{ $clClient.FullName }}" + address: "{{ $clClient.Beacon_HTTP_URL }}" + dataProvider: true +{{- end }} From e7c7b140672b6ac9efcd0bc9bf46568d278efc75 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 28 Nov 2025 13:02:30 +0100 Subject: [PATCH 2/2] add more tests --- .github/tests/mix-public.yaml | 1 + .github/tests/mix-with-tools-mev.yaml | 1 + .github/tests/mix-with-tools-minimal.yaml | 1 + network_params.yaml | 2 ++ src/package_io/input_parser.star | 3 +++ src/package_io/sanity_check.star | 4 ++++ 6 files changed, 12 insertions(+) diff --git a/.github/tests/mix-public.yaml b/.github/tests/mix-public.yaml index ed656fff0..6bcafd739 100644 --- a/.github/tests/mix-public.yaml +++ b/.github/tests/mix-public.yaml @@ -38,6 +38,7 @@ additional_services: - tx_fuzz - forkmon - dora + - checkpointz - prometheus - grafana - dugtrio diff --git a/.github/tests/mix-with-tools-mev.yaml b/.github/tests/mix-with-tools-mev.yaml index 93cf055fc..0f38a1dec 100644 --- a/.github/tests/mix-with-tools-mev.yaml +++ b/.github/tests/mix-with-tools-mev.yaml @@ -15,6 +15,7 @@ additional_services: - tx_fuzz - forkmon - dora + - checkpointz - prometheus - grafana - custom_flood diff --git a/.github/tests/mix-with-tools-minimal.yaml b/.github/tests/mix-with-tools-minimal.yaml index 099687b65..c1ce6c56e 100644 --- a/.github/tests/mix-with-tools-minimal.yaml +++ b/.github/tests/mix-with-tools-minimal.yaml @@ -19,6 +19,7 @@ additional_services: - tx_fuzz - forkmon - dora + - checkpointz - prometheus - grafana - custom_flood diff --git a/network_params.yaml b/network_params.yaml index f64f1cf13..5d40e0445 100644 --- a/network_params.yaml +++ b/network_params.yaml @@ -174,6 +174,8 @@ assertoor_params: run_opcodes_transaction_test: false run_lifecycle_test: false tests: [] +checkpointz_params: + image: "ethpandaops/checkpointz:latest" wait_for_finalization: false global_log_level: info snooper_enabled: false diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index b59cafb4a..9d96b8856 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -598,6 +598,9 @@ def input_parser(plan, input_args): verif_image=result["blockscout_params"]["verif_image"], frontend_image=result["blockscout_params"]["frontend_image"], ), + checkpointz_params=struct( + image=result["checkpointz_params"]["image"], + ), dora_params=struct( image=result["dora_params"]["image"], env=result["dora_params"]["env"], diff --git a/src/package_io/sanity_check.star b/src/package_io/sanity_check.star index eb7a2fae2..48a7db8e5 100644 --- a/src/package_io/sanity_check.star +++ b/src/package_io/sanity_check.star @@ -278,6 +278,9 @@ SUBCATEGORY_PARAMS = { "image", "env", ], + "checkpointz_params": [ + "image", + ], "docker_cache_params": [ "enabled", "url", @@ -386,6 +389,7 @@ ADDITIONAL_SERVICES_PARAMS = [ "forkmon", "blockscout", "dora", + "checkpointz", "full_beaconchain_explorer", "prometheus_grafana", "prometheus",