Commit 76dde3ed authored by pk910's avatar pk910 Committed by GitHub

feat: add assertoor to additional toolings (#419)

Added assertoor testnet testing tool.

There are currently 6 tests included:
* Check for chain stability (finalizing, high voting consensus, no
reorgs)
* Check if all clients propose a block
* Validator Lifecycle Test
Test for the whole validator lifecycle, includes Deposits, BLSChanges,
Exits & Slashings
This Test takes up to 2 days to run through due to deposit delays &
queues.
* Normal Transaction Test
Test if normal EOA transactions (type 0/2) are processed by all client
pairs (inclusion & submission)
* Blob Transaction Test
Test if blob transactions (type 3) are processed by all client pairs
(inclusion & submission)
* All-Opcodes Transaction Test
  Generates & submits a transaction that triggers every EVM opcode once.
  Checks if the transaction succeeds and no client forks off

---------
Co-authored-by: default avatarBarnabas Busa <busa.barnabas@gmail.com>
parent e61c58a8
participants:
- el_client_type: geth
cl_client_type: lighthouse
count: 1
- el_client_type: geth
cl_client_type: lodestar
count: 1
additional_services:
- assertoor
...@@ -33,6 +33,7 @@ jobs: ...@@ -33,6 +33,7 @@ jobs:
"./.github/tests/mev-mock.yaml", "./.github/tests/mev-mock.yaml",
"./.github/tests/mix-with-tools.yaml", "./.github/tests/mix-with-tools.yaml",
"./.github/tests/mix-persistence.yaml", "./.github/tests/mix-persistence.yaml",
"./.github/tests/assertoor.yaml",
"./network_params.yaml" "./network_params.yaml"
] ]
runs-on: ubuntu-latest runs-on: ubuntu-latest
......
...@@ -314,6 +314,62 @@ goomy_blob_params: ...@@ -314,6 +314,62 @@ goomy_blob_params:
# A list of optional params that will be passed to the blob-spammer comamnd for modifying its behaviour # A list of optional params that will be passed to the blob-spammer comamnd for modifying its behaviour
goomy_blob_args: [] goomy_blob_args: []
# Configuration place for the assertoor testing tool - https:#github.com/ethpandaops/assertoor
assertoor_params:
# Check chain stability
# This check monitors the chain and succeeds if:
# - all clients are synced
# - chain is finalizing for min. 2 epochs
# - >= 98% correct target votes
# - >= 80% correct head votes
# - no reorgs with distance > 2 blocks
# - no more than 2 reorgs per epoch
run_stability_check: true
# Check block propöosals
# This check monitors the chain and succeeds if:
# - all client pairs have proposed a block
run_block_proposal_check: true
# Run normal transaction test
# This test generates random EOA transactions and checks inclusion with/from all client pairs
# This test checks for:
# - block proposals with transactions from all client pairs
# - transaction inclusion when submitting via each client pair
# test is done twice, first with legacy (type 0) transactions, then with dynfee (type 2) transactions
run_transaction_test: false
# Run blob transaction test
# This test generates blob transactions and checks inclusion with/from all client pairs
# This test checks for:
# - block proposals with blobs from all client pairs
# - blob inclusion when submitting via each client pair
run_blob_transaction_test: false
# Run all-opcodes transaction test
# This test generates a transaction that triggers all EVM OPCODES once
# This test checks for:
# - all-opcodes transaction success
run_opcodes_transaction_test: false
# Run validator lifecycle test (~48h to complete)
# This test requires exactly 500 active validator keys.
# The test will cause a temporary chain unfinality when running.
# This test checks:
# - Deposit inclusion with/from all client pairs
# - BLS Change inclusion with/from all client pairs
# - Voluntary Exit inclusion with/from all client pairs
# - Attester Slashing inclusion with/from all client pairs
# - Proposer Slashing inclusion with/from all client pairs
# all checks are done during finality & unfinality
run_lifecycle_test: false
# Run additional tests from external test definitions
# eg:
# - https://raw.githubusercontent.com/ethpandaops/assertoor/master/example/tests/block-proposal-check.yaml
tests: []
# By default includes # By default includes
# - A transaction spammer & blob spammer is launched to fake transactions sent to the network # - A transaction spammer & blob spammer is launched to fake transactions sent to the network
# - Forkmon for EL will be launched # - Forkmon for EL will be launched
...@@ -322,6 +378,7 @@ goomy_blob_params: ...@@ -322,6 +378,7 @@ goomy_blob_params:
# - A light beacon chain explorer will be launched # - A light beacon chain explorer will be launched
# - Default: ["tx_spammer", "blob_spammer", "el_forkmon", "beacon_metrics_gazer", "dora"," "prometheus_grafana"] # - Default: ["tx_spammer", "blob_spammer", "el_forkmon", "beacon_metrics_gazer", "dora"," "prometheus_grafana"]
additional_services: additional_services:
- assertoor
- broadcaster - broadcaster
- tx_spammer - tx_spammer
- blob_spammer - blob_spammer
...@@ -607,6 +664,7 @@ Here's a table of where the keys are used ...@@ -607,6 +664,7 @@ Here's a table of where the keys are used
| 5 | eip4788_deployment | ✅ | | As contract deployer | | 5 | eip4788_deployment | ✅ | | As contract deployer |
| 6 | mev_flood | ✅ | | As the contract owner | | 6 | mev_flood | ✅ | | As the contract owner |
| 7 | mev_flood | ✅ | | As the user_key | | 7 | mev_flood | ✅ | | As the user_key |
| 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 |
## Developing On This Package ## Developing On This Package
......
...@@ -38,6 +38,7 @@ eip4788_deployment = import_module( ...@@ -38,6 +38,7 @@ eip4788_deployment = import_module(
"./src/eip4788_deployment/eip4788_deployment_launcher.star" "./src/eip4788_deployment/eip4788_deployment_launcher.star"
) )
broadcaster = import_module("./src/broadcaster/broadcaster.star") broadcaster = import_module("./src/broadcaster/broadcaster.star")
assertoor = import_module("./src/assertoor/assertoor_launcher.star")
GRAFANA_USER = "admin" GRAFANA_USER = "admin"
GRAFANA_PASSWORD = "admin" GRAFANA_PASSWORD = "admin"
...@@ -371,6 +372,20 @@ def run(plan, args={}): ...@@ -371,6 +372,20 @@ def run(plan, args={}):
elif additional_service == "prometheus_grafana": elif additional_service == "prometheus_grafana":
# Allow prometheus to be launched last so is able to collect metrics from other services # Allow prometheus to be launched last so is able to collect metrics from other services
launch_prometheus_grafana = True launch_prometheus_grafana = True
elif additional_service == "assertoor":
plan.print("Launching assertoor")
assertoor_config_template = read_file(
static_files.ASSERTOOR_CONFIG_TEMPLATE_FILEPATH
)
assertoor_params = args_with_right_defaults.assertoor_params
assertoor.launch_assertoor(
plan,
assertoor_config_template,
all_participants,
args_with_right_defaults.participants,
assertoor_params,
)
plan.print("Successfully launched assertoor")
elif additional_service == "custom_flood": elif additional_service == "custom_flood":
mev_custom_flood.spam_in_background( mev_custom_flood.spam_in_background(
plan, plan,
......
shared_utils = import_module("../shared_utils/shared_utils.star")
static_files = import_module("../static_files/static_files.star")
constants = import_module("../package_io/constants.star")
SERVICE_NAME = "assertoor"
HTTP_PORT_ID = "http"
HTTP_PORT_NUMBER = 8080
ASSERTOOR_CONFIG_FILENAME = "assertoor-config.yaml"
ASSERTOOR_CONFIG_MOUNT_DIRPATH_ON_SERVICE = "/config"
ASSERTOOR_TESTS_MOUNT_DIRPATH_ON_SERVICE = "/tests"
VALIDATOR_RANGES_MOUNT_DIRPATH_ON_SERVICE = "/validator-ranges"
VALIDATOR_RANGES_ARTIFACT_NAME = "validator-ranges"
# The min/max CPU/memory that assertoor can use
MIN_CPU = 100
MAX_CPU = 1000
MIN_MEMORY = 128
MAX_MEMORY = 2048
USED_PORTS = {
HTTP_PORT_ID: shared_utils.new_port_spec(
HTTP_PORT_NUMBER,
shared_utils.TCP_PROTOCOL,
shared_utils.HTTP_APPLICATION_PROTOCOL,
)
}
def launch_assertoor(
plan,
config_template,
participant_contexts,
participant_configs,
assertoor_params,
):
all_client_info = []
validator_client_info = []
for index, participant in enumerate(participant_contexts):
participant_config = participant_configs[index]
cl_client = participant.cl_client_context
el_client = participant.el_client_context
all_client_info.append(
new_client_info(
cl_client.ip_addr,
cl_client.http_port_num,
el_client.ip_addr,
el_client.rpc_port_num,
cl_client.beacon_service_name,
)
)
if participant_config.validator_count != 0:
validator_client_info.append(
new_client_info(
cl_client.ip_addr,
cl_client.http_port_num,
el_client.ip_addr,
el_client.rpc_port_num,
cl_client.beacon_service_name,
)
)
template_data = new_config_template_data(
HTTP_PORT_NUMBER, all_client_info, validator_client_info, assertoor_params
)
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[
ASSERTOOR_CONFIG_FILENAME
] = template_and_data
config_files_artifact_name = plan.render_templates(
template_and_data_by_rel_dest_filepath, "assertoor-config"
)
tests_config_artifacts_name = plan.upload_files(
static_files.ASSERTOOR_TESTS_CONFIG_DIRPATH, name="assertoor-tests"
)
config = get_config(
config_files_artifact_name,
tests_config_artifacts_name,
)
plan.add_service(SERVICE_NAME, config)
def get_config(config_files_artifact_name, tests_config_artifacts_name):
config_file_path = shared_utils.path_join(
ASSERTOOR_CONFIG_MOUNT_DIRPATH_ON_SERVICE,
ASSERTOOR_CONFIG_FILENAME,
)
IMAGE_NAME = "ethpandaops/assertoor:master"
return ServiceConfig(
image=IMAGE_NAME,
ports=USED_PORTS,
files={
ASSERTOOR_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name,
ASSERTOOR_TESTS_MOUNT_DIRPATH_ON_SERVICE: tests_config_artifacts_name,
VALIDATOR_RANGES_MOUNT_DIRPATH_ON_SERVICE: VALIDATOR_RANGES_ARTIFACT_NAME,
},
cmd=["--config", config_file_path],
min_cpu=MIN_CPU,
max_cpu=MAX_CPU,
min_memory=MIN_MEMORY,
max_memory=MAX_MEMORY,
)
def new_config_template_data(
listen_port_num, client_info, validator_client_info, assertoor_params
):
return {
"ListenPortNum": listen_port_num,
"ClientInfo": client_info,
"ValidatorClientInfo": validator_client_info,
"RunStabilityCheck": assertoor_params.run_stability_check,
"RunBlockProposalCheck": assertoor_params.run_block_proposal_check,
"RunLifecycleTest": assertoor_params.run_lifecycle_test,
"RunTransactionTest": assertoor_params.run_transaction_test,
"RunBlobTransactionTest": assertoor_params.run_blob_transaction_test,
"RunOpcodesTransactionTest": assertoor_params.run_opcodes_transaction_test,
"AdditionalTests": assertoor_params.tests,
}
def new_client_info(cl_ip_addr, cl_port_num, el_ip_addr, el_port_num, service_name):
return {
"CLIPAddr": cl_ip_addr,
"CLPortNum": cl_port_num,
"ELIPAddr": el_ip_addr,
"ELPortNum": el_port_num,
"Name": service_name,
}
...@@ -52,6 +52,7 @@ ATTR_TO_BE_SKIPPED_AT_ROOT = ( ...@@ -52,6 +52,7 @@ ATTR_TO_BE_SKIPPED_AT_ROOT = (
"network_params", "network_params",
"participants", "participants",
"mev_params", "mev_params",
"assertoor_params",
"goomy_blob_params", "goomy_blob_params",
"tx_spammer_params", "tx_spammer_params",
"custom_flood_params", "custom_flood_params",
...@@ -72,6 +73,8 @@ def input_parser(plan, input_args): ...@@ -72,6 +73,8 @@ def input_parser(plan, input_args):
result["tx_spammer_params"] = get_default_tx_spammer_params() result["tx_spammer_params"] = get_default_tx_spammer_params()
result["custom_flood_params"] = get_default_custom_flood_params() result["custom_flood_params"] = get_default_custom_flood_params()
result["disable_peer_scoring"] = False result["disable_peer_scoring"] = False
result["goomy_blob_params"] = get_default_goomy_blob_params()
result["assertoor_params"] = get_default_assertoor_params()
result["persistent"] = False result["persistent"] = False
for attr in input_args: for attr in input_args:
...@@ -92,6 +95,14 @@ def input_parser(plan, input_args): ...@@ -92,6 +95,14 @@ def input_parser(plan, input_args):
for sub_attr in input_args["custom_flood_params"]: for sub_attr in input_args["custom_flood_params"]:
sub_value = input_args["custom_flood_params"][sub_attr] sub_value = input_args["custom_flood_params"][sub_attr]
result["custom_flood_params"][sub_attr] = sub_value result["custom_flood_params"][sub_attr] = sub_value
elif attr == "goomy_blob_params":
for sub_attr in input_args["goomy_blob_params"]:
sub_value = input_args["goomy_blob_params"][sub_attr]
result["goomy_blob_params"][sub_attr] = sub_value
elif attr == "assertoor_params":
for sub_attr in input_args["assertoor_params"]:
sub_value = input_args["assertoor_params"][sub_attr]
result["assertoor_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)
...@@ -116,7 +127,6 @@ def input_parser(plan, input_args): ...@@ -116,7 +127,6 @@ def input_parser(plan, input_args):
) )
) )
result["goomy_blob_params"] = get_default_goomy_blob_params()
return struct( return struct(
participants=[ participants=[
struct( struct(
...@@ -213,6 +223,21 @@ def input_parser(plan, input_args): ...@@ -213,6 +223,21 @@ def input_parser(plan, input_args):
goomy_blob_params=struct( goomy_blob_params=struct(
goomy_blob_args=result["goomy_blob_params"]["goomy_blob_args"], goomy_blob_args=result["goomy_blob_params"]["goomy_blob_args"],
), ),
assertoor_params=struct(
run_stability_check=result["assertoor_params"]["run_stability_check"],
run_block_proposal_check=result["assertoor_params"][
"run_block_proposal_check"
],
run_lifecycle_test=result["assertoor_params"]["run_lifecycle_test"],
run_transaction_test=result["assertoor_params"]["run_transaction_test"],
run_blob_transaction_test=result["assertoor_params"][
"run_blob_transaction_test"
],
run_opcodes_transaction_test=result["assertoor_params"][
"run_opcodes_transaction_test"
],
tests=result["assertoor_params"]["tests"],
),
custom_flood_params=struct( custom_flood_params=struct(
interval_between_transactions=result["custom_flood_params"][ interval_between_transactions=result["custom_flood_params"][
"interval_between_transactions" "interval_between_transactions"
...@@ -514,6 +539,18 @@ def get_default_goomy_blob_params(): ...@@ -514,6 +539,18 @@ def get_default_goomy_blob_params():
return {"goomy_blob_args": []} return {"goomy_blob_args": []}
def get_default_assertoor_params():
return {
"run_stability_check": True,
"run_block_proposal_check": True,
"run_lifecycle_test": False,
"run_transaction_test": False,
"run_blob_transaction_test": False,
"run_opcodes_transaction_test": False,
"tests": [],
}
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}
......
...@@ -22,6 +22,15 @@ FULL_BEACONCHAIN_CONFIG_TEMPLATE_FILEPATH = ( ...@@ -22,6 +22,15 @@ FULL_BEACONCHAIN_CONFIG_TEMPLATE_FILEPATH = (
STATIC_FILES_DIRPATH + "/full-beaconchain-config/config.yaml.tmpl" STATIC_FILES_DIRPATH + "/full-beaconchain-config/config.yaml.tmpl"
) )
# assertoor config
ASSERTOOR_CONFIG_DIRPATH = "/assertoor-config"
ASSERTOOR_CONFIG_TEMPLATE_FILEPATH = (
STATIC_FILES_DIRPATH + ASSERTOOR_CONFIG_DIRPATH + "/config.yaml.tmpl"
)
ASSERTOOR_TESTS_CONFIG_DIRPATH = (
STATIC_FILES_DIRPATH + ASSERTOOR_CONFIG_DIRPATH + "/tests"
)
# Grafana config # Grafana config
GRAFANA_CONFIG_DIRPATH = "/grafana-config" GRAFANA_CONFIG_DIRPATH = "/grafana-config"
GRAFANA_DATASOURCE_CONFIG_TEMPLATE_FILEPATH = ( GRAFANA_DATASOURCE_CONFIG_TEMPLATE_FILEPATH = (
......
endpoints:
{{ range $client := .ClientInfo }}
- name: "{{ $client.Name }}"
consensusUrl: "http://{{ $client.CLIPAddr }}:{{ $client.CLPortNum }}"
executionUrl: "http://{{ $client.ELIPAddr }}:{{ $client.ELPortNum }}"
{{- end }}
web:
server:
host: "0.0.0.0"
port: 8080
frontend:
enabled: true
debug: true
pprof: true
validatorNames:
inventoryYaml: "/validator-ranges/validator-ranges.yaml"
globalVars:
walletPrivkey: "850643a0224065ecce3882673c21f56bcf6eef86274cc21cadff15930b59fc8c"
clientPairNames:
{{ range $client := .ClientInfo }}
- "{{ $client.Name }}"
{{- end }}
validatorPairNames:
{{ range $client := .ValidatorClientInfo }}
- "{{ $client.Name }}"
{{- end }}
externalTests:
{{ if .RunStabilityCheck }}
- file: /tests/stability-check.yaml
{{ end }}
{{ if .RunBlockProposalCheck }}
- file: /tests/block-proposal-check.yaml
{{ end }}
{{ if .RunTransactionTest }}
- file: /tests/eoa-transactions-test.yaml
{{ end }}
{{ if .RunBlobTransactionTest }}
- file: /tests/blob-transactions-test.yaml
{{ end }}
{{ if .RunOpcodesTransactionTest }}
- file: /tests/all-opcodes-transaction-test.yaml
{{ end }}
{{ if .RunLifecycleTest }}
- file: /tests/validator-lifecycle-test.yaml
{{ end }}
{{ range $test := .AdditionalTests }}
- file: "{{ $test }}"
{{- end }}
name: "All-Opcodes Transaction Test"
timeout: 1h
config:
#walletPrivkey: ""
tasks:
- name: check_clients_are_healthy
title: "Check if at least one client is ready"
timeout: 5m
config:
minClientCount: 1
- name: generate_transaction
title: "Generate all-opcodes test transaction"
config:
feeCap: 5000000000 # 5 gwei
gasLimit: 1000000
contractDeployment: true
callData: "602a61053901600052600160206000a1602a61053902600052600260206000a1602a61053903600052600360206000a1602a61053904600052600460206000a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd661053905600052600560206000a1602a61053906600052600660206000a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd661053907600052600760206000a1610400602a61053908600052600860206000a1610400602a61053909600052600960206000a1602a6105390a600052600a60206000a1602a6105390b600052600b60206000a1602a61053910600052601060206000a1602a61053911600052601160206000a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd661053912600052601260206000a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd661053913600052601360206000a1602a61053914600052601460206000a161053915600052601560206000a1602a61053916600052601660206000a1602a61053917600052601760206000a1602a61053918600052601860206000a161053919600052601960206000a1602a6105391a600052601a60206000a1602a6105391b600052601b60206000a1602a6105391c600052601c60206000a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6105391d600052601d60206000a16105396000526020600020600052602060206000a130600052603060206000a13031600052603160206000a132600052603260206000a133600052603360206000a134600052603460206000a1600035600052603560206000a136600052603660206000a160146002600137603760206000a138600052603860206000a160146002600139603960206000a13a600052603a60206000a1303b600052603b60206000a1601460026001303c603c60206000a1686000388082803990f360b81b600052600960006000f0808060005260f060206000a167100000000000000060005260205f5f5f5f855af13d600052603d60206000a13d600060003e603e60206000a13f600052603f60206000a16001430340600052604060206000a141600052604160206000a142600052604260206000a143600052604360206000a144600052604460206000a145600052604560206000a146600052604660206000a147600052604760206000a148600052604860206000a1610539600150600052605060206000a1600151600052605160206000a1610539600052605260206000a1610539600053605360206000a1610539600155605560206000a1600154600052605460206000a16642424242424242600052600f5801566710000000000000006000525b605660206000a1602a61053911600f5801576710000000000000006000525b605760206000a158600052605860206000a159600052605960206000a15a600052605a60206000a16001600052606060206000a1610102600052606160206000a162010203600052606260206000a16301020304600052606360206000a1640102030405600052606460206000a165010203040506600052606560206000a16601020304050607600052606660206000a1670102030405060708600052606760206000a168010203040506070809600052606860206000a16901020304050607080910600052606960206000a16a0102030405060708091011600052606a60206000a16b010203040506070809101112600052606b60206000a16c01020304050607080910111213600052606c60206000a16d0102030405060708091011121314600052606d60206000a16e010203040506070809101112131415600052606e60206000a16f01020304050607080910111213141516600052606f60206000a1700102030405060708091011121314151617600052607060206000a171010203040506070809101112131415161718600052607160206000a17201020304050607080910111213141516171819600052607260206000a1730102030405060708091011121314151617181920600052607360206000a174010203040506070809101112131415161718192021600052607460206000a17501020304050607080910111213141516171819202122600052607560206000a1760102030405060708091011121314151617181920212223600052607660206000a177010203040506070809101112131415161718192021222324600052607760206000a17801020304050607080910111213141516171819202122232425600052607860206000a1790102030405060708091011121314151617181920212223242526600052607960206000a17a010203040506070809101112131415161718192021222324252627600052607a60206000a17b01020304050607080910111213141516171819202122232425262728600052607b60206000a17c0102030405060708091011121314151617181920212223242526272829600052607c60206000a17d010203040506070809101112131415161718192021222324252627282930600052607d60206000a17e01020304050607080910111213141516171819202122232425262728293031600052607e60206000a17f0102030405060708091011121314151617181920212223242526272829303132600052607f60206000a1600060116022603360446055606660776088609960aa60bb60cc60dd60ee60ff80600052608060206000a181600052608160206000a182600052608260206000a183600052608360206000a184600052608460206000a185600052608560206000a186600052608660206000a187600052608760206000a188600052608860206000a189600052608960206000a18a600052608a60206000a18b600052608b60206000a18c600052608c60206000a18d600052608d60206000a18e600052608e60206000a18f600052608f60206000a1604290600052609060206000a1604291600052609160206000a1604292600052609260206000a1604293600052609360206000a1604294600052609460206000a1604295600052609560206000a1604296600052609660206000a1604297600052609760206000a1604298600052609860206000a1604299600052609960206000a160429a600052609a60206000a160429b600052609b60206000a160429c600052609c60206000a160429d600052609d60206000a160429e600052609e60206000a160429f600052609f60206000a161133760005260206000a060a160206000a1601160a260206000a26022601160a360206000a360336022601160a460206000a4686000388082803990f360b81b600052600960006000f08060005260f060206000a160205f5f5f5f85612710f160005260f160206000a160205f5f5f5f85612710f260005260f260206000a160205f5f5f845af460005260f460206000a1686000388082803990f360b81b6000526000600960006000f58060005260f560206000a160205f5f5f84612710fa60005260fa60206000a16000388082803990f3"
failOnReject: true
expectEvents:
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000001", data: "0x0000000000000000000000000000000000000000000000000000000000000563" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000002", data: "0x000000000000000000000000000000000000000000000000000000000000db5a" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000003", data: "0x000000000000000000000000000000000000000000000000000000000000050f" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000004", data: "0x000000000000000000000000000000000000000000000000000000000000001f" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000005", data: "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000006", data: "0x0000000000000000000000000000000000000000000000000000000000000023" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000007", data: "0x0000000000000000000000000000000000000000000000000000000000000023" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000008", data: "0x0000000000000000000000000000000000000000000000000000000000000163" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000009", data: "0x000000000000000000000000000000000000000000000000000000000000035a" }
- { topic0: "0x000000000000000000000000000000000000000000000000000000000000000a", data: "0x22216e0e1bc703e8543d93e59e8f927277d1501d039f87b7aeb01fd538f0ee71" }
- { topic0: "0x000000000000000000000000000000000000000000000000000000000000000b", data: "0x000000000000000000000000000000000000000000000000000000000000002a" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000010", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000011", data: "0x0000000000000000000000000000000000000000000000000000000000000001" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000012", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000013", data: "0x0000000000000000000000000000000000000000000000000000000000000001" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000014", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000015", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000016", data: "0x0000000000000000000000000000000000000000000000000000000000000028" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000017", data: "0x000000000000000000000000000000000000000000000000000000000000053b" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000018", data: "0x0000000000000000000000000000000000000000000000000000000000000513" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000019", data: "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac6" }
- { topic0: "0x000000000000000000000000000000000000000000000000000000000000001a", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x000000000000000000000000000000000000000000000000000000000000001b", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x000000000000000000000000000000000000000000000000000000000000001c", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x000000000000000000000000000000000000000000000000000000000000001d", data: "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000020", data: "0x64525377d0e4fdc0b5cb83d111f37debd7efc1f40a572ff8a92bbeeb587a5603" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000031", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000034", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000035", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000036", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000037", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000038", data: "0x0000000000000000000000000000000000000000000000000000000000000a38" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000039", data: "0x0061053901600052600160206000a1602a610539020000000000000000000a38" }
- { topic0: "0x000000000000000000000000000000000000000000000000000000000000003b", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x000000000000000000000000000000000000000000000000000000000000003c", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x000000000000000000000000000000000000000000000000000000000000003d", data: "0x0000000000000000000000000000000000000000000000000000000000000009" }
- { topic0: "0x000000000000000000000000000000000000000000000000000000000000003e", data: "0x6000388082803990f30000000000000000000000000000000000000000000009" }
- { topic0: "0x000000000000000000000000000000000000000000000000000000000000003f", data: "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000047", data: "0x0000000000000000000000000000000000000000000000000000000000000000" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000050", data: "0x0000000000000000000000000000000000000000000000000000000000000539" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000051", data: "0x0000000000000000000000000000000000000000000000000000000000053900" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000052", data: "0x0000000000000000000000000000000000000000000000000000000000000539" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000053", data: "0x3900000000000000000000000000000000000000000000000000000000000539" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000054", data: "0x0000000000000000000000000000000000000000000000000000000000000539" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000055", data: "0x3900000000000000000000000000000000000000000000000000000000000539" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000056", data: "0x0000000000000000000000000000000000000000000000000042424242424242" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000057", data: "0x0000000000000000000000000000000000000000000000000042424242424242" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000058", data: "0x0000000000000000000000000000000000000000000000000000000000000435" }
- { topic0: "0x0000000000000000000000000000000000000000000000000000000000000059", data: "0x0000000000000000000000000000000000000000000000000000000000000040" }
configVars:
privateKey: "walletPrivkey"
- name: run_tasks_concurrent
title: "Check chain stability"
timeout: 1h
config:
tasks:
- name: check_consensus_reorgs
title: "Check consensus reorgs"
config:
maxReorgsPerEpoch: 2
minCheckEpochCount: 1
- name: check_consensus_forks
title: "Check consensus forks"
config:
minCheckEpochCount: 1
\ No newline at end of file
name: "Blob Transaction Test"
timeout: 1h
config:
#walletPrivkey: ""
#validatorPairNames: []
#clientPairNames: []
tasks:
- name: check_clients_are_healthy
title: "Check if at least one client is ready"
timeout: 5m
config:
minClientCount: 1
# check if all client pairs propose blocks with blob transactions
- name: run_tasks_concurrent
title: "Check if all clients propose blocks with blob transactions"
config:
succeedTaskCount: 1
tasks:
- name: generate_blob_transactions
title: "Generate 2 blob transactions per block"
config:
childWallets: 5
limitPending: 2
limitPerBlock: 2
randomTarget: true
amount: 1000000
randomAmount: true
blobSidecars: 1
configVars:
privateKey: "walletPrivkey"
- name: run_task_matrix
title: "Check transaction inclusion with all client pairs"
timeout: 1h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with >= 2 blobs from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minBlobCount: 2
- name: "sleep"
title: "Wait 30sec to clear up pending transactions"
config:
duration: 30s
# check if blob transactions can be sent via each client pair
- name: run_task_matrix
title: "Check if blob transactions can be sent via each client pair"
configVars:
matrixValues: "clientPairNames"
config:
runConcurrent: false
matrixVar: "clientPairName"
task:
name: run_tasks
title: "Check if blob transactions can be sent via ${clientPairName}"
config:
tasks:
- name: run_tasks_concurrent
title: "Check if blob transactions can be sent via ${clientPairName}"
config:
succeedTaskCount: 1
tasks:
- name: generate_blob_transactions
title: "Generate 2 blob transactions per block and send via ${clientPairName}"
config:
childWallets: 5
limitPending: 2
limitPerBlock: 2
randomTarget: true
amount: 1000000
randomAmount: true
blobSidecars: 1
configVars:
privateKey: "walletPrivkey"
clientPattern: "clientPairName"
- name: check_consensus_block_proposals
title: "Wait for block proposal with >= 2 blobs"
config:
minBlobCount: 2
- name: "sleep"
title: "Wait 30sec to clear up pending transactions"
config:
duration: 30s
\ No newline at end of file
name: "Every client pair proposed a block"
timeout: 2h
disable: false
config:
#validatorPairNames: []
tasks:
- name: check_clients_are_healthy
title: "Check if at least one client is ready"
timeout: 5m
config:
minClientCount: 1
- name: run_task_matrix
title: "Check block proposals from all client pairs"
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
name: "Transaction Test"
timeout: 1h
config:
#walletPrivkey: ""
#validatorPairNames: []
#clientPairNames: []
tasks:
- name: check_clients_are_healthy
title: "Check if at least one client is ready"
timeout: 5m
config:
minClientCount: 1
# check if all client pairs propose blocks with legacy EOA transactions
- name: run_tasks_concurrent
title: "Check if all clients propose blocks with legacy EOA transactions"
config:
succeedTaskCount: 1
tasks:
- name: generate_eoa_transactions
title: "Generate 10 EOA transaction per block"
config:
childWallets: 10
limitPending: 10
limitPerBlock: 10
randomTarget: true
amount: 1000000
randomAmount: true
legacyTxType: true
configVars:
privateKey: "walletPrivkey"
- name: run_task_matrix
title: "Check transaction inclusion with all client pairs"
timeout: 1h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with >= 5 transactions from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minTransactionCount: 5
- name: "sleep"
title: "Wait 30sec to clear up pending transactions"
config:
duration: 30s
# check if legacy EOA transactions can be sent via each client pair
- name: run_task_matrix
title: "Check if legacy EOA transactions can be sent via each client pair"
configVars:
matrixValues: "clientPairNames"
config:
runConcurrent: false
matrixVar: "clientPairName"
task:
name: run_tasks
title: "Check if legacy EOA transactions can be sent via ${clientPairName}"
config:
tasks:
- name: run_tasks_concurrent
title: "Check if legacy EOA transactions can be sent via ${clientPairName}"
config:
succeedTaskCount: 1
tasks:
- name: generate_eoa_transactions
title: "Generate 10 EOA transaction per block and send via ${clientPairName}"
config:
childWallets: 10
limitPending: 10
limitPerBlock: 10
randomTarget: true
amount: 1000000
randomAmount: true
legacyTxType: true
configVars:
privateKey: "walletPrivkey"
clientPattern: "clientPairName"
- name: check_consensus_block_proposals
title: "Wait for block proposal with >= 5 transactions"
config:
minTransactionCount: 5
- name: "sleep"
title: "Wait 30sec to clear up pending transactions"
config:
duration: 30s
# check if all client pairs propose blocks with dynfee EOA transactions
- name: run_tasks_concurrent
title: "Check if all clients propose blocks with dynfee EOA transactions"
config:
succeedTaskCount: 1
tasks:
- name: generate_eoa_transactions
title: "Generate 10 EOA transaction per block"
config:
childWallets: 10
limitPending: 10
limitPerBlock: 10
randomTarget: true
amount: 1000000
randomAmount: true
configVars:
privateKey: "walletPrivkey"
- name: run_task_matrix
title: "Check transaction inclusion with all client pairs"
timeout: 1h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with >= 5 transactions from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minTransactionCount: 5
- name: "sleep"
title: "Wait 30sec to clear up pending transactions"
config:
duration: 30s
# check if dynfee EOA transactions can be sent via each client pair
- name: run_task_matrix
title: "Check if dynfee EOA transactions can be sent via each client pair"
configVars:
matrixValues: "clientPairNames"
config:
runConcurrent: false
matrixVar: "clientPairName"
task:
name: run_tasks
title: "Check if dynfee EOA transactions can be sent via ${clientPairName}"
config:
tasks:
- name: run_tasks_concurrent
title: "Check if dynfee EOA transactions can be sent via ${clientPairName}"
config:
succeedTaskCount: 1
tasks:
- name: generate_eoa_transactions
title: "Generate 10 EOA transaction per block and send via ${clientPairName}"
config:
childWallets: 10
limitPending: 10
limitPerBlock: 10
randomTarget: true
amount: 1000000
randomAmount: true
configVars:
privateKey: "walletPrivkey"
clientPattern: "clientPairName"
- name: check_consensus_block_proposals
title: "Wait for block proposal with >= 5 transactions"
config:
minTransactionCount: 5
- name: "sleep"
title: "Wait 30sec to clear up pending transactions"
config:
duration: 30s
\ No newline at end of file
name: "Check chain stability"
timeout: 2h
tasks:
- name: check_clients_are_healthy
title: "Check if at least one client is ready"
timeout: 5m
config:
minClientCount: 1
- name: run_tasks_concurrent
title: "Check if all EL & CL clients are synced"
timeout: 30m
config:
tasks:
- name: check_consensus_sync_status
title: "Check if CL clients are synced"
- name: check_execution_sync_status
title: "Check if EL clients are synced"
- name: run_tasks_concurrent
title: "Check chain stability"
timeout: 1h
config:
tasks:
- name: check_consensus_finality
title: "Check consensus chain finality"
config:
minFinalizedEpochs: 2
maxUnfinalizedEpochs: 3
- name: check_consensus_attestation_stats
title: "Check consensus attestation stats"
config:
minTargetPercent: 98
minHeadPercent: 80
- name: check_consensus_reorgs
title: "Check consensus reorgs"
config:
maxReorgsPerEpoch: 2
minCheckEpochCount: 1
- name: check_consensus_forks
title: "Check consensus forks"
\ No newline at end of file
name: "Validator Lifecycle Test"
timeout: 72h
config:
#walletPrivkey: ""
validatorMnemonic: "trial jeans seat abstract runway cupboard please elevator club file arrow lounge crash sun thumb clock duty priority key fence funny trick diary album"
#validatorPairNames: []
tasks:
- name: check_clients_are_healthy
title: "Check if at least one client is ready"
timeout: 5m
config:
minClientCount: 1
- name: run_tasks_concurrent
title: "Generate deposits & Track inclusion"
config:
tasks:
- name: generate_deposits
title: "Generate 300 deposits"
config:
limitTotal: 300
depositContract: "0x4242424242424242424242424242424242424242"
configVars:
walletPrivkey: "walletPrivkey"
mnemonic: "validatorMnemonic"
- name: run_task_options
title: "Check deposit inclusion"
config:
ignoreFailure: true
task:
name: run_task_matrix
title: "Check deposit inclusion with all client pairs"
timeout: 48h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with deposits from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minDepositCount: 1
# due to the deposits we should reach un-finality soon.
- name: check_consensus_validator_status
title: "Wait for the last deposit to become activated"
timeout: 48h
config:
validatorPubKey: 0xa4a6121cb76eaf63e520615368a21d504c6f7363b5045f965e3587f623a6f7f1ce32af63ce3c535e75cd831db27c5abd
validatorStatus:
- active_ongoing
# due to the deposits we should have reached un-finality now.
- name: check_consensus_finality
title: "Check for consensus chain un-finality"
timeout: 1m
config:
minUnfinalizedEpochs: 5
# check if all client pairs propose blocks with bls changes during un-finality
- name: run_tasks_concurrent
title: "Check if all clients propose blocks with BLS changes during un-finality"
config:
tasks:
- name: generate_bls_changes
title: "Generate 50 BLS changes (1 bls change per slot)"
config:
limitTotal: 50
limitPerSlot: 1
indexCount: 100
targetAddress: 0x65D08a056c17Ae13370565B04cF77D2AfA1cB9FA
configVars:
mnemonic: "validatorMnemonic"
- name: run_task_matrix
title: "Check bls change inclusion with all client pairs"
timeout: 1h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with deposits from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minBlsChangeCount: 1
# check if all client pairs propose blocks with exits during un-finality
- name: run_tasks_concurrent
title: "Check if all clients propose blocks with exits during un-finality"
config:
tasks:
- name: generate_exits
title: "Generate 50 Voluntary Exits (1 exit per slot)"
config:
limitTotal: 50
limitPerSlot: 1
indexCount: 100
configVars:
mnemonic: "validatorMnemonic"
- name: run_task_matrix
title: "Check exit inclusion with all client pairs"
timeout: 1h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with deposits from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minExitCount: 1
# check if all client pairs propose blocks with attester slashings
- name: run_tasks_concurrent
title: "Check if all clients propose blocks with attester slashings during un-finality"
config:
tasks:
- name: generate_slashings
title: "Generate 1 attester slashing per slot"
config:
slashingType: "attester"
startIndex: 50
limitTotal: 50
limitPerSlot: 1
indexCount: 50
configVars:
mnemonic: "validatorMnemonic"
- name: run_task_matrix
title: "Check slashing inclusion with all client pairs"
timeout: 1h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with attester slashings from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minAttesterSlashingCount: 1
# check if all client pairs propose blocks with proposer slashings
- name: run_tasks_concurrent
title: "Check if all clients propose blocks with proposer slashings during un-finality"
config:
tasks:
- name: generate_slashings
title: "Generate 1 proposer slashing per slot"
config:
slashingType: "proposer"
startIndex: 100
limitTotal: 50
limitPerSlot: 1
indexCount: 50
configVars:
mnemonic: "validatorMnemonic"
- name: run_task_matrix
title: "Check slashing inclusion with all client pairs"
timeout: 1h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with proposer slashings from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minProposerSlashingCount: 1
# exit 150 validators and wait for finality
- name: generate_exits
title: "Exit 150 Validators"
config:
indexCount: 150
configVars:
mnemonic: "validatorMnemonic"
- name: check_consensus_finality
title: "Wait for consensus chain finality"
timeout: 18h
config:
maxUnfinalizedEpochs: 4
# check if all client pairs propose blocks with bls changes during finality
- name: run_tasks_concurrent
title: "Check if all clients propose blocks with BLS changes during finality"
config:
tasks:
- name: generate_bls_changes
title: "Generate 1 bls change per slot"
config:
startIndex: 150
limitTotal: 50
limitPerSlot: 1
indexCount: 50
targetAddress: 0x65D08a056c17Ae13370565B04cF77D2AfA1cB9FA
configVars:
mnemonic: "validatorMnemonic"
- name: run_task_matrix
title: "Check bls change inclusion with all client pairs"
timeout: 1h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with deposits from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minBlsChangeCount: 1
# check if all client pairs propose blocks with exits during finality
- name: run_tasks_concurrent
title: "Check if all clients propose blocks with exits during finality"
config:
tasks:
- name: generate_exits
title: "Generate 1 exit per slot"
config:
startIndex: 150
limitTotal: 50
limitPerSlot: 1
indexCount: 50
configVars:
mnemonic: "validatorMnemonic"
- name: run_task_matrix
title: "Check exit inclusion with all client pairs"
timeout: 1h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with deposits from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minExitCount: 1
# check if all client pairs propose blocks with attester slashings
- name: run_tasks_concurrent
title: "Check if all clients propose blocks with attester slashings during finality"
config:
tasks:
- name: generate_slashings
title: "Generate 1 attester slashing per slot"
config:
slashingType: "attester"
startIndex: 200
limitTotal: 50
limitPerSlot: 1
indexCount: 50
configVars:
mnemonic: "validatorMnemonic"
- name: run_task_matrix
title: "Check slashing inclusion with all client pairs"
timeout: 1h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with attester slashings from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minAttesterSlashingCount: 1
# check if all client pairs propose blocks with proposer slashings
- name: run_tasks_concurrent
title: "Check if all clients propose blocks with proposer slashings during finality"
config:
tasks:
- name: generate_slashings
title: "Generate 1 proposer slashing per slot"
config:
slashingType: "proposer"
startIndex: 250
limitTotal: 50
limitPerSlot: 1
indexCount: 50
configVars:
mnemonic: "validatorMnemonic"
- name: run_task_matrix
title: "Check slashing inclusion with all client pairs"
timeout: 1h
configVars:
matrixValues: "validatorPairNames"
config:
runConcurrent: true
matrixVar: "validatorPairName"
task:
name: check_consensus_block_proposals
title: "Wait for block proposal with proposer slashings from ${validatorPairName}"
configVars:
validatorNamePattern: "validatorPairName"
config:
minProposerSlashingCount: 1
cleanupTasks:
- name: generate_exits
title: "Exit all test validators"
config:
limitTotal: 300
indexCount: 300
configVars:
mnemonic: "validatorMnemonic"
\ No newline at end of file
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