Commit a01d7727 authored by Barnabas Busa's avatar Barnabas Busa Committed by GitHub

feat: add spamoor (#850)

parent d7e31e01
...@@ -26,6 +26,7 @@ additional_services: ...@@ -26,6 +26,7 @@ additional_services:
- blutgang - blutgang
- apache - apache
- tracoor - tracoor
- spamoor
ethereum_metrics_exporter_enabled: true ethereum_metrics_exporter_enabled: true
snooper_enabled: true snooper_enabled: true
mev_type: flashbots mev_type: flashbots
......
...@@ -28,6 +28,7 @@ additional_services: ...@@ -28,6 +28,7 @@ additional_services:
- blutgang - blutgang
- apache - apache
- tracoor - tracoor
- spamoor
ethereum_metrics_exporter_enabled: true ethereum_metrics_exporter_enabled: true
snooper_enabled: true snooper_enabled: true
keymanager_enabled: true keymanager_enabled: true
......
...@@ -28,6 +28,7 @@ additional_services: ...@@ -28,6 +28,7 @@ additional_services:
- blutgang - blutgang
- apache - apache
- tracoor - tracoor
- spamoor
ethereum_metrics_exporter_enabled: true ethereum_metrics_exporter_enabled: true
snooper_enabled: true snooper_enabled: true
keymanager_enabled: true keymanager_enabled: true
...@@ -927,6 +927,27 @@ checkpoint_sync_enabled: false ...@@ -927,6 +927,27 @@ checkpoint_sync_enabled: false
# Global flag to set checkpoint sync url # Global flag to set checkpoint sync url
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 # Global paarameter to set the exit ip address of services and public ports
port_publisher: port_publisher:
# if you have a service that you want to expose on a specific interfact; set that IP here # 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 ...@@ -1166,6 +1187,7 @@ Here's a table of where the keys are used
| 8 | assertoor | ✅ | ✅ | As the funding for tests | | 8 | assertoor | ✅ | ✅ | As the funding for tests |
| 11 | mev_custom_flood | ✅ | | As the sender of balance | | 11 | mev_custom_flood | ✅ | | As the sender of balance |
| 12 | l2_contracts | ✅ | | Contract deployer address | | 12 | l2_contracts | ✅ | | Contract deployer address |
| 13 | spamoor | ✅ | | Spams transactions |
## Developing On This Package ## Developing On This Package
......
...@@ -61,6 +61,7 @@ assertoor = import_module("./src/assertoor/assertoor_launcher.star") ...@@ -61,6 +61,7 @@ assertoor = import_module("./src/assertoor/assertoor_launcher.star")
get_prefunded_accounts = import_module( get_prefunded_accounts = import_module(
"./src/prefunded_accounts/get_prefunded_accounts.star" "./src/prefunded_accounts/get_prefunded_accounts.star"
) )
spamoor = import_module("./src/spamoor/spamoor.star")
GRAFANA_USER = "admin" GRAFANA_USER = "admin"
GRAFANA_PASSWORD = "admin" GRAFANA_PASSWORD = "admin"
...@@ -686,6 +687,15 @@ def run(plan, args={}): ...@@ -686,6 +687,15 @@ def run(plan, args={}):
global_node_selectors, global_node_selectors,
args_with_right_defaults.docker_cache_params, 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: else:
fail("Invalid additional service %s" % (additional_service)) fail("Invalid additional service %s" % (additional_service))
if launch_prometheus_grafana: if launch_prometheus_grafana:
......
...@@ -86,6 +86,7 @@ ATTR_TO_BE_SKIPPED_AT_ROOT = ( ...@@ -86,6 +86,7 @@ ATTR_TO_BE_SKIPPED_AT_ROOT = (
"custom_flood_params", "custom_flood_params",
"xatu_sentry_params", "xatu_sentry_params",
"port_publisher", "port_publisher",
"spamoor_params",
) )
...@@ -119,6 +120,7 @@ def input_parser(plan, input_args): ...@@ -119,6 +120,7 @@ def input_parser(plan, input_args):
result["global_tolerations"] = [] result["global_tolerations"] = []
result["global_node_selectors"] = {} result["global_node_selectors"] = {}
result["port_publisher"] = get_port_publisher_params("default") 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"]: if constants.NETWORK_NAME.shadowfork in result["network_params"]["network"]:
shadow_base = result["network_params"]["network"].split("-shadowfork")[0] shadow_base = result["network_params"]["network"].split("-shadowfork")[0]
...@@ -184,6 +186,10 @@ def input_parser(plan, input_args): ...@@ -184,6 +186,10 @@ def input_parser(plan, input_args):
result["xatu_sentry_params"][sub_attr] = sub_value result["xatu_sentry_params"][sub_attr] = sub_value
elif attr == "port_publisher": elif attr == "port_publisher":
result["port_publisher"] = get_port_publisher_params("user", input_args) 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"): if result.get("disable_peer_scoring"):
result = enrich_disable_peer_scoring(result) result = enrich_disable_peer_scoring(result)
...@@ -430,6 +436,14 @@ def input_parser(plan, input_args): ...@@ -430,6 +436,14 @@ def input_parser(plan, input_args):
"interval_between_transactions" "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"], additional_services=result["additional_services"],
wait_for_finalization=result["wait_for_finalization"], wait_for_finalization=result["wait_for_finalization"],
global_log_level=result["global_log_level"], global_log_level=result["global_log_level"],
...@@ -844,6 +858,7 @@ def default_input_args(input_args): ...@@ -844,6 +858,7 @@ def default_input_args(input_args):
"nat_exit_ip": constants.PRIVATE_IP_ADDRESS_PLACEHOLDER, "nat_exit_ip": constants.PRIVATE_IP_ADDRESS_PLACEHOLDER,
"public_port_start": None, "public_port_start": None,
}, },
"spamoor_params": get_default_spamoor_params(),
} }
...@@ -1151,6 +1166,17 @@ def get_default_xatu_sentry_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(): def get_default_custom_flood_params():
# this is a simple script that increases the balance of the coinbase address at a cadence # this is a simple script that increases the balance of the coinbase address at a cadence
return {"interval_between_transactions": 1} return {"interval_between_transactions": 1}
...@@ -1346,6 +1372,7 @@ def docker_cache_image_override(plan, result): ...@@ -1346,6 +1372,7 @@ def docker_cache_image_override(plan, result):
"goomy_blob_params.image", "goomy_blob_params.image",
"prometheus_params.image", "prometheus_params.image",
"grafana_params.image", "grafana_params.image",
"spamoor_params.image",
] ]
if result["docker_cache_params"]["url"] == "": if result["docker_cache_params"]["url"] == "":
......
...@@ -244,6 +244,14 @@ SUBCATEGORY_PARAMS = { ...@@ -244,6 +244,14 @@ SUBCATEGORY_PARAMS = {
"xatu_server_headers", "xatu_server_headers",
"beacon_subscriptions", "beacon_subscriptions",
], ],
"spamoor_params": [
"image",
"tx_type",
"throughput",
"max_pending",
"max_wallets",
"spamoor_extra_args",
],
"port_publisher": [ "port_publisher": [
"nat_exit_ip", "nat_exit_ip",
"el", "el",
...@@ -273,6 +281,7 @@ ADDITIONAL_SERVICES_PARAMS = [ ...@@ -273,6 +281,7 @@ ADDITIONAL_SERVICES_PARAMS = [
"forky", "forky",
"apache", "apache",
"tracoor", "tracoor",
"spamoor",
] ]
ADDITIONAL_CATEGORY_PARAMS = { ADDITIONAL_CATEGORY_PARAMS = {
......
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,
)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment