From 0f9c3aad1f1360fa896dce75cb1b2c46e9872af1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Piwo=C5=84ski?= Date: Wed, 8 Nov 2023 17:52:13 +0100 Subject: [PATCH] feat: Add broadcaster (#355) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/NethermindEth/broadcaster --------- Co-authored-by: Piotr Piwoński Co-authored-by: Gyanendra Mishra --- README.md | 1 + main.star | 31 ++++++++++++++----- src/blob_spammer/blob_spammer.star | 11 +++---- src/broadcaster/broadcaster.star | 18 +++++++++++ .../transaction_spammer.star | 12 +++---- 5 files changed, 51 insertions(+), 22 deletions(-) create mode 100644 src/broadcaster/broadcaster.star diff --git a/README.md b/README.md index a2a3579ed..4bebceed9 100644 --- a/README.md +++ b/README.md @@ -261,6 +261,7 @@ goomy_blob_params: # - A light beacon chain explorer will be launched # - Default: ["tx_spammer", "blob_spammer", "el_forkmon", "beacon_metrics_gazer", "dora"," "prometheus_grafana"] additional_services: + - broadcaster - tx_spammer - blob_spammer - custom_flood diff --git a/main.star b/main.star index e721354ab..b3f413107 100644 --- a/main.star +++ b/main.star @@ -36,6 +36,8 @@ mev_custom_flood = import_module( eip4788_deployment = import_module( "./src/eip4788_deployment/eip4788_deployment_launcher.star" ) +broadcaster = import_module("./src/broadcaster/broadcaster.star") + GRAFANA_USER = "admin" GRAFANA_PASSWORD = "admin" GRAFANA_DASHBOARD_PATH_URL = "/d/QdTOwy-nz/eth2-merge-kurtosis-module-dashboard?orgId=1" @@ -127,6 +129,22 @@ def run(plan, args={}): el_uri, ) + fuzz_target = "http://{0}:{1}".format( + all_el_client_contexts[0].ip_addr, + all_el_client_contexts[0].rpc_port_num, + ) + + # Broadcaster forwards requests, sent to it, to all nodes in parallel + if "broadcaster" in args_with_right_defaults.additional_services: + args_with_right_defaults.additional_services.remove("broadcaster") + broadcaster_service = broadcaster.launch_broadcaster( + plan, all_el_client_contexts + ) + fuzz_target = "http://{0}:{1}".format( + broadcaster_service.ip_address, + broadcaster.PORT, + ) + mev_endpoints = [] # passed external relays get priority # perhaps add mev_type External or remove this @@ -165,9 +183,6 @@ def run(plan, args={}): args_with_right_defaults.mev_type and args_with_right_defaults.mev_type == FULL_MEV_TYPE ): - el_uri = "http://{0}:{1}".format( - all_el_client_contexts[0].ip_addr, all_el_client_contexts[0].rpc_port_num - ) builder_uri = "http://{0}:{1}".format( all_el_client_contexts[-1].ip_addr, all_el_client_contexts[-1].rpc_port_num ) @@ -183,7 +198,7 @@ def run(plan, args={}): mev_flood.launch_mev_flood( plan, mev_params.mev_flood_image, - el_uri, + fuzz_target, genesis_constants.PRE_FUNDED_ACCOUNTS, ) epoch_recipe = GetHttpRequestRecipe( @@ -210,7 +225,7 @@ def run(plan, args={}): ) mev_flood.spam_in_background( plan, - el_uri, + fuzz_target, mev_params.mev_flood_extra_args, mev_params.mev_flood_seconds_per_bundle, genesis_constants.PRE_FUNDED_ACCOUNTS, @@ -254,7 +269,7 @@ def run(plan, args={}): transaction_spammer.launch_transaction_spammer( plan, genesis_constants.PRE_FUNDED_ACCOUNTS, - all_el_client_contexts[0], + fuzz_target, tx_spammer_params, ) plan.print("Successfully launched transaction spammer") @@ -263,7 +278,7 @@ def run(plan, args={}): blob_spammer.launch_blob_spammer( plan, genesis_constants.PRE_FUNDED_ACCOUNTS, - all_el_client_contexts[0], + fuzz_target, all_cl_client_contexts[0], network_params.deneb_fork_epoch, network_params.seconds_per_slot, @@ -338,7 +353,7 @@ def run(plan, args={}): plan, genesis_constants.PRE_FUNDED_ACCOUNTS[-1].private_key, genesis_constants.PRE_FUNDED_ACCOUNTS[0].address, - el_uri, + fuzz_target, args_with_right_defaults.custom_flood_params, ) else: diff --git a/src/blob_spammer/blob_spammer.star b/src/blob_spammer/blob_spammer.star index 8c9f5d7eb..7abd5a862 100644 --- a/src/blob_spammer/blob_spammer.star +++ b/src/blob_spammer/blob_spammer.star @@ -7,7 +7,7 @@ ENTRYPOINT_ARGS = ["/bin/sh", "-c"] def launch_blob_spammer( plan, prefunded_addresses, - el_client_context, + el_uri, cl_client_context, deneb_fork_epoch, seconds_per_slot, @@ -15,7 +15,7 @@ def launch_blob_spammer( ): config = get_config( prefunded_addresses, - el_client_context, + el_uri, cl_client_context, deneb_fork_epoch, seconds_per_slot, @@ -26,7 +26,7 @@ def launch_blob_spammer( def get_config( prefunded_addresses, - el_client_context, + el_uri, cl_client_context, deneb_fork_epoch, seconds_per_slot, @@ -51,9 +51,8 @@ def get_config( seconds_per_slot, ), 'echo "sleep is over, starting to send blob transactions"', - "/tx-fuzz.bin blobs --rpc=http://{0}:{1} --sk={2}".format( - el_client_context.ip_addr, - el_client_context.rpc_port_num, + "/tx-fuzz.bin blobs --rpc={} --sk={}".format( + el_uri, prefunded_addresses[1].private_key, ), ] diff --git a/src/broadcaster/broadcaster.star b/src/broadcaster/broadcaster.star new file mode 100644 index 000000000..2a901c8df --- /dev/null +++ b/src/broadcaster/broadcaster.star @@ -0,0 +1,18 @@ +IMAGE_NAME = "nethermind/broadcaster:latest" +SERVICE_NAME = "broadcaster" +PORT = 8545 + + +def launch_broadcaster(plan, all_el_client_contexts): + config = get_config(all_el_client_contexts) + return plan.add_service(SERVICE_NAME, config) + + +def get_config(all_el_client_contexts): + return ServiceConfig( + image=IMAGE_NAME, + cmd=[ + "http://{0}:{1}".format(context.ip_addr, context.rpc_port_num) + for context in all_el_client_contexts + ], + ) diff --git a/src/transaction_spammer/transaction_spammer.star b/src/transaction_spammer/transaction_spammer.star index 7a46b67ae..e339e0042 100644 --- a/src/transaction_spammer/transaction_spammer.star +++ b/src/transaction_spammer/transaction_spammer.star @@ -2,23 +2,19 @@ IMAGE_NAME = "ethpandaops/tx-fuzz:master" SERVICE_NAME = "transaction-spammer" -def launch_transaction_spammer( - plan, prefunded_addresses, el_client_context, tx_spammer_params -): +def launch_transaction_spammer(plan, prefunded_addresses, el_uri, tx_spammer_params): config = get_config( - prefunded_addresses, el_client_context, tx_spammer_params.tx_spammer_extra_args + prefunded_addresses, el_uri, tx_spammer_params.tx_spammer_extra_args ) plan.add_service(SERVICE_NAME, config) -def get_config(prefunded_addresses, el_client_context, tx_spammer_extra_args): +def get_config(prefunded_addresses, el_uri, tx_spammer_extra_args): return ServiceConfig( image=IMAGE_NAME, cmd=[ "spam", - "--rpc=http://{0}:{1}".format( - el_client_context.ip_addr, el_client_context.rpc_port_num - ), + "--rpc={}".format(el_uri), "--sk={0}".format(prefunded_addresses[3].private_key), "{0}".format(" ".join(tx_spammer_extra_args)), ],