diff --git a/.github/tests/mix-with-tools-mev.yaml b/.github/tests/mix-with-tools-mev.yaml index 728fb31a5..ae82f9943 100644 --- a/.github/tests/mix-with-tools-mev.yaml +++ b/.github/tests/mix-with-tools-mev.yaml @@ -26,6 +26,7 @@ additional_services: - blutgang - apache - tracoor + - spamoor ethereum_metrics_exporter_enabled: true snooper_enabled: true mev_type: flashbots diff --git a/.github/tests/mix-with-tools-minimal.yaml b/.github/tests/mix-with-tools-minimal.yaml index 8ec08e1c0..744789604 100644 --- a/.github/tests/mix-with-tools-minimal.yaml +++ b/.github/tests/mix-with-tools-minimal.yaml @@ -28,6 +28,7 @@ additional_services: - blutgang - apache - tracoor + - spamoor ethereum_metrics_exporter_enabled: true snooper_enabled: true keymanager_enabled: true diff --git a/.github/tests/mix-with-tools.yaml b/.github/tests/mix-with-tools.yaml index ed4fc57e5..bc9317ff6 100644 --- a/.github/tests/mix-with-tools.yaml +++ b/.github/tests/mix-with-tools.yaml @@ -28,6 +28,7 @@ additional_services: - blutgang - apache - tracoor + - spamoor ethereum_metrics_exporter_enabled: true snooper_enabled: true keymanager_enabled: true diff --git a/README.md b/README.md index f82e14bc7..0a5864678 100644 --- a/README.md +++ b/README.md @@ -927,6 +927,27 @@ checkpoint_sync_enabled: false # Global flag to set checkpoint sync url checkpoint_sync_url: "" +# Spamoor params +spamoor_params: + # The image to use for spamoor + image: ethpandaops/spamoor:latest + # The type of transactions to send + # Valid values are eoatx, erctx, deploytx, depoy-destruct, blobs, gasburnertx + # Defaults to eoatx + tx_type: eoatx + # Throughput of spamoor + # Defaults to 1000 + throughput: 1000 + # Max pending transactions for spamoor + # Defaults to 1000 + max_pending: 1000 + # Max wallets for spamoor + # Defaults to 500 + max_wallets: 500 + # Extra parameters to send to spamoor + # Defaults to empty + spamoor_extra_args: [] + # Global paarameter to set the exit ip address of services and public ports port_publisher: # if you have a service that you want to expose on a specific interfact; set that IP here @@ -1166,6 +1187,7 @@ Here's a table of where the keys are used | 8 | assertoor | ✅ | ✅ | As the funding for tests | | 11 | mev_custom_flood | ✅ | | As the sender of balance | | 12 | l2_contracts | ✅ | | Contract deployer address | +| 13 | spamoor | ✅ | | Spams transactions | ## Developing On This Package diff --git a/main.star b/main.star index 87302cb83..1f39d5f6d 100644 --- a/main.star +++ b/main.star @@ -61,6 +61,7 @@ assertoor = import_module("./src/assertoor/assertoor_launcher.star") get_prefunded_accounts = import_module( "./src/prefunded_accounts/get_prefunded_accounts.star" ) +spamoor = import_module("./src/spamoor/spamoor.star") GRAFANA_USER = "admin" GRAFANA_PASSWORD = "admin" @@ -686,6 +687,15 @@ def run(plan, args={}): global_node_selectors, args_with_right_defaults.docker_cache_params, ) + elif additional_service == "spamoor": + plan.print("Launching spamoor") + spamoor.launch_spamoor( + plan, + prefunded_accounts, + all_el_contexts, + args_with_right_defaults.spamoor_params, + global_node_selectors, + ) else: fail("Invalid additional service %s" % (additional_service)) if launch_prometheus_grafana: diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index 2f2956324..95b9b81bb 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -86,6 +86,7 @@ ATTR_TO_BE_SKIPPED_AT_ROOT = ( "custom_flood_params", "xatu_sentry_params", "port_publisher", + "spamoor_params", ) @@ -119,6 +120,7 @@ def input_parser(plan, input_args): result["global_tolerations"] = [] result["global_node_selectors"] = {} result["port_publisher"] = get_port_publisher_params("default") + result["spamoor_params"] = get_default_spamoor_params() if constants.NETWORK_NAME.shadowfork in result["network_params"]["network"]: shadow_base = result["network_params"]["network"].split("-shadowfork")[0] @@ -184,6 +186,10 @@ def input_parser(plan, input_args): result["xatu_sentry_params"][sub_attr] = sub_value elif attr == "port_publisher": result["port_publisher"] = get_port_publisher_params("user", input_args) + elif attr == "spamoor_params": + for sub_attr in input_args["spamoor_params"]: + sub_value = input_args["spamoor_params"][sub_attr] + result["spamoor_params"][sub_attr] = sub_value if result.get("disable_peer_scoring"): result = enrich_disable_peer_scoring(result) @@ -430,6 +436,14 @@ def input_parser(plan, input_args): "interval_between_transactions" ], ), + spamoor_params=struct( + image=result["spamoor_params"]["image"], + tx_type=result["spamoor_params"]["tx_type"], + throughput=result["spamoor_params"]["throughput"], + max_pending=result["spamoor_params"]["max_pending"], + max_wallets=result["spamoor_params"]["max_wallets"], + spamoor_extra_args=result["spamoor_params"]["spamoor_extra_args"], + ), additional_services=result["additional_services"], wait_for_finalization=result["wait_for_finalization"], global_log_level=result["global_log_level"], @@ -844,6 +858,7 @@ def default_input_args(input_args): "nat_exit_ip": constants.PRIVATE_IP_ADDRESS_PLACEHOLDER, "public_port_start": None, }, + "spamoor_params": get_default_spamoor_params(), } @@ -1151,6 +1166,17 @@ def get_default_xatu_sentry_params(): } +def get_default_spamoor_params(): + return { + "image": "ethpandaops/spamoor:latest", + "tx_type": "eoatx", + "throughput": 1000, + "max_pending": 1000, + "max_wallets": 500, + "spamoor_extra_args": [], + } + + def get_default_custom_flood_params(): # this is a simple script that increases the balance of the coinbase address at a cadence return {"interval_between_transactions": 1} @@ -1346,6 +1372,7 @@ def docker_cache_image_override(plan, result): "goomy_blob_params.image", "prometheus_params.image", "grafana_params.image", + "spamoor_params.image", ] if result["docker_cache_params"]["url"] == "": diff --git a/src/package_io/sanity_check.star b/src/package_io/sanity_check.star index 72a403526..82dc8f2d1 100644 --- a/src/package_io/sanity_check.star +++ b/src/package_io/sanity_check.star @@ -244,6 +244,14 @@ SUBCATEGORY_PARAMS = { "xatu_server_headers", "beacon_subscriptions", ], + "spamoor_params": [ + "image", + "tx_type", + "throughput", + "max_pending", + "max_wallets", + "spamoor_extra_args", + ], "port_publisher": [ "nat_exit_ip", "el", @@ -273,6 +281,7 @@ ADDITIONAL_SERVICES_PARAMS = [ "forky", "apache", "tracoor", + "spamoor", ] ADDITIONAL_CATEGORY_PARAMS = { diff --git a/src/spamoor/spamoor.star b/src/spamoor/spamoor.star new file mode 100644 index 000000000..1f3dd2fc4 --- /dev/null +++ b/src/spamoor/spamoor.star @@ -0,0 +1,55 @@ +shared_utils = import_module("../shared_utils/shared_utils.star") +SERVICE_NAME = "spamoor" + +# The min/max CPU/memory that spamoor can use +MIN_CPU = 100 +MAX_CPU = 1000 +MIN_MEMORY = 20 +MAX_MEMORY = 300 + + +def launch_spamoor( + plan, + prefunded_addresses, + all_el_contexts, + spamoor_params, + global_node_selectors, +): + config = get_config( + prefunded_addresses, + all_el_contexts, + spamoor_params, + global_node_selectors, + ) + plan.add_service(SERVICE_NAME, config) + + +def get_config( + prefunded_addresses, + all_el_contexts, + spamoor_params, + node_selectors, +): + cmd = [ + "{}".format(spamoor_params.tx_type), + "--privkey={}".format(prefunded_addresses[13].private_key), + "--rpchost={}".format( + ",".join([el_context.rpc_http_url for el_context in all_el_contexts]) + ), + "--throughput={}".format(spamoor_params.throughput), + "--max-pending={}".format(spamoor_params.max_pending), + "--max-wallets={}".format(spamoor_params.max_wallets), + ] + + if len(spamoor_params.spamoor_extra_args) > 0: + cmd.extend([param for param in spamoor_params.spamoor_extra_args]) + + return ServiceConfig( + image=spamoor_params.image, + cmd=cmd, + min_cpu=MIN_CPU, + max_cpu=MAX_CPU, + min_memory=MIN_MEMORY, + max_memory=MAX_MEMORY, + node_selectors=node_selectors, + )