diff --git a/.github/tests/assertoor.yaml b/.github/tests/assertoor.yaml index c5be467ef..d9b995f4c 100644 --- a/.github/tests/assertoor.yaml +++ b/.github/tests/assertoor.yaml @@ -7,3 +7,6 @@ participants: count: 1 additional_services: - assertoor +docker_cache_params: + enabled: true + url: "docker.ethquokkaops.io" diff --git a/.github/tests/bpo.yaml b/.github/tests/bpo.yaml index c8de935e1..c6047eff0 100644 --- a/.github/tests/bpo.yaml +++ b/.github/tests/bpo.yaml @@ -1,37 +1,50 @@ participants_matrix: el: - - el_type: nethermind - el_image: ethpandaops/nethermind:feature-peerdas - - el_type: reth - el_image: ethpandaops/reth:rkrasiuk-peerdas + # - el_type: nethermind + # el_image: ethpandaops/nethermind:feature-peerdas + # - el_type: reth + # el_image: ethpandaops/reth:rkrasiuk-peerdas - el_type: geth - el_image: ethpandaops/geth:peerdas-devnet-7 + el_image: ethpandaops/geth:fusaka-devnet-0 cl: - - cl_type: teku - cl_image: ethpandaops/teku:das - supernode: true - - cl_type: nimbus - cl_image: ethpandaops/nimbus-eth2:gbv2 - supernode: true + # - cl_type: teku + # cl_image: ethpandaops/teku:das + # supernode: true + # - cl_type: nimbus + # cl_image: ethpandaops/nimbus-eth2:gbv2 + # supernode: true - cl_type: grandine - cl_image: ethpandaops/grandine:hangleang-peerdas-devnet-7 + cl_image: ethpandaops/grandine:add-bpo-blob-schedule supernode: true cl_extra_env_vars: {"RUST_MIN_STACK": "5242880"} - - cl_type: prysm - cl_image: ethpandaops/prysm-beacon-chain:peerDAS - supernode: true - - cl_type: lighthouse - cl_image: ethpandaops/lighthouse:peerdas-devnet-7 - supernode: true + # - cl_type: prysm + # cl_image: ethpandaops/prysm-beacon-chain:peerDAS + # supernode: true + # - cl_type: lighthouse + # cl_image: ethpandaops/lighthouse:peerdas-devnet-7 + # supernode: true - cl_type: lodestar - cl_image: ethpandaops/lodestar:peerDAS - supernode: true + cl_image: ethpandaops/lodestar:nc-BPO + # supernode: true network_params: fulu_fork_epoch: 1 bpo_1_epoch: 1 bpo_1_max_blobs: 9 bpo_1_target_blobs: 6 + bpo_2_epoch: 2 + bpo_2_max_blobs: 18 + bpo_2_target_blobs: 12 + bpo_3_epoch: 3 + bpo_3_max_blobs: 9 + bpo_3_target_blobs: 6 + bpo_4_epoch: 4 + bpo_4_max_blobs: 18 + bpo_4_target_blobs: 12 + bpo_5_epoch: 5 + bpo_5_max_blobs: 9 + bpo_5_target_blobs: 6 + additional_services: - dora - spamoor @@ -46,4 +59,3 @@ spamoor_params: - scenario: blobs config: throughput: 20 - diff --git a/.github/tests/mev-mock.yaml b/.github/tests/mev-mock.yaml index ef6331c24..930fdac59 100644 --- a/.github/tests/mev-mock.yaml +++ b/.github/tests/mev-mock.yaml @@ -9,3 +9,6 @@ additional_services: - tx_fuzz mev_params: mock_mev_image: "ethpandaops/rustic-builder:main" +docker_cache_params: + enabled: true + url: "docker.ethquokkaops.io" diff --git a/.github/tests/mev.yaml b/.github/tests/mev.yaml index 18be4baa9..96f9d9d7c 100644 --- a/.github/tests/mev.yaml +++ b/.github/tests/mev.yaml @@ -17,3 +17,6 @@ additional_services: - prometheus_grafana network_params: seconds_per_slot: 6 +docker_cache_params: + enabled: true + url: "docker.ethquokkaops.io" diff --git a/.github/tests/minimal.yaml b/.github/tests/minimal.yaml index aea361d67..99a5ea5be 100644 --- a/.github/tests/minimal.yaml +++ b/.github/tests/minimal.yaml @@ -13,3 +13,6 @@ participants: cl_type: grandine network_params: preset: minimal +docker_cache_params: + enabled: true + url: "docker.ethquokkaops.io" diff --git a/.github/tests/mix-assert.yaml b/.github/tests/mix-assert.yaml index 28445bc30..e69766fa8 100644 --- a/.github/tests/mix-assert.yaml +++ b/.github/tests/mix-assert.yaml @@ -17,3 +17,6 @@ additional_services: assertoor_params: run_stability_check: false run_block_proposal_check: true +docker_cache_params: + enabled: true + url: "docker.ethquokkaops.io" diff --git a/.github/tests/mix-persistence-k8s.yaml b/.github/tests/mix-persistence-k8s.yaml index 285fc7cde..0946a4e4c 100644 --- a/.github/tests/mix-persistence-k8s.yaml +++ b/.github/tests/mix-persistence-k8s.yaml @@ -14,3 +14,6 @@ participants: - el_type: ethereumjs cl_type: nimbus persistent: true +docker_cache_params: + enabled: true + url: "docker.ethquokkaops.io" diff --git a/.github/tests/mix-persistence.yaml b/.github/tests/mix-persistence.yaml index 145202149..80e15a4e0 100644 --- a/.github/tests/mix-persistence.yaml +++ b/.github/tests/mix-persistence.yaml @@ -14,3 +14,6 @@ participants: - el_type: ethereumjs cl_type: nimbus persistent: true +docker_cache_params: + enabled: true + url: "docker.ethquokkaops.io" diff --git a/.github/tests/mix-public.yaml b/.github/tests/mix-public.yaml index 83f9d0d46..8664b7976 100644 --- a/.github/tests/mix-public.yaml +++ b/.github/tests/mix-public.yaml @@ -33,3 +33,24 @@ port_publisher: mev: enabled: true public_port_start: 45000 + other: + enabled: true + public_port_start: 46000 +additional_services: + - tx_fuzz + - forkmon + - dora + - prometheus_grafana + - custom_flood + - blobscan + - dugtrio + - blutgang + - apache + - tracoor + - spamoor +ethereum_metrics_exporter_enabled: true +snooper_enabled: true +keymanager_enabled: true +docker_cache_params: + enabled: true + url: "docker.ethquokkaops.io" diff --git a/.github/tests/mix-with-tools-mev.yaml b/.github/tests/mix-with-tools-mev.yaml index 122fcf19b..702c9ffcb 100644 --- a/.github/tests/mix-with-tools-mev.yaml +++ b/.github/tests/mix-with-tools-mev.yaml @@ -30,3 +30,6 @@ mev_type: flashbots mev_params: mev_relay_image: ethpandaops/mev-boost-relay:main persistent: True +docker_cache_params: + enabled: true + url: "docker.ethquokkaops.io" diff --git a/.github/tests/mix-with-tools.yaml b/.github/tests/mix-with-tools.yaml index 611658ba9..88982e45c 100644 --- a/.github/tests/mix-with-tools.yaml +++ b/.github/tests/mix-with-tools.yaml @@ -28,3 +28,6 @@ additional_services: ethereum_metrics_exporter_enabled: true snooper_enabled: true keymanager_enabled: true +docker_cache_params: + enabled: true + url: "docker.ethquokkaops.io" diff --git a/.github/tests/mix.yaml b/.github/tests/mix.yaml index f0637e185..926b511d3 100644 --- a/.github/tests/mix.yaml +++ b/.github/tests/mix.yaml @@ -13,3 +13,6 @@ participants: cl_type: teku - el_type: ethereumjs cl_type: grandine +docker_cache_params: + enabled: true + url: "docker.ethquokkaops.io" diff --git a/README.md b/README.md index fc6cfec75..feeb400a6 100644 --- a/README.md +++ b/README.md @@ -1100,6 +1100,14 @@ port_publisher: mev: enabled: false public_port_start: 37000 + + # Other public port exposed to your local machine (like ethereum metrics exporter, snooper) + # Disabled by default + # Public port start defaults to 38000 + # You can't run multiple enclaves on the same port settings + other: + enabled: false + public_port_start: 38000 ``` #### Example configurations diff --git a/main.star b/main.star index 95d56eef6..d9b6c3864 100644 --- a/main.star +++ b/main.star @@ -643,6 +643,7 @@ def run(plan, args={}): elif additional_service == "prometheus_grafana": # Allow prometheus to be launched last so is able to collect metrics from other services launch_prometheus_grafana = True + prometheus_grafana_index = index elif additional_service == "assertoor": plan.print("Launching assertoor") assertoor_config_template = read_file( @@ -705,7 +706,7 @@ def run(plan, args={}): global_node_selectors, args_with_right_defaults.prometheus_params, args_with_right_defaults.port_publisher, - index, + prometheus_grafana_index, ) plan.print("Launching grafana...") grafana.launch_grafana( @@ -716,7 +717,7 @@ def run(plan, args={}): global_node_selectors, args_with_right_defaults.grafana_params, args_with_right_defaults.port_publisher, - index + 1, + prometheus_grafana_index, ) plan.print("Successfully launched grafana") diff --git a/src/cl/cl_launcher.star b/src/cl/cl_launcher.star index d8129257f..37be6c4b2 100644 --- a/src/cl/cl_launcher.star +++ b/src/cl/cl_launcher.star @@ -29,6 +29,7 @@ def launch( validator_data, prysm_password_relative_filepath, prysm_password_artifact_uuid, + global_other_index, ): plan.print("Launching CL network") @@ -130,8 +131,11 @@ def launch( snooper_service_name, el_context, node_selectors, + args_with_right_defaults.port_publisher, + global_other_index, args_with_right_defaults.docker_cache_params, ) + global_other_index += 1 plan.print( "Successfully added {0} snooper participants".format( snooper_engine_context @@ -214,4 +218,5 @@ def launch( all_cl_contexts, all_snooper_engine_contexts, preregistered_validator_keys_for_nodes, + global_other_index, ) diff --git a/src/ethereum_metrics_exporter/ethereum_metrics_exporter_launcher.star b/src/ethereum_metrics_exporter/ethereum_metrics_exporter_launcher.star index 2b6e95393..4fc6a2fd5 100644 --- a/src/ethereum_metrics_exporter/ethereum_metrics_exporter_launcher.star +++ b/src/ethereum_metrics_exporter/ethereum_metrics_exporter_launcher.star @@ -3,7 +3,6 @@ static_files = import_module("../static_files/static_files.star") ethereum_metrics_exporter_context = import_module( "../ethereum_metrics_exporter/ethereum_metrics_exporter_context.star" ) - HTTP_PORT_ID = "http" METRICS_PORT_NUMBER = 9090 @@ -23,8 +22,17 @@ def launch( el_context, cl_context, node_selectors, + port_publisher, + global_other_index, docker_cache_params, ): + public_ports = shared_utils.get_other_public_port( + port_publisher, + HTTP_PORT_ID, + global_other_index, + 0, + ) + exporter_service = plan.add_service( ethereum_metrics_exporter_service_name, ServiceConfig( @@ -39,6 +47,7 @@ def launch( shared_utils.HTTP_APPLICATION_PROTOCOL, ) }, + public_ports=public_ports, cmd=[ "--metrics-port", str(METRICS_PORT_NUMBER), diff --git a/src/grafana/grafana_launcher.star b/src/grafana/grafana_launcher.star index 95f928739..ea8d8aaa9 100644 --- a/src/grafana/grafana_launcher.star +++ b/src/grafana/grafana_launcher.star @@ -68,9 +68,9 @@ def launch_grafana( public_ports = shared_utils.get_additional_service_standard_public_port( port_publisher, - constants.HTTP_PORT_ID, + HTTP_PORT_ID, index, - 0, + 1, ) config = get_config( diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index f3d08c065..ef8799cbd 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -549,6 +549,10 @@ def input_parser(plan, input_args): ]["public_port_start"], mev_enabled=result["port_publisher"]["mev"]["enabled"], mev_public_port_start=result["port_publisher"]["mev"]["public_port_start"], + other_enabled=result["port_publisher"]["other"]["enabled"], + other_public_port_start=result["port_publisher"]["other"][ + "public_port_start" + ], ), ) @@ -1363,6 +1367,7 @@ def get_port_publisher_params(parameter_type, input_args=None): "remote_signer": {"enabled": False, "public_port_start": 35000}, "additional_services": {"enabled": False, "public_port_start": 36000}, "mev": {"enabled": False, "public_port_start": 37000}, + "other": {"enabled": False, "public_port_start": 38000}, } if parameter_type == "default": return port_publisher_parameters diff --git a/src/package_io/sanity_check.star b/src/package_io/sanity_check.star index 307044c70..b61fa1533 100644 --- a/src/package_io/sanity_check.star +++ b/src/package_io/sanity_check.star @@ -294,6 +294,7 @@ SUBCATEGORY_PARAMS = { "remote_signer", "additional_services", "mev", + "other", ], } diff --git a/src/participant_network.star b/src/participant_network.star index 0ea77035e..cc1312dc4 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -45,6 +45,7 @@ def launch_participant_network( num_participants = len(args_with_right_defaults.participants) total_number_of_validator_keys = 0 latest_block = "" + global_other_index = 0 if ( network_params.network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network_params.network @@ -160,6 +161,7 @@ def launch_participant_network( all_cl_contexts, all_snooper_engine_contexts, preregistered_validator_keys_for_nodes, + global_other_index, ) = cl_client_launcher.launch( plan, network_params, @@ -175,6 +177,7 @@ def launch_participant_network( validator_data, prysm_password_relative_filepath, prysm_password_artifact_uuid, + global_other_index, ) ethereum_metrics_exporter_context = None @@ -224,8 +227,11 @@ def launch_participant_network( el_context, cl_context, node_selectors, + args_with_right_defaults.port_publisher, + global_other_index, args_with_right_defaults.docker_cache_params, ) + global_other_index += 1 plan.print( "Successfully added {0} ethereum metrics exporter participants".format( ethereum_metrics_exporter_context @@ -303,8 +309,11 @@ def launch_participant_network( snooper_service_name, cl_context, node_selectors, + args_with_right_defaults.port_publisher, + global_other_index, args_with_right_defaults.docker_cache_params, ) + global_other_index += 1 plan.print( "Successfully added {0} snooper participants".format( snooper_beacon_context diff --git a/src/shared_utils/shared_utils.star b/src/shared_utils/shared_utils.star index 3322a537c..2b0068386 100644 --- a/src/shared_utils/shared_utils.star +++ b/src/shared_utils/shared_utils.star @@ -12,6 +12,7 @@ MAX_PORTS_PER_VC_NODE = 3 MAX_PORTS_PER_REMOTE_SIGNER_NODE = 2 MAX_PORTS_PER_ADDITIONAL_SERVICE = 2 MAX_PORTS_PER_MEV_NODE = 2 +MAX_PORTS_PER_OTHER_NODE = 1 def new_template_and_data(template, template_data_json): @@ -253,6 +254,12 @@ def get_public_ports_for_component( MAX_PORTS_PER_MEV_NODE, participant_index, ) + elif component == "other": + public_port_range = __get_port_range( + port_publisher_params.other_public_port_start, + MAX_PORTS_PER_OTHER_NODE, + participant_index, + ) return [port for port in range(public_port_range[0], public_port_range[1], 1)] @@ -321,6 +328,18 @@ def get_mev_public_port(port_publisher, port_id, additional_service_index, port_ return public_ports +def get_other_public_port( + port_publisher, port_id, additional_service_index, port_index +): + public_ports = {} + if port_publisher.other_enabled: + public_ports_for_component = get_public_ports_for_component( + "other", port_publisher, additional_service_index + ) + public_ports = get_port_specs({port_id: public_ports_for_component[port_index]}) + return public_ports + + def get_cpu_mem_resource_limits( min_cpu, max_cpu, min_mem, max_mem, volume_size, network_name, client_type ): diff --git a/src/snooper/snooper_beacon_launcher.star b/src/snooper/snooper_beacon_launcher.star index e5c6ff6fb..f6b0ebd61 100644 --- a/src/snooper/snooper_beacon_launcher.star +++ b/src/snooper/snooper_beacon_launcher.star @@ -26,15 +26,25 @@ def launch( service_name, cl_context, node_selectors, + port_publisher, + global_other_index, docker_cache_params, ): snooper_service_name = "{0}".format(service_name) + public_ports = shared_utils.get_other_public_port( + port_publisher, + SNOOPER_BEACON_RPC_PORT_ID, + global_other_index, + 0, + ) + snooper_config = get_config( service_name, cl_context, node_selectors, docker_cache_params, + public_ports, ) snooper_service = plan.add_service(snooper_service_name, snooper_config) @@ -49,6 +59,7 @@ def get_config( cl_context, node_selectors, docker_cache_params, + public_ports, ): beacon_rpc_port_num = "{0}".format( cl_context.beacon_http_url, @@ -65,6 +76,7 @@ def get_config( docker_cache_params, constants.DEFAULT_SNOOPER_IMAGE ), ports=SNOOPER_USED_PORTS, + public_ports=public_ports, cmd=cmd, min_cpu=MIN_CPU, max_cpu=MAX_CPU, diff --git a/src/snooper/snooper_engine_launcher.star b/src/snooper/snooper_engine_launcher.star index 0501412d2..eb65d262f 100644 --- a/src/snooper/snooper_engine_launcher.star +++ b/src/snooper/snooper_engine_launcher.star @@ -22,14 +22,30 @@ MIN_MEMORY = 10 MAX_MEMORY = 600 -def launch(plan, service_name, el_context, node_selectors, docker_cache_params): +def launch( + plan, + service_name, + el_context, + node_selectors, + port_publisher, + global_other_index, + docker_cache_params, +): snooper_service_name = "{0}".format(service_name) + public_ports = shared_utils.get_other_public_port( + port_publisher, + SNOOPER_ENGINE_RPC_PORT_ID, + global_other_index, + 0, + ) + snooper_config = get_config( service_name, el_context, node_selectors, docker_cache_params, + public_ports, ) snooper_service = plan.add_service(snooper_service_name, snooper_config) @@ -39,7 +55,9 @@ def launch(plan, service_name, el_context, node_selectors, docker_cache_params): ) -def get_config(service_name, el_context, node_selectors, docker_cache_params): +def get_config( + service_name, el_context, node_selectors, docker_cache_params, public_ports +): engine_rpc_port_num = "http://{0}:{1}".format( el_context.ip_addr, el_context.engine_rpc_port_num, @@ -56,6 +74,7 @@ def get_config(service_name, el_context, node_selectors, docker_cache_params): docker_cache_params, constants.DEFAULT_SNOOPER_IMAGE ), ports=SNOOPER_USED_PORTS, + public_ports=public_ports, cmd=cmd, min_cpu=MIN_CPU, max_cpu=MAX_CPU,