From 38828fe005e49d40abe7eee20021ec487c5ac05e Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Mon, 29 Jan 2024 23:31:11 +0100 Subject: [PATCH 01/90] feat: enable shadowforking --- src/package_io/constants.star | 1 + src/participant_network.star | 81 +++++++++++++++++++ .../el_cl_genesis_generator.star | 4 + 3 files changed, 86 insertions(+) diff --git a/src/package_io/constants.star b/src/package_io/constants.star index 150e89d6d..6dfc09e8b 100644 --- a/src/package_io/constants.star +++ b/src/package_io/constants.star @@ -61,6 +61,7 @@ NETWORK_NAME = struct( ephemery="ephemery", kurtosis="kurtosis", verkle="verkle", + shadowfork="shadowfork", ) PUBLIC_NETWORKS = ( diff --git a/src/participant_network.star b/src/participant_network.star index f722732c3..749ae3d95 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -157,6 +157,7 @@ def launch_participant_network( network_params.capella_fork_epoch, network_params.deneb_fork_epoch, network_params.electra_fork_epoch, + shadowfork_file_path="", ) elif network_params.network in constants.PUBLIC_NETWORKS: # We are running a public network @@ -171,6 +172,86 @@ def launch_participant_network( final_genesis_timestamp = constants.GENESIS_TIME[network_params.network] network_id = constants.NETWORK_ID[network_params.network] validator_data = None + elif constants.NETWORK_NAME.shadowfork in network_params.network: # Shadowfork + # if not persistent: + # fail("Shadowforks are only supported with persistent storage") + # We are running a shadowfork + latest_block = plan.run_sh( + run="mkdir -p /network-configs/ && \ + curl -o latest_block.json https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/latest_block.json", + image="badouralix/curl-jq", + store=[StoreSpec(src="/network-configs/", name="latest_block")], + ) + shadowfork_file_path = "/network-configs/latest_block.json" + + for participant in participants: + if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: + geth_fetch = plan.run_sh( + run="mkdir -p /geth && \ + curl -o geth.tar.gz https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar.gz && \ + tar xvzf geth.tar.gz -C /data", + image="badouralix/curl-jq", + store=[StoreSpec(src="/data/geth/execution-data", name="geth_data")], + ) + + plan.print("Generating cl validator key stores") + validator_data = None + if not parallel_keystore_generation: + validator_data = validator_keystores.generate_validator_keystores( + plan, network_params.preregistered_validator_keys_mnemonic, participants + ) + else: + validator_data = ( + validator_keystores.generate_valdiator_keystores_in_parallel( + plan, + network_params.preregistered_validator_keys_mnemonic, + participants, + ) + ) + + plan.print(json.indent(json.encode(validator_data))) + + network_id = network_params.network_id + + # We need to send the same genesis time to both the EL and the CL to ensure that timestamp based forking works as expected + final_genesis_timestamp = get_final_genesis_timestamp( + plan, + network_params.genesis_delay + + CL_GENESIS_DATA_GENERATION_TIME + + num_participants * CL_NODE_STARTUP_TIME, + ) + + # if preregistered validator count is 0 (default) then calculate the total number of validators from the participants + total_number_of_validator_keys = network_params.preregistered_validator_count + + if network_params.preregistered_validator_count == 0: + for participant in participants: + total_number_of_validator_keys += participant.validator_count + + ethereum_genesis_generator_image = ("parithoshj/ethereum-genesis-generator:shadowfork-from-file") + el_cl_genesis_config_template = read_file( + static_files.EL_CL_GENESIS_GENERATION_CONFIG_TEMPLATE_FILEPATH + ) + el_cl_data = el_cl_genesis_data_generator.generate_el_cl_genesis_data( + plan, + ethereum_genesis_generator_image, + el_cl_genesis_config_template, + final_genesis_timestamp, + network_params.network_id, + network_params.deposit_contract_address, + network_params.seconds_per_slot, + network_params.preregistered_validator_keys_mnemonic, + total_number_of_validator_keys, + network_params.genesis_delay, + network_params.max_churn, + network_params.ejection_balance, + network_params.eth1_follow_distance, + network_params.capella_fork_epoch, + network_params.deneb_fork_epoch, + network_params.electra_fork_epoch, + shadowfork_file_path, + ) + elif network_params.network == constants.NETWORK_NAME.ephemery: el_cl_genesis_data_uuid = plan.run_sh( run="mkdir -p /network-configs/ && \ diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star index d4093c146..3fa54e80a 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star @@ -25,6 +25,7 @@ def generate_el_cl_genesis_data( capella_fork_epoch, deneb_fork_epoch, electra_fork_epoch, + shadowfork_file_path, ): template_data = new_env_file_for_el_cl_genesis_data( genesis_unix_timestamp, @@ -40,6 +41,7 @@ def generate_el_cl_genesis_data( capella_fork_epoch, deneb_fork_epoch, electra_fork_epoch, + shadowfork_file_path, ) genesis_generation_template = shared_utils.new_template_and_data( genesis_generation_config_yml_template, template_data @@ -96,6 +98,7 @@ def new_env_file_for_el_cl_genesis_data( capella_fork_epoch, deneb_fork_epoch, electra_fork_epoch, + shadowfork_file_path, ): return { "UnixTimestamp": genesis_unix_timestamp, @@ -116,4 +119,5 @@ def new_env_file_for_el_cl_genesis_data( "CapellaForkVersion": constants.CAPELLA_FORK_VERSION, "DenebForkVersion": constants.DENEB_FORK_VERSION, "ElectraForkVersion": constants.ELECTRA_FORK_VERSION, + "ShadowforkFilePath": shadowfork_file_path, } From 431c4993a2b053bee1120caf3fd7f62868886ec4 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 30 Jan 2024 10:04:47 +0100 Subject: [PATCH 02/90] fixes --- src/el/geth/geth_launcher.star | 10 +- src/package_io/constants.star | 37 ++++++ src/package_io/input_parser.star | 15 ++- src/participant_network.star | 123 ++++++------------ .../el_cl_genesis_generator.star | 19 ++- src/static_files/static_files.star | 2 + .../el-cl/values.env.tmpl | 1 + 7 files changed, 112 insertions(+), 95 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 727818f7c..0d34dd015 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -99,8 +99,9 @@ def launch( network_name = ( "devnets" - if launcher.network != "kurtosis" - and launcher.network != "ephemery" + if launcher.network != constants.NETWORK_NAME.kurtosis + and launcher.network != constants.NETWORK_NAME.ephemery + and launcher.network != constants.NETWORK_NAME.shadowfork and launcher.network not in constants.PUBLIC_NETWORKS else launcher.network ) @@ -293,7 +294,10 @@ def get_config( if "--ws.api" in arg: cmd[index] = "--ws.api=admin,engine,net,eth,web3,debug,mev,flashbots" - if network == constants.NETWORK_NAME.kurtosis: + if ( + network == constants.NETWORK_NAME.kurtosis + or constants.NETWORK_NAME.shadowfork in network + ): if len(existing_el_clients) > 0: cmd.append( "--bootnodes=" diff --git a/src/package_io/constants.star b/src/package_io/constants.star index 6dfc09e8b..11d00f433 100644 --- a/src/package_io/constants.star +++ b/src/package_io/constants.star @@ -192,6 +192,19 @@ VOLUME_SIZE = { "nimbus_volume_size": 1000, # 1GB "lodestar_volume_size": 1000, # 1GB }, + "shadowfork": { + "geth_volume_size": 5000, # 5GB + "erigon_volume_size": 3000, # 3GB + "nethermind_volume_size": 3000, # 3GB + "besu_volume_size": 3000, # 3GB + "reth_volume_size": 3000, # 3GB + "ethereumjs_volume_size": 3000, # 3GB + "prysm_volume_size": 1000, # 1GB + "lighthouse_volume_size": 1000, # 1GB + "teku_volume_size": 1000, # 1GB + "nimbus_volume_size": 1000, # 1GB + "lodestar_volume_size": 1000, # 1GB + }, } RAM_CPU_OVERRIDES = { @@ -363,4 +376,28 @@ RAM_CPU_OVERRIDES = { "lodestar_max_mem": 1024, # 1GB "lodestar_max_cpu": 1000, # 1 core }, + "shadowfork": { + "geth_max_mem": 4096, # 4GB + "geth_max_cpu": 1000, # 1 core + "erigon_max_mem": 4096, # 4GB + "erigon_max_cpu": 1000, # 1 core + "nethermind_max_mem": 4096, # 4GB + "nethermind_max_cpu": 1000, # 1 core + "besu_max_mem": 4096, # 4GB + "besu_max_cpu": 1000, # 1 core + "reth_max_mem": 4096, # 4GB + "reth_max_cpu": 1000, # 1 core + "ethereumjs_max_mem": 4096, # 4GB + "ethereumjs_max_cpu": 1000, # 1 core + "prysm_max_mem": 4096, # 4GB + "prysm_max_cpu": 1000, # 1 core + "lighthouse_max_mem": 4096, # 4GB + "lighthouse_max_cpu": 1000, # 1 core + "teku_max_mem": 4096, # 4GB + "teku_max_cpu": 1000, # 1 core + "nimbus_max_mem": 4096, # 4GB + "nimbus_max_cpu": 1000, # 1 core + "lodestar_max_mem": 4096, # 4GB + "lodestar_max_cpu": 1000, # 1 core + }, } diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index cc0cb91e0..893802cf0 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -66,7 +66,10 @@ def input_parser(plan, input_args): # add default eth2 input params result["mev_type"] = None result["mev_params"] = get_default_mev_params() - if result["network_params"]["network"] == "kurtosis": + if ( + result["network_params"]["network"] == constants.NETWORK_NAME.kurtosis + or constants.NETWORK_NAME.shadowfork in result["network_params"]["network"] + ): result["additional_services"] = DEFAULT_ADDITIONAL_SERVICES else: result["additional_services"] = [] @@ -405,7 +408,10 @@ def parse_network_params(input_args): "deposit_contract_address is empty or spaces it needs to be of non zero length" ) - if result["network_params"]["network"] == "kurtosis": + if ( + result["network_params"]["network"] == "kurtosis" + or constants.NETWORK_NAME.shadowfork in result["network_params"]["network"] + ): if ( result["network_params"]["preregistered_validator_keys_mnemonic"].strip() == "" @@ -430,7 +436,10 @@ def parse_network_params(input_args): ): fail("electra can only happen with capella genesis not bellatrix") - if result["network_params"]["network"] == "kurtosis": + if ( + result["network_params"]["network"] == constants.NETWORK_NAME.kurtosis + or constants.NETWORK_NAME.shadowfork in result["network_params"]["network"] + ): if MIN_VALIDATORS > actual_num_validators: fail( "We require at least {0} validators but got {1}".format( diff --git a/src/participant_network.star b/src/participant_network.star index 749ae3d95..217785bba 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -68,8 +68,38 @@ def launch_participant_network( parallel_keystore_generation=False, ): num_participants = len(participants) - if network_params.network == constants.NETWORK_NAME.kurtosis: - # We are running a kurtosis network + latest_block = "" + if ( + network_params.network == constants.NETWORK_NAME.kurtosis + or constants.NETWORK_NAME.shadowfork in network_params.network + ): + if ( + constants.NETWORK_NAME.shadowfork in network_params.network + ): # shadowfork requires some preparation + latest_block = plan.run_sh( # fetch the latest block + run="mkdir -p /shadowfork && \ + curl -o /shadowfork/latest_block.json https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/latest_block.json", + image="badouralix/curl-jq", + store=[StoreSpec(src="/shadowfork", name="latest_blocks")], + ) + + for ( + participant + ) in participants: # fetch the latest state for each EL participant + if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: + geth_fetch = plan.run_sh( + run="mkdir -p /data && \ + curl -o geth.tar.gz https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth-test.tar.gz && \ + tar xvzf geth.tar.gz -C /data", + image="badouralix/curl-jq", + store=[StoreSpec(src="/data/geth-test/", name="geth_data")], + ) + + ethereum_genesis_generator_image = ( + "parithoshj/ethereum-genesis-generator:shadowfork-from-file" + ) + + # We are running a kurtosis or shadowfork network plan.print("Generating cl validator key stores") validator_data = None if not parallel_keystore_generation: @@ -105,8 +135,12 @@ def launch_participant_network( total_number_of_validator_keys += participant.validator_count plan.print("Generating EL CL data") + if constants.NETWORK_NAME.shadowfork in network_params.network: + ethereum_genesis_generator_image = ( + "parithoshj/ethereum-genesis-generator:shadowfork-from-file" + ) # we are running bellatrix genesis (deprecated) - will be removed in the future - if ( + elif ( network_params.capella_fork_epoch > 0 and network_params.electra_fork_epoch == None ): @@ -157,7 +191,7 @@ def launch_participant_network( network_params.capella_fork_epoch, network_params.deneb_fork_epoch, network_params.electra_fork_epoch, - shadowfork_file_path="", + latest_block.files_artifacts[0], ) elif network_params.network in constants.PUBLIC_NETWORKS: # We are running a public network @@ -172,86 +206,6 @@ def launch_participant_network( final_genesis_timestamp = constants.GENESIS_TIME[network_params.network] network_id = constants.NETWORK_ID[network_params.network] validator_data = None - elif constants.NETWORK_NAME.shadowfork in network_params.network: # Shadowfork - # if not persistent: - # fail("Shadowforks are only supported with persistent storage") - # We are running a shadowfork - latest_block = plan.run_sh( - run="mkdir -p /network-configs/ && \ - curl -o latest_block.json https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/latest_block.json", - image="badouralix/curl-jq", - store=[StoreSpec(src="/network-configs/", name="latest_block")], - ) - shadowfork_file_path = "/network-configs/latest_block.json" - - for participant in participants: - if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: - geth_fetch = plan.run_sh( - run="mkdir -p /geth && \ - curl -o geth.tar.gz https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar.gz && \ - tar xvzf geth.tar.gz -C /data", - image="badouralix/curl-jq", - store=[StoreSpec(src="/data/geth/execution-data", name="geth_data")], - ) - - plan.print("Generating cl validator key stores") - validator_data = None - if not parallel_keystore_generation: - validator_data = validator_keystores.generate_validator_keystores( - plan, network_params.preregistered_validator_keys_mnemonic, participants - ) - else: - validator_data = ( - validator_keystores.generate_valdiator_keystores_in_parallel( - plan, - network_params.preregistered_validator_keys_mnemonic, - participants, - ) - ) - - plan.print(json.indent(json.encode(validator_data))) - - network_id = network_params.network_id - - # We need to send the same genesis time to both the EL and the CL to ensure that timestamp based forking works as expected - final_genesis_timestamp = get_final_genesis_timestamp( - plan, - network_params.genesis_delay - + CL_GENESIS_DATA_GENERATION_TIME - + num_participants * CL_NODE_STARTUP_TIME, - ) - - # if preregistered validator count is 0 (default) then calculate the total number of validators from the participants - total_number_of_validator_keys = network_params.preregistered_validator_count - - if network_params.preregistered_validator_count == 0: - for participant in participants: - total_number_of_validator_keys += participant.validator_count - - ethereum_genesis_generator_image = ("parithoshj/ethereum-genesis-generator:shadowfork-from-file") - el_cl_genesis_config_template = read_file( - static_files.EL_CL_GENESIS_GENERATION_CONFIG_TEMPLATE_FILEPATH - ) - el_cl_data = el_cl_genesis_data_generator.generate_el_cl_genesis_data( - plan, - ethereum_genesis_generator_image, - el_cl_genesis_config_template, - final_genesis_timestamp, - network_params.network_id, - network_params.deposit_contract_address, - network_params.seconds_per_slot, - network_params.preregistered_validator_keys_mnemonic, - total_number_of_validator_keys, - network_params.genesis_delay, - network_params.max_churn, - network_params.ejection_balance, - network_params.eth1_follow_distance, - network_params.capella_fork_epoch, - network_params.deneb_fork_epoch, - network_params.electra_fork_epoch, - shadowfork_file_path, - ) - elif network_params.network == constants.NETWORK_NAME.ephemery: el_cl_genesis_data_uuid = plan.run_sh( run="mkdir -p /network-configs/ && \ @@ -480,6 +434,7 @@ def launch_participant_network( preregistered_validator_keys_for_nodes = ( validator_data.per_node_keystores if network_params.network == constants.NETWORK_NAME.kurtosis + or constants.NETWORK_NAME.shadowfork in network_params.network else None ) diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star index 3fa54e80a..59bbb721f 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star @@ -6,6 +6,7 @@ constants = import_module("../../package_io/constants.star") GENESIS_VALUES_PATH = "/opt" GENESIS_VALUES_FILENAME = "values.env" +SHADOWFORK_FILEPATH = "/shadowfork" def generate_el_cl_genesis_data( @@ -25,8 +26,13 @@ def generate_el_cl_genesis_data( capella_fork_epoch, deneb_fork_epoch, electra_fork_epoch, - shadowfork_file_path, + latest_block, ): + if latest_block == "": + shadowfork_file = "" + else: + shadowfork_file = "/shadowfork/shadowfork/latest_block.json" + template_data = new_env_file_for_el_cl_genesis_data( genesis_unix_timestamp, network_id, @@ -41,7 +47,7 @@ def generate_el_cl_genesis_data( capella_fork_epoch, deneb_fork_epoch, electra_fork_epoch, - shadowfork_file_path, + shadowfork_file, ) genesis_generation_template = shared_utils.new_template_and_data( genesis_generation_config_yml_template, template_data @@ -60,7 +66,10 @@ def generate_el_cl_genesis_data( genesis = plan.run_sh( run="cp /opt/values.env /config/values.env && ./entrypoint.sh all && mkdir /network-configs && mv /data/custom_config_data/* /network-configs/", image=image, - files={GENESIS_VALUES_PATH: genesis_generation_config_artifact_name}, + files={ + GENESIS_VALUES_PATH: genesis_generation_config_artifact_name, + SHADOWFORK_FILEPATH: latest_block, + }, store=[ StoreSpec(src="/network-configs/", name="el_cl_genesis_data"), StoreSpec( @@ -98,7 +107,7 @@ def new_env_file_for_el_cl_genesis_data( capella_fork_epoch, deneb_fork_epoch, electra_fork_epoch, - shadowfork_file_path, + shadowfork_file, ): return { "UnixTimestamp": genesis_unix_timestamp, @@ -119,5 +128,5 @@ def new_env_file_for_el_cl_genesis_data( "CapellaForkVersion": constants.CAPELLA_FORK_VERSION, "DenebForkVersion": constants.DENEB_FORK_VERSION, "ElectraForkVersion": constants.ELECTRA_FORK_VERSION, - "ShadowforkFilePath": shadowfork_file_path, + "ShadowForkFile": shadowfork_file, } diff --git a/src/static_files/static_files.star b/src/static_files/static_files.star index 07a4745da..40eb2254e 100644 --- a/src/static_files/static_files.star +++ b/src/static_files/static_files.star @@ -68,3 +68,5 @@ CL_GENESIS_GENERATION_MNEMONICS_TEMPLATE_FILEPATH = ( ) JWT_PATH_FILEPATH = STATIC_FILES_DIRPATH + "/jwt/jwtsecret" + +SHADOWFORK_FILEPATH = "/network-configs/latest_block.json" diff --git a/static_files/genesis-generation-config/el-cl/values.env.tmpl b/static_files/genesis-generation-config/el-cl/values.env.tmpl index 45057d8ae..2a4ec0962 100644 --- a/static_files/genesis-generation-config/el-cl/values.env.tmpl +++ b/static_files/genesis-generation-config/el-cl/values.env.tmpl @@ -21,3 +21,4 @@ export GENESIS_DELAY={{ .GenesisDelay }} export MAX_CHURN={{ .MaxChurn }} export EJECTION_BALANCE={{ .EjectionBalance }} export ETH1_FOLLOW_DISTANCE={{ .Eth1FollowDistance }} +export SHADOW_FORK_FILE={{ .ShadowForkFile }} From 46b05e01ba6632e615de6184d109ba6badb11427 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 30 Jan 2024 12:31:08 +0100 Subject: [PATCH 03/90] fixes --- src/el/geth/geth_launcher.star | 10 ++++++++++ src/package_io/constants.star | 2 +- src/participant_network.star | 13 ++++++++++--- .../el_cl_genesis/el_cl_genesis_data.star | 2 ++ .../el_cl_genesis/el_cl_genesis_generator.star | 8 +++++++- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 0d34dd015..8aa25e2f0 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -148,6 +148,7 @@ def launch( launcher.capella_fork_epoch, launcher.electra_fork_epoch, launcher.final_genesis_timestamp, + launcher.cancun_time, persistent, el_volume_size, tolerations, @@ -198,6 +199,7 @@ def get_config( capella_fork_epoch, electra_fork_epoch, final_genesis_timestamp, + cancun_time, persistent, el_volume_size, tolerations, @@ -224,6 +226,8 @@ def get_config( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.json", ) + elif constants.NETWORK_NAME.shadowfork in network: # if its a shadowfork we dont need to init the datadir + init_datadir_cmd_str = "echo shadowfork" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, @@ -258,6 +262,10 @@ def get_config( "{0}".format( "--{}".format(network) if network in constants.PUBLIC_NETWORKS else "" ), + # "{0}".format( + # "--override.cancun={}".format(cancun_time) if constants.NETWORK_NAME.shadowfork in network else "" + # ), + "--override.cancun={}".format(cancun_time), "--networkid={0}".format(networkid), "--verbosity=" + verbosity_level, "--datadir=" + EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, @@ -369,6 +377,7 @@ def new_geth_launcher( networkid, final_genesis_timestamp, capella_fork_epoch, + cancun_time, electra_fork_epoch=None, ): return struct( @@ -378,5 +387,6 @@ def new_geth_launcher( networkid=networkid, final_genesis_timestamp=final_genesis_timestamp, capella_fork_epoch=capella_fork_epoch, + cancun_time=cancun_time, electra_fork_epoch=electra_fork_epoch, ) diff --git a/src/package_io/constants.star b/src/package_io/constants.star index 11d00f433..00a9083db 100644 --- a/src/package_io/constants.star +++ b/src/package_io/constants.star @@ -389,7 +389,7 @@ RAM_CPU_OVERRIDES = { "reth_max_cpu": 1000, # 1 core "ethereumjs_max_mem": 4096, # 4GB "ethereumjs_max_cpu": 1000, # 1 core - "prysm_max_mem": 4096, # 4GB + "prysm_max_mem": 8192, # 8GB "prysm_max_cpu": 1000, # 1 core "lighthouse_max_mem": 4096, # 4GB "lighthouse_max_cpu": 1000, # 1 core diff --git a/src/participant_network.star b/src/participant_network.star index 217785bba..68e2a4553 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -67,8 +67,10 @@ def launch_participant_network( global_tolerations, parallel_keystore_generation=False, ): + network_id = network_params.network_id num_participants = len(participants) latest_block = "" + cancun_time = 0 if ( network_params.network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network_params.network @@ -76,6 +78,9 @@ def launch_participant_network( if ( constants.NETWORK_NAME.shadowfork in network_params.network ): # shadowfork requires some preparation + + network_name = network_params.network.split("-shadowfork")[0] # overload the network name to remove the shadowfork suffix + network_id = constants.NETWORK_ID[network_name] # overload the network id to match the network name latest_block = plan.run_sh( # fetch the latest block run="mkdir -p /shadowfork && \ curl -o /shadowfork/latest_block.json https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/latest_block.json", @@ -117,8 +122,6 @@ def launch_participant_network( plan.print(json.indent(json.encode(validator_data))) - network_id = network_params.network_id - # We need to send the same genesis time to both the EL and the CL to ensure that timestamp based forking works as expected final_genesis_timestamp = get_final_genesis_timestamp( plan, @@ -179,7 +182,7 @@ def launch_participant_network( ethereum_genesis_generator_image, el_cl_genesis_config_template, final_genesis_timestamp, - network_params.network_id, + network_id, network_params.deposit_contract_address, network_params.seconds_per_slot, network_params.preregistered_validator_keys_mnemonic, @@ -202,6 +205,7 @@ def launch_participant_network( el_cl_data = el_cl_genesis_data.new_el_cl_genesis_data( dummy.files_artifacts[0], constants.GENESIS_VALIDATORS_ROOT[network_params.network], + cancun_time, ) final_genesis_timestamp = constants.GENESIS_TIME[network_params.network] network_id = constants.NETWORK_ID[network_params.network] @@ -219,6 +223,7 @@ def launch_participant_network( el_cl_data = el_cl_genesis_data.new_el_cl_genesis_data( el_cl_genesis_data_uuid.files_artifacts[0], genesis_validators_root, + cancun_time, ) final_genesis_timestamp = shared_utils.read_genesis_timestamp_from_config( plan, el_cl_genesis_data_uuid.files_artifacts[0] @@ -244,6 +249,7 @@ def launch_participant_network( el_cl_data = el_cl_genesis_data.new_el_cl_genesis_data( el_cl_genesis_data_uuid.files_artifacts[0], genesis_validators_root, + cancun_time, ) final_genesis_timestamp = shared_utils.read_genesis_timestamp_from_config( plan, el_cl_genesis_data_uuid.files_artifacts[0] @@ -262,6 +268,7 @@ def launch_participant_network( network_id, final_genesis_timestamp, network_params.capella_fork_epoch, + el_cl_data.cancun_time, network_params.electra_fork_epoch, ), "launch_method": geth.launch, diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_data.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_data.star index 8e0a834f7..312b8d6ba 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_data.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_data.star @@ -1,8 +1,10 @@ def new_el_cl_genesis_data( files_artifact_uuid, genesis_validators_root, + cancun_time, ): return struct( files_artifact_uuid=files_artifact_uuid, genesis_validators_root=genesis_validators_root, + cancun_time=cancun_time, ) diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star index 59bbb721f..afa1d7f54 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star @@ -86,8 +86,14 @@ def generate_el_cl_genesis_data( wait=None, ) + cancun_time = plan.run_sh( + run="jq .config.cancunTime /data/network-configs/genesis.json | tr -d '\n'", + image= "badouralix/curl-jq", + files={"/data": genesis.files_artifacts[0]}, + ) + result = el_cl_genesis_data.new_el_cl_genesis_data( - genesis.files_artifacts[0], genesis_validators_root.output + genesis.files_artifacts[0], genesis_validators_root.output, cancun_time.output ) return result From 48ad47e3cf52c5f37008b0ec166da07aa8b12524 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 30 Jan 2024 12:49:55 +0100 Subject: [PATCH 04/90] fix lint --- src/el/geth/geth_launcher.star | 4 +++- src/participant_network.star | 9 ++++++--- .../el_cl_genesis/el_cl_genesis_generator.star | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 8aa25e2f0..26b99425b 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -226,7 +226,9 @@ def get_config( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.json", ) - elif constants.NETWORK_NAME.shadowfork in network: # if its a shadowfork we dont need to init the datadir + elif ( + constants.NETWORK_NAME.shadowfork in network + ): # if its a shadowfork we dont need to init the datadir init_datadir_cmd_str = "echo shadowfork" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( diff --git a/src/participant_network.star b/src/participant_network.star index 68e2a4553..04bfbbde7 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -78,9 +78,12 @@ def launch_participant_network( if ( constants.NETWORK_NAME.shadowfork in network_params.network ): # shadowfork requires some preparation - - network_name = network_params.network.split("-shadowfork")[0] # overload the network name to remove the shadowfork suffix - network_id = constants.NETWORK_ID[network_name] # overload the network id to match the network name + network_name = network_params.network.split("-shadowfork")[ + 0 + ] # overload the network name to remove the shadowfork suffix + network_id = constants.NETWORK_ID[ + network_name + ] # overload the network id to match the network name latest_block = plan.run_sh( # fetch the latest block run="mkdir -p /shadowfork && \ curl -o /shadowfork/latest_block.json https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/latest_block.json", diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star index afa1d7f54..c566c0669 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star @@ -88,7 +88,7 @@ def generate_el_cl_genesis_data( cancun_time = plan.run_sh( run="jq .config.cancunTime /data/network-configs/genesis.json | tr -d '\n'", - image= "badouralix/curl-jq", + image="badouralix/curl-jq", files={"/data": genesis.files_artifacts[0]}, ) From e1c94b47f5a9d6e324fc76ee1c46159af35b452f Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 30 Jan 2024 13:03:44 +0100 Subject: [PATCH 05/90] fix stuff --- src/el/geth/geth_launcher.star | 9 +++++---- src/participant_network.star | 2 +- .../el_cl_genesis/el_cl_genesis_generator.star | 12 +++++++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 26b99425b..2934b2bb4 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -264,10 +264,11 @@ def get_config( "{0}".format( "--{}".format(network) if network in constants.PUBLIC_NETWORKS else "" ), - # "{0}".format( - # "--override.cancun={}".format(cancun_time) if constants.NETWORK_NAME.shadowfork in network else "" - # ), - "--override.cancun={}".format(cancun_time), + "{0}".format( + "--override.cancun={}".format(cancun_time) + if constants.NETWORK_NAME.shadowfork in network + else "" + ), "--networkid={0}".format(networkid), "--verbosity=" + verbosity_level, "--datadir=" + EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, diff --git a/src/participant_network.star b/src/participant_network.star index 04bfbbde7..9f6437b25 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -197,7 +197,7 @@ def launch_participant_network( network_params.capella_fork_epoch, network_params.deneb_fork_epoch, network_params.electra_fork_epoch, - latest_block.files_artifacts[0], + latest_block.files_artifacts[0] if latest_block != "" else "", ) elif network_params.network in constants.PUBLIC_NETWORKS: # We are running a public network diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star index c566c0669..bf3975ab4 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star @@ -28,10 +28,12 @@ def generate_el_cl_genesis_data( electra_fork_epoch, latest_block, ): + files = {} if latest_block == "": shadowfork_file = "" + else: - shadowfork_file = "/shadowfork/shadowfork/latest_block.json" + shadowfork_file = SHADOWFORK_FILEPATH + "/shadowfork/latest_block.json" template_data = new_env_file_for_el_cl_genesis_data( genesis_unix_timestamp, @@ -63,13 +65,13 @@ def generate_el_cl_genesis_data( genesis_values_and_dest_filepath, "genesis-el-cl-env-file" ) + files = {GENESIS_VALUES_PATH: genesis_generation_config_artifact_name} + if latest_block != "": + files[SHADOWFORK_FILEPATH] = latest_block genesis = plan.run_sh( run="cp /opt/values.env /config/values.env && ./entrypoint.sh all && mkdir /network-configs && mv /data/custom_config_data/* /network-configs/", image=image, - files={ - GENESIS_VALUES_PATH: genesis_generation_config_artifact_name, - SHADOWFORK_FILEPATH: latest_block, - }, + files=files, store=[ StoreSpec(src="/network-configs/", name="el_cl_genesis_data"), StoreSpec( From 775773a1694b543ba961abaaecb99021f38dcf2e Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 30 Jan 2024 13:10:28 +0100 Subject: [PATCH 06/90] add some readme --- README.md | 10 +++++++++ src/cl/teku/teku_launcher.star | 3 +++ src/el/geth/geth_launcher.star | 4 ++++ src/package_io/constants.star | 37 ---------------------------------- 4 files changed, 17 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 85c0fd7c9..fb60799b0 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,16 @@ To mitigate these issues, you can use the `el_client_volume_size` and `cl_client For optimal performance, we recommend using a cloud provider that allows you to provision Kubernetes clusters with fast persistent storage or self hosting your own Kubernetes cluster with fast persistent storage. +### Shadowforking +In order to enable shadowfork capabilities, you can use the `network_params.network` flag. The expected value is the name of the network you want to shadowfork followed by `-shadowfork`. For example, to shadowfork the Holesky testnet, you can use the following command: +```yaml +... +network_params: + network: "holesky-shadowfork" +... +``` + + #### Taints and tolerations It is possible to run the package on a Kubernetes cluster with taints and tolerations. This is done by adding the tolerations to the `tolerations` field in the `network_params.yaml` file. For example: ```yaml diff --git a/src/cl/teku/teku_launcher.star b/src/cl/teku/teku_launcher.star index 24d6d95d0..400647c01 100644 --- a/src/cl/teku/teku_launcher.star +++ b/src/cl/teku/teku_launcher.star @@ -160,6 +160,9 @@ def launch( else launcher.network ) + if constants.NETWORK_NAME.shadowfork in network_name: + network_name = network_name.split("-shadowfork")[0] + bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU bn_max_cpu = ( int(bn_max_cpu) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 2934b2bb4..a0c5ddbf6 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -105,6 +105,10 @@ def launch( and launcher.network not in constants.PUBLIC_NETWORKS else launcher.network ) + if ( + constants.NETWORK_NAME.shadowfork in network_name + ): # if its a shadowfork we want proper resource allocation based on public network + network_name = launcher.network.split("-shadowfork")[0] el_min_cpu = int(el_min_cpu) if int(el_min_cpu) > 0 else EXECUTION_MIN_CPU el_max_cpu = ( diff --git a/src/package_io/constants.star b/src/package_io/constants.star index 00a9083db..6dfc09e8b 100644 --- a/src/package_io/constants.star +++ b/src/package_io/constants.star @@ -192,19 +192,6 @@ VOLUME_SIZE = { "nimbus_volume_size": 1000, # 1GB "lodestar_volume_size": 1000, # 1GB }, - "shadowfork": { - "geth_volume_size": 5000, # 5GB - "erigon_volume_size": 3000, # 3GB - "nethermind_volume_size": 3000, # 3GB - "besu_volume_size": 3000, # 3GB - "reth_volume_size": 3000, # 3GB - "ethereumjs_volume_size": 3000, # 3GB - "prysm_volume_size": 1000, # 1GB - "lighthouse_volume_size": 1000, # 1GB - "teku_volume_size": 1000, # 1GB - "nimbus_volume_size": 1000, # 1GB - "lodestar_volume_size": 1000, # 1GB - }, } RAM_CPU_OVERRIDES = { @@ -376,28 +363,4 @@ RAM_CPU_OVERRIDES = { "lodestar_max_mem": 1024, # 1GB "lodestar_max_cpu": 1000, # 1 core }, - "shadowfork": { - "geth_max_mem": 4096, # 4GB - "geth_max_cpu": 1000, # 1 core - "erigon_max_mem": 4096, # 4GB - "erigon_max_cpu": 1000, # 1 core - "nethermind_max_mem": 4096, # 4GB - "nethermind_max_cpu": 1000, # 1 core - "besu_max_mem": 4096, # 4GB - "besu_max_cpu": 1000, # 1 core - "reth_max_mem": 4096, # 4GB - "reth_max_cpu": 1000, # 1 core - "ethereumjs_max_mem": 4096, # 4GB - "ethereumjs_max_cpu": 1000, # 1 core - "prysm_max_mem": 8192, # 8GB - "prysm_max_cpu": 1000, # 1 core - "lighthouse_max_mem": 4096, # 4GB - "lighthouse_max_cpu": 1000, # 1 core - "teku_max_mem": 4096, # 4GB - "teku_max_cpu": 1000, # 1 core - "nimbus_max_mem": 4096, # 4GB - "nimbus_max_cpu": 1000, # 1 core - "lodestar_max_mem": 4096, # 4GB - "lodestar_max_cpu": 1000, # 1 core - }, } From 638d138d06240332d05e6d8a35a94efac2a60c68 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 30 Jan 2024 13:23:16 +0100 Subject: [PATCH 07/90] this should work --- src/el/geth/geth_launcher.star | 6 ++++++ src/participant_network.star | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index a0c5ddbf6..e830a87b8 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -153,6 +153,7 @@ def launch( launcher.electra_fork_epoch, launcher.final_genesis_timestamp, launcher.cancun_time, + launcher.geth_shadowfork_data, persistent, el_volume_size, tolerations, @@ -204,6 +205,7 @@ def get_config( electra_fork_epoch, final_genesis_timestamp, cancun_time, + geth_shadowfork_data, persistent, el_volume_size, tolerations, @@ -354,6 +356,8 @@ def get_config( persistent_key="data-{0}".format(service_name), size=el_volume_size, ) + if constants.NETWORK_NAME.shadowfork in network: + files[EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER] = geth_shadowfork_data return ServiceConfig( image=image, ports=USED_PORTS, @@ -385,6 +389,7 @@ def new_geth_launcher( final_genesis_timestamp, capella_fork_epoch, cancun_time, + geth_shadowfork_data, electra_fork_epoch=None, ): return struct( @@ -395,5 +400,6 @@ def new_geth_launcher( final_genesis_timestamp=final_genesis_timestamp, capella_fork_epoch=capella_fork_epoch, cancun_time=cancun_time, + geth_shadowfork_data=geth_shadowfork_data, electra_fork_epoch=electra_fork_epoch, ) diff --git a/src/participant_network.star b/src/participant_network.star index 9f6437b25..77c8219f5 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -95,12 +95,14 @@ def launch_participant_network( participant ) in participants: # fetch the latest state for each EL participant if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: - geth_fetch = plan.run_sh( + geth_shadowfork_data = plan.run_sh( run="mkdir -p /data && \ - curl -o geth.tar.gz https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth-test.tar.gz && \ + curl -o geth.tar.gz https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar.gz && \ tar xvzf geth.tar.gz -C /data", image="badouralix/curl-jq", - store=[StoreSpec(src="/data/geth-test/", name="geth_data")], + store=[ + StoreSpec(src="/data/geth", name="geth_shadowfork_data") + ], ) ethereum_genesis_generator_image = ( @@ -272,6 +274,9 @@ def launch_participant_network( final_genesis_timestamp, network_params.capella_fork_epoch, el_cl_data.cancun_time, + geth_shadowfork_data.files_artifacts[0] + if constants.NETWORK_NAME.shadowfork in network_params.network + else None, network_params.electra_fork_epoch, ), "launch_method": geth.launch, @@ -284,6 +289,10 @@ def launch_participant_network( network_id, final_genesis_timestamp, network_params.capella_fork_epoch, + el_cl_data.cancun_time, + geth_shadowfork_data.files_artifacts[0] + if constants.NETWORK_NAME.shadowfork in network_params.network + else None, network_params.electra_fork_epoch, ), "launch_method": geth.launch, From 3fbe3b1cf149c300f987a231631c63e53fe222ba Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 30 Jan 2024 13:47:18 +0100 Subject: [PATCH 08/90] fix gz issue --- src/participant_network.star | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/participant_network.star b/src/participant_network.star index 77c8219f5..b01a75b0a 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -97,8 +97,8 @@ def launch_participant_network( if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: geth_shadowfork_data = plan.run_sh( run="mkdir -p /data && \ - curl -o geth.tar.gz https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar.gz && \ - tar xvzf geth.tar.gz -C /data", + wget -o geth.tar https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar.gz && \ + tar -xf geth.tar -C /data", image="badouralix/curl-jq", store=[ StoreSpec(src="/data/geth", name="geth_shadowfork_data") From 95944729aef811b9c88fbe5dfb9ff935e53448e1 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 30 Jan 2024 13:52:40 +0100 Subject: [PATCH 09/90] fix capital --- src/participant_network.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/participant_network.star b/src/participant_network.star index b01a75b0a..145230ddd 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -97,7 +97,7 @@ def launch_participant_network( if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: geth_shadowfork_data = plan.run_sh( run="mkdir -p /data && \ - wget -o geth.tar https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar.gz && \ + wget -O geth.tar https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar.gz && \ tar -xf geth.tar -C /data", image="badouralix/curl-jq", store=[ From 68583380a62426eac7f649fa43dc76c8f49edf40 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 30 Jan 2024 13:57:31 +0100 Subject: [PATCH 10/90] fix timeout issue --- src/participant_network.star | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/participant_network.star b/src/participant_network.star index 145230ddd..7fae52c68 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -103,6 +103,8 @@ def launch_participant_network( store=[ StoreSpec(src="/data/geth", name="geth_shadowfork_data") ], + wait="800s" + ) ethereum_genesis_generator_image = ( From 6c45a1c29cb1afdac37748ed03120b2809eb5c95 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 30 Jan 2024 14:10:10 +0100 Subject: [PATCH 11/90] add test --- .github/tests/holesky-shadowfork.yaml | 12 ++++++++++++ src/participant_network.star | 3 +-- 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 .github/tests/holesky-shadowfork.yaml diff --git a/.github/tests/holesky-shadowfork.yaml b/.github/tests/holesky-shadowfork.yaml new file mode 100644 index 000000000..5ac3d9787 --- /dev/null +++ b/.github/tests/holesky-shadowfork.yaml @@ -0,0 +1,12 @@ +participants: + - el_client_type: geth + el_client_image: ethereum/client-go:v1.13.11 + cl_client_type: teku + cl_client_image: consensys/teku:24.1.1 +network_params: + dencun_fork_epoch: 1 + network: holesky-shadowfork +additional_services: + - dora +ethereum_metrics_exporter_enabled: true +snoopy_enabled: true diff --git a/src/participant_network.star b/src/participant_network.star index 7fae52c68..d7e2d3282 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -103,8 +103,7 @@ def launch_participant_network( store=[ StoreSpec(src="/data/geth", name="geth_shadowfork_data") ], - wait="800s" - + wait="800s", ) ethereum_genesis_generator_image = ( From caf613f60e11ec2b5950e9a06c544a5772ef1c29 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Tue, 30 Jan 2024 14:15:18 +0100 Subject: [PATCH 12/90] fix url --- src/participant_network.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/participant_network.star b/src/participant_network.star index d7e2d3282..6c0eb4a59 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -97,7 +97,7 @@ def launch_participant_network( if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: geth_shadowfork_data = plan.run_sh( run="mkdir -p /data && \ - wget -O geth.tar https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar.gz && \ + wget https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && \ tar -xf geth.tar -C /data", image="badouralix/curl-jq", store=[ From ce3e1c48ad1e73df031012b80fa88955461b4583 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 12:13:28 +0100 Subject: [PATCH 13/90] add pull to geth --- src/el/geth/geth_launcher.star | 2 +- src/participant_network.star | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index e830a87b8..4c119f3dc 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -235,7 +235,7 @@ def get_config( elif ( constants.NETWORK_NAME.shadowfork in network ): # if its a shadowfork we dont need to init the datadir - init_datadir_cmd_str = "echo shadowfork" + init_datadir_cmd_str = "mkdir -p /data && wget https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && tar -xvf geth.tar -C /data" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, diff --git a/src/participant_network.star b/src/participant_network.star index 6c0eb4a59..3ab9a7cad 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -91,20 +91,20 @@ def launch_participant_network( store=[StoreSpec(src="/shadowfork", name="latest_blocks")], ) - for ( - participant - ) in participants: # fetch the latest state for each EL participant - if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: - geth_shadowfork_data = plan.run_sh( - run="mkdir -p /data && \ - wget https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && \ - tar -xf geth.tar -C /data", - image="badouralix/curl-jq", - store=[ - StoreSpec(src="/data/geth", name="geth_shadowfork_data") - ], - wait="800s", - ) + # for ( + # participant + # ) in participants: # fetch the latest state for each EL participant + # if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: + # geth_shadowfork_data = plan.run_sh( + # run="mkdir -p /data && \ + # wget https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && \ + # tar -xf geth.tar -C /data", + # image="badouralix/curl-jq", + # store=[ + # StoreSpec(src="/data/geth", name="geth_shadowfork_data") + # ], + # wait="800s", + # ) ethereum_genesis_generator_image = ( "parithoshj/ethereum-genesis-generator:shadowfork-from-file" From 16acd65fd8375a3d2cc10388d1b002ce139ab85a Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 12:17:11 +0100 Subject: [PATCH 14/90] cleanup --- src/el/geth/geth_launcher.star | 6 ------ src/participant_network.star | 6 ------ 2 files changed, 12 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 4c119f3dc..6f4598949 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -153,7 +153,6 @@ def launch( launcher.electra_fork_epoch, launcher.final_genesis_timestamp, launcher.cancun_time, - launcher.geth_shadowfork_data, persistent, el_volume_size, tolerations, @@ -205,7 +204,6 @@ def get_config( electra_fork_epoch, final_genesis_timestamp, cancun_time, - geth_shadowfork_data, persistent, el_volume_size, tolerations, @@ -356,8 +354,6 @@ def get_config( persistent_key="data-{0}".format(service_name), size=el_volume_size, ) - if constants.NETWORK_NAME.shadowfork in network: - files[EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER] = geth_shadowfork_data return ServiceConfig( image=image, ports=USED_PORTS, @@ -389,7 +385,6 @@ def new_geth_launcher( final_genesis_timestamp, capella_fork_epoch, cancun_time, - geth_shadowfork_data, electra_fork_epoch=None, ): return struct( @@ -400,6 +395,5 @@ def new_geth_launcher( final_genesis_timestamp=final_genesis_timestamp, capella_fork_epoch=capella_fork_epoch, cancun_time=cancun_time, - geth_shadowfork_data=geth_shadowfork_data, electra_fork_epoch=electra_fork_epoch, ) diff --git a/src/participant_network.star b/src/participant_network.star index 3ab9a7cad..fe253707c 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -275,9 +275,6 @@ def launch_participant_network( final_genesis_timestamp, network_params.capella_fork_epoch, el_cl_data.cancun_time, - geth_shadowfork_data.files_artifacts[0] - if constants.NETWORK_NAME.shadowfork in network_params.network - else None, network_params.electra_fork_epoch, ), "launch_method": geth.launch, @@ -291,9 +288,6 @@ def launch_participant_network( final_genesis_timestamp, network_params.capella_fork_epoch, el_cl_data.cancun_time, - geth_shadowfork_data.files_artifacts[0] - if constants.NETWORK_NAME.shadowfork in network_params.network - else None, network_params.electra_fork_epoch, ), "launch_method": geth.launch, From 731e9b59bcc20ccd96dd7450c9072ec6815f42d2 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 12:29:37 +0100 Subject: [PATCH 15/90] add ready condition --- src/el/geth/geth_launcher.star | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 6f4598949..6eb0e1330 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -366,6 +366,16 @@ def get_config( min_memory=el_min_mem, max_memory=el_max_mem, env_vars=extra_env_vars, + ready_conditions = ReadyCondition( + recipe = GetHttpRequestRecipe( + port_id = RPC_PORT_ID, + endpoint = "/", + ), + field = "code", + assertion = "==", + target_value = 200, + timeout = "5m", + ), labels=shared_utils.label_maker( constants.EL_CLIENT_TYPE.geth, constants.CLIENT_TYPES.el, From 0e46a000ebdc37ca635ecb99a2d0d8c52ba4f099 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 12:56:15 +0100 Subject: [PATCH 16/90] disable wait for 8551 and disable checkpoint for shadowfork --- src/cl/lighthouse/lighthouse_launcher.star | 7 +++++++ src/el/geth/geth_launcher.star | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/cl/lighthouse/lighthouse_launcher.star b/src/cl/lighthouse/lighthouse_launcher.star index ed7096e84..07d760a38 100644 --- a/src/cl/lighthouse/lighthouse_launcher.star +++ b/src/cl/lighthouse/lighthouse_launcher.star @@ -411,6 +411,13 @@ def get_beacon_config( plan, el_cl_genesis_data.files_artifact_uuid ) ) + elif constants.NETWORK_NAME.shadowfork in network: + cmd.append( + "--boot-nodes=" + + shared_utils.get_devnet_enrs_list( + plan, el_cl_genesis_data.files_artifact_uuid + ) + ) else: # Devnets # TODO Remove once checkpoint sync is working for verkle if constants.NETWORK_NAME.verkle not in network: diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 6eb0e1330..cfb7dc32f 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -48,7 +48,7 @@ USED_PORTS = { DISCOVERY_PORT_NUM, shared_utils.UDP_PROTOCOL ), ENGINE_RPC_PORT_ID: shared_utils.new_port_spec( - ENGINE_RPC_PORT_NUM, shared_utils.TCP_PROTOCOL + ENGINE_RPC_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None ), METRICS_PORT_ID: shared_utils.new_port_spec( METRICS_PORT_NUM, shared_utils.TCP_PROTOCOL From a700a88f32f21ea4a1b59d8d8d30925c0f2f9244 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 12:59:31 +0100 Subject: [PATCH 17/90] disable wait geth --- src/el/geth/geth_launcher.star | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index cfb7dc32f..3d13b6212 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -40,18 +40,18 @@ PRIVATE_IP_ADDRESS_PLACEHOLDER = "KURTOSIS_IP_ADDR_PLACEHOLDER" USED_PORTS = { RPC_PORT_ID: shared_utils.new_port_spec(RPC_PORT_NUM, shared_utils.TCP_PROTOCOL), - WS_PORT_ID: shared_utils.new_port_spec(WS_PORT_NUM, shared_utils.TCP_PROTOCOL), + WS_PORT_ID: shared_utils.new_port_spec(WS_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None), TCP_DISCOVERY_PORT_ID: shared_utils.new_port_spec( - DISCOVERY_PORT_NUM, shared_utils.TCP_PROTOCOL + DISCOVERY_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None ), UDP_DISCOVERY_PORT_ID: shared_utils.new_port_spec( - DISCOVERY_PORT_NUM, shared_utils.UDP_PROTOCOL + DISCOVERY_PORT_NUM, shared_utils.UDP_PROTOCOL, wait=None ), ENGINE_RPC_PORT_ID: shared_utils.new_port_spec( ENGINE_RPC_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None ), METRICS_PORT_ID: shared_utils.new_port_spec( - METRICS_PORT_NUM, shared_utils.TCP_PROTOCOL + METRICS_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None ), } From 1ef4f449cae4ed41224ca2c7dcfbbda7d777df30 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 13:04:48 +0100 Subject: [PATCH 18/90] fix path for geth --- src/el/geth/geth_launcher.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 3d13b6212..119f1ce81 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -233,7 +233,7 @@ def get_config( elif ( constants.NETWORK_NAME.shadowfork in network ): # if its a shadowfork we dont need to init the datadir - init_datadir_cmd_str = "mkdir -p /data && wget https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && tar -xvf geth.tar -C /data" + init_datadir_cmd_str = "mkdir -p /data && wget https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && tar -xvf geth.tar -C /data/geth/execution-data" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, From 4bed16940deead57df4525e8ad4ac6de774695e4 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 13:07:15 +0100 Subject: [PATCH 19/90] fix path for geth --- src/el/geth/geth_launcher.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 119f1ce81..958fda47d 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -233,7 +233,7 @@ def get_config( elif ( constants.NETWORK_NAME.shadowfork in network ): # if its a shadowfork we dont need to init the datadir - init_datadir_cmd_str = "mkdir -p /data && wget https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && tar -xvf geth.tar -C /data/geth/execution-data" + init_datadir_cmd_str = "mkdir -p /data/geth/execution-data && wget https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && tar -xvf geth.tar -C /data/geth/execution-data" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, From bed5c89aa6d99ba913f6614911e5ac9d962c0647 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 13:16:15 +0100 Subject: [PATCH 20/90] strip components --- src/el/geth/geth_launcher.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 958fda47d..0b57b9471 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -233,7 +233,7 @@ def get_config( elif ( constants.NETWORK_NAME.shadowfork in network ): # if its a shadowfork we dont need to init the datadir - init_datadir_cmd_str = "mkdir -p /data/geth/execution-data && wget https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && tar -xvf geth.tar -C /data/geth/execution-data" + init_datadir_cmd_str = "mkdir -p /data/geth/execution-data && wget -O /data/geth/geth.tar https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && tar -xvf geth.tar -C /data/geth/execution-data --strip-components=1 && rm -rf /data/geth/geth.tar" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, From 9ea484f07fe03ef1cff560a47f70f024c4b98ad4 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 13:19:21 +0100 Subject: [PATCH 21/90] stop waiting --- src/el/geth/geth_launcher.star | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 0b57b9471..289542004 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -39,8 +39,12 @@ EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER = "/data/geth/execution-data" PRIVATE_IP_ADDRESS_PLACEHOLDER = "KURTOSIS_IP_ADDR_PLACEHOLDER" USED_PORTS = { - RPC_PORT_ID: shared_utils.new_port_spec(RPC_PORT_NUM, shared_utils.TCP_PROTOCOL), - WS_PORT_ID: shared_utils.new_port_spec(WS_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None), + RPC_PORT_ID: shared_utils.new_port_spec( + RPC_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None + ), + WS_PORT_ID: shared_utils.new_port_spec( + WS_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None + ), TCP_DISCOVERY_PORT_ID: shared_utils.new_port_spec( DISCOVERY_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None ), @@ -366,15 +370,15 @@ def get_config( min_memory=el_min_mem, max_memory=el_max_mem, env_vars=extra_env_vars, - ready_conditions = ReadyCondition( - recipe = GetHttpRequestRecipe( - port_id = RPC_PORT_ID, - endpoint = "/", + ready_conditions=ReadyCondition( + recipe=GetHttpRequestRecipe( + port_id=RPC_PORT_ID, + endpoint="/", ), - field = "code", - assertion = "==", - target_value = 200, - timeout = "5m", + field="code", + assertion="==", + target_value=200, + timeout="5m", ), labels=shared_utils.label_maker( constants.EL_CLIENT_TYPE.geth, From 33130ddd10c4cfd3206a79141610f01eb76931db Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 13:21:39 +0100 Subject: [PATCH 22/90] fix path --- src/el/geth/geth_launcher.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 289542004..72a928143 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -237,7 +237,7 @@ def get_config( elif ( constants.NETWORK_NAME.shadowfork in network ): # if its a shadowfork we dont need to init the datadir - init_datadir_cmd_str = "mkdir -p /data/geth/execution-data && wget -O /data/geth/geth.tar https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && tar -xvf geth.tar -C /data/geth/execution-data --strip-components=1 && rm -rf /data/geth/geth.tar" + init_datadir_cmd_str = "mkdir -p /data/geth/execution-data && wget -O /data/geth/geth.tar https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && tar -xvf /data/geth/geth.tar -C /data/geth/execution-data --strip-components=1 && rm -rf /data/geth/geth.tar" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, From dc441494a9c60e2e3942fc40974bb4b93def1655 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 13:33:55 +0100 Subject: [PATCH 23/90] fix path based storage --- src/el/geth/geth_launcher.star | 1 + 1 file changed, 1 insertion(+) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 72a928143..da283c657 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -253,6 +253,7 @@ def get_config( "--state.scheme=path" if electra_fork_epoch == None and "verkle" not in network + and constants.NETWORK_NAME.shadowfork not in network # for now and "--builder" not in extra_params and capella_fork_epoch == 0 else "" From 55f0d895bd33cf99dacb0d02737d4631707ee973 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 13:39:44 +0100 Subject: [PATCH 24/90] add shanghai time override --- src/el/geth/geth_launcher.star | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index da283c657..14104f158 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -274,7 +274,12 @@ def get_config( "--{}".format(network) if network in constants.PUBLIC_NETWORKS else "" ), "{0}".format( - "--override.cancun={}".format(cancun_time) + "--override.cancun=" + cancun_time + if constants.NETWORK_NAME.shadowfork in network + else "" + ), + "{0}".format( + "--override.shanghai=" + final_genesis_timestamp if constants.NETWORK_NAME.shadowfork in network else "" ), From 35c6e59a8eea0b3d98be86a3a61616eac380d7a6 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 14:16:54 +0100 Subject: [PATCH 25/90] add deposit contract override --- src/el/geth/geth_launcher.star | 7 +------ src/package_io/constants.star | 7 +++++++ src/package_io/input_parser.star | 6 ++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 14104f158..373cd6fed 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -253,7 +253,7 @@ def get_config( "--state.scheme=path" if electra_fork_epoch == None and "verkle" not in network - and constants.NETWORK_NAME.shadowfork not in network # for now + and constants.NETWORK_NAME.shadowfork not in network # for now and "--builder" not in extra_params and capella_fork_epoch == 0 else "" @@ -278,11 +278,6 @@ def get_config( if constants.NETWORK_NAME.shadowfork in network else "" ), - "{0}".format( - "--override.shanghai=" + final_genesis_timestamp - if constants.NETWORK_NAME.shadowfork in network - else "" - ), "--networkid={0}".format(networkid), "--verbosity=" + verbosity_level, "--datadir=" + EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, diff --git a/src/package_io/constants.star b/src/package_io/constants.star index 6dfc09e8b..b676817ea 100644 --- a/src/package_io/constants.star +++ b/src/package_io/constants.star @@ -93,6 +93,13 @@ GENESIS_VALIDATORS_ROOT = { "holesky": "0x9143aa7c615a7f7115e2b6aac319c03529df8242ae705fba9df39b79c59fa8b1", } +DEPOSIT_CONTRACT_ADDRESS = { + "mainnet": "0x00000000219ab540356cBB839Cbe05303d7705Fa", + "goerli": "0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b", + "sepolia": "0x7f02C3E3c98b133055B8B348B2Ac625669Ed295D", + "holesky": "0x4242424242424242424242424242424242424242", +} + GENESIS_TIME = { "mainnet": 1606824023, "goerli": 1616508000, diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index 893802cf0..e9f66cb43 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -83,6 +83,12 @@ def input_parser(plan, input_args): result["persistent"] = False result["global_tolerations"] = [] + if constants.NETWORK_NAME.shadowfork in result["network_params"]["network"]: + shadow_base = result["network_params"]["network"].split("-shadowfork")[0] + result["network_params"][ + "deposit_contract_address" + ] = constants.DEPOSIT_CONTRACT_ADDRESS[shadow_base] + for attr in input_args: value = input_args[attr] # if its inserted we use the value inserted From 90c16bcfdd4bb3e8bd2a4b15c513871044269cb9 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 15:30:03 +0100 Subject: [PATCH 26/90] increase timeout --- src/el/geth/geth_launcher.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 373cd6fed..9793fe3d7 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -379,7 +379,7 @@ def get_config( field="code", assertion="==", target_value=200, - timeout="5m", + timeout="60m", ), labels=shared_utils.label_maker( constants.EL_CLIENT_TYPE.geth, From e6765d5d71cd0fc52f092ec6e972d8cd45b82be1 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 15:36:16 +0100 Subject: [PATCH 27/90] remove cancun override --- src/el/geth/geth_launcher.star | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 9793fe3d7..2ef0b8c53 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -273,11 +273,11 @@ def get_config( "{0}".format( "--{}".format(network) if network in constants.PUBLIC_NETWORKS else "" ), - "{0}".format( - "--override.cancun=" + cancun_time - if constants.NETWORK_NAME.shadowfork in network - else "" - ), + # "{0}".format( + # "--override.cancun=" + cancun_time + # if constants.NETWORK_NAME.shadowfork in network + # else "" + # ), "--networkid={0}".format(networkid), "--verbosity=" + verbosity_level, "--datadir=" + EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, From 527917ff99dc0e6ddcdfede42ee4ff984b378210 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 16:04:39 +0100 Subject: [PATCH 28/90] untar on the fly --- src/el/geth/geth_launcher.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 2ef0b8c53..ddcabb3d5 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -237,7 +237,7 @@ def get_config( elif ( constants.NETWORK_NAME.shadowfork in network ): # if its a shadowfork we dont need to init the datadir - init_datadir_cmd_str = "mkdir -p /data/geth/execution-data && wget -O /data/geth/geth.tar https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && tar -xvf /data/geth/geth.tar -C /data/geth/execution-data --strip-components=1 && rm -rf /data/geth/geth.tar" + init_datadir_cmd_str = "mkdir -p /data/geth/execution-data && wget -qO- https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar | tar xvf - -C /data/geth/execution-data --strip-components=1" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, From f51a157bf8f9e73513af21c59817de011c09a1a9 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 16:26:00 +0100 Subject: [PATCH 29/90] enable verkle shadowfork --- src/el/geth/geth_launcher.star | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index ddcabb3d5..56b2e3aeb 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -213,7 +213,7 @@ def get_config( tolerations, ): # TODO: Remove this once electra fork has path based storage scheme implemented - if electra_fork_epoch != None or constants.NETWORK_NAME.verkle in network: + if electra_fork_epoch != None or constants.NETWORK_NAME.verkle in network and constants.NETWORK_NAME.shadowfork not in network: if ( electra_fork_epoch == 0 or constants.NETWORK_NAME.verkle + "-gen" in network ): # verkle-gen @@ -270,6 +270,12 @@ def get_config( if electra_fork_epoch == 0 or "verkle-gen" in network else "" ), + # Override prague fork timestamp if electra_fork_epoch not Null + "{0}".format( + "--override.prague=" + final_genesis_timestamp * 32 * 12 * electra_fork_epoch + if electra_fork_epoch != None or "verkle" in network + else "" + ), "{0}".format( "--{}".format(network) if network in constants.PUBLIC_NETWORKS else "" ), From a2cbd7ac4e1e1bbfbb4dcecaa6f8d6205559c64a Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 16:34:26 +0100 Subject: [PATCH 30/90] fix lint --- src/el/geth/geth_launcher.star | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 56b2e3aeb..99b99ae22 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -213,7 +213,11 @@ def get_config( tolerations, ): # TODO: Remove this once electra fork has path based storage scheme implemented - if electra_fork_epoch != None or constants.NETWORK_NAME.verkle in network and constants.NETWORK_NAME.shadowfork not in network: + if ( + electra_fork_epoch != None + or constants.NETWORK_NAME.verkle in network + and constants.NETWORK_NAME.shadowfork not in network + ): if ( electra_fork_epoch == 0 or constants.NETWORK_NAME.verkle + "-gen" in network ): # verkle-gen @@ -272,7 +276,8 @@ def get_config( ), # Override prague fork timestamp if electra_fork_epoch not Null "{0}".format( - "--override.prague=" + final_genesis_timestamp * 32 * 12 * electra_fork_epoch + "--override.prague=" + + final_genesis_timestamp * 32 * 12 * electra_fork_epoch if electra_fork_epoch != None or "verkle" in network else "" ), From 284e14e27fe8940bcc77b8f2d98922ff3ae8cc40 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 16:41:56 +0100 Subject: [PATCH 31/90] fix prauge override --- src/el/geth/geth_launcher.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 99b99ae22..cc9379c88 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -277,7 +277,7 @@ def get_config( # Override prague fork timestamp if electra_fork_epoch not Null "{0}".format( "--override.prague=" - + final_genesis_timestamp * 32 * 12 * electra_fork_epoch + + final_genesis_timestamp + (32 * 12 * electra_fork_epoch) if electra_fork_epoch != None or "verkle" in network else "" ), From a1ebbe41ed027328dd39481d84b4459c9e121e43 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 16:55:32 +0100 Subject: [PATCH 32/90] enable verkle shadowfork --- src/el/geth/geth_launcher.star | 7 +++++-- src/participant_network.star | 20 ++++++++++--------- .../el_cl_genesis/el_cl_genesis_data.star | 2 ++ .../el_cl_genesis_generator.star | 8 +++++++- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index cc9379c88..e33b777c6 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -157,6 +157,7 @@ def launch( launcher.electra_fork_epoch, launcher.final_genesis_timestamp, launcher.cancun_time, + launcher.prague_time, persistent, el_volume_size, tolerations, @@ -208,6 +209,7 @@ def get_config( electra_fork_epoch, final_genesis_timestamp, cancun_time, + prague_time, persistent, el_volume_size, tolerations, @@ -276,8 +278,7 @@ def get_config( ), # Override prague fork timestamp if electra_fork_epoch not Null "{0}".format( - "--override.prague=" - + final_genesis_timestamp + (32 * 12 * electra_fork_epoch) + "--override.prague=" + prague_time if electra_fork_epoch != None or "verkle" in network else "" ), @@ -411,6 +412,7 @@ def new_geth_launcher( final_genesis_timestamp, capella_fork_epoch, cancun_time, + prague_time, electra_fork_epoch=None, ): return struct( @@ -421,5 +423,6 @@ def new_geth_launcher( final_genesis_timestamp=final_genesis_timestamp, capella_fork_epoch=capella_fork_epoch, cancun_time=cancun_time, + prague_time=prague_time, electra_fork_epoch=electra_fork_epoch, ) diff --git a/src/participant_network.star b/src/participant_network.star index fe253707c..d2760507b 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -71,6 +71,7 @@ def launch_participant_network( num_participants = len(participants) latest_block = "" cancun_time = 0 + prague_time = 0 if ( network_params.network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network_params.network @@ -106,10 +107,6 @@ def launch_participant_network( # wait="800s", # ) - ethereum_genesis_generator_image = ( - "parithoshj/ethereum-genesis-generator:shadowfork-from-file" - ) - # We are running a kurtosis or shadowfork network plan.print("Generating cl validator key stores") validator_data = None @@ -144,12 +141,12 @@ def launch_participant_network( total_number_of_validator_keys += participant.validator_count plan.print("Generating EL CL data") - if constants.NETWORK_NAME.shadowfork in network_params.network: - ethereum_genesis_generator_image = ( - "parithoshj/ethereum-genesis-generator:shadowfork-from-file" - ) + # if constants.NETWORK_NAME.shadowfork in network_params.network: + # ethereum_genesis_generator_image = ( + # "parithoshj/ethereum-genesis-generator:shadowfork-from-file" + # ) # we are running bellatrix genesis (deprecated) - will be removed in the future - elif ( + if ( network_params.capella_fork_epoch > 0 and network_params.electra_fork_epoch == None ): @@ -212,6 +209,7 @@ def launch_participant_network( dummy.files_artifacts[0], constants.GENESIS_VALIDATORS_ROOT[network_params.network], cancun_time, + prague_time, ) final_genesis_timestamp = constants.GENESIS_TIME[network_params.network] network_id = constants.NETWORK_ID[network_params.network] @@ -230,6 +228,7 @@ def launch_participant_network( el_cl_genesis_data_uuid.files_artifacts[0], genesis_validators_root, cancun_time, + prague_time, ) final_genesis_timestamp = shared_utils.read_genesis_timestamp_from_config( plan, el_cl_genesis_data_uuid.files_artifacts[0] @@ -256,6 +255,7 @@ def launch_participant_network( el_cl_genesis_data_uuid.files_artifacts[0], genesis_validators_root, cancun_time, + prague_time, ) final_genesis_timestamp = shared_utils.read_genesis_timestamp_from_config( plan, el_cl_genesis_data_uuid.files_artifacts[0] @@ -275,6 +275,7 @@ def launch_participant_network( final_genesis_timestamp, network_params.capella_fork_epoch, el_cl_data.cancun_time, + el_cl_data.prague_time, network_params.electra_fork_epoch, ), "launch_method": geth.launch, @@ -288,6 +289,7 @@ def launch_participant_network( final_genesis_timestamp, network_params.capella_fork_epoch, el_cl_data.cancun_time, + el_cl_data.prague_time, network_params.electra_fork_epoch, ), "launch_method": geth.launch, diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_data.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_data.star index 312b8d6ba..154f89728 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_data.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_data.star @@ -2,9 +2,11 @@ def new_el_cl_genesis_data( files_artifact_uuid, genesis_validators_root, cancun_time, + prague_time, ): return struct( files_artifact_uuid=files_artifact_uuid, genesis_validators_root=genesis_validators_root, cancun_time=cancun_time, + prague_time=prague_time, ) diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star index bf3975ab4..762c20359 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star @@ -94,8 +94,14 @@ def generate_el_cl_genesis_data( files={"/data": genesis.files_artifacts[0]}, ) + prague_time = plan.run_sh( + run="jq .config.pragueTime /data/network-configs/genesis.json | tr -d '\n'", + image="badouralix/curl-jq", + files={"/data": genesis.files_artifacts[0]}, + ) + result = el_cl_genesis_data.new_el_cl_genesis_data( - genesis.files_artifacts[0], genesis_validators_root.output, cancun_time.output + genesis.files_artifacts[0], genesis_validators_root.output, cancun_time.output, prague_time.output ) return result From bcda9b15d21ef27a91bbfc6fd1289dfc80a78441 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 16:55:48 +0100 Subject: [PATCH 33/90] lint --- .../el_cl_genesis/el_cl_genesis_generator.star | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star index 762c20359..323eecb10 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star @@ -101,7 +101,10 @@ def generate_el_cl_genesis_data( ) result = el_cl_genesis_data.new_el_cl_genesis_data( - genesis.files_artifacts[0], genesis_validators_root.output, cancun_time.output, prague_time.output + genesis.files_artifacts[0], + genesis_validators_root.output, + cancun_time.output, + prague_time.output, ) return result From a5c78ab0519f0b60aa77709c86ce63fe19b65e7b Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 16:57:56 +0100 Subject: [PATCH 34/90] add verkle to readme --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index fb60799b0..34e43ea79 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,15 @@ network_params: ... ``` +##### Shadowforking custom verkle networks +In order to enable shadowfork capabilities for verkle networks, you need to define electra and mention verkle in the network name after shadowfork. +```yaml +... +network_params: + electra_fork_epoch: 1 + network: "holesky-shadowfork-verkle" +... +``` #### Taints and tolerations It is possible to run the package on a Kubernetes cluster with taints and tolerations. This is done by adding the tolerations to the `tolerations` field in the `network_params.yaml` file. For example: From 076c3b3a001d6dcc615753d3c23898442f81c190 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 17:05:10 +0100 Subject: [PATCH 35/90] bump eggs --- src/participant_network.star | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/participant_network.star b/src/participant_network.star index d2760507b..a8d99df37 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -159,7 +159,7 @@ def launch_participant_network( and network_params.electra_fork_epoch == None ): ethereum_genesis_generator_image = ( - "ethpandaops/ethereum-genesis-generator:2.0.8" + "ethpandaops/ethereum-genesis-generator:2.0.9" ) # we are running electra - experimental elif network_params.electra_fork_epoch != None: @@ -169,7 +169,7 @@ def launch_participant_network( ) else: ethereum_genesis_generator_image = ( - "ethpandaops/ethereum-genesis-generator:3.0.0-rc.18" + "ethpandaops/ethereum-genesis-generator:3.0.0-rc.19" ) else: fail( From 3c9ea348ab7edf45ab409853e5f517d3c0f52b5e Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 17:45:40 +0100 Subject: [PATCH 36/90] fix logic --- src/el/geth/geth_launcher.star | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index e33b777c6..496515a14 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -216,10 +216,8 @@ def get_config( ): # TODO: Remove this once electra fork has path based storage scheme implemented if ( - electra_fork_epoch != None - or constants.NETWORK_NAME.verkle in network - and constants.NETWORK_NAME.shadowfork not in network - ): + electra_fork_epoch != None or constants.NETWORK_NAME.verkle in network + ) and constants.NETWORK_NAME.shadowfork not in network: if ( electra_fork_epoch == 0 or constants.NETWORK_NAME.verkle + "-gen" in network ): # verkle-gen @@ -240,9 +238,7 @@ def get_config( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.json", ) - elif ( - constants.NETWORK_NAME.shadowfork in network - ): # if its a shadowfork we dont need to init the datadir + elif constants.NETWORK_NAME.shadowfork in network: init_datadir_cmd_str = "mkdir -p /data/geth/execution-data && wget -qO- https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar | tar xvf - -C /data/geth/execution-data --strip-components=1" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( From 82473724cba2b5a113c777f951b36417bad3b534 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 18:04:35 +0100 Subject: [PATCH 37/90] bump eggs --- src/participant_network.star | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/participant_network.star b/src/participant_network.star index a8d99df37..33e6bf020 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -91,7 +91,7 @@ def launch_participant_network( image="badouralix/curl-jq", store=[StoreSpec(src="/shadowfork", name="latest_blocks")], ) - + # maybe we can do the copy in the same step as the fetch? # for ( # participant # ) in participants: # fetch the latest state for each EL participant @@ -141,10 +141,7 @@ def launch_participant_network( total_number_of_validator_keys += participant.validator_count plan.print("Generating EL CL data") - # if constants.NETWORK_NAME.shadowfork in network_params.network: - # ethereum_genesis_generator_image = ( - # "parithoshj/ethereum-genesis-generator:shadowfork-from-file" - # ) + # we are running bellatrix genesis (deprecated) - will be removed in the future if ( network_params.capella_fork_epoch > 0 @@ -159,7 +156,7 @@ def launch_participant_network( and network_params.electra_fork_epoch == None ): ethereum_genesis_generator_image = ( - "ethpandaops/ethereum-genesis-generator:2.0.9" + "ethpandaops/ethereum-genesis-generator:2.0.10" ) # we are running electra - experimental elif network_params.electra_fork_epoch != None: From 35d19be87550f6bd752abadc6f3de84eaf1182b2 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 18:06:44 +0100 Subject: [PATCH 38/90] add testcase --- .github/tests/holesky-shadowfork-verkle.yaml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/tests/holesky-shadowfork-verkle.yaml diff --git a/.github/tests/holesky-shadowfork-verkle.yaml b/.github/tests/holesky-shadowfork-verkle.yaml new file mode 100644 index 000000000..5df1b20cc --- /dev/null +++ b/.github/tests/holesky-shadowfork-verkle.yaml @@ -0,0 +1,15 @@ +participants: + - el_client_type: geth + el_client_image: ethpandaops/geth:verkle-costs-activation-switch-0f04aba + cl_client_type: lighthouse + cl_client_image: ethpandaops/lighthouse:verkle-trees-capella-2ffb8a9 + - el_client_type: geth + el_client_image: ethpandaops/geth:verkle-costs-activation-switch-0f04aba + cl_client_type: lodestar + cl_client_image: ethpandaops/lodestar:g11tech-verge-815364b +network_params: + electra_fork_epoch: 2 + network: holesky-shadowfork-verkle +additional_services: + - dora +snooper_enabled: true From 8dab8c4761d547303f61e9422376b769b09ff69a Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 22:40:11 +0100 Subject: [PATCH 39/90] disable checkpoint sync for shadowforks --- src/cl/lodestar/lodestar_launcher.star | 7 +++++++ src/cl/prysm/prysm_launcher.star | 6 ++++++ src/cl/teku/teku_launcher.star | 7 +++++++ src/el/geth/geth_launcher.star | 7 ++++--- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/cl/lodestar/lodestar_launcher.star b/src/cl/lodestar/lodestar_launcher.star index 243218f4b..eacf214c1 100644 --- a/src/cl/lodestar/lodestar_launcher.star +++ b/src/cl/lodestar/lodestar_launcher.star @@ -368,6 +368,13 @@ def get_beacon_config( plan, el_cl_genesis_data.files_artifact_uuid ) ) + elif constants.NETWORK_NAME.shadowfork in network: + cmd.append( + "--bootnodes=" + + shared_utils.get_devnet_enrs_list( + plan, el_cl_genesis_data.files_artifact_uuid + ) + ) else: # Devnets # TODO Remove once checkpoint sync is working for verkle if constants.NETWORK_NAME.verkle not in network: diff --git a/src/cl/prysm/prysm_launcher.star b/src/cl/prysm/prysm_launcher.star index 90b95cd65..6563b8b3f 100644 --- a/src/cl/prysm/prysm_launcher.star +++ b/src/cl/prysm/prysm_launcher.star @@ -377,6 +377,12 @@ def get_beacon_config( + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/boot_enr.yaml" ) + elif constants.NETWORK_NAME.shadowfork in network: + cmd.append( + "--bootstrap-node=" + + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + + "/boot_enr.yaml" + ) else: # Devnets # TODO Remove once checkpoint sync is working for verkle if constants.NETWORK_NAME.verkle not in network: diff --git a/src/cl/teku/teku_launcher.star b/src/cl/teku/teku_launcher.star index 400647c01..77351e7ee 100644 --- a/src/cl/teku/teku_launcher.star +++ b/src/cl/teku/teku_launcher.star @@ -433,6 +433,13 @@ def get_beacon_config( plan, el_cl_genesis_data.files_artifact_uuid ) ) + elif constants.NETWORK_NAME.shadowfork in network: + cmd.append( + "--p2p-discovery-bootnodes=" + + shared_utils.get_devnet_enrs_list( + plan, el_cl_genesis_data.files_artifact_uuid + ) + ) else: # Devnets # TODO Remove once checkpoint sync is working for verkle if constants.NETWORK_NAME.verkle not in network: diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 496515a14..24cc91150 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -272,10 +272,11 @@ def get_config( if electra_fork_epoch == 0 or "verkle-gen" in network else "" ), - # Override prague fork timestamp if electra_fork_epoch not Null + # Override prague fork timestamp if we are shadowforking for verkle "{0}".format( - "--override.prague=" + prague_time - if electra_fork_epoch != None or "verkle" in network + "--override.prague=" + str(prague_time) + if constants.NETWORK_NAME.shadowfork in network + and "verkle" in network else "" ), "{0}".format( From 809fb329688e219fdd3ed079d1cf8f1be98a7773 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 31 Jan 2024 22:41:13 +0100 Subject: [PATCH 40/90] fix lint --- src/el/geth/geth_launcher.star | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 24cc91150..636a025da 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -275,8 +275,7 @@ def get_config( # Override prague fork timestamp if we are shadowforking for verkle "{0}".format( "--override.prague=" + str(prague_time) - if constants.NETWORK_NAME.shadowfork in network - and "verkle" in network + if constants.NETWORK_NAME.shadowfork in network and "verkle" in network else "" ), "{0}".format( From fedab9ee1abcaa0d224578faec60860f7f2ec23e Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 2 Feb 2024 12:39:22 +0100 Subject: [PATCH 41/90] add a new service to fetch snapshots --- src/el/geth/geth_launcher.star | 3 ++- src/participant_network.star | 48 ++++++++++++++++++++++++---------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 636a025da..dd2238a81 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -239,7 +239,8 @@ def get_config( constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.json", ) elif constants.NETWORK_NAME.shadowfork in network: - init_datadir_cmd_str = "mkdir -p /data/geth/execution-data && wget -qO- https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar | tar xvf - -C /data/geth/execution-data --strip-components=1" + init_datadir_cmd_str = "echo shadowfork" + # mkdir -p /data/geth/execution-data && wget -qO- https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar | tar xvf - -C /data/geth/execution-data --strip-components=1" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, diff --git a/src/participant_network.star b/src/participant_network.star index 25cf4b893..53e95b722 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -91,21 +91,41 @@ def launch_participant_network( image="badouralix/curl-jq", store=[StoreSpec(src="/shadowfork", name="latest_blocks")], ) + # maybe we can do the copy in the same step as the fetch? - # for ( - # participant - # ) in participants: # fetch the latest state for each EL participant - # if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: - # geth_shadowfork_data = plan.run_sh( - # run="mkdir -p /data && \ - # wget https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar && \ - # tar -xf geth.tar -C /data", - # image="badouralix/curl-jq", - # store=[ - # StoreSpec(src="/data/geth", name="geth_shadowfork_data") - # ], - # wait="800s", - # ) + for index, participant in enumerate(participants): + cl_client_type = participant.cl_client_type + el_client_type = participant.el_client_type + + # Zero-pad the index using the calculated zfill value + index_str = shared_utils.zfill_custom( + index + 1, len(str(len(participants))) + ) + + el_service_name = "el-{0}-{1}-{2}".format( + index_str, el_client_type, cl_client_type + ) + if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: + geth_shadowfork_data = plan.add_service( + name="geth-shadowfork-data", + config=ServiceConfig( + image="rclone/rclone:1.55.1", + cmd=[ + "-c", + "copy -P mys3:ethpandaops-ethereum-node-snapshots/holesky/geth/latest /data/geth/execution-data --transfers=100 --checkers=200", + ], + files={ + "/data/geth/execution-data": Directory( + persistent_key="data-{0}".format(el_service_name) + ), + }, + env_vars={ + "RCLONE_CONFIG_MYS3_TYPE": "s3", + "RCLONE_CONFIG_MYS3_PROVIDER": "DigitalOcean", + "RCLONE_CONFIG_MYS3_ENDPOINT": "https://ams3.digitaloceanspaces.com", + }, + ), + ) # We are running a kurtosis or shadowfork network plan.print("Generating cl validator key stores") From 6a6e8f5c72d37ef64f00b90e1683ce99547434f0 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 2 Feb 2024 13:05:12 +0100 Subject: [PATCH 42/90] sketchy workaround --- src/el/geth/geth_launcher.star | 2 +- src/participant_network.star | 66 +++++++++++++++++----------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index dd2238a81..03e31c144 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -239,7 +239,7 @@ def get_config( constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.json", ) elif constants.NETWORK_NAME.shadowfork in network: - init_datadir_cmd_str = "echo shadowfork" + init_datadir_cmd_str = "apk add rclone && export RCLONE_CONFIG_MYS3_TYPE=s3;export RCLONE_CONFIG_MYS3_PROVIDER=DigitalOcean; export RCLONE_CONFIG_MYS3_ENDPOINT=https://ams3.digitaloceanspaces.com && rclone copy -P mys3:ethpandaops-ethereum-node-snapshots/holesky/geth/latest /data/geth/execution-data --transfers=100 --checkers=200" # mkdir -p /data/geth/execution-data && wget -qO- https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar | tar xvf - -C /data/geth/execution-data --strip-components=1" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( diff --git a/src/participant_network.star b/src/participant_network.star index 53e95b722..e32fc6199 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -93,39 +93,39 @@ def launch_participant_network( ) # maybe we can do the copy in the same step as the fetch? - for index, participant in enumerate(participants): - cl_client_type = participant.cl_client_type - el_client_type = participant.el_client_type - - # Zero-pad the index using the calculated zfill value - index_str = shared_utils.zfill_custom( - index + 1, len(str(len(participants))) - ) - - el_service_name = "el-{0}-{1}-{2}".format( - index_str, el_client_type, cl_client_type - ) - if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: - geth_shadowfork_data = plan.add_service( - name="geth-shadowfork-data", - config=ServiceConfig( - image="rclone/rclone:1.55.1", - cmd=[ - "-c", - "copy -P mys3:ethpandaops-ethereum-node-snapshots/holesky/geth/latest /data/geth/execution-data --transfers=100 --checkers=200", - ], - files={ - "/data/geth/execution-data": Directory( - persistent_key="data-{0}".format(el_service_name) - ), - }, - env_vars={ - "RCLONE_CONFIG_MYS3_TYPE": "s3", - "RCLONE_CONFIG_MYS3_PROVIDER": "DigitalOcean", - "RCLONE_CONFIG_MYS3_ENDPOINT": "https://ams3.digitaloceanspaces.com", - }, - ), - ) + # for index, participant in enumerate(participants): + # cl_client_type = participant.cl_client_type + # el_client_type = participant.el_client_type + + # # Zero-pad the index using the calculated zfill value + # index_str = shared_utils.zfill_custom( + # index + 1, len(str(len(participants))) + # ) + + # el_service_name = "el-{0}-{1}-{2}".format( + # index_str, el_client_type, cl_client_type + # ) + # if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: + # geth_shadowfork_data = plan.add_service( + # name="geth-shadowfork-data", + # config=ServiceConfig( + # image="rclone/rclone:1.55.1", + # cmd=[ + # "-c", + # "copy -P mys3:ethpandaops-ethereum-node-snapshots/holesky/geth/latest /data/geth/execution-data --transfers=100 --checkers=200", + # ], + # files={ + # "/data/geth/execution-data": Directory( + # persistent_key="data-{0}".format(el_service_name) + # ), + # }, + # env_vars={ + # "RCLONE_CONFIG_MYS3_TYPE": "s3", + # "RCLONE_CONFIG_MYS3_PROVIDER": "DigitalOcean", + # "RCLONE_CONFIG_MYS3_ENDPOINT": "https://ams3.digitaloceanspaces.com", + # }, + # ), + # ) # We are running a kurtosis or shadowfork network plan.print("Generating cl validator key stores") From 44eb92fc346ad22a96fde251bef376570df7c93c Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 2 Feb 2024 13:15:48 +0100 Subject: [PATCH 43/90] fix path for latest snapshot --- src/participant_network.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/participant_network.star b/src/participant_network.star index e32fc6199..b4b30dbc0 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -87,7 +87,7 @@ def launch_participant_network( ] # overload the network id to match the network name latest_block = plan.run_sh( # fetch the latest block run="mkdir -p /shadowfork && \ - curl -o /shadowfork/latest_block.json https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/latest_block.json", + curl -o /shadowfork/latest_block.json https://ethpandaops-ethereum-node-snapshots.ams3.digitaloceanspaces.com/holesky/geth/latest/latest_snapshot_block.json", image="badouralix/curl-jq", store=[StoreSpec(src="/shadowfork", name="latest_blocks")], ) From 9740cb4c066c7ba2e1153102cc8d6f4f09a0a2b4 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 2 Feb 2024 15:45:13 +0100 Subject: [PATCH 44/90] fix peering issues --- src/cl/lighthouse/lighthouse_launcher.star | 9 +-------- src/cl/lodestar/lodestar_launcher.star | 9 +-------- src/cl/nimbus/nimbus_launcher.star | 2 +- src/cl/prysm/prysm_launcher.star | 8 +------- src/cl/teku/teku_launcher.star | 2 +- 5 files changed, 5 insertions(+), 25 deletions(-) diff --git a/src/cl/lighthouse/lighthouse_launcher.star b/src/cl/lighthouse/lighthouse_launcher.star index 07d760a38..7d30ce898 100644 --- a/src/cl/lighthouse/lighthouse_launcher.star +++ b/src/cl/lighthouse/lighthouse_launcher.star @@ -381,7 +381,7 @@ def get_beacon_config( if network not in constants.PUBLIC_NETWORKS: cmd.append("--testnet-dir=" + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER) - if network == constants.NETWORK_NAME.kurtosis: + if network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network: if boot_cl_client_ctxs != None: cmd.append( "--boot-nodes=" @@ -411,13 +411,6 @@ def get_beacon_config( plan, el_cl_genesis_data.files_artifact_uuid ) ) - elif constants.NETWORK_NAME.shadowfork in network: - cmd.append( - "--boot-nodes=" - + shared_utils.get_devnet_enrs_list( - plan, el_cl_genesis_data.files_artifact_uuid - ) - ) else: # Devnets # TODO Remove once checkpoint sync is working for verkle if constants.NETWORK_NAME.verkle not in network: diff --git a/src/cl/lodestar/lodestar_launcher.star b/src/cl/lodestar/lodestar_launcher.star index eacf214c1..7a7f1879a 100644 --- a/src/cl/lodestar/lodestar_launcher.star +++ b/src/cl/lodestar/lodestar_launcher.star @@ -349,7 +349,7 @@ def get_beacon_config( + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.ssz" ) - if network == constants.NETWORK_NAME.kurtosis: + if network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network: if bootnode_contexts != None: cmd.append( "--bootnodes=" @@ -368,13 +368,6 @@ def get_beacon_config( plan, el_cl_genesis_data.files_artifact_uuid ) ) - elif constants.NETWORK_NAME.shadowfork in network: - cmd.append( - "--bootnodes=" - + shared_utils.get_devnet_enrs_list( - plan, el_cl_genesis_data.files_artifact_uuid - ) - ) else: # Devnets # TODO Remove once checkpoint sync is working for verkle if constants.NETWORK_NAME.verkle not in network: diff --git a/src/cl/nimbus/nimbus_launcher.star b/src/cl/nimbus/nimbus_launcher.star index 8148725c2..781496fa8 100644 --- a/src/cl/nimbus/nimbus_launcher.star +++ b/src/cl/nimbus/nimbus_launcher.star @@ -394,7 +394,7 @@ def get_beacon_config( + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/bootstrap_nodes.txt" ) - if network == constants.NETWORK_NAME.kurtosis: + if network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network: if bootnode_contexts == None: cmd.append("--subscribe-all-subnets") else: diff --git a/src/cl/prysm/prysm_launcher.star b/src/cl/prysm/prysm_launcher.star index 6563b8b3f..ef57fd6a3 100644 --- a/src/cl/prysm/prysm_launcher.star +++ b/src/cl/prysm/prysm_launcher.star @@ -360,7 +360,7 @@ def get_beacon_config( + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.ssz", ) - if network == constants.NETWORK_NAME.kurtosis: + if network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network: if bootnode_contexts != None: for ctx in bootnode_contexts[: constants.MAX_ENR_ENTRIES]: cmd.append("--peer=" + ctx.multiaddr) @@ -377,12 +377,6 @@ def get_beacon_config( + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/boot_enr.yaml" ) - elif constants.NETWORK_NAME.shadowfork in network: - cmd.append( - "--bootstrap-node=" - + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER - + "/boot_enr.yaml" - ) else: # Devnets # TODO Remove once checkpoint sync is working for verkle if constants.NETWORK_NAME.verkle not in network: diff --git a/src/cl/teku/teku_launcher.star b/src/cl/teku/teku_launcher.star index 77351e7ee..da5e7e229 100644 --- a/src/cl/teku/teku_launcher.star +++ b/src/cl/teku/teku_launcher.star @@ -403,7 +403,7 @@ def get_beacon_config( + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.ssz" ) - if network == constants.NETWORK_NAME.kurtosis: + if network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network: if bootnode_contexts != None: cmd.append( "--p2p-discovery-bootnodes=" From 4882199c5f3e20a763d83888828605502745a1cc Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 2 Feb 2024 15:45:42 +0100 Subject: [PATCH 45/90] fix lint --- src/cl/lighthouse/lighthouse_launcher.star | 5 ++++- src/cl/lodestar/lodestar_launcher.star | 5 ++++- src/cl/nimbus/nimbus_launcher.star | 5 ++++- src/cl/prysm/prysm_launcher.star | 5 ++++- src/cl/teku/teku_launcher.star | 5 ++++- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/cl/lighthouse/lighthouse_launcher.star b/src/cl/lighthouse/lighthouse_launcher.star index 7d30ce898..403774a14 100644 --- a/src/cl/lighthouse/lighthouse_launcher.star +++ b/src/cl/lighthouse/lighthouse_launcher.star @@ -381,7 +381,10 @@ def get_beacon_config( if network not in constants.PUBLIC_NETWORKS: cmd.append("--testnet-dir=" + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER) - if network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network: + if ( + network == constants.NETWORK_NAME.kurtosis + or constants.NETWORK_NAME.shadowfork in network + ): if boot_cl_client_ctxs != None: cmd.append( "--boot-nodes=" diff --git a/src/cl/lodestar/lodestar_launcher.star b/src/cl/lodestar/lodestar_launcher.star index 7a7f1879a..f7713edd7 100644 --- a/src/cl/lodestar/lodestar_launcher.star +++ b/src/cl/lodestar/lodestar_launcher.star @@ -349,7 +349,10 @@ def get_beacon_config( + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.ssz" ) - if network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network: + if ( + network == constants.NETWORK_NAME.kurtosis + or constants.NETWORK_NAME.shadowfork in network + ): if bootnode_contexts != None: cmd.append( "--bootnodes=" diff --git a/src/cl/nimbus/nimbus_launcher.star b/src/cl/nimbus/nimbus_launcher.star index 781496fa8..18443baf3 100644 --- a/src/cl/nimbus/nimbus_launcher.star +++ b/src/cl/nimbus/nimbus_launcher.star @@ -394,7 +394,10 @@ def get_beacon_config( + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/bootstrap_nodes.txt" ) - if network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network: + if ( + network == constants.NETWORK_NAME.kurtosis + or constants.NETWORK_NAME.shadowfork in network + ): if bootnode_contexts == None: cmd.append("--subscribe-all-subnets") else: diff --git a/src/cl/prysm/prysm_launcher.star b/src/cl/prysm/prysm_launcher.star index ef57fd6a3..b51555c7f 100644 --- a/src/cl/prysm/prysm_launcher.star +++ b/src/cl/prysm/prysm_launcher.star @@ -360,7 +360,10 @@ def get_beacon_config( + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.ssz", ) - if network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network: + if ( + network == constants.NETWORK_NAME.kurtosis + or constants.NETWORK_NAME.shadowfork in network + ): if bootnode_contexts != None: for ctx in bootnode_contexts[: constants.MAX_ENR_ENTRIES]: cmd.append("--peer=" + ctx.multiaddr) diff --git a/src/cl/teku/teku_launcher.star b/src/cl/teku/teku_launcher.star index da5e7e229..4b7b58006 100644 --- a/src/cl/teku/teku_launcher.star +++ b/src/cl/teku/teku_launcher.star @@ -403,7 +403,10 @@ def get_beacon_config( + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.ssz" ) - if network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network: + if ( + network == constants.NETWORK_NAME.kurtosis + or constants.NETWORK_NAME.shadowfork in network + ): if bootnode_contexts != None: cmd.append( "--p2p-discovery-bootnodes=" From e2c8c0656ad878180418ab0aa7f26abfa31c66a7 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 2 Feb 2024 15:58:26 +0100 Subject: [PATCH 46/90] enable syncing any chain --- src/el/geth/geth_launcher.star | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 03e31c144..01e1eac87 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -239,8 +239,12 @@ def get_config( constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.json", ) elif constants.NETWORK_NAME.shadowfork in network: - init_datadir_cmd_str = "apk add rclone && export RCLONE_CONFIG_MYS3_TYPE=s3;export RCLONE_CONFIG_MYS3_PROVIDER=DigitalOcean; export RCLONE_CONFIG_MYS3_ENDPOINT=https://ams3.digitaloceanspaces.com && rclone copy -P mys3:ethpandaops-ethereum-node-snapshots/holesky/geth/latest /data/geth/execution-data --transfers=100 --checkers=200" - # mkdir -p /data/geth/execution-data && wget -qO- https://holesky-shadowfork.fra1.cdn.digitaloceanspaces.com/geth.tar | tar xvf - -C /data/geth/execution-data --strip-components=1" + base_network = network.split("-shadowfork")[0] + init_datadir_cmd_str = ( + "apk add rclone && export RCLONE_CONFIG_MYS3_TYPE=s3;export RCLONE_CONFIG_MYS3_PROVIDER=DigitalOcean; export RCLONE_CONFIG_MYS3_ENDPOINT=https://ams3.digitaloceanspaces.com && rclone copy -P mys3:ethpandaops-ethereum-node-snapshots/" + + base_network + + "/geth/latest /data/geth/execution-data --transfers=100 --checkers=200" + ) else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, From 34552658fa96eb16e6809f5414c0f42655adc118 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 2 Feb 2024 16:21:12 +0100 Subject: [PATCH 47/90] add latest snapshot to any network --- src/participant_network.star | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/participant_network.star b/src/participant_network.star index b4b30dbc0..058163304 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -79,15 +79,17 @@ def launch_participant_network( if ( constants.NETWORK_NAME.shadowfork in network_params.network ): # shadowfork requires some preparation - network_name = network_params.network.split("-shadowfork")[ + base_network = network_params.network.split("-shadowfork")[ 0 ] # overload the network name to remove the shadowfork suffix network_id = constants.NETWORK_ID[ - network_name + base_network ] # overload the network id to match the network name latest_block = plan.run_sh( # fetch the latest block run="mkdir -p /shadowfork && \ - curl -o /shadowfork/latest_block.json https://ethpandaops-ethereum-node-snapshots.ams3.digitaloceanspaces.com/holesky/geth/latest/latest_snapshot_block.json", + curl -o /shadowfork/latest_block.json https://ethpandaops-ethereum-node-snapshots.ams3.digitaloceanspaces.com/" + + base_network + + "/geth/latest/latest_snapshot_block.json", image="badouralix/curl-jq", store=[StoreSpec(src="/shadowfork", name="latest_blocks")], ) From b0a8f733d574b7dc808acc9b60bafd353138cabc Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 2 Feb 2024 17:13:48 +0100 Subject: [PATCH 48/90] enable ephemery shadowforking --- src/package_io/constants.star | 1 + src/participant_network.star | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/package_io/constants.star b/src/package_io/constants.star index b676817ea..ce7cd050e 100644 --- a/src/package_io/constants.star +++ b/src/package_io/constants.star @@ -98,6 +98,7 @@ DEPOSIT_CONTRACT_ADDRESS = { "goerli": "0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b", "sepolia": "0x7f02C3E3c98b133055B8B348B2Ac625669Ed295D", "holesky": "0x4242424242424242424242424242424242424242", + "ephemery": "0x4242424242424242424242424242424242424242", } GENESIS_TIME = { diff --git a/src/participant_network.star b/src/participant_network.star index 058163304..7a2625ecc 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -82,9 +82,16 @@ def launch_participant_network( base_network = network_params.network.split("-shadowfork")[ 0 ] # overload the network name to remove the shadowfork suffix - network_id = constants.NETWORK_ID[ - base_network - ] # overload the network id to match the network name + if constants.NETWORK_NAME.ephemery in base_network: + chain_id = plan.run_sh( + run="curl -s https://ephemery.dev/latest/config.yaml | yq .DEPOSIT_CHAIN_ID | tr -d '\n'", + image="linuxserver/yq", + ) + network_id = chain_id.output + else: + network_id = constants.NETWORK_ID[ + base_network + ] # overload the network id to match the network name latest_block = plan.run_sh( # fetch the latest block run="mkdir -p /shadowfork && \ curl -o /shadowfork/latest_block.json https://ethpandaops-ethereum-node-snapshots.ams3.digitaloceanspaces.com/" From a65790f664c1f219659debbe119e296c46a69a22 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Mon, 5 Feb 2024 09:46:57 +0100 Subject: [PATCH 49/90] rework the way data is stored --- src/participant_network.star | 40 ++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/participant_network.star b/src/participant_network.star index 7a2625ecc..9803bb4f3 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -114,27 +114,27 @@ def launch_participant_network( # el_service_name = "el-{0}-{1}-{2}".format( # index_str, el_client_type, cl_client_type # ) - # if participant.el_client_type == constants.EL_CLIENT_TYPE.geth: - # geth_shadowfork_data = plan.add_service( - # name="geth-shadowfork-data", - # config=ServiceConfig( - # image="rclone/rclone:1.55.1", - # cmd=[ - # "-c", - # "copy -P mys3:ethpandaops-ethereum-node-snapshots/holesky/geth/latest /data/geth/execution-data --transfers=100 --checkers=200", - # ], - # files={ - # "/data/geth/execution-data": Directory( - # persistent_key="data-{0}".format(el_service_name) - # ), - # }, - # env_vars={ - # "RCLONE_CONFIG_MYS3_TYPE": "s3", - # "RCLONE_CONFIG_MYS3_PROVIDER": "DigitalOcean", - # "RCLONE_CONFIG_MYS3_ENDPOINT": "https://ams3.digitaloceanspaces.com", - # }, - # ), + # shadowfork_data = plan.add_service( + # name="geth-shadowfork-data", + # config=ServiceConfig( + # image="rclone/rclone:1.55.1", + # cmd=[ + # "-c", + # "copy -P mys3:ethpandaops-ethereum-node-snapshots/"+ base_network +"/"+ el_client_type +"/latest /data/"+ el_client_type +"/execution-data --transfers=100 --checkers=200", + # ], + # files={ + # "/data/"+ el_client_type +"/execution-data": Directory( + # persistent_key="data-{0}".format(el_service_name), + # size = constants.VOLUME_SIZE[base_network][el_client_type + "_volume_size"] + # ), + # }, + # env_vars={ + # "RCLONE_CONFIG_MYS3_TYPE": "s3", + # "RCLONE_CONFIG_MYS3_PROVIDER": "DigitalOcean", + # "RCLONE_CONFIG_MYS3_ENDPOINT": "https://ams3.digitaloceanspaces.com", + # }, # ) + # ) # We are running a kurtosis or shadowfork network plan.print("Generating cl validator key stores") From 90aac2deec6921eedfd52039a427ad8959eb9bee Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Mon, 5 Feb 2024 14:28:03 +0100 Subject: [PATCH 50/90] add file to pvc --- src/el/geth/geth_launcher.star | 11 +++--- src/participant_network.star | 66 +++++++++++++++++----------------- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 01e1eac87..1045b6346 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -240,11 +240,12 @@ def get_config( ) elif constants.NETWORK_NAME.shadowfork in network: base_network = network.split("-shadowfork")[0] - init_datadir_cmd_str = ( - "apk add rclone && export RCLONE_CONFIG_MYS3_TYPE=s3;export RCLONE_CONFIG_MYS3_PROVIDER=DigitalOcean; export RCLONE_CONFIG_MYS3_ENDPOINT=https://ams3.digitaloceanspaces.com && rclone copy -P mys3:ethpandaops-ethereum-node-snapshots/" - + base_network - + "/geth/latest /data/geth/execution-data --transfers=100 --checkers=200" - ) + init_datadir_cmd_str = ("echo shadowfork") + # init_datadir_cmd_str = ( + # "apk add rclone && export RCLONE_CONFIG_MYS3_TYPE=s3;export RCLONE_CONFIG_MYS3_PROVIDER=DigitalOcean; export RCLONE_CONFIG_MYS3_ENDPOINT=https://ams3.digitaloceanspaces.com && rclone copy -P mys3:ethpandaops-ethereum-node-snapshots/" + # + base_network + # + "/geth/latest /data/geth/execution-data --transfers=100 --checkers=200" + # ) else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, diff --git a/src/participant_network.star b/src/participant_network.star index 9803bb4f3..03a74585e 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -102,39 +102,39 @@ def launch_participant_network( ) # maybe we can do the copy in the same step as the fetch? - # for index, participant in enumerate(participants): - # cl_client_type = participant.cl_client_type - # el_client_type = participant.el_client_type - - # # Zero-pad the index using the calculated zfill value - # index_str = shared_utils.zfill_custom( - # index + 1, len(str(len(participants))) - # ) - - # el_service_name = "el-{0}-{1}-{2}".format( - # index_str, el_client_type, cl_client_type - # ) - # shadowfork_data = plan.add_service( - # name="geth-shadowfork-data", - # config=ServiceConfig( - # image="rclone/rclone:1.55.1", - # cmd=[ - # "-c", - # "copy -P mys3:ethpandaops-ethereum-node-snapshots/"+ base_network +"/"+ el_client_type +"/latest /data/"+ el_client_type +"/execution-data --transfers=100 --checkers=200", - # ], - # files={ - # "/data/"+ el_client_type +"/execution-data": Directory( - # persistent_key="data-{0}".format(el_service_name), - # size = constants.VOLUME_SIZE[base_network][el_client_type + "_volume_size"] - # ), - # }, - # env_vars={ - # "RCLONE_CONFIG_MYS3_TYPE": "s3", - # "RCLONE_CONFIG_MYS3_PROVIDER": "DigitalOcean", - # "RCLONE_CONFIG_MYS3_ENDPOINT": "https://ams3.digitaloceanspaces.com", - # }, - # ) - # ) + for index, participant in enumerate(participants): + cl_client_type = participant.cl_client_type + el_client_type = participant.el_client_type + + # Zero-pad the index using the calculated zfill value + index_str = shared_utils.zfill_custom( + index + 1, len(str(len(participants))) + ) + + el_service_name = "el-{0}-{1}-{2}".format( + index_str, el_client_type, cl_client_type + ) + shadowfork_data = plan.add_service( + name="shadowfork-{0}".format(el_service_name), + config=ServiceConfig( + image="rclone/rclone:1.55.1", + cmd=[ + "rclone copy -P mys3:ethpandaops-ethereum-node-snapshots/"+ base_network +"/"+ el_client_type +"/latest /data/"+ el_client_type +"/execution-data" + ], + entrypoint=["/bin/sh", "-c"], + files={ + "/data/"+ el_client_type +"/execution-data": Directory( + persistent_key="data-{0}".format(el_service_name), + size = constants.VOLUME_SIZE[base_network][el_client_type + "_volume_size"] + ), + }, + env_vars={ + "RCLONE_CONFIG_MYS3_TYPE": "s3", + "RCLONE_CONFIG_MYS3_PROVIDER": "DigitalOcean", + "RCLONE_CONFIG_MYS3_ENDPOINT": "https://ams3.digitaloceanspaces.com", + }, + ) + ) # We are running a kurtosis or shadowfork network plan.print("Generating cl validator key stores") From e4d7264500b60b061971f81bd47909d8f8bcd373 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Mon, 5 Feb 2024 14:35:22 +0100 Subject: [PATCH 51/90] fix lint --- src/el/geth/geth_launcher.star | 2 +- src/participant_network.star | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 1045b6346..c667febc9 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -240,7 +240,7 @@ def get_config( ) elif constants.NETWORK_NAME.shadowfork in network: base_network = network.split("-shadowfork")[0] - init_datadir_cmd_str = ("echo shadowfork") + init_datadir_cmd_str = "echo shadowfork" # init_datadir_cmd_str = ( # "apk add rclone && export RCLONE_CONFIG_MYS3_TYPE=s3;export RCLONE_CONFIG_MYS3_PROVIDER=DigitalOcean; export RCLONE_CONFIG_MYS3_ENDPOINT=https://ams3.digitaloceanspaces.com && rclone copy -P mys3:ethpandaops-ethereum-node-snapshots/" # + base_network diff --git a/src/participant_network.star b/src/participant_network.star index 03a74585e..33d511320 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -119,13 +119,23 @@ def launch_participant_network( config=ServiceConfig( image="rclone/rclone:1.55.1", cmd=[ - "rclone copy -P mys3:ethpandaops-ethereum-node-snapshots/"+ base_network +"/"+ el_client_type +"/latest /data/"+ el_client_type +"/execution-data" + "rclone copy -P mys3:ethpandaops-ethereum-node-snapshots/" + + base_network + + "/" + + el_client_type + + "/latest /data/" + + el_client_type + + "/execution-data" ], entrypoint=["/bin/sh", "-c"], files={ - "/data/"+ el_client_type +"/execution-data": Directory( + "/data/" + + el_client_type + + "/execution-data": Directory( persistent_key="data-{0}".format(el_service_name), - size = constants.VOLUME_SIZE[base_network][el_client_type + "_volume_size"] + size=constants.VOLUME_SIZE[base_network][ + el_client_type + "_volume_size" + ], ), }, env_vars={ @@ -133,7 +143,7 @@ def launch_participant_network( "RCLONE_CONFIG_MYS3_PROVIDER": "DigitalOcean", "RCLONE_CONFIG_MYS3_ENDPOINT": "https://ams3.digitaloceanspaces.com", }, - ) + ), ) # We are running a kurtosis or shadowfork network From 79f36f4433e338e273e4f33d71c86dfdd6c32031 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 7 Feb 2024 13:00:25 +0100 Subject: [PATCH 52/90] add wait for download --- src/participant_network.star | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/participant_network.star b/src/participant_network.star index 33d511320..b8a5ffe92 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -126,6 +126,8 @@ def launch_participant_network( + "/latest /data/" + el_client_type + "/execution-data" + + "&& touch /tmp/finished" + + "&& tail -f /dev/null" ], entrypoint=["/bin/sh", "-c"], files={ @@ -145,6 +147,31 @@ def launch_participant_network( }, ), ) + for index, participant in enumerate(participants): + cl_client_type = participant.cl_client_type + el_client_type = participant.el_client_type + + # Zero-pad the index using the calculated zfill value + index_str = shared_utils.zfill_custom( + index + 1, len(str(len(participants))) + ) + + el_service_name = "el-{0}-{1}-{2}".format( + index_str, el_client_type, cl_client_type + ) + plan.wait( + service_name = "shadowfork-{0}".format(el_service_name), + recipe = ExecRecipe( + command = ["cat", "/tmp/finished"] + ), + field = "code", + assertion = "==", + target_value = 0, + interval = "1s", + timeout = "20m", + ) + + # We are running a kurtosis or shadowfork network plan.print("Generating cl validator key stores") From 2afc5a588a9bda057fa1a85d968501b13e46db48 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 7 Feb 2024 13:09:21 +0100 Subject: [PATCH 53/90] fix lint --- src/participant_network.star | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/participant_network.star b/src/participant_network.star index b8a5ffe92..fd9343f5b 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -160,19 +160,15 @@ def launch_participant_network( index_str, el_client_type, cl_client_type ) plan.wait( - service_name = "shadowfork-{0}".format(el_service_name), - recipe = ExecRecipe( - command = ["cat", "/tmp/finished"] - ), - field = "code", - assertion = "==", - target_value = 0, - interval = "1s", - timeout = "20m", + service_name="shadowfork-{0}".format(el_service_name), + recipe=ExecRecipe(command=["cat", "/tmp/finished"]), + field="code", + assertion="==", + target_value=0, + interval="1s", + timeout="20m", ) - - # We are running a kurtosis or shadowfork network plan.print("Generating cl validator key stores") validator_data = None From 31e337360b03c0afcc268b8c23fbfddbc20f38db Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 7 Feb 2024 15:17:31 +0100 Subject: [PATCH 54/90] fix cancun time --- src/el/geth/geth_launcher.star | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index c667febc9..48a45613f 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -287,11 +287,11 @@ def get_config( "{0}".format( "--{}".format(network) if network in constants.PUBLIC_NETWORKS else "" ), - # "{0}".format( - # "--override.cancun=" + cancun_time - # if constants.NETWORK_NAME.shadowfork in network - # else "" - # ), + "{0}".format( + "--override.cancun=" + cancun_time + if constants.NETWORK_NAME.shadowfork in network + else "" + ), "--networkid={0}".format(networkid), "--verbosity=" + verbosity_level, "--datadir=" + EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, From 66e87814f430a4d980c5ef2b7f9b9aa25eb11c1d Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 7 Feb 2024 16:00:14 +0100 Subject: [PATCH 55/90] fix cancun override, not for verkle --- src/el/geth/geth_launcher.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 48a45613f..c0405796a 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -289,7 +289,7 @@ def get_config( ), "{0}".format( "--override.cancun=" + cancun_time - if constants.NETWORK_NAME.shadowfork in network + if constants.NETWORK_NAME.shadowfork in network and "verkle" not in network else "" ), "--networkid={0}".format(networkid), From 8a9d3b7b150071465f75927a0fa76e582f0df47c Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 7 Feb 2024 16:03:00 +0100 Subject: [PATCH 56/90] fix fnt --- src/el/geth/geth_launcher.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index c0405796a..9f0e12403 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -289,7 +289,7 @@ def get_config( ), "{0}".format( "--override.cancun=" + cancun_time - if constants.NETWORK_NAME.shadowfork in network and "verkle" not in network + if constants.NETWORK_NAME.shadowfork in network and "verkle" not in network else "" ), "--networkid={0}".format(networkid), From f73aeaac35e17821a653b0de75933ccfdfd44fec Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 7 Feb 2024 16:24:45 +0100 Subject: [PATCH 57/90] fix geth verkle shadowfork --- src/el/geth/geth_launcher.star | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 9f0e12403..d2d8dfe5f 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -241,11 +241,6 @@ def get_config( elif constants.NETWORK_NAME.shadowfork in network: base_network = network.split("-shadowfork")[0] init_datadir_cmd_str = "echo shadowfork" - # init_datadir_cmd_str = ( - # "apk add rclone && export RCLONE_CONFIG_MYS3_TYPE=s3;export RCLONE_CONFIG_MYS3_PROVIDER=DigitalOcean; export RCLONE_CONFIG_MYS3_ENDPOINT=https://ams3.digitaloceanspaces.com && rclone copy -P mys3:ethpandaops-ethereum-node-snapshots/" - # + base_network - # + "/geth/latest /data/geth/execution-data --transfers=100 --checkers=200" - # ) else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, @@ -278,12 +273,6 @@ def get_config( if electra_fork_epoch == 0 or "verkle-gen" in network else "" ), - # Override prague fork timestamp if we are shadowforking for verkle - "{0}".format( - "--override.prague=" + str(prague_time) - if constants.NETWORK_NAME.shadowfork in network and "verkle" in network - else "" - ), "{0}".format( "--{}".format(network) if network in constants.PUBLIC_NETWORKS else "" ), @@ -342,6 +331,13 @@ def get_config( ] ) ) + if ( + constants.NETWORK_NAME.shadowfork in network and "verkle" in network + ): # verkle shadowfork + cmd.append("--override.prague=" + str(prague_time)) + cmd.append("--override.overlay-stride=10000") + cmd.append("--override.blockproof=true") + cmd.append("--clear.verkle.costs=true") elif network not in constants.PUBLIC_NETWORKS: cmd.append( "--bootnodes=" From 58e28b62dffc411e297db773af90326904078e33 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 7 Feb 2024 16:59:06 +0100 Subject: [PATCH 58/90] add shadowfork for all els --- src/el/besu/besu_launcher.star | 5 ++++- src/el/erigon/erigon_launcher.star | 10 +++++++++- src/el/geth/geth_launcher.star | 11 ++--------- src/el/nethermind/nethermind_launcher.star | 12 +++++++++++- src/participant_network.star | 3 +-- 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/el/besu/besu_launcher.star b/src/el/besu/besu_launcher.star index 12a282b27..618d12d92 100644 --- a/src/el/besu/besu_launcher.star +++ b/src/el/besu/besu_launcher.star @@ -208,7 +208,10 @@ def get_config( "--metrics-host=0.0.0.0", "--metrics-port={0}".format(METRICS_PORT_NUM), ] - if network not in constants.PUBLIC_NETWORKS: + if ( + network not in constants.PUBLIC_NETWORKS + or constants.NETWORK_NAME.shadowfork in network + ): cmd.append( "--genesis-file=" + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER diff --git a/src/el/erigon/erigon_launcher.star b/src/el/erigon/erigon_launcher.star index cc503ec2e..20c6316c2 100644 --- a/src/el/erigon/erigon_launcher.star +++ b/src/el/erigon/erigon_launcher.star @@ -134,6 +134,7 @@ def launch( extra_params, extra_env_vars, extra_labels, + launcher.cancun_time, persistent, el_volume_size, tolerations, @@ -181,6 +182,7 @@ def get_config( extra_params, extra_env_vars, extra_labels, + cancun_time, persistent, el_volume_size, tolerations, @@ -195,6 +197,11 @@ def get_config( "--chain={0}".format( network if network in constants.PUBLIC_NETWORKS else "dev" ), + "{0}".format( + "--override.cancun=" + cancun_time + if constants.NETWORK_NAME.shadowfork in network and "verkle" not in network + else "" + ), "--networkid={0}".format(networkid), "--log.console.verbosity=" + verbosity_level, "--datadir=" + EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, @@ -296,10 +303,11 @@ def get_config( ) -def new_erigon_launcher(el_cl_genesis_data, jwt_file, network, networkid): +def new_erigon_launcher(el_cl_genesis_data, jwt_file, network, networkid, cancun_time): return struct( el_cl_genesis_data=el_cl_genesis_data, jwt_file=jwt_file, network=network, networkid=networkid, + cancun_time=cancun_time, ) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index d2d8dfe5f..fc2e4d687 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -155,7 +155,6 @@ def launch( extra_labels, launcher.capella_fork_epoch, launcher.electra_fork_epoch, - launcher.final_genesis_timestamp, launcher.cancun_time, launcher.prague_time, persistent, @@ -207,7 +206,6 @@ def get_config( extra_labels, capella_fork_epoch, electra_fork_epoch, - final_genesis_timestamp, cancun_time, prague_time, persistent, @@ -223,7 +221,7 @@ def get_config( ): # verkle-gen init_datadir_cmd_str = "geth --datadir={0} --cache.preimages --override.prague={1} init {2}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, - final_genesis_timestamp, + prague_time, constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.json", ) else: # verkle @@ -238,9 +236,6 @@ def get_config( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.json", ) - elif constants.NETWORK_NAME.shadowfork in network: - base_network = network.split("-shadowfork")[0] - init_datadir_cmd_str = "echo shadowfork" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, @@ -269,7 +264,7 @@ def get_config( ), # Override prague fork timestamp if electra_fork_epoch == 0 "{0}".format( - "--override.prague=" + final_genesis_timestamp + "--override.prague=" + prague_time if electra_fork_epoch == 0 or "verkle-gen" in network else "" ), @@ -407,7 +402,6 @@ def new_geth_launcher( jwt_file, network, networkid, - final_genesis_timestamp, capella_fork_epoch, cancun_time, prague_time, @@ -418,7 +412,6 @@ def new_geth_launcher( jwt_file=jwt_file, network=network, networkid=networkid, - final_genesis_timestamp=final_genesis_timestamp, capella_fork_epoch=capella_fork_epoch, cancun_time=cancun_time, prague_time=prague_time, diff --git a/src/el/nethermind/nethermind_launcher.star b/src/el/nethermind/nethermind_launcher.star index e59bfcf1e..96c448a7f 100644 --- a/src/el/nethermind/nethermind_launcher.star +++ b/src/el/nethermind/nethermind_launcher.star @@ -208,10 +208,20 @@ def get_config( + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/chainspec.json" ) + elif constants.NETWORK_NAME.shadowfork in network: + cmd.append( + "--Init.ChainSpecPath=" + + constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + + "/chainspec.json" + ) + cmd.append("--config=" + network) else: cmd.append("--config=" + network) - if network == constants.NETWORK_NAME.kurtosis: + if ( + network == constants.NETWORK_NAME.kurtosis + or constants.NETWORK_NAME.shadowfork in network + ): if len(existing_el_clients) > 0: cmd.append( "--Network.StaticPeers=" diff --git a/src/participant_network.star b/src/participant_network.star index fd9343f5b..8f143acca 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -331,7 +331,6 @@ def launch_participant_network( jwt_file, network_params.network, network_id, - final_genesis_timestamp, network_params.capella_fork_epoch, el_cl_data.cancun_time, el_cl_data.prague_time, @@ -345,7 +344,6 @@ def launch_participant_network( jwt_file, network_params.network, network_id, - final_genesis_timestamp, network_params.capella_fork_epoch, el_cl_data.cancun_time, el_cl_data.prague_time, @@ -367,6 +365,7 @@ def launch_participant_network( jwt_file, network_params.network, network_id, + el_cl_data.cancun_time, ), "launch_method": erigon.launch, }, From 161979e5d1729940bec7030a8e47213ef6fa612b Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 7 Feb 2024 18:25:31 +0100 Subject: [PATCH 59/90] update tests --- .github/tests/holesky-shadowfork-verkle.yaml | 8 +++--- .github/tests/holesky-shadowfork.yaml | 4 +-- .github/tests/verkle-gen-devnet-3.yaml | 6 ++--- .github/tests/verkle-gen.yaml | 4 +-- .github/tests/verkle.yaml | 4 +-- src/el/geth/geth_launcher.star | 26 +++++--------------- src/participant_network.star | 8 +++++- 7 files changed, 27 insertions(+), 33 deletions(-) diff --git a/.github/tests/holesky-shadowfork-verkle.yaml b/.github/tests/holesky-shadowfork-verkle.yaml index 5df1b20cc..84c79cad6 100644 --- a/.github/tests/holesky-shadowfork-verkle.yaml +++ b/.github/tests/holesky-shadowfork-verkle.yaml @@ -1,15 +1,17 @@ participants: - el_client_type: geth - el_client_image: ethpandaops/geth:verkle-costs-activation-switch-0f04aba + el_client_image: ethpandaops/geth:transition-post-genesis-04b0304 cl_client_type: lighthouse cl_client_image: ethpandaops/lighthouse:verkle-trees-capella-2ffb8a9 - el_client_type: geth - el_client_image: ethpandaops/geth:verkle-costs-activation-switch-0f04aba + el_client_image: ethpandaops/geth:transition-post-genesis-04b0304 cl_client_type: lodestar cl_client_image: ethpandaops/lodestar:g11tech-verge-815364b network_params: - electra_fork_epoch: 2 + electra_fork_epoch: 1 network: holesky-shadowfork-verkle + genesis_delay: 300 additional_services: - dora snooper_enabled: true +persistent: true diff --git a/.github/tests/holesky-shadowfork.yaml b/.github/tests/holesky-shadowfork.yaml index 5ac3d9787..f26bd9c8c 100644 --- a/.github/tests/holesky-shadowfork.yaml +++ b/.github/tests/holesky-shadowfork.yaml @@ -8,5 +8,5 @@ network_params: network: holesky-shadowfork additional_services: - dora -ethereum_metrics_exporter_enabled: true -snoopy_enabled: true +snooper_enabled: true +persistent: true diff --git a/.github/tests/verkle-gen-devnet-3.yaml b/.github/tests/verkle-gen-devnet-3.yaml index 818ae0bcd..2416a7a92 100644 --- a/.github/tests/verkle-gen-devnet-3.yaml +++ b/.github/tests/verkle-gen-devnet-3.yaml @@ -1,13 +1,13 @@ participants: - el_client_type: geth - el_client_image: ethpandaops/geth:kaustinen-with-shapella-6d7b22c + el_client_image: ethpandaops/geth:kaustinen-with-shapella-0b110bd cl_client_type: lighthouse cl_client_image: ethpandaops/lighthouse:verkle-trees-capella-2ffb8a9 count: 2 - el_client_type: geth - el_client_image: ethpandaops/geth:kaustinen-with-shapella-6d7b22c + el_client_image: ethpandaops/geth:kaustinen-with-shapella-0b110bd cl_client_type: lodestar cl_client_image: ethpandaops/lodestar:g11tech-verge-815364b network_params: - network: verkle-gen-devnet-3 + network: verkle-gen-devnet-4 diff --git a/.github/tests/verkle-gen.yaml b/.github/tests/verkle-gen.yaml index 5164562da..bc50e1f07 100644 --- a/.github/tests/verkle-gen.yaml +++ b/.github/tests/verkle-gen.yaml @@ -1,11 +1,11 @@ participants: - el_client_type: geth - el_client_image: ethpandaops/geth:kaustinen-with-shapella-6d7b22c + el_client_image: ethpandaops/geth:kaustinen-with-shapella-0b110bd cl_client_type: lighthouse cl_client_image: ethpandaops/lighthouse:verkle-trees-capella-2ffb8a9 count: 2 - el_client_type: geth - el_client_image: ethpandaops/geth:kaustinen-with-shapella-6d7b22c + el_client_image: ethpandaops/geth:kaustinen-with-shapella-0b110bd cl_client_type: lodestar cl_client_image: ethpandaops/lodestar:g11tech-verge-815364b count: 2 diff --git a/.github/tests/verkle.yaml b/.github/tests/verkle.yaml index dc9de4217..fbcfe87c0 100644 --- a/.github/tests/verkle.yaml +++ b/.github/tests/verkle.yaml @@ -1,11 +1,11 @@ participants: - el_client_type: geth - el_client_image: ethpandaops/geth:transition-post-genesis-1d80ebd + el_client_image: ethpandaops/geth:transition-post-genesis-04b0304 cl_client_type: lighthouse cl_client_image: ethpandaops/lighthouse:verkle-trees-capella-2ffb8a9 count: 2 - el_client_type: geth - el_client_image: ethpandaops/geth:transition-post-genesis-1d80ebd + el_client_image: ethpandaops/geth:transition-post-genesis-04b0304 cl_client_type: lodestar cl_client_image: ethpandaops/lodestar:g11tech-verge-815364b network_params: diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index fc2e4d687..4057fc622 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -39,23 +39,19 @@ EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER = "/data/geth/execution-data" PRIVATE_IP_ADDRESS_PLACEHOLDER = "KURTOSIS_IP_ADDR_PLACEHOLDER" USED_PORTS = { - RPC_PORT_ID: shared_utils.new_port_spec( - RPC_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None - ), - WS_PORT_ID: shared_utils.new_port_spec( - WS_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None - ), + RPC_PORT_ID: shared_utils.new_port_spec(RPC_PORT_NUM, shared_utils.TCP_PROTOCOL), + WS_PORT_ID: shared_utils.new_port_spec(WS_PORT_NUM, shared_utils.TCP_PROTOCOL), TCP_DISCOVERY_PORT_ID: shared_utils.new_port_spec( - DISCOVERY_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None + DISCOVERY_PORT_NUM, shared_utils.TCP_PROTOCOL ), UDP_DISCOVERY_PORT_ID: shared_utils.new_port_spec( - DISCOVERY_PORT_NUM, shared_utils.UDP_PROTOCOL, wait=None + DISCOVERY_PORT_NUM, shared_utils.UDP_PROTOCOL ), ENGINE_RPC_PORT_ID: shared_utils.new_port_spec( - ENGINE_RPC_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None + ENGINE_RPC_PORT_NUM, shared_utils.TCP_PROTOCOL ), METRICS_PORT_ID: shared_utils.new_port_spec( - METRICS_PORT_NUM, shared_utils.TCP_PROTOCOL, wait=None + METRICS_PORT_NUM, shared_utils.TCP_PROTOCOL ), } @@ -376,16 +372,6 @@ def get_config( min_memory=el_min_mem, max_memory=el_max_mem, env_vars=extra_env_vars, - ready_conditions=ReadyCondition( - recipe=GetHttpRequestRecipe( - port_id=RPC_PORT_ID, - endpoint="/", - ), - field="code", - assertion="==", - target_value=200, - timeout="60m", - ), labels=shared_utils.label_maker( constants.EL_CLIENT_TYPE.geth, constants.CLIENT_TYPES.el, diff --git a/src/participant_network.star b/src/participant_network.star index 8f143acca..7d1a0745b 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -103,6 +103,11 @@ def launch_participant_network( # maybe we can do the copy in the same step as the fetch? for index, participant in enumerate(participants): + tolerations = input_parser.get_client_tolerations( + participant.el_tolerations, + participant.tolerations, + global_tolerations, + ) cl_client_type = participant.cl_client_type el_client_type = participant.el_client_type @@ -145,6 +150,7 @@ def launch_participant_network( "RCLONE_CONFIG_MYS3_PROVIDER": "DigitalOcean", "RCLONE_CONFIG_MYS3_ENDPOINT": "https://ams3.digitaloceanspaces.com", }, + tolerations=tolerations, ), ) for index, participant in enumerate(participants): @@ -166,7 +172,7 @@ def launch_participant_network( assertion="==", target_value=0, interval="1s", - timeout="20m", + timeout="6h", # 6 hours should be enough for the biggest network ) # We are running a kurtosis or shadowfork network From ded3820343be07538d487701a50b3612b853fc9b Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 7 Feb 2024 18:28:53 +0100 Subject: [PATCH 60/90] add input parser --- .../{verkle-gen-devnet-3.yaml => verkle-gen-devnet-4.yaml} | 0 src/participant_network.star | 3 +++ 2 files changed, 3 insertions(+) rename .github/tests/{verkle-gen-devnet-3.yaml => verkle-gen-devnet-4.yaml} (100%) diff --git a/.github/tests/verkle-gen-devnet-3.yaml b/.github/tests/verkle-gen-devnet-4.yaml similarity index 100% rename from .github/tests/verkle-gen-devnet-3.yaml rename to .github/tests/verkle-gen-devnet-4.yaml diff --git a/src/participant_network.star b/src/participant_network.star index 7d1a0745b..d4d824ed4 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -8,6 +8,9 @@ el_cl_genesis_data_generator = import_module( el_cl_genesis_data = import_module( "./prelaunch_data_generator/el_cl_genesis/el_cl_genesis_data.star" ) + +input_parser = import_module("./package_io/input_parser.star") + shared_utils = import_module("./shared_utils/shared_utils.star") static_files = import_module("./static_files/static_files.star") From 111bbad46d8208a947c0313a6323e1660fd7b23e Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Wed, 7 Feb 2024 18:54:19 +0100 Subject: [PATCH 61/90] dont run shadowforks in ci --- ...wfork-verkle.yaml => holesky-shadowfork-verkle.yaml_norun} | 0 ...{holesky-shadowfork.yaml => holesky-shadowfork.yaml_norun} | 0 src/el/erigon/erigon_launcher.star | 2 +- src/el/geth/geth_launcher.star | 4 ++-- 4 files changed, 3 insertions(+), 3 deletions(-) rename .github/tests/{holesky-shadowfork-verkle.yaml => holesky-shadowfork-verkle.yaml_norun} (100%) rename .github/tests/{holesky-shadowfork.yaml => holesky-shadowfork.yaml_norun} (100%) diff --git a/.github/tests/holesky-shadowfork-verkle.yaml b/.github/tests/holesky-shadowfork-verkle.yaml_norun similarity index 100% rename from .github/tests/holesky-shadowfork-verkle.yaml rename to .github/tests/holesky-shadowfork-verkle.yaml_norun diff --git a/.github/tests/holesky-shadowfork.yaml b/.github/tests/holesky-shadowfork.yaml_norun similarity index 100% rename from .github/tests/holesky-shadowfork.yaml rename to .github/tests/holesky-shadowfork.yaml_norun diff --git a/src/el/erigon/erigon_launcher.star b/src/el/erigon/erigon_launcher.star index 20c6316c2..fde551879 100644 --- a/src/el/erigon/erigon_launcher.star +++ b/src/el/erigon/erigon_launcher.star @@ -198,7 +198,7 @@ def get_config( network if network in constants.PUBLIC_NETWORKS else "dev" ), "{0}".format( - "--override.cancun=" + cancun_time + "--override.cancun=" + str(cancun_time) if constants.NETWORK_NAME.shadowfork in network and "verkle" not in network else "" ), diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 4057fc622..fb1c1b519 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -260,7 +260,7 @@ def get_config( ), # Override prague fork timestamp if electra_fork_epoch == 0 "{0}".format( - "--override.prague=" + prague_time + "--override.prague=" + str(prague_time) if electra_fork_epoch == 0 or "verkle-gen" in network else "" ), @@ -268,7 +268,7 @@ def get_config( "--{}".format(network) if network in constants.PUBLIC_NETWORKS else "" ), "{0}".format( - "--override.cancun=" + cancun_time + "--override.cancun=" + str(cancun_time) if constants.NETWORK_NAME.shadowfork in network and "verkle" not in network else "" ), From d61d5eeb4e933804372cdc676918ddf04a6cf5c7 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Thu, 8 Feb 2024 20:49:11 +0100 Subject: [PATCH 62/90] fix path based --- src/el/geth/geth_launcher.star | 15 ++++++++++----- src/package_io/input_parser.star | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index fb1c1b519..8fe1a107c 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -99,10 +99,13 @@ def launch( network_name = ( "devnets" - if launcher.network != constants.NETWORK_NAME.kurtosis - and launcher.network != constants.NETWORK_NAME.ephemery - and launcher.network != constants.NETWORK_NAME.shadowfork - and launcher.network not in constants.PUBLIC_NETWORKS + if launcher.network + not in ( + constants.NETWORK_NAME.kurtosis, + constants.NETWORK_NAME.ephemery, + constants.NETWORK_NAME.shadowfork, + constants.PUBLIC_NETWORKS, + ) else launcher.network ) if ( @@ -232,6 +235,8 @@ def get_config( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, constants.GENESIS_CONFIG_MOUNT_PATH_ON_CONTAINER + "/genesis.json", ) + elif constants.NETWORK_NAME.shadowfork in network: + init_datadir_cmd_str = "echo shadowfork" else: init_datadir_cmd_str = "geth init --state.scheme=path --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, @@ -269,7 +274,7 @@ def get_config( ), "{0}".format( "--override.cancun=" + str(cancun_time) - if constants.NETWORK_NAME.shadowfork in network and "verkle" not in network + if constants.NETWORK_NAME.shadowfork in network else "" ), "--networkid={0}".format(networkid), diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index 31c0f1465..e03d0df78 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -30,7 +30,7 @@ NIMBUS_NODE_NAME = "nimbus" # Placeholder value for the deneb fork epoch if electra is being run # TODO: This is a hack, and should be removed once we electra is rebased on deneb -HIGH_DENEB_VALUE_FORK_VERKLE = 20000 +HIGH_DENEB_VALUE_FORK_VERKLE = 2000000000 # MEV Params FLASHBOTS_MEV_BOOST_PORT = 18550 From e81829e3eab1e76cc9284d1cd16d98c32b4dcc2e Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 09:28:56 +0100 Subject: [PATCH 63/90] feat: enable min_validator_withdrawability_delay, shard_committee_period (#490) Co-authored-by: pk910 --- README.md | 12 ++++++++++-- network_params.yaml | 9 +++++++++ src/package_io/input_parser.star | 6 ++++++ src/participant_network.star | 4 +++- .../el_cl_genesis/el_cl_genesis_generator.star | 8 ++++++++ .../genesis-generation-config/el-cl/values.env.tmpl | 2 ++ 6 files changed, 38 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ac1d9cbd4..87baba778 100644 --- a/README.md +++ b/README.md @@ -237,7 +237,7 @@ participants: # effect: "NoSchedule" # toleration_seconds: 3600 # Defaults to empty - el_tolerations: [] + cl_tolerations: [] # A list of tolerations that will be passed to the validator container # Only works with Kubernetes @@ -381,7 +381,7 @@ network_params: # Defaults to 2048 eth1_follow_distance: 2048 - # The epoch at which the capella and deneb forks are set to occur. + # The epoch at which the capella/deneb/electra forks are set to occur. capella_fork_epoch: 0 deneb_fork_epoch: 500 electra_fork_epoch: null @@ -392,6 +392,14 @@ network_params: # You can sync any devnet by setting this to the network name (e.g. "dencun-devnet-12", "verkle-gen-devnet-2") network: "kurtosis" + # The number of epochs to wait validators to be able to withdraw + # Defaults to 256 epochs ~27 hours + min_validator_withdrawability_delay: 256 + + # The period of the shard committee + # Defaults to 256 epoch ~27 hours + shard_committee_period: 256 + # Configuration place for transaction spammer - https:#github.com/MariusVanDerWijden/tx-fuzz tx_spammer_params: # A list of optional extra params that will be passed to the TX Spammer container for modifying its behaviour diff --git a/network_params.yaml b/network_params.yaml index 8f533ac35..2c025b322 100644 --- a/network_params.yaml +++ b/network_params.yaml @@ -4,9 +4,13 @@ participants: el_client_log_level: "" el_extra_params: [] el_extra_labels: {} + el_tolerations: [] cl_client_type: lighthouse cl_client_image: sigp/lighthouse:latest cl_client_log_level: "" + cl_tolerations: [] + validator_tolerations: [] + tolerations: [] beacon_extra_params: [] beacon_extra_labels: {} validator_extra_params: [] @@ -50,6 +54,10 @@ network_params: capella_fork_epoch: 0 deneb_fork_epoch: 4 electra_fork_epoch: null + network: kurtosis + min_validator_withdrawability_delay: 256 + shard_committee_period: 256 + additional_services: - tx_spammer - blob_spammer @@ -78,3 +86,4 @@ mev_params: grafana_additional_dashboards: [] persistent: false xatu_sentry_enabled: false +global_tolerations: [] diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index e03d0df78..4be39d044 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -218,6 +218,10 @@ def input_parser(plan, input_args): deneb_fork_epoch=result["network_params"]["deneb_fork_epoch"], electra_fork_epoch=result["network_params"]["electra_fork_epoch"], network=result["network_params"]["network"], + min_validator_withdrawability_delay=result["network_params"][ + "min_validator_withdrawability_delay" + ], + shard_committee_period=result["network_params"]["shard_committee_period"], ), mev_params=struct( mev_relay_image=result["mev_params"]["mev_relay_image"], @@ -548,6 +552,8 @@ def default_network_params(): "deneb_fork_epoch": 500, "electra_fork_epoch": None, "network": "kurtosis", + "min_validator_withdrawability_delay": 256, + "shard_committee_period": 256, } diff --git a/src/participant_network.star b/src/participant_network.star index d4d824ed4..97473c85c 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -227,7 +227,7 @@ def launch_participant_network( and network_params.electra_fork_epoch == None ): ethereum_genesis_generator_image = ( - "ethpandaops/ethereum-genesis-generator:2.0.11" + "ethpandaops/ethereum-genesis-generator:2.0.12" ) # we are running electra - experimental elif network_params.electra_fork_epoch != None: @@ -266,6 +266,8 @@ def launch_participant_network( network_params.deneb_fork_epoch, network_params.electra_fork_epoch, latest_block.files_artifacts[0] if latest_block != "" else "", + network_params.min_validator_withdrawability_delay, + network_params.shard_committee_period, ) elif network_params.network in constants.PUBLIC_NETWORKS: # We are running a public network diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star index 323eecb10..aab6d3fc0 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star @@ -27,6 +27,8 @@ def generate_el_cl_genesis_data( deneb_fork_epoch, electra_fork_epoch, latest_block, + min_validator_withdrawability_delay, + shard_committee_period, ): files = {} if latest_block == "": @@ -50,6 +52,8 @@ def generate_el_cl_genesis_data( deneb_fork_epoch, electra_fork_epoch, shadowfork_file, + min_validator_withdrawability_delay, + shard_committee_period, ) genesis_generation_template = shared_utils.new_template_and_data( genesis_generation_config_yml_template, template_data @@ -125,6 +129,8 @@ def new_env_file_for_el_cl_genesis_data( deneb_fork_epoch, electra_fork_epoch, shadowfork_file, + min_validator_withdrawability_delay, + shard_committee_period, ): return { "UnixTimestamp": genesis_unix_timestamp, @@ -146,4 +152,6 @@ def new_env_file_for_el_cl_genesis_data( "DenebForkVersion": constants.DENEB_FORK_VERSION, "ElectraForkVersion": constants.ELECTRA_FORK_VERSION, "ShadowForkFile": shadowfork_file, + "MinValidatorWithdrawabilityDelay": min_validator_withdrawability_delay, + "ShardCommitteePeriod": shard_committee_period, } diff --git a/static_files/genesis-generation-config/el-cl/values.env.tmpl b/static_files/genesis-generation-config/el-cl/values.env.tmpl index 2a4ec0962..cc420a4ed 100644 --- a/static_files/genesis-generation-config/el-cl/values.env.tmpl +++ b/static_files/genesis-generation-config/el-cl/values.env.tmpl @@ -22,3 +22,5 @@ export MAX_CHURN={{ .MaxChurn }} export EJECTION_BALANCE={{ .EjectionBalance }} export ETH1_FOLLOW_DISTANCE={{ .Eth1FollowDistance }} export SHADOW_FORK_FILE={{ .ShadowForkFile }} +export MIN_VALIDATOR_WITHDRAWABILITY_DELAY={{ .MinValidatorWithdrawabilityDelay }} +export SHARD_COMMITTEE_PERIOD={{ .ShardCommitteePeriod }} From 84d9dbe66404d184ded724db3226aa6d955c143a Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 09:31:09 +0100 Subject: [PATCH 64/90] fix lint --- src/el/geth/geth_launcher.star | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 29af742a3..c01953ce6 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -319,8 +319,8 @@ def get_config( if "--http.api" in arg: cmd[index] = "--http.api=admin,engine,net,eth,web3,debug,suavex" if "--ws.api" in arg: - cmd[index] = "--ws.api=admin,engine,net,eth,web3,debug,suavex" - + cmd[index] = "--ws.api=admin,engine,net,eth,web3,debug,suavex" + if ( network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network From 3afbe184a6b91483a689e073ad22aba7df937b97 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 09:56:13 +0100 Subject: [PATCH 65/90] fix based on feedback --- README.md | 4 +++- src/cl/lighthouse/lighthouse_launcher.star | 8 +------- src/cl/lodestar/lodestar_launcher.star | 8 +------- src/cl/nimbus/nimbus_launcher.star | 8 +------- src/cl/prysm/prysm_launcher.star | 8 +------- src/cl/teku/teku_launcher.star | 11 +---------- src/el/besu/besu_launcher.star | 8 +------- src/el/erigon/erigon_launcher.star | 10 ++-------- src/el/ethereumjs/ethereumjs_launcher.star | 8 +------- src/el/geth/geth_launcher.star | 16 +--------------- src/el/nethermind/nethermind_launcher.star | 8 +------- src/el/reth/reth_launcher.star | 9 ++------- src/package_io/constants.star | 7 +++++++ src/participant_network.star | 13 ++++++------- src/shared_utils/shared_utils.star | 17 +++++++++++++++++ 15 files changed, 46 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index 87baba778..3bd75fcf1 100644 --- a/README.md +++ b/README.md @@ -65,11 +65,12 @@ To mitigate these issues, you can use the `el_client_volume_size` and `cl_client For optimal performance, we recommend using a cloud provider that allows you to provision Kubernetes clusters with fast persistent storage or self hosting your own Kubernetes cluster with fast persistent storage. ### Shadowforking -In order to enable shadowfork capabilities, you can use the `network_params.network` flag. The expected value is the name of the network you want to shadowfork followed by `-shadowfork`. For example, to shadowfork the Holesky testnet, you can use the following command: +In order to enable shadowfork capabilities, you can use the `network_params.network` flag. The expected value is the name of the network you want to shadowfork followed by `-shadowfork`. Please note that `persistent` configuration parameter has to be enabled for shadowforks to work! Current limitation on k8s is it is only working on a single node cluster. For example, to shadowfork the Holesky testnet, you can use the following command: ```yaml ... network_params: network: "holesky-shadowfork" +persistent: true ... ``` @@ -80,6 +81,7 @@ In order to enable shadowfork capabilities for verkle networks, you need to defi network_params: electra_fork_epoch: 1 network: "holesky-shadowfork-verkle" +persistent: true ... ``` diff --git a/src/cl/lighthouse/lighthouse_launcher.star b/src/cl/lighthouse/lighthouse_launcher.star index 403774a14..53b68d9ff 100644 --- a/src/cl/lighthouse/lighthouse_launcher.star +++ b/src/cl/lighthouse/lighthouse_launcher.star @@ -138,13 +138,7 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) - network_name = ( - "devnets" - if launcher.network != "kurtosis" - and launcher.network != "ephemery" - and launcher.network not in constants.PUBLIC_NETWORKS - else launcher.network - ) + network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU bn_max_cpu = ( diff --git a/src/cl/lodestar/lodestar_launcher.star b/src/cl/lodestar/lodestar_launcher.star index f7713edd7..f12b6c473 100644 --- a/src/cl/lodestar/lodestar_launcher.star +++ b/src/cl/lodestar/lodestar_launcher.star @@ -116,13 +116,7 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) - network_name = ( - "devnets" - if launcher.network != "kurtosis" - and launcher.network != "ephemery" - and launcher.network not in constants.PUBLIC_NETWORKS - else launcher.network - ) + network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU bn_max_cpu = ( diff --git a/src/cl/nimbus/nimbus_launcher.star b/src/cl/nimbus/nimbus_launcher.star index 18443baf3..0c066d917 100644 --- a/src/cl/nimbus/nimbus_launcher.star +++ b/src/cl/nimbus/nimbus_launcher.star @@ -152,13 +152,7 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) - network_name = ( - "devnets" - if launcher.network != "kurtosis" - and launcher.network != "ephemery" - and launcher.network not in constants.PUBLIC_NETWORKS - else launcher.network - ) + network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU bn_max_cpu = ( diff --git a/src/cl/prysm/prysm_launcher.star b/src/cl/prysm/prysm_launcher.star index b51555c7f..dd86ce1cc 100644 --- a/src/cl/prysm/prysm_launcher.star +++ b/src/cl/prysm/prysm_launcher.star @@ -143,13 +143,7 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) - network_name = ( - "devnets" - if launcher.network != "kurtosis" - and launcher.network != "ephemery" - and launcher.network not in constants.PUBLIC_NETWORKS - else launcher.network - ) + network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU bn_max_cpu = ( diff --git a/src/cl/teku/teku_launcher.star b/src/cl/teku/teku_launcher.star index 4b7b58006..0fd47bd5d 100644 --- a/src/cl/teku/teku_launcher.star +++ b/src/cl/teku/teku_launcher.star @@ -152,16 +152,7 @@ def launch( int(bn_max_mem) if int(bn_max_mem) > 0 else holesky_beacon_memory_limit ) - network_name = ( - "devnets" - if launcher.network != "kurtosis" - and launcher.network != "ephemery" - and launcher.network not in constants.PUBLIC_NETWORKS - else launcher.network - ) - - if constants.NETWORK_NAME.shadowfork in network_name: - network_name = network_name.split("-shadowfork")[0] + network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU bn_max_cpu = ( diff --git a/src/el/besu/besu_launcher.star b/src/el/besu/besu_launcher.star index 618d12d92..ac117880f 100644 --- a/src/el/besu/besu_launcher.star +++ b/src/el/besu/besu_launcher.star @@ -87,13 +87,7 @@ def launch( el_tolerations, participant_tolerations, global_tolerations ) - network_name = ( - "devnets" - if launcher.network != "kurtosis" - and launcher.network != "ephemery" - and launcher.network not in constants.PUBLIC_NETWORKS - else launcher.network - ) + network_name = shared_utils.get_network_name(launcher.network) el_min_cpu = int(el_min_cpu) if int(el_min_cpu) > 0 else EXECUTION_MIN_CPU el_max_cpu = ( diff --git a/src/el/erigon/erigon_launcher.star b/src/el/erigon/erigon_launcher.star index fde551879..cfee870c0 100644 --- a/src/el/erigon/erigon_launcher.star +++ b/src/el/erigon/erigon_launcher.star @@ -87,13 +87,7 @@ def launch( el_tolerations, participant_tolerations, global_tolerations ) - network_name = ( - "devnets" - if launcher.network != "kurtosis" - and launcher.network != "ephemery" - and launcher.network not in constants.PUBLIC_NETWORKS - else launcher.network - ) + network_name = shared_utils.get_network_name(launcher.network) el_min_cpu = int(el_min_cpu) if int(el_min_cpu) > 0 else EXECUTION_MIN_CPU el_max_cpu = ( @@ -199,7 +193,7 @@ def get_config( ), "{0}".format( "--override.cancun=" + str(cancun_time) - if constants.NETWORK_NAME.shadowfork in network and "verkle" not in network + if constants.NETWORK_NAME.shadowfork in network else "" ), "--networkid={0}".format(networkid), diff --git a/src/el/ethereumjs/ethereumjs_launcher.star b/src/el/ethereumjs/ethereumjs_launcher.star index 55a9a926e..aa0eaeb63 100644 --- a/src/el/ethereumjs/ethereumjs_launcher.star +++ b/src/el/ethereumjs/ethereumjs_launcher.star @@ -89,13 +89,7 @@ def launch( el_tolerations, participant_tolerations, global_tolerations ) - network_name = ( - "devnets" - if launcher.network != "kurtosis" - and launcher.network != "ephemery" - and launcher.network not in constants.PUBLIC_NETWORKS - else launcher.network - ) + network_name = shared_utils.get_network_name(launcher.network) el_min_cpu = int(el_min_cpu) if int(el_min_cpu) > 0 else EXECUTION_MIN_CPU el_max_cpu = ( diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index c01953ce6..830beb98e 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -98,21 +98,7 @@ def launch( el_tolerations, participant_tolerations, global_tolerations ) - network_name = ( - "devnets" - if launcher.network - not in ( - constants.NETWORK_NAME.kurtosis, - constants.NETWORK_NAME.ephemery, - constants.NETWORK_NAME.shadowfork, - constants.PUBLIC_NETWORKS, - ) - else launcher.network - ) - if ( - constants.NETWORK_NAME.shadowfork in network_name - ): # if its a shadowfork we want proper resource allocation based on public network - network_name = launcher.network.split("-shadowfork")[0] + network_name = shared_utils.get_network_name(launcher.network) el_min_cpu = int(el_min_cpu) if int(el_min_cpu) > 0 else EXECUTION_MIN_CPU el_max_cpu = ( diff --git a/src/el/nethermind/nethermind_launcher.star b/src/el/nethermind/nethermind_launcher.star index 96c448a7f..ba7be24a7 100644 --- a/src/el/nethermind/nethermind_launcher.star +++ b/src/el/nethermind/nethermind_launcher.star @@ -85,13 +85,7 @@ def launch( el_tolerations, participant_tolerations, global_tolerations ) - network_name = ( - "devnets" - if launcher.network != "kurtosis" - and launcher.network != "ephemery" - and launcher.network not in constants.PUBLIC_NETWORKS - else launcher.network - ) + network_name = shared_utils.get_network_name(launcher.network) el_min_cpu = int(el_min_cpu) if int(el_min_cpu) > 0 else EXECUTION_MIN_CPU el_max_cpu = ( diff --git a/src/el/reth/reth_launcher.star b/src/el/reth/reth_launcher.star index 411f8ee15..8faf1d6ed 100644 --- a/src/el/reth/reth_launcher.star +++ b/src/el/reth/reth_launcher.star @@ -87,13 +87,8 @@ def launch( tolerations = input_parser.get_client_tolerations( el_tolerations, participant_tolerations, global_tolerations ) - network_name = ( - "devnets" - if launcher.network != "kurtosis" - and launcher.network != "ephemery" - and launcher.network not in constants.PUBLIC_NETWORKS - else launcher.network - ) + + network_name = shared_utils.get_network_name(launcher.network) el_min_cpu = int(el_min_cpu) if int(el_min_cpu) > 0 else EXECUTION_MIN_CPU el_max_cpu = ( diff --git a/src/package_io/constants.star b/src/package_io/constants.star index ce7cd050e..2e9f1c06e 100644 --- a/src/package_io/constants.star +++ b/src/package_io/constants.star @@ -53,6 +53,13 @@ CAPELLA_FORK_VERSION = "0x40000038" DENEB_FORK_VERSION = "0x50000038" ELECTRA_FORK_VERSION = "0x60000038" +ETHEREUM_GENESIS_GENERATOR = struct( + bellatrix_genesis="ethpandaops/ethereum-genesis-generator:1.3.15", # EOL + capella_genesis="ethpandaops/ethereum-genesis-generator:2.0.12", # Default + verkle_support_genesis="ethpandaops/ethereum-genesis-generator:3.0.0-rc.19", # soon to be deneb genesis + verkle_genesis="ethpandaops/ethereum-genesis-generator:4.0.0-rc.6", +) + NETWORK_NAME = struct( mainnet="mainnet", goerli="goerli", diff --git a/src/participant_network.star b/src/participant_network.star index 97473c85c..dfce04630 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -82,9 +82,8 @@ def launch_participant_network( if ( constants.NETWORK_NAME.shadowfork in network_params.network ): # shadowfork requires some preparation - base_network = network_params.network.split("-shadowfork")[ - 0 - ] # overload the network name to remove the shadowfork suffix + base_network = shared_utils.get_network_name(network_params.network) + # overload the network name to remove the shadowfork suffix if constants.NETWORK_NAME.ephemery in base_network: chain_id = plan.run_sh( run="curl -s https://ephemery.dev/latest/config.yaml | yq .DEPOSIT_CHAIN_ID | tr -d '\n'", @@ -219,7 +218,7 @@ def launch_participant_network( and network_params.electra_fork_epoch == None ): ethereum_genesis_generator_image = ( - "ethpandaops/ethereum-genesis-generator:1.3.15" + constants.ETHEREUM_GENESIS_GENERATOR.bellatrix_genesis ) # we are running capella genesis - default behavior elif ( @@ -227,17 +226,17 @@ def launch_participant_network( and network_params.electra_fork_epoch == None ): ethereum_genesis_generator_image = ( - "ethpandaops/ethereum-genesis-generator:2.0.12" + constants.ETHEREUM_GENESIS_GENERATOR.capella_genesis ) # we are running electra - experimental elif network_params.electra_fork_epoch != None: if network_params.electra_fork_epoch == 0: ethereum_genesis_generator_image = ( - "ethpandaops/ethereum-genesis-generator:4.0.0-rc.6" + constants.ETHEREUM_GENESIS_GENERATOR.verkle_genesis ) else: ethereum_genesis_generator_image = ( - "ethpandaops/ethereum-genesis-generator:3.0.0-rc.19" + constants.ETHEREUM_GENESIS_GENERATOR.verkle_support_genesis ) else: fail( diff --git a/src/shared_utils/shared_utils.star b/src/shared_utils/shared_utils.star index 52bafa711..41e5597a5 100644 --- a/src/shared_utils/shared_utils.star +++ b/src/shared_utils/shared_utils.star @@ -139,3 +139,20 @@ print(network_id, end="") """, ) return value.output + + +def get_network_name(network): + if network not in ( + constants.NETWORK_NAME.kurtosis, + constants.NETWORK_NAME.ephemery, + constants.NETWORK_NAME.shadowfork, + constants.PUBLIC_NETWORKS, + ): + network_name = "devnets" + else: + network_name = network + + if constants.NETWORK_NAME.shadowfork in network_name: + network_name = network.split("-shadowfork")[0] + + return network_name From e75c5486742cc09fa36f856d6a8cc0fde04a9141 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 10:01:55 +0100 Subject: [PATCH 66/90] fix based on feedback --- .../el_cl_genesis/el_cl_genesis_generator.star | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star index aab6d3fc0..f440c818f 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star @@ -31,10 +31,9 @@ def generate_el_cl_genesis_data( shard_committee_period, ): files = {} - if latest_block == "": - shadowfork_file = "" - - else: + shadowfork_file = "" + if latest_block != "": + files[SHADOWFORK_FILEPATH] = latest_block shadowfork_file = SHADOWFORK_FILEPATH + "/shadowfork/latest_block.json" template_data = new_env_file_for_el_cl_genesis_data( @@ -70,8 +69,6 @@ def generate_el_cl_genesis_data( ) files = {GENESIS_VALUES_PATH: genesis_generation_config_artifact_name} - if latest_block != "": - files[SHADOWFORK_FILEPATH] = latest_block genesis = plan.run_sh( run="cp /opt/values.env /config/values.env && ./entrypoint.sh all && mkdir /network-configs && mv /data/custom_config_data/* /network-configs/", image=image, From 623fe23539e611380f6d034ae640a167dca7474c Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 11:19:13 +0100 Subject: [PATCH 67/90] update nethermind image, to not make it fail --- src/package_io/input_parser.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index 4be39d044..cb4910198 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -7,7 +7,7 @@ genesis_constants = import_module( DEFAULT_EL_IMAGES = { "geth": "ethereum/client-go:latest", "erigon": "ethpandaops/erigon:devel", - "nethermind": "nethermindeth/nethermind:master", + "nethermind": "nethermindeth/nethermind:master-53a24f4", "besu": "hyperledger/besu:latest", "reth": "ghcr.io/paradigmxyz/reth", "ethereumjs": "ethpandaops/ethereumjs:master", From b3b5ff8786ab0088631cbfcaee84b5ae571b7ba1 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 11:22:32 +0100 Subject: [PATCH 68/90] update nethermind image, to not make it fail --- src/package_io/input_parser.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index cb4910198..cfd6c7e2b 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -7,7 +7,7 @@ genesis_constants = import_module( DEFAULT_EL_IMAGES = { "geth": "ethereum/client-go:latest", "erigon": "ethpandaops/erigon:devel", - "nethermind": "nethermindeth/nethermind:master-53a24f4", + "nethermind": "ethpandaops/nethermind:master-53a24f4", "besu": "hyperledger/besu:latest", "reth": "ghcr.io/paradigmxyz/reth", "ethereumjs": "ethpandaops/ethereumjs:master", From 0392c22cad59bbc9c41fcd18a83b46d5b67fe475 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 11:45:47 +0100 Subject: [PATCH 69/90] fix master --- src/package_io/input_parser.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index cfd6c7e2b..297e02133 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -7,7 +7,7 @@ genesis_constants = import_module( DEFAULT_EL_IMAGES = { "geth": "ethereum/client-go:latest", "erigon": "ethpandaops/erigon:devel", - "nethermind": "ethpandaops/nethermind:master-53a24f4", + "nethermind": "ethpandaops/nethermind:master", "besu": "hyperledger/besu:latest", "reth": "ghcr.io/paradigmxyz/reth", "ethereumjs": "ethpandaops/ethereumjs:master", From 3c98118143602ca613996e5bfaa78f2595a1c47a Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 12:05:08 +0100 Subject: [PATCH 70/90] feat!: add node selectors features --- README.md | 12 ++++++++++++ network_params.yaml | 2 ++ src/cl/lighthouse/lighthouse_launcher.star | 12 ++++++++++++ src/cl/lodestar/lodestar_launcher.star | 12 ++++++++++++ src/cl/nimbus/nimbus_launcher.star | 12 ++++++++++++ src/cl/prysm/prysm_launcher.star | 12 ++++++++++++ src/cl/teku/teku_launcher.star | 19 ++++++++++++------- src/el/besu/besu_launcher.star | 8 ++++++++ src/el/erigon/erigon_launcher.star | 8 ++++++++ src/el/ethereumjs/ethereumjs_launcher.star | 8 ++++++++ src/el/geth/geth_launcher.star | 8 ++++++++ src/el/nethermind/nethermind_launcher.star | 8 ++++++++ src/el/reth/reth_launcher.star | 8 ++++++++ src/package_io/input_parser.star | 15 +++++++++++++++ src/participant_network.star | 12 ++++++++++++ 15 files changed, 149 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3bd75fcf1..ecb40bcea 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,12 @@ participants: # Defaults to empty tolerations: [] + # Node selector + # Only works with Kubernetes + # Example: node_selectors: { "disktype": "ssd" } + # Defaults to empty + node_selectors: {} + # A list of optional extra params that will be passed to the CL client Beacon container for modifying its behaviour # If the client combines the Beacon & validator nodes (e.g. Teku, Nimbus), then this list will be passed to the combined Beacon-validator node beacon_extra_params: [] @@ -605,6 +611,12 @@ xatu_sentry_params: # toleration_seconds: 3600 # Defaults to empty global_tolerations: [] + +# Global node selector that will be passed to all containers (unless overridden by a more specific node selector) +# Only works with Kubernetes +# Example: node_selectors: { "disktype": "ssd" } +# Defaults to empty +node_selectors: {} ``` #### Example configurations diff --git a/network_params.yaml b/network_params.yaml index 2c025b322..d03330642 100644 --- a/network_params.yaml +++ b/network_params.yaml @@ -11,6 +11,7 @@ participants: cl_tolerations: [] validator_tolerations: [] tolerations: [] + node_selectors: {} beacon_extra_params: [] beacon_extra_labels: {} validator_extra_params: [] @@ -87,3 +88,4 @@ grafana_additional_dashboards: [] persistent: false xatu_sentry_enabled: false global_tolerations: [] +global_node_selectors: {} diff --git a/src/cl/lighthouse/lighthouse_launcher.star b/src/cl/lighthouse/lighthouse_launcher.star index 53b68d9ff..815443e18 100644 --- a/src/cl/lighthouse/lighthouse_launcher.star +++ b/src/cl/lighthouse/lighthouse_launcher.star @@ -123,6 +123,8 @@ def launch( validator_tolerations, participant_tolerations, global_tolerations, + participant_node_selectors, + global_node_selectors, split_mode_enabled=False, ): beacon_service_name = "{0}".format(service_name) @@ -138,6 +140,10 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) + node_selectors = input_parser.get_client_node_selectors( + participant_node_selectors, global_node_selectors + ) + network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU @@ -181,6 +187,7 @@ def launch( persistent, cl_volume_size, tolerations, + node_selectors, ) beacon_service = plan.add_service(beacon_service_name, beacon_config) @@ -234,6 +241,7 @@ def launch( extra_validator_labels, persistent, tolerations, + node_selectors, ) validator_service = plan.add_service(validator_service_name, validator_config) @@ -313,6 +321,7 @@ def get_beacon_config( persistent, cl_volume_size, tolerations, + node_selectors, ): # If snooper is enabled use the snooper engine context, otherwise use the execution client context if snooper_enabled: @@ -465,6 +474,7 @@ def get_beacon_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) @@ -484,6 +494,7 @@ def get_validator_config( extra_labels, persistent, tolerations, + node_selectors, ): validator_keys_dirpath = shared_utils.path_join( VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS, @@ -550,6 +561,7 @@ def get_validator_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) diff --git a/src/cl/lodestar/lodestar_launcher.star b/src/cl/lodestar/lodestar_launcher.star index f12b6c473..5610a0ac0 100644 --- a/src/cl/lodestar/lodestar_launcher.star +++ b/src/cl/lodestar/lodestar_launcher.star @@ -102,6 +102,8 @@ def launch( validator_tolerations, participant_tolerations, global_tolerations, + participant_node_selectors, + global_node_selectors, split_mode_enabled=False, ): beacon_service_name = "{0}".format(service_name) @@ -116,6 +118,10 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) + node_selectors = input_parser.get_client_node_selectors( + participant_node_selectors, global_node_selectors + ) + network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU @@ -159,6 +165,7 @@ def launch( persistent, cl_volume_size, tolerations, + node_selectors, ) beacon_service = plan.add_service(beacon_service_name, beacon_config) @@ -213,6 +220,7 @@ def launch( extra_validator_labels, persistent, tolerations, + node_selectors, ) plan.add_service(validator_service_name, validator_config) @@ -284,6 +292,7 @@ def get_beacon_config( persistent, cl_volume_size, tolerations, + node_selectors, ): el_client_rpc_url_str = "http://{0}:{1}".format( el_client_context.ip_addr, @@ -417,6 +426,7 @@ def get_beacon_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) @@ -436,6 +446,7 @@ def get_validator_config( extra_labels, persistent, tolerations, + node_selectors, ): root_dirpath = shared_utils.path_join( VALIDATOR_DATA_DIRPATH_ON_SERVICE_CONTAINER, service_name @@ -500,6 +511,7 @@ def get_validator_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) diff --git a/src/cl/nimbus/nimbus_launcher.star b/src/cl/nimbus/nimbus_launcher.star index 0c066d917..a0232eac1 100644 --- a/src/cl/nimbus/nimbus_launcher.star +++ b/src/cl/nimbus/nimbus_launcher.star @@ -137,6 +137,8 @@ def launch( validator_tolerations, participant_tolerations, global_tolerations, + participant_node_selectors, + global_node_selectors, split_mode_enabled, ): beacon_service_name = "{0}".format(service_name) @@ -152,6 +154,10 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) + node_selectors = input_parser.get_client_node_selectors( + participant_node_selectors, global_node_selectors + ) + network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU @@ -196,6 +202,7 @@ def launch( persistent, cl_volume_size, tolerations, + node_selectors, ) beacon_service = plan.add_service(beacon_service_name, beacon_config) @@ -255,6 +262,7 @@ def launch( extra_validator_labels, persistent, tolerations, + node_selectors, ) validator_service = plan.add_service(validator_service_name, validator_config) @@ -310,6 +318,7 @@ def get_beacon_config( persistent, cl_volume_size, tolerations, + node_selectors, ): validator_keys_dirpath = "" validator_secrets_dirpath = "" @@ -439,6 +448,7 @@ def get_beacon_config( ), user=User(uid=0, gid=0), tolerations=tolerations, + node_selectors=node_selectors, ) @@ -458,6 +468,7 @@ def get_validator_config( extra_labels, persistent, tolerations, + node_selectors, ): validator_keys_dirpath = "" validator_secrets_dirpath = "" @@ -512,6 +523,7 @@ def get_validator_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) diff --git a/src/cl/prysm/prysm_launcher.star b/src/cl/prysm/prysm_launcher.star index dd86ce1cc..9e11add85 100644 --- a/src/cl/prysm/prysm_launcher.star +++ b/src/cl/prysm/prysm_launcher.star @@ -114,6 +114,8 @@ def launch( validator_tolerations, participant_tolerations, global_tolerations, + participant_node_selectors, + global_node_selectors, split_mode_enabled=False, ): split_images = images.split(IMAGE_SEPARATOR_DELIMITER) @@ -143,6 +145,10 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) + node_selectors = input_parser.get_client_node_selectors( + participant_node_selectors, global_node_selectors + ) + network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU @@ -185,6 +191,7 @@ def launch( persistent, cl_volume_size, tolerations, + node_selectors, ) beacon_service = plan.add_service(beacon_service_name, beacon_config) @@ -223,6 +230,7 @@ def launch( launcher.prysm_password_artifact_uuid, persistent, tolerations, + node_selectors, ) validator_service = plan.add_service(validator_service_name, validator_config) @@ -302,6 +310,7 @@ def get_beacon_config( persistent, cl_volume_size, tolerations, + node_selectors, ): # If snooper is enabled use the snooper engine context, otherwise use the execution client context if snooper_enabled: @@ -433,6 +442,7 @@ def get_beacon_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) @@ -455,6 +465,7 @@ def get_validator_config( prysm_password_artifact_uuid, persistent, tolerations, + node_selectors, ): validator_keys_dirpath = shared_utils.path_join( VALIDATOR_KEYS_MOUNT_DIRPATH_ON_SERVICE_CONTAINER, @@ -520,6 +531,7 @@ def get_validator_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) diff --git a/src/cl/teku/teku_launcher.star b/src/cl/teku/teku_launcher.star index 0fd47bd5d..fab537727 100644 --- a/src/cl/teku/teku_launcher.star +++ b/src/cl/teku/teku_launcher.star @@ -127,6 +127,8 @@ def launch( validator_tolerations, participant_tolerations, global_tolerations, + participant_node_selectors, + global_node_selectors, split_mode_enabled, ): beacon_service_name = "{0}".format(service_name) @@ -141,17 +143,14 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) + node_selectors = input_parser.get_client_node_selectors( + participant_node_selectors, global_node_selectors + ) + extra_params = [param for param in extra_beacon_params] + [ param for param in extra_validator_params ] - # Holesky has a bigger memory footprint, so it needs more memory - if launcher.network == "holesky": - holesky_beacon_memory_limit = 4096 - bn_max_mem = ( - int(bn_max_mem) if int(bn_max_mem) > 0 else holesky_beacon_memory_limit - ) - network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU @@ -196,6 +195,7 @@ def launch( persistent, cl_volume_size, tolerations, + node_selectors, ) beacon_service = plan.add_service(service_name, config) @@ -258,6 +258,7 @@ def launch( extra_validator_labels, persistent, tolerations, + node_selectors, ) validator_service = plan.add_service(validator_service_name, validator_config) @@ -313,6 +314,7 @@ def get_beacon_config( persistent, cl_volume_size, tolerations, + node_selectors, ): validator_keys_dirpath = "" validator_secrets_dirpath = "" @@ -492,6 +494,7 @@ def get_beacon_config( ), user=User(uid=0, gid=0), tolerations=tolerations, + node_selectors=node_selectors, ) @@ -512,6 +515,7 @@ def get_validator_config( extra_labels, persistent, tolerations, + node_selectors, ): validator_keys_dirpath = "" validator_secrets_dirpath = "" @@ -577,6 +581,7 @@ def get_validator_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) diff --git a/src/el/besu/besu_launcher.star b/src/el/besu/besu_launcher.star index ac117880f..1c913a29c 100644 --- a/src/el/besu/besu_launcher.star +++ b/src/el/besu/besu_launcher.star @@ -79,6 +79,8 @@ def launch( el_tolerations, participant_tolerations, global_tolerations, + participant_node_selectors, + global_node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS @@ -86,6 +88,9 @@ def launch( tolerations = input_parser.get_client_tolerations( el_tolerations, participant_tolerations, global_tolerations ) + node_selectors = input_parser.get_client_node_selectors( + participant_node_selectors, global_node_selectors + ) network_name = shared_utils.get_network_name(launcher.network) @@ -130,6 +135,7 @@ def launch( persistent, el_volume_size, tolerations, + node_selectors, ) service = plan.add_service(service_name, config) @@ -174,6 +180,7 @@ def get_config( persistent, el_volume_size, tolerations, + node_selectors, ): cmd = [ "besu", @@ -272,6 +279,7 @@ def get_config( ), user=User(uid=0, gid=0), tolerations=tolerations, + node_selectors=node_selectors, ) diff --git a/src/el/erigon/erigon_launcher.star b/src/el/erigon/erigon_launcher.star index cfee870c0..c34ddc226 100644 --- a/src/el/erigon/erigon_launcher.star +++ b/src/el/erigon/erigon_launcher.star @@ -79,6 +79,8 @@ def launch( el_tolerations, participant_tolerations, global_tolerations, + participant_node_selectors, + global_node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS @@ -86,6 +88,9 @@ def launch( tolerations = input_parser.get_client_tolerations( el_tolerations, participant_tolerations, global_tolerations ) + node_selectors = input_parser.get_client_node_selectors( + participant_node_selectors, global_node_selectors + ) network_name = shared_utils.get_network_name(launcher.network) @@ -132,6 +137,7 @@ def launch( persistent, el_volume_size, tolerations, + node_selectors, ) service = plan.add_service(service_name, config) @@ -180,6 +186,7 @@ def get_config( persistent, el_volume_size, tolerations, + node_selectors, ): init_datadir_cmd_str = "erigon init --datadir={0} {1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, @@ -294,6 +301,7 @@ def get_config( ), user=User(uid=0, gid=0), tolerations=tolerations, + node_selectors=node_selectors, ) diff --git a/src/el/ethereumjs/ethereumjs_launcher.star b/src/el/ethereumjs/ethereumjs_launcher.star index aa0eaeb63..616ad34d3 100644 --- a/src/el/ethereumjs/ethereumjs_launcher.star +++ b/src/el/ethereumjs/ethereumjs_launcher.star @@ -81,6 +81,8 @@ def launch( el_tolerations, participant_tolerations, global_tolerations, + participant_node_selectors, + global_node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS @@ -88,6 +90,9 @@ def launch( tolerations = input_parser.get_client_tolerations( el_tolerations, participant_tolerations, global_tolerations ) + node_selectors = input_parser.get_client_node_selectors( + participant_node_selectors, global_node_selectors + ) network_name = shared_utils.get_network_name(launcher.network) @@ -132,6 +137,7 @@ def launch( persistent, el_volume_size, tolerations, + node_selectors, ) service = plan.add_service(service_name, config) @@ -175,6 +181,7 @@ def get_config( persistent, el_volume_size, tolerations, + node_selectors, ): cmd = [ "--dataDir=" + EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, @@ -260,6 +267,7 @@ def get_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 830beb98e..80b5fd9f6 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -90,6 +90,8 @@ def launch( el_tolerations, participant_tolerations, global_tolerations, + participant_node_selectors, + global_node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS @@ -97,6 +99,9 @@ def launch( tolerations = input_parser.get_client_tolerations( el_tolerations, participant_tolerations, global_tolerations ) + node_selectors = input_parser.get_client_node_selectors( + participant_node_selectors, global_node_selectors + ) network_name = shared_utils.get_network_name(launcher.network) @@ -146,6 +151,7 @@ def launch( persistent, el_volume_size, tolerations, + node_selectors, ) service = plan.add_service(service_name, config) @@ -197,6 +203,7 @@ def get_config( persistent, el_volume_size, tolerations, + node_selectors, ): # TODO: Remove this once electra fork has path based storage scheme implemented if ( @@ -379,6 +386,7 @@ def get_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) diff --git a/src/el/nethermind/nethermind_launcher.star b/src/el/nethermind/nethermind_launcher.star index ba7be24a7..0d583f682 100644 --- a/src/el/nethermind/nethermind_launcher.star +++ b/src/el/nethermind/nethermind_launcher.star @@ -77,6 +77,8 @@ def launch( el_tolerations, participant_tolerations, global_tolerations, + participant_node_selectors, + global_node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS @@ -84,6 +86,9 @@ def launch( tolerations = input_parser.get_client_tolerations( el_tolerations, participant_tolerations, global_tolerations ) + node_selectors = input_parser.get_client_node_selectors( + participant_node_selectors, global_node_selectors + ) network_name = shared_utils.get_network_name(launcher.network) @@ -128,6 +133,7 @@ def launch( persistent, el_volume_size, tolerations, + node_selectors, ) service = plan.add_service(service_name, config) @@ -173,6 +179,7 @@ def get_config( persistent, el_volume_size, tolerations, + node_selectors, ): cmd = [ "--log=" + log_level, @@ -268,6 +275,7 @@ def get_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) diff --git a/src/el/reth/reth_launcher.star b/src/el/reth/reth_launcher.star index 8faf1d6ed..19012fd65 100644 --- a/src/el/reth/reth_launcher.star +++ b/src/el/reth/reth_launcher.star @@ -80,6 +80,8 @@ def launch( el_tolerations, participant_tolerations, global_tolerations, + participant_node_selectors, + global_node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS @@ -87,6 +89,9 @@ def launch( tolerations = input_parser.get_client_tolerations( el_tolerations, participant_tolerations, global_tolerations ) + node_selectors = input_parser.get_client_node_selectors( + participant_node_selectors, global_node_selectors + ) network_name = shared_utils.get_network_name(launcher.network) @@ -131,6 +136,7 @@ def launch( persistent, el_volume_size, tolerations, + node_selectors, ) service = plan.add_service(service_name, config) @@ -175,6 +181,7 @@ def get_config( persistent, el_volume_size, tolerations, + node_selectors, ): init_datadir_cmd_str = "reth init --datadir={0} --chain={1}".format( EXECUTION_DATA_DIRPATH_ON_CLIENT_CONTAINER, @@ -274,6 +281,7 @@ def get_config( extra_labels, ), tolerations=tolerations, + node_selectors=node_selectors, ) diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index 297e02133..16a008230 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -82,6 +82,7 @@ def input_parser(plan, input_args): result["xatu_sentry_params"] = get_default_xatu_sentry_params() result["persistent"] = False result["global_tolerations"] = [] + result["global_node_selectors"] = {} if constants.NETWORK_NAME.shadowfork in result["network_params"]["network"]: shadow_base = result["network_params"]["network"].split("-shadowfork")[0] @@ -162,6 +163,7 @@ def input_parser(plan, input_args): cl_tolerations=participant["cl_tolerations"], tolerations=participant["tolerations"], validator_tolerations=participant["validator_tolerations"], + node_selectors=participant["node_selectors"], beacon_extra_params=participant["beacon_extra_params"], beacon_extra_labels=participant["beacon_extra_labels"], validator_extra_params=participant["validator_extra_params"], @@ -288,6 +290,7 @@ def input_parser(plan, input_args): xatu_server_tls=result["xatu_sentry_params"]["xatu_server_tls"], ), global_tolerations=result["global_tolerations"], + global_node_selectors=result["global_node_selectors"], ) @@ -517,6 +520,15 @@ def get_client_tolerations( return toleration_list +def get_client_node_selectors( + participant_node_selectors, global_node_selectors +): + node_selectors = {} + node_selectors = participant_node_selectors if participant_node_selectors else {} + if not node_selectors: + node_selectors = global_node_selectors if global_node_selectors else {} + + return node_selectors def default_input_args(): network_params = default_network_params() @@ -575,6 +587,7 @@ def default_participant(): "cl_tolerations": [], "validator_tolerations": [], "tolerations": [], + "node_selectors": {}, "beacon_extra_params": [], "beacon_extra_labels": {}, "validator_extra_params": [], @@ -603,6 +616,8 @@ def default_participant(): }, "blobber_enabled": False, "blobber_extra_params": [], + "global_tolerations": [], + "global_node_selectors": {}, } diff --git a/src/participant_network.star b/src/participant_network.star index dfce04630..9067b253f 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -68,6 +68,7 @@ def launch_participant_network( persistent, xatu_sentry_params, global_tolerations, + global_node_selectors, parallel_keystore_generation=False, ): network_id = network_params.network_id @@ -110,6 +111,10 @@ def launch_participant_network( participant.tolerations, global_tolerations, ) + node_selectors = input_parser.get_client_node_selectors( + participant.node_selectors, + global_node_selectors, + ) cl_client_type = participant.cl_client_type el_client_type = participant.el_client_type @@ -153,6 +158,7 @@ def launch_participant_network( "RCLONE_CONFIG_MYS3_ENDPOINT": "https://ams3.digitaloceanspaces.com", }, tolerations=tolerations, + node_selectors=node_selectors, ), ) for index, participant in enumerate(participants): @@ -450,6 +456,8 @@ def launch_participant_network( participant.el_tolerations, participant.tolerations, global_tolerations, + participant.node_selectors, + global_node_selectors, ) # Add participant el additional prometheus metrics @@ -602,6 +610,8 @@ def launch_participant_network( participant.validator_tolerations, participant.tolerations, global_tolerations, + participant.node_selectors, + global_node_selectors, participant.cl_split_mode_enabled, ) else: @@ -638,6 +648,8 @@ def launch_participant_network( participant.validator_tolerations, participant.tolerations, global_tolerations, + participant.node_selectors, + global_node_selectors, participant.cl_split_mode_enabled, ) From 76c92474055bba1f4984b7097fb749e7875f78d9 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 12:10:14 +0100 Subject: [PATCH 71/90] fix lint --- src/package_io/input_parser.star | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index 16a008230..d837dd228 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -520,9 +520,8 @@ def get_client_tolerations( return toleration_list -def get_client_node_selectors( - participant_node_selectors, global_node_selectors -): + +def get_client_node_selectors(participant_node_selectors, global_node_selectors): node_selectors = {} node_selectors = participant_node_selectors if participant_node_selectors else {} if not node_selectors: @@ -530,6 +529,7 @@ def get_client_node_selectors( return node_selectors + def default_input_args(): network_params = default_network_params() participants = [default_participant()] From 3eab7b2419b661dde2c2ab85e88e0dec7a277cdc Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 12:12:42 +0100 Subject: [PATCH 72/90] revert the nethermind image --- src/package_io/input_parser.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index 297e02133..4be39d044 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -7,7 +7,7 @@ genesis_constants = import_module( DEFAULT_EL_IMAGES = { "geth": "ethereum/client-go:latest", "erigon": "ethpandaops/erigon:devel", - "nethermind": "ethpandaops/nethermind:master", + "nethermind": "nethermindeth/nethermind:master", "besu": "hyperledger/besu:latest", "reth": "ghcr.io/paradigmxyz/reth", "ethereumjs": "ethpandaops/ethereumjs:master", From 2b0bf8f7c58f8a077dba6a7c63c2eadfd8616e1b Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 13:02:16 +0100 Subject: [PATCH 73/90] fix global node selectors --- main.star | 2 ++ src/package_io/input_parser.star | 5 +---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/main.star b/main.star index bef06e591..ddd18dd2a 100644 --- a/main.star +++ b/main.star @@ -61,6 +61,7 @@ def run(plan, args={}): persistent = args_with_right_defaults.persistent xatu_sentry_params = args_with_right_defaults.xatu_sentry_params global_tolerations = args_with_right_defaults.global_tolerations + global_node_selectors = args_with_right_defaults.global_node_selectors grafana_datasource_config_template = read_file( static_files.GRAFANA_DATASOURCE_CONFIG_TEMPLATE_FILEPATH @@ -95,6 +96,7 @@ def run(plan, args={}): persistent, xatu_sentry_params, global_tolerations, + global_node_selectors, parallel_keystore_generation, ) diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index d837dd228..5c68166ab 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -80,9 +80,6 @@ def input_parser(plan, input_args): result["goomy_blob_params"] = get_default_goomy_blob_params() result["assertoor_params"] = get_default_assertoor_params() result["xatu_sentry_params"] = get_default_xatu_sentry_params() - result["persistent"] = False - result["global_tolerations"] = [] - result["global_node_selectors"] = {} if constants.NETWORK_NAME.shadowfork in result["network_params"]["network"]: shadow_base = result["network_params"]["network"].split("-shadowfork")[0] @@ -524,7 +521,7 @@ def get_client_tolerations( def get_client_node_selectors(participant_node_selectors, global_node_selectors): node_selectors = {} node_selectors = participant_node_selectors if participant_node_selectors else {} - if not node_selectors: + if node_selectors == {}: node_selectors = global_node_selectors if global_node_selectors else {} return node_selectors From f3a9ed646cf5abad002bb860949e757363975a9d Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 13:04:48 +0100 Subject: [PATCH 74/90] add test for node selectors --- .github/tests/node-selectors.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/tests/node-selectors.yaml diff --git a/.github/tests/node-selectors.yaml b/.github/tests/node-selectors.yaml new file mode 100644 index 000000000..3bb411796 --- /dev/null +++ b/.github/tests/node-selectors.yaml @@ -0,0 +1,13 @@ +participants: + - el_client_type: reth + cl_client_type: teku + cl_split_mode_enabled: true + node_selectors: { + "kubernetes.io/hostname": testing-1, + } + - el_client_type: reth + cl_client_type: teku + cl_split_mode_enabled: true +global_node_selectors: { + " kubernetes.io/hostname": testing-2, +} From fbecc0ac352062af900975c0d7171c43c1e7dad5 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 13:07:32 +0100 Subject: [PATCH 75/90] fix input parser --- src/package_io/input_parser.star | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index a6204ae65..4a4710962 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -80,6 +80,10 @@ def input_parser(plan, input_args): result["goomy_blob_params"] = get_default_goomy_blob_params() result["assertoor_params"] = get_default_assertoor_params() result["xatu_sentry_params"] = get_default_xatu_sentry_params() + result["persistent"] = False + result["parallel_keystore_generation"] = False + result["global_tolerations"] = [] + result["global_node_selectors"] = {} if constants.NETWORK_NAME.shadowfork in result["network_params"]["network"]: shadow_base = result["network_params"]["network"].split("-shadowfork")[0] From 73d15951ba1f0c59652bca533c67dc43ac6d2e15 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 14:12:44 +0100 Subject: [PATCH 76/90] fix network name logic --- src/shared_utils/shared_utils.star | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/shared_utils/shared_utils.star b/src/shared_utils/shared_utils.star index 41e5597a5..8645116b4 100644 --- a/src/shared_utils/shared_utils.star +++ b/src/shared_utils/shared_utils.star @@ -142,17 +142,15 @@ print(network_id, end="") def get_network_name(network): - if network not in ( - constants.NETWORK_NAME.kurtosis, - constants.NETWORK_NAME.ephemery, - constants.NETWORK_NAME.shadowfork, - constants.PUBLIC_NETWORKS, + if ( + network != constants.NETWORK_NAME.kurtosis + and network != constants.NETWORK_NAME.ephemery + and constants.NETWORK_NAME.shadowfork not in network + and network not in constants.PUBLIC_NETWORKS ): - network_name = "devnets" - else: - network_name = network + return "devnets" - if constants.NETWORK_NAME.shadowfork in network_name: + if constants.NETWORK_NAME.shadowfork in network: network_name = network.split("-shadowfork")[0] return network_name From 74c77e247ad560ae23bd9a48ab3ec54ad571d451 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 14:15:46 +0100 Subject: [PATCH 77/90] fix network name logic --- src/shared_utils/shared_utils.star | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/shared_utils/shared_utils.star b/src/shared_utils/shared_utils.star index 8645116b4..da9f63b79 100644 --- a/src/shared_utils/shared_utils.star +++ b/src/shared_utils/shared_utils.star @@ -142,13 +142,14 @@ print(network_id, end="") def get_network_name(network): + network_name = network if ( network != constants.NETWORK_NAME.kurtosis and network != constants.NETWORK_NAME.ephemery and constants.NETWORK_NAME.shadowfork not in network and network not in constants.PUBLIC_NETWORKS ): - return "devnets" + network_name = "devnets" if constants.NETWORK_NAME.shadowfork in network: network_name = network.split("-shadowfork")[0] From 957db5512496a35793e7f4e124537e0b07c384f3 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 14:22:23 +0100 Subject: [PATCH 78/90] revert changes --- .../el_cl_genesis/el_cl_genesis_generator.star | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star index f440c818f..377415c3a 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star @@ -31,9 +31,9 @@ def generate_el_cl_genesis_data( shard_committee_period, ): files = {} - shadowfork_file = "" - if latest_block != "": - files[SHADOWFORK_FILEPATH] = latest_block + if latest_block == "": + shadowfork_file = "" + else: shadowfork_file = SHADOWFORK_FILEPATH + "/shadowfork/latest_block.json" template_data = new_env_file_for_el_cl_genesis_data( @@ -69,6 +69,8 @@ def generate_el_cl_genesis_data( ) files = {GENESIS_VALUES_PATH: genesis_generation_config_artifact_name} + if latest_block != "": + files[SHADOWFORK_FILEPATH] = latest_block genesis = plan.run_sh( run="cp /opt/values.env /config/values.env && ./entrypoint.sh all && mkdir /network-configs && mv /data/custom_config_data/* /network-configs/", image=image, From 0fc0275ac6c45a75d82fcab46d3c787fb987dbad Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 15:07:55 +0100 Subject: [PATCH 79/90] refactor --- .../el_cl_genesis/el_cl_genesis_generator.star | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star index 377415c3a..d2919bfd5 100644 --- a/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star +++ b/src/prelaunch_data_generator/el_cl_genesis/el_cl_genesis_generator.star @@ -31,9 +31,9 @@ def generate_el_cl_genesis_data( shard_committee_period, ): files = {} - if latest_block == "": - shadowfork_file = "" - else: + shadowfork_file = "" + if latest_block != "": + files[SHADOWFORK_FILEPATH] = latest_block shadowfork_file = SHADOWFORK_FILEPATH + "/shadowfork/latest_block.json" template_data = new_env_file_for_el_cl_genesis_data( @@ -68,9 +68,8 @@ def generate_el_cl_genesis_data( genesis_values_and_dest_filepath, "genesis-el-cl-env-file" ) - files = {GENESIS_VALUES_PATH: genesis_generation_config_artifact_name} - if latest_block != "": - files[SHADOWFORK_FILEPATH] = latest_block + files[GENESIS_VALUES_PATH] = genesis_generation_config_artifact_name + genesis = plan.run_sh( run="cp /opt/values.env /config/values.env && ./entrypoint.sh all && mkdir /network-configs && mv /data/custom_config_data/* /network-configs/", image=image, From 83b8ad30f084a0459568f9423f725c465ed89905 Mon Sep 17 00:00:00 2001 From: parithosh Date: Fri, 9 Feb 2024 18:20:55 +0100 Subject: [PATCH 80/90] adding verkle logic --- src/participant_network.star | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/participant_network.star b/src/participant_network.star index dfce04630..c6141175f 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -75,6 +75,10 @@ def launch_participant_network( latest_block = "" cancun_time = 0 prague_time = 0 + shadowfork_block = "latest" + if constants.NETWORK_NAME.shadowfork in network and ("verkle" in network) and ("holesky" in network): + shadowfork_block = "793312" # Hardcodes verkle shadowfork block for holesky + if ( network_params.network == constants.NETWORK_NAME.kurtosis or constants.NETWORK_NAME.shadowfork in network_params.network @@ -98,7 +102,7 @@ def launch_participant_network( run="mkdir -p /shadowfork && \ curl -o /shadowfork/latest_block.json https://ethpandaops-ethereum-node-snapshots.ams3.digitaloceanspaces.com/" + base_network - + "/geth/latest/latest_snapshot_block.json", + + "/geth/" + shadowfork_block + "/_snapshot_eth_getBlockByNumber.json", image="badouralix/curl-jq", store=[StoreSpec(src="/shadowfork", name="latest_blocks")], ) @@ -130,9 +134,14 @@ def launch_participant_network( + base_network + "/" + el_client_type - + "/latest /data/" + + "/" + shadowfork_block + " /data/" + + el_client_type + + "/snapshot.tar.zst | tar -I zstd -xvf - -C /data/" + el_client_type + "/execution-data" + + "&& rm /data/" + + el_client_type + + "/execution-data.tar.zst" + "&& touch /tmp/finished" + "&& tail -f /dev/null" ], From ed14fa8d046b3add7830a8306c0fe817e46a6260 Mon Sep 17 00:00:00 2001 From: parithosh Date: Fri, 9 Feb 2024 18:33:19 +0100 Subject: [PATCH 81/90] reverted streaming file --- src/participant_network.star | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/participant_network.star b/src/participant_network.star index c6141175f..8b8924e2d 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -76,7 +76,7 @@ def launch_participant_network( cancun_time = 0 prague_time = 0 shadowfork_block = "latest" - if constants.NETWORK_NAME.shadowfork in network and ("verkle" in network) and ("holesky" in network): + if constants.NETWORK_NAME.shadowfork in network_params.network and ("verkle" in network_params.network) and ("holesky" in network_params.network): shadowfork_block = "793312" # Hardcodes verkle shadowfork block for holesky if ( @@ -134,9 +134,13 @@ def launch_participant_network( + base_network + "/" + el_client_type - + "/" + shadowfork_block + " /data/" + + "/" + shadowfork_block + "/snapshot.tar.zst" + + " /data/" + el_client_type - + "/snapshot.tar.zst | tar -I zstd -xvf - -C /data/" + + "/execution-data.tar.zst" + + "&& tar -I zstd -xvf /data/" + + el_client_type + + "/execution-data.tar.zst -C /data/" + el_client_type + "/execution-data" + "&& rm /data/" From 5864a523252ec6fc88e399440dfd23d57760486f Mon Sep 17 00:00:00 2001 From: parithosh Date: Fri, 9 Feb 2024 18:41:30 +0100 Subject: [PATCH 82/90] switch to tar autodetect --- src/participant_network.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/participant_network.star b/src/participant_network.star index 8b8924e2d..c4195d9c7 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -138,7 +138,7 @@ def launch_participant_network( + " /data/" + el_client_type + "/execution-data.tar.zst" - + "&& tar -I zstd -xvf /data/" + + "&& tar -axvf /data/" + el_client_type + "/execution-data.tar.zst -C /data/" + el_client_type From ec464b08aea06b07bdc6d55abf87c332ae5d5ede Mon Sep 17 00:00:00 2001 From: parithosh Date: Fri, 9 Feb 2024 18:56:03 +0100 Subject: [PATCH 83/90] switch to tar autodetect --- src/participant_network.star | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/participant_network.star b/src/participant_network.star index c4195d9c7..794dc781f 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -138,16 +138,16 @@ def launch_participant_network( + " /data/" + el_client_type + "/execution-data.tar.zst" - + "&& tar -axvf /data/" + + " && tar -axvf /data/" + el_client_type + "/execution-data.tar.zst -C /data/" + el_client_type + "/execution-data" - + "&& rm /data/" + + " && rm /data/" + el_client_type + "/execution-data.tar.zst" - + "&& touch /tmp/finished" - + "&& tail -f /dev/null" + + " && touch /tmp/finished" + + " && tail -f /dev/null" ], entrypoint=["/bin/sh", "-c"], files={ From 89145efc47308663795dd5ac5094edfd26403fa8 Mon Sep 17 00:00:00 2001 From: parithosh Date: Fri, 9 Feb 2024 19:03:08 +0100 Subject: [PATCH 84/90] switch to tar autodetect --- src/participant_network.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/participant_network.star b/src/participant_network.star index 794dc781f..a06bac2b3 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -137,7 +137,7 @@ def launch_participant_network( + "/" + shadowfork_block + "/snapshot.tar.zst" + " /data/" + el_client_type - + "/execution-data.tar.zst" + + "/execution-data.tar.zst && sleep 5" + " && tar -axvf /data/" + el_client_type + "/execution-data.tar.zst -C /data/" From 4dfe8f7fa8cd3d436ef48b2d5334013ed9775019 Mon Sep 17 00:00:00 2001 From: parithosh Date: Fri, 9 Feb 2024 19:43:31 +0100 Subject: [PATCH 85/90] thank you rafael --- src/participant_network.star | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/participant_network.star b/src/participant_network.star index a06bac2b3..1ec3c61e1 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -128,24 +128,16 @@ def launch_participant_network( shadowfork_data = plan.add_service( name="shadowfork-{0}".format(el_service_name), config=ServiceConfig( - image="rclone/rclone:1.55.1", + image="alpine:3.19.1", cmd=[ - "rclone copy -P mys3:ethpandaops-ethereum-node-snapshots/" + "apk add --no-cache curl tar zstd && curl -s -L https://ethpandaops-ethereum-node-snapshots.ams3.digitaloceanspaces.com/" + base_network + "/" + el_client_type + "/" + shadowfork_block + "/snapshot.tar.zst" - + " /data/" - + el_client_type - + "/execution-data.tar.zst && sleep 5" - + " && tar -axvf /data/" - + el_client_type - + "/execution-data.tar.zst -C /data/" + + " | tar -I zstd -xvf - -C /data/" + el_client_type + "/execution-data" - + " && rm /data/" - + el_client_type - + "/execution-data.tar.zst" + " && touch /tmp/finished" + " && tail -f /dev/null" ], From 211211a0e21ea03e622c759bbc03cade98512e6f Mon Sep 17 00:00:00 2001 From: parithosh Date: Fri, 9 Feb 2024 20:11:55 +0100 Subject: [PATCH 86/90] lint so bbusa can sleep well --- src/participant_network.star | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/participant_network.star b/src/participant_network.star index 1ec3c61e1..2b159e7d2 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -76,8 +76,12 @@ def launch_participant_network( cancun_time = 0 prague_time = 0 shadowfork_block = "latest" - if constants.NETWORK_NAME.shadowfork in network_params.network and ("verkle" in network_params.network) and ("holesky" in network_params.network): - shadowfork_block = "793312" # Hardcodes verkle shadowfork block for holesky + if ( + constants.NETWORK_NAME.shadowfork in network_params.network + and ("verkle" in network_params.network) + and ("holesky" in network_params.network) + ): + shadowfork_block = "793312" # Hardcodes verkle shadowfork block for holesky if ( network_params.network == constants.NETWORK_NAME.kurtosis @@ -102,7 +106,9 @@ def launch_participant_network( run="mkdir -p /shadowfork && \ curl -o /shadowfork/latest_block.json https://ethpandaops-ethereum-node-snapshots.ams3.digitaloceanspaces.com/" + base_network - + "/geth/" + shadowfork_block + "/_snapshot_eth_getBlockByNumber.json", + + "/geth/" + + shadowfork_block + + "/_snapshot_eth_getBlockByNumber.json", image="badouralix/curl-jq", store=[StoreSpec(src="/shadowfork", name="latest_blocks")], ) @@ -134,7 +140,9 @@ def launch_participant_network( + base_network + "/" + el_client_type - + "/" + shadowfork_block + "/snapshot.tar.zst" + + "/" + + shadowfork_block + + "/snapshot.tar.zst" + " | tar -I zstd -xvf - -C /data/" + el_client_type + "/execution-data" From de444233c6877531e324122b5bc9f13adfcf7447 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Fri, 9 Feb 2024 20:36:33 +0100 Subject: [PATCH 87/90] fix lint, remove not needed env --- src/el/besu/besu_launcher.star | 2 +- src/participant_network.star | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/el/besu/besu_launcher.star b/src/el/besu/besu_launcher.star index 4f577ba4f..00f7fe051 100644 --- a/src/el/besu/besu_launcher.star +++ b/src/el/besu/besu_launcher.star @@ -88,7 +88,7 @@ def launch( tolerations = input_parser.get_client_tolerations( el_tolerations, participant_tolerations, global_tolerations ) - + node_selectors = input_parser.get_client_node_selectors( participant_node_selectors, global_node_selectors ) diff --git a/src/participant_network.star b/src/participant_network.star index af2f7ec52..68a75696a 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -114,7 +114,6 @@ def launch_participant_network( store=[StoreSpec(src="/shadowfork", name="latest_blocks")], ) - # maybe we can do the copy in the same step as the fetch? for index, participant in enumerate(participants): tolerations = input_parser.get_client_tolerations( participant.el_tolerations, @@ -166,14 +165,8 @@ def launch_participant_network( ], ), }, - env_vars={ - "RCLONE_CONFIG_MYS3_TYPE": "s3", - "RCLONE_CONFIG_MYS3_PROVIDER": "DigitalOcean", - "RCLONE_CONFIG_MYS3_ENDPOINT": "https://ams3.digitaloceanspaces.com", - }, tolerations=tolerations, node_selectors=node_selectors, - ), ) for index, participant in enumerate(participants): From 0768fba46637d2ed25d3c08aacfeb26a83f9c10c Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Mon, 12 Feb 2024 08:15:16 +0100 Subject: [PATCH 88/90] Update node-selectors.yaml Co-authored-by: Gyanendra Mishra --- .github/tests/node-selectors.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/tests/node-selectors.yaml b/.github/tests/node-selectors.yaml index 3bb411796..a011f73dc 100644 --- a/.github/tests/node-selectors.yaml +++ b/.github/tests/node-selectors.yaml @@ -9,5 +9,5 @@ participants: cl_client_type: teku cl_split_mode_enabled: true global_node_selectors: { - " kubernetes.io/hostname": testing-2, + "kubernetes.io/hostname": testing-2, } From 8cc4928c127cd7b77eb1ba611ef85c13cff9c879 Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Mon, 12 Feb 2024 12:42:32 +0100 Subject: [PATCH 89/90] add node selectors to all tooling too --- main.star | 32 +++++++++++++-- src/assertoor/assertoor_launcher.star | 4 ++ .../beacon_metrics_gazer_launcher.star | 11 ++++- src/blob_spammer/blob_spammer.star | 4 ++ src/blobber/blobber_launcher.star | 24 +++++++++-- src/blobscan/blobscan_launcher.star | 41 ++++++++++++++++--- src/blockscout/blockscout_launcher.star | 24 ++++++++--- src/broadcaster/broadcaster.star | 10 +++-- src/cl/lighthouse/lighthouse_launcher.star | 8 +--- src/cl/lodestar/lodestar_launcher.star | 7 +--- src/cl/nimbus/nimbus_launcher.star | 7 +--- src/cl/prysm/prysm_launcher.star | 7 +--- src/cl/teku/teku_launcher.star | 7 +--- src/dora/dora_launcher.star | 4 ++ src/el_forkmon/el_forkmon_launcher.star | 9 +++- .../ethereum_metrics_exporter_launcher.star | 2 + .../full_beaconchain_launcher.star | 12 ++++++ src/goomy_blob/goomy_blob.star | 4 ++ src/grafana/grafana_launcher.star | 4 ++ src/mev/mev_boost/mev_boost_launcher.star | 24 +++++++++-- .../mev_custom_flood_launcher.star | 10 ++++- src/mev/mev_flood/mev_flood_launcher.star | 10 ++++- src/mev/mev_relay/mev_relay_launcher.star | 7 ++++ src/mev/mock_mev/mock_mev_launcher.star | 10 ++++- src/participant_network.star | 13 ++++-- src/prometheus/prometheus_launcher.star | 9 +++- src/snooper/snooper_engine_launcher.star | 7 ++-- .../transaction_spammer.star | 17 +++++++- src/xatu_sentry/xatu_sentry_launcher.star | 2 + 29 files changed, 259 insertions(+), 71 deletions(-) diff --git a/main.star b/main.star index ddd18dd2a..7ef2fd7ff 100644 --- a/main.star +++ b/main.star @@ -139,7 +139,9 @@ def run(plan, args={}): 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 + plan, + all_el_client_contexts, + global_node_selectors, ) fuzz_target = "http://{0}:{1}".format( broadcaster_service.ip_address, @@ -172,6 +174,7 @@ def run(plan, args={}): beacon_uri, raw_jwt_secret, args_with_right_defaults.global_client_log_level, + global_node_selectors, ) mev_endpoints.append(endpoint) elif ( @@ -197,6 +200,7 @@ def run(plan, args={}): fuzz_target, contract_owner.private_key, normal_user.private_key, + global_node_selectors, ) epoch_recipe = GetHttpRequestRecipe( endpoint="/eth/v2/beacon/blocks/head", @@ -220,6 +224,7 @@ def run(plan, args={}): builder_uri, network_params.seconds_per_slot, persistent, + global_node_selectors, ) mev_flood.spam_in_background( plan, @@ -240,7 +245,8 @@ def run(plan, args={}): ) if args_with_right_defaults.participants[index].validator_count != 0: mev_boost_launcher = mev_boost.new_mev_boost_launcher( - MEV_BOOST_SHOULD_CHECK_RELAY, mev_endpoints + MEV_BOOST_SHOULD_CHECK_RELAY, + mev_endpoints, ) mev_boost_service_name = "{0}-{1}-{2}-{3}".format( input_parser.MEV_BOOST_SERVICE_NAME_PREFIX, @@ -254,6 +260,7 @@ def run(plan, args={}): mev_boost_service_name, network_params.network_id, mev_params.mev_boost_image, + global_node_selectors, ) all_mevboost_contexts.append(mev_boost_context) @@ -277,6 +284,7 @@ def run(plan, args={}): fuzz_target, tx_spammer_params, network_params.electra_fork_epoch, + global_node_selectors, ) plan.print("Successfully launched transaction spammer") elif additional_service == "blob_spammer": @@ -289,6 +297,7 @@ def run(plan, args={}): network_params.deneb_fork_epoch, network_params.seconds_per_slot, network_params.genesis_delay, + global_node_selectors, ) plan.print("Successfully launched blob spammer") elif additional_service == "goomy_blob": @@ -301,6 +310,7 @@ def run(plan, args={}): all_cl_client_contexts[0], network_params.seconds_per_slot, goomy_blob_params, + global_node_selectors, ) plan.print("Successfully launched goomy the blob spammer") # We need a way to do time.sleep @@ -311,7 +321,10 @@ def run(plan, args={}): static_files.EL_FORKMON_CONFIG_TEMPLATE_FILEPATH ) el_forkmon.launch_el_forkmon( - plan, el_forkmon_config_template, all_el_client_contexts + plan, + el_forkmon_config_template, + all_el_client_contexts, + global_node_selectors, ) plan.print("Successfully launched execution layer forkmon") elif additional_service == "beacon_metrics_gazer": @@ -321,6 +334,7 @@ def run(plan, args={}): plan, all_cl_client_contexts, network_params, + global_node_selectors, ) ) launch_prometheus_grafana = True @@ -331,7 +345,10 @@ def run(plan, args={}): elif additional_service == "blockscout": plan.print("Launching blockscout") blockscout_sc_verif_url = blockscout.launch_blockscout( - plan, all_el_client_contexts, persistent + plan, + all_el_client_contexts, + persistent, + global_node_selectors, ) plan.print("Successfully launched blockscout") elif additional_service == "dora": @@ -344,6 +361,7 @@ def run(plan, args={}): el_cl_data_files_artifact_uuid, network_params.electra_fork_epoch, network_params.network, + global_node_selectors, ) plan.print("Successfully launched dora") elif additional_service == "blobscan": @@ -354,6 +372,7 @@ def run(plan, args={}): all_el_client_contexts, network_params.network_id, persistent, + global_node_selectors, ) plan.print("Successfully launched blobscan") elif additional_service == "full_beaconchain_explorer": @@ -367,6 +386,7 @@ def run(plan, args={}): all_cl_client_contexts, all_el_client_contexts, persistent, + global_node_selectors, ) plan.print("Successfully launched full-beaconchain-explorer") elif additional_service == "prometheus_grafana": @@ -385,6 +405,7 @@ def run(plan, args={}): args_with_right_defaults.participants, network_params, assertoor_params, + global_node_selectors, ) plan.print("Successfully launched assertoor") elif additional_service == "custom_flood": @@ -394,6 +415,7 @@ def run(plan, args={}): genesis_constants.PRE_FUNDED_ACCOUNTS[0].address, fuzz_target, args_with_right_defaults.custom_flood_params, + global_node_selectors, ) else: fail("Invalid additional service %s" % (additional_service)) @@ -406,6 +428,7 @@ def run(plan, args={}): prometheus_additional_metrics_jobs, all_ethereum_metrics_exporter_contexts, all_xatu_sentry_contexts, + global_node_selectors, ) plan.print("Launching grafana...") @@ -414,6 +437,7 @@ def run(plan, args={}): grafana_datasource_config_template, grafana_dashboards_config_template, prometheus_private_url, + global_node_selectors, additional_dashboards=args_with_right_defaults.grafana_additional_dashboards, ) plan.print("Successfully launched grafana") diff --git a/src/assertoor/assertoor_launcher.star b/src/assertoor/assertoor_launcher.star index 9a41d8e31..94a73d0cc 100644 --- a/src/assertoor/assertoor_launcher.star +++ b/src/assertoor/assertoor_launcher.star @@ -36,6 +36,7 @@ def launch_assertoor( participant_configs, network_params, assertoor_params, + global_node_selectors, ): all_client_info = [] validator_client_info = [] @@ -91,6 +92,7 @@ def launch_assertoor( tests_config_artifacts_name, network_params, assertoor_params, + global_node_selectors, ) plan.add_service(SERVICE_NAME, config) @@ -101,6 +103,7 @@ def get_config( tests_config_artifacts_name, network_params, assertoor_params, + node_selectors, ): config_file_path = shared_utils.path_join( ASSERTOOR_CONFIG_MOUNT_DIRPATH_ON_SERVICE, @@ -127,6 +130,7 @@ def get_config( max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/beacon_metrics_gazer/beacon_metrics_gazer_launcher.star b/src/beacon_metrics_gazer/beacon_metrics_gazer_launcher.star index bce574e50..2d0b6739c 100644 --- a/src/beacon_metrics_gazer/beacon_metrics_gazer_launcher.star +++ b/src/beacon_metrics_gazer/beacon_metrics_gazer_launcher.star @@ -31,10 +31,16 @@ MIN_MEMORY = 20 MAX_MEMORY = 300 -def launch_beacon_metrics_gazer(plan, cl_client_contexts, network_params): +def launch_beacon_metrics_gazer( + plan, + cl_client_contexts, + network_params, + global_node_selectors, +): config = get_config( cl_client_contexts[0].ip_addr, cl_client_contexts[0].http_port_num, + global_node_selectors, ) beacon_metrics_gazer_service = plan.add_service(SERVICE_NAME, config) @@ -51,7 +57,7 @@ def launch_beacon_metrics_gazer(plan, cl_client_contexts, network_params): ) -def get_config(ip_addr, http_port_num): +def get_config(ip_addr, http_port_num, node_selectors): config_file_path = shared_utils.path_join( BEACON_METRICS_GAZER_CONFIG_MOUNT_DIRPATH_ON_SERVICE, BEACON_METRICS_GAZER_CONFIG_FILENAME, @@ -76,4 +82,5 @@ def get_config(ip_addr, http_port_num): max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/blob_spammer/blob_spammer.star b/src/blob_spammer/blob_spammer.star index 10cadc5cf..c294e60ff 100644 --- a/src/blob_spammer/blob_spammer.star +++ b/src/blob_spammer/blob_spammer.star @@ -18,6 +18,7 @@ def launch_blob_spammer( deneb_fork_epoch, seconds_per_slot, genesis_delay, + global_node_selectors, ): config = get_config( prefunded_addresses, @@ -26,6 +27,7 @@ def launch_blob_spammer( deneb_fork_epoch, seconds_per_slot, genesis_delay, + global_node_selectors, ) plan.add_service(SERVICE_NAME, config) @@ -37,6 +39,7 @@ def get_config( deneb_fork_epoch, seconds_per_slot, genesis_delay, + node_selectors, ): dencunTime = (deneb_fork_epoch * 32 * seconds_per_slot) + genesis_delay return ServiceConfig( @@ -68,4 +71,5 @@ def get_config( max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/blobber/blobber_launcher.star b/src/blobber/blobber_launcher.star index 0f2873ace..8d9438f97 100644 --- a/src/blobber/blobber_launcher.star +++ b/src/blobber/blobber_launcher.star @@ -35,11 +35,22 @@ MIN_MEMORY = 10 MAX_MEMORY = 300 -def launch(plan, service_name, node_keystore_files, beacon_http_url, extra_params): +def launch( + plan, + service_name, + node_keystore_files, + beacon_http_url, + extra_params, + node_selectors, +): blobber_service_name = "{0}".format(service_name) blobber_config = get_config( - service_name, node_keystore_files, beacon_http_url, extra_params + service_name, + node_keystore_files, + beacon_http_url, + extra_params, + node_selectors, ) blobber_service = plan.add_service(blobber_service_name, blobber_config) @@ -49,7 +60,13 @@ def launch(plan, service_name, node_keystore_files, beacon_http_url, extra_param ) -def get_config(service_name, node_keystore_files, beacon_http_url, extra_params): +def get_config( + service_name, + node_keystore_files, + beacon_http_url, + extra_params, + node_selectors, +): validator_root_dirpath = shared_utils.path_join( VALIDATOR_KEYS_MOUNTPOINT_ON_CLIENTS, node_keystore_files.raw_root_dirpath, @@ -78,4 +95,5 @@ def get_config(service_name, node_keystore_files, beacon_http_url, extra_params) max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/blobscan/blobscan_launcher.star b/src/blobscan/blobscan_launcher.star index a8a22ea81..2a5c90591 100644 --- a/src/blobscan/blobscan_launcher.star +++ b/src/blobscan/blobscan_launcher.star @@ -59,7 +59,9 @@ def launch_blobscan( el_client_contexts, chain_id, persistent, + global_node_selectors, ): + node_selectors = global_node_selectors beacon_node_rpc_uri = "http://{0}:{1}".format( cl_client_contexts[0].ip_addr, cl_client_contexts[0].http_port_num ) @@ -75,24 +77,43 @@ def launch_blobscan( min_memory=POSTGRES_MIN_MEMORY, max_memory=POSTGRES_MAX_MEMORY, persistent=persistent, + node_selectors=node_selectors, + ) + api_config = get_api_config( + postgres_output.url, + beacon_node_rpc_uri, + chain_id, + node_selectors, ) - api_config = get_api_config(postgres_output.url, beacon_node_rpc_uri, chain_id) blobscan_config = plan.add_service(API_SERVICE_NAME, api_config) blobscan_api_url = "http://{0}:{1}".format( blobscan_config.ip_address, blobscan_config.ports[HTTP_PORT_ID].number ) - web_config = get_web_config(postgres_output.url, beacon_node_rpc_uri, chain_id) + web_config = get_web_config( + postgres_output.url, + beacon_node_rpc_uri, + chain_id, + node_selectors, + ) plan.add_service(WEB_SERVICE_NAME, web_config) indexer_config = get_indexer_config( - beacon_node_rpc_uri, execution_node_rpc_uri, blobscan_api_url + beacon_node_rpc_uri, + execution_node_rpc_uri, + blobscan_api_url, + node_selectors, ) plan.add_service(INDEXER_SERVICE_NAME, indexer_config) -def get_api_config(database_url, beacon_node_rpc, chain_id): +def get_api_config( + database_url, + beacon_node_rpc, + chain_id, + node_selectors, +): IMAGE_NAME = "blossomlabs/blobscan:stable" return ServiceConfig( @@ -121,10 +142,11 @@ def get_api_config(database_url, beacon_node_rpc, chain_id): max_cpu=API_MAX_CPU, min_memory=API_MIN_MEMORY, max_memory=API_MAX_MEMORY, + node_selectors=node_selectors, ) -def get_web_config(database_url, beacon_node_rpc, chain_id): +def get_web_config(database_url, beacon_node_rpc, chain_id, node_selectors): # TODO: https://github.com/kurtosis-tech/kurtosis/issues/1861 # Configure NEXT_PUBLIC_BEACON_BASE_URL and NEXT_PUBLIC_EXPLORER_BASE env vars # once retrieving external URLs from services are supported in Kurtosis. @@ -145,10 +167,16 @@ def get_web_config(database_url, beacon_node_rpc, chain_id): max_cpu=WEB_MAX_CPU, min_memory=WEB_MIN_MEMORY, max_memory=WEB_MAX_MEMORY, + node_selectors=node_selectors, ) -def get_indexer_config(beacon_node_rpc, execution_node_rpc, blobscan_api_url): +def get_indexer_config( + beacon_node_rpc, + execution_node_rpc, + blobscan_api_url, + node_selectors, +): IMAGE_NAME = "blossomlabs/blobscan-indexer:master" return ServiceConfig( @@ -165,4 +193,5 @@ def get_indexer_config(beacon_node_rpc, execution_node_rpc, blobscan_api_url): max_cpu=INDEX_MAX_CPU, min_memory=INDEX_MIN_MEMORY, max_memory=INDEX_MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/blockscout/blockscout_launcher.star b/src/blockscout/blockscout_launcher.star index 23ce9a366..5c515d9d7 100644 --- a/src/blockscout/blockscout_launcher.star +++ b/src/blockscout/blockscout_launcher.star @@ -38,13 +38,19 @@ VERIF_USED_PORTS = { } -def launch_blockscout(plan, el_client_contexts, persistent): +def launch_blockscout( + plan, + el_client_contexts, + persistent, + global_node_selectors, +): postgres_output = postgres.run( plan, service_name="{}-postgres".format(SERVICE_NAME_BLOCKSCOUT), database="blockscout", extra_configs=["max_connections=1000"], persistent=persistent, + node_selectors=global_node_selectors, ) el_client_context = el_client_contexts[0] @@ -53,7 +59,7 @@ def launch_blockscout(plan, el_client_contexts, persistent): ) el_client_name = el_client_context.client_name - config_verif = get_config_verif() + config_verif = get_config_verif(global_node_selectors) verif_service_name = "{}-verif".format(SERVICE_NAME_BLOCKSCOUT) verif_service = plan.add_service(verif_service_name, config_verif) verif_url = "http://{}:{}/api".format( @@ -61,7 +67,11 @@ def launch_blockscout(plan, el_client_contexts, persistent): ) config_backend = get_config_backend( - postgres_output, el_client_rpc_url, verif_url, el_client_name + postgres_output, + el_client_rpc_url, + verif_url, + el_client_name, + global_node_selectors, ) blockscout_service = plan.add_service(SERVICE_NAME_BLOCKSCOUT, config_backend) plan.print(blockscout_service) @@ -73,7 +83,7 @@ def launch_blockscout(plan, el_client_contexts, persistent): return blockscout_url -def get_config_verif(): +def get_config_verif(node_selectors): return ServiceConfig( image=IMAGE_NAME_BLOCKSCOUT_VERIF, ports=VERIF_USED_PORTS, @@ -86,10 +96,13 @@ def get_config_verif(): max_cpu=BLOCKSCOUT_VERIF_MAX_CPU, min_memory=BLOCKSCOUT_VERIF_MIN_MEMORY, max_memory=BLOCKSCOUT_VERIF_MAX_MEMORY, + node_selectors=node_selectors, ) -def get_config_backend(postgres_output, el_client_rpc_url, verif_url, el_client_name): +def get_config_backend( + postgres_output, el_client_rpc_url, verif_url, el_client_name, node_selectors +): database_url = "{protocol}://{user}:{password}@{hostname}:{port}/{database}".format( protocol="postgresql", user=postgres_output.user, @@ -128,4 +141,5 @@ def get_config_backend(postgres_output, el_client_rpc_url, verif_url, el_client_ max_cpu=BLOCKSCOUT_MAX_CPU, min_memory=BLOCKSCOUT_MIN_MEMORY, max_memory=BLOCKSCOUT_MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/broadcaster/broadcaster.star b/src/broadcaster/broadcaster.star index 5a26b56bb..1cb671598 100644 --- a/src/broadcaster/broadcaster.star +++ b/src/broadcaster/broadcaster.star @@ -9,12 +9,15 @@ MIN_MEMORY = 128 MAX_MEMORY = 2048 -def launch_broadcaster(plan, all_el_client_contexts): - config = get_config(all_el_client_contexts) +def launch_broadcaster(plan, all_el_client_contexts, global_node_selectors): + config = get_config(all_el_client_contexts, global_node_selectors) return plan.add_service(SERVICE_NAME, config) -def get_config(all_el_client_contexts): +def get_config( + all_el_client_contexts, + node_selectors, +): return ServiceConfig( image=IMAGE_NAME, cmd=[ @@ -25,4 +28,5 @@ def get_config(all_el_client_contexts): max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/cl/lighthouse/lighthouse_launcher.star b/src/cl/lighthouse/lighthouse_launcher.star index 815443e18..c22694847 100644 --- a/src/cl/lighthouse/lighthouse_launcher.star +++ b/src/cl/lighthouse/lighthouse_launcher.star @@ -123,8 +123,7 @@ def launch( validator_tolerations, participant_tolerations, global_tolerations, - participant_node_selectors, - global_node_selectors, + node_selectors, split_mode_enabled=False, ): beacon_service_name = "{0}".format(service_name) @@ -140,10 +139,6 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) - node_selectors = input_parser.get_client_node_selectors( - participant_node_selectors, global_node_selectors - ) - network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU @@ -204,6 +199,7 @@ def launch( node_keystore_files, beacon_http_url, blobber_extra_params, + node_selectors, ) blobber_service = plan.add_service(blobber_service_name, blobber_config) diff --git a/src/cl/lodestar/lodestar_launcher.star b/src/cl/lodestar/lodestar_launcher.star index 5610a0ac0..4ca3abd5b 100644 --- a/src/cl/lodestar/lodestar_launcher.star +++ b/src/cl/lodestar/lodestar_launcher.star @@ -102,8 +102,7 @@ def launch( validator_tolerations, participant_tolerations, global_tolerations, - participant_node_selectors, - global_node_selectors, + node_selectors, split_mode_enabled=False, ): beacon_service_name = "{0}".format(service_name) @@ -118,10 +117,6 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) - node_selectors = input_parser.get_client_node_selectors( - participant_node_selectors, global_node_selectors - ) - network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU diff --git a/src/cl/nimbus/nimbus_launcher.star b/src/cl/nimbus/nimbus_launcher.star index a0232eac1..71a286c56 100644 --- a/src/cl/nimbus/nimbus_launcher.star +++ b/src/cl/nimbus/nimbus_launcher.star @@ -137,8 +137,7 @@ def launch( validator_tolerations, participant_tolerations, global_tolerations, - participant_node_selectors, - global_node_selectors, + node_selectors, split_mode_enabled, ): beacon_service_name = "{0}".format(service_name) @@ -154,10 +153,6 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) - node_selectors = input_parser.get_client_node_selectors( - participant_node_selectors, global_node_selectors - ) - network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU diff --git a/src/cl/prysm/prysm_launcher.star b/src/cl/prysm/prysm_launcher.star index 9e11add85..697694d6f 100644 --- a/src/cl/prysm/prysm_launcher.star +++ b/src/cl/prysm/prysm_launcher.star @@ -114,8 +114,7 @@ def launch( validator_tolerations, participant_tolerations, global_tolerations, - participant_node_selectors, - global_node_selectors, + node_selectors, split_mode_enabled=False, ): split_images = images.split(IMAGE_SEPARATOR_DELIMITER) @@ -145,10 +144,6 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) - node_selectors = input_parser.get_client_node_selectors( - participant_node_selectors, global_node_selectors - ) - network_name = shared_utils.get_network_name(launcher.network) bn_min_cpu = int(bn_min_cpu) if int(bn_min_cpu) > 0 else BEACON_MIN_CPU diff --git a/src/cl/teku/teku_launcher.star b/src/cl/teku/teku_launcher.star index fab537727..80aae97b8 100644 --- a/src/cl/teku/teku_launcher.star +++ b/src/cl/teku/teku_launcher.star @@ -127,8 +127,7 @@ def launch( validator_tolerations, participant_tolerations, global_tolerations, - participant_node_selectors, - global_node_selectors, + node_selectors, split_mode_enabled, ): beacon_service_name = "{0}".format(service_name) @@ -143,10 +142,6 @@ def launch( cl_tolerations, participant_tolerations, global_tolerations ) - node_selectors = input_parser.get_client_node_selectors( - participant_node_selectors, global_node_selectors - ) - extra_params = [param for param in extra_beacon_params] + [ param for param in extra_validator_params ] diff --git a/src/dora/dora_launcher.star b/src/dora/dora_launcher.star index d862b7ceb..568fd230d 100644 --- a/src/dora/dora_launcher.star +++ b/src/dora/dora_launcher.star @@ -34,6 +34,7 @@ def launch_dora( el_cl_data_files_artifact_uuid, electra_fork_epoch, network, + global_node_selectors, ): all_cl_client_info = [] for index, client in enumerate(cl_client_contexts): @@ -62,6 +63,7 @@ def launch_dora( el_cl_data_files_artifact_uuid, electra_fork_epoch, network, + global_node_selectors, ) plan.add_service(SERVICE_NAME, config) @@ -72,6 +74,7 @@ def get_config( el_cl_data_files_artifact_uuid, electra_fork_epoch, network, + node_selectors, ): config_file_path = shared_utils.path_join( DORA_CONFIG_MOUNT_DIRPATH_ON_SERVICE, @@ -97,6 +100,7 @@ def get_config( max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/el_forkmon/el_forkmon_launcher.star b/src/el_forkmon/el_forkmon_launcher.star index 0f0beceee..a03df2999 100644 --- a/src/el_forkmon/el_forkmon_launcher.star +++ b/src/el_forkmon/el_forkmon_launcher.star @@ -30,6 +30,7 @@ def launch_el_forkmon( plan, config_template, el_client_contexts, + global_node_selectors, ): all_el_client_info = [] for client in el_client_contexts: @@ -52,12 +53,15 @@ def launch_el_forkmon( template_and_data_by_rel_dest_filepath, "el-forkmon-config" ) - config = get_config(config_files_artifact_name) + config = get_config( + config_files_artifact_name, + global_node_selectors, + ) plan.add_service(SERVICE_NAME, config) -def get_config(config_files_artifact_name): +def get_config(config_files_artifact_name, node_selectors): config_file_path = shared_utils.path_join( EL_FORKMON_CONFIG_MOUNT_DIRPATH_ON_SERVICE, EL_FORKMON_CONFIG_FILENAME ) @@ -72,6 +76,7 @@ def get_config(config_files_artifact_name): max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/ethereum_metrics_exporter/ethereum_metrics_exporter_launcher.star b/src/ethereum_metrics_exporter/ethereum_metrics_exporter_launcher.star index 608ccd6df..ba5321cc7 100644 --- a/src/ethereum_metrics_exporter/ethereum_metrics_exporter_launcher.star +++ b/src/ethereum_metrics_exporter/ethereum_metrics_exporter_launcher.star @@ -22,6 +22,7 @@ def launch( ethereum_metrics_exporter_service_name, el_client_context, cl_client_context, + node_selectors, ): exporter_service = plan.add_service( ethereum_metrics_exporter_service_name, @@ -52,6 +53,7 @@ def launch( max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ), ) diff --git a/src/full_beaconchain/full_beaconchain_launcher.star b/src/full_beaconchain/full_beaconchain_launcher.star index 1c22e232d..f0f87d37d 100644 --- a/src/full_beaconchain/full_beaconchain_launcher.star +++ b/src/full_beaconchain/full_beaconchain_launcher.star @@ -97,7 +97,9 @@ def launch_full_beacon( cl_client_contexts, el_client_contexts, persistent, + global_node_selectors, ): + node_selectors = global_node_selectors postgres_output = postgres.run( plan, service_name="beaconchain-postgres", @@ -110,6 +112,7 @@ def launch_full_beacon( min_memory=POSTGRES_MIN_MEMORY, max_memory=POSTGRES_MAX_MEMORY, persistent=persistent, + node_selectors=node_selectors, ) redis_output = redis.run( plan, @@ -119,6 +122,7 @@ def launch_full_beacon( max_cpu=REDIS_MAX_CPU, min_memory=REDIS_MIN_MEMORY, max_memory=REDIS_MAX_MEMORY, + node_selectors=node_selectors, ) # TODO perhaps create a new service for the littlebigtable little_bigtable = plan.add_service( @@ -134,6 +138,7 @@ def launch_full_beacon( max_cpu=LITTLE_BIGTABLE_MAX_CPU, min_memory=LITTLE_BIGTABLE_MIN_MEMORY, max_memory=LITTLE_BIGTABLE_MAX_MEMORY, + node_selectors=node_selectors, ), ) @@ -178,6 +183,7 @@ def launch_full_beacon( max_cpu=INIT_MAX_CPU, min_memory=INIT_MIN_MEMORY, max_memory=INIT_MAX_MEMORY, + node_selectors=node_selectors, ), ) @@ -224,6 +230,7 @@ def launch_full_beacon( max_cpu=INDEXER_MAX_CPU, min_memory=INDEXER_MIN_MEMORY, max_memory=INDEXER_MAX_MEMORY, + node_selectors=node_selectors, ), ) # Start the eth1indexer @@ -250,6 +257,7 @@ def launch_full_beacon( max_cpu=ETH1INDEXER_MAX_CPU, min_memory=ETH1INDEXER_MIN_MEMORY, max_memory=ETH1INDEXER_MAX_MEMORY, + node_selectors=node_selectors, ), ) @@ -269,6 +277,7 @@ def launch_full_beacon( max_cpu=REWARDSEXPORTER_MAX_CPU, min_memory=REWARDSEXPORTER_MIN_MEMORY, max_memory=REWARDSEXPORTER_MAX_MEMORY, + node_selectors=node_selectors, ), ) @@ -291,6 +300,7 @@ def launch_full_beacon( max_cpu=STATISTICS_MAX_CPU, min_memory=STATISTICS_MIN_MEMORY, max_memory=STATISTICS_MAX_MEMORY, + node_selectors=node_selectors, ), ) @@ -310,6 +320,7 @@ def launch_full_beacon( max_cpu=FDU_MAX_CPU, min_memory=FDU_MIN_MEMORY, max_memory=FDU_MAX_MEMORY, + node_selectors=node_selectors, ), ) @@ -337,6 +348,7 @@ def launch_full_beacon( max_cpu=FRONTEND_MAX_CPU, min_memory=FRONTEND_MIN_MEMORY, max_memory=FRONTEND_MAX_MEMORY, + node_selectors=node_selectors, ), ) diff --git a/src/goomy_blob/goomy_blob.star b/src/goomy_blob/goomy_blob.star index d62c2c756..b6f55c6f2 100644 --- a/src/goomy_blob/goomy_blob.star +++ b/src/goomy_blob/goomy_blob.star @@ -17,6 +17,7 @@ def launch_goomy_blob( cl_client_context, seconds_per_slot, goomy_blob_params, + global_node_selectors, ): config = get_config( prefunded_addresses, @@ -24,6 +25,7 @@ def launch_goomy_blob( cl_client_context, seconds_per_slot, goomy_blob_params.goomy_blob_args, + global_node_selectors, ) plan.add_service(SERVICE_NAME, config) @@ -34,6 +36,7 @@ def get_config( cl_client_context, seconds_per_slot, goomy_blob_args, + node_selectors, ): goomy_cli_args = [] for index, client in enumerate(el_client_contexts): @@ -77,4 +80,5 @@ def get_config( max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/grafana/grafana_launcher.star b/src/grafana/grafana_launcher.star index b7f335214..eec063713 100644 --- a/src/grafana/grafana_launcher.star +++ b/src/grafana/grafana_launcher.star @@ -50,6 +50,7 @@ def launch_grafana( datasource_config_template, dashboard_providers_config_template, prometheus_private_url, + global_node_selectors, additional_dashboards=[], ): ( @@ -73,6 +74,7 @@ def launch_grafana( config = get_config( grafana_config_artifacts_uuid, merged_dashboards_artifact_name, + global_node_selectors, ) plan.add_service(SERVICE_NAME, config) @@ -127,6 +129,7 @@ def get_grafana_config_dir_artifact_uuid( def get_config( grafana_config_artifacts_name, grafana_dashboards_artifacts_name, + node_selectors, ): return ServiceConfig( image=IMAGE_NAME, @@ -146,6 +149,7 @@ def get_config( max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/mev/mev_boost/mev_boost_launcher.star b/src/mev/mev_boost/mev_boost_launcher.star index 904344692..a54da92a4 100644 --- a/src/mev/mev_boost/mev_boost_launcher.star +++ b/src/mev/mev_boost/mev_boost_launcher.star @@ -23,8 +23,20 @@ MIN_MEMORY = 16 MAX_MEMORY = 256 -def launch(plan, mev_boost_launcher, service_name, network_id, mev_boost_image): - config = get_config(mev_boost_launcher, network_id, mev_boost_image) +def launch( + plan, + mev_boost_launcher, + service_name, + network_id, + mev_boost_image, + global_node_selectors, +): + config = get_config( + mev_boost_launcher, + network_id, + mev_boost_image, + global_node_selectors, + ) mev_boost_service = plan.add_service(service_name, config) @@ -33,7 +45,12 @@ def launch(plan, mev_boost_launcher, service_name, network_id, mev_boost_image): ) -def get_config(mev_boost_launcher, network_id, mev_boost_image): +def get_config( + mev_boost_launcher, + network_id, + mev_boost_image, + node_selectors, +): command = ["mev-boost"] if mev_boost_launcher.should_check_relay: @@ -60,6 +77,7 @@ def get_config(mev_boost_launcher, network_id, mev_boost_image): max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/mev/mev_custom_flood/mev_custom_flood_launcher.star b/src/mev/mev_custom_flood/mev_custom_flood_launcher.star index 928682624..ce062b214 100644 --- a/src/mev/mev_custom_flood/mev_custom_flood_launcher.star +++ b/src/mev/mev_custom_flood/mev_custom_flood_launcher.star @@ -8,7 +8,14 @@ MIN_MEMORY = 128 MAX_MEMORY = 1024 -def spam_in_background(plan, sender_key, receiver_key, el_uri, params): +def spam_in_background( + plan, + sender_key, + receiver_key, + el_uri, + params, + global_node_selectors, +): sender_script = plan.upload_files(src="./sender.py", name="mev-custom-flood-sender") plan.add_service( @@ -26,6 +33,7 @@ def spam_in_background(plan, sender_key, receiver_key, el_uri, params): max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=global_node_selectors, ), ) diff --git a/src/mev/mev_flood/mev_flood_launcher.star b/src/mev/mev_flood/mev_flood_launcher.star index 1715e9e4a..7a8218409 100644 --- a/src/mev/mev_flood/mev_flood_launcher.star +++ b/src/mev/mev_flood/mev_flood_launcher.star @@ -12,7 +12,14 @@ def prefixed_address(address): return "0x" + address -def launch_mev_flood(plan, image, el_uri, contract_owner, normal_user): +def launch_mev_flood( + plan, + image, + el_uri, + contract_owner, + normal_user, + global_node_selectors, +): plan.add_service( name="mev-flood", config=ServiceConfig( @@ -22,6 +29,7 @@ def launch_mev_flood(plan, image, el_uri, contract_owner, normal_user): max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=global_node_selectors, ), ) diff --git a/src/mev/mev_relay/mev_relay_launcher.star b/src/mev/mev_relay/mev_relay_launcher.star index e56ec46bd..bb857912e 100644 --- a/src/mev/mev_relay/mev_relay_launcher.star +++ b/src/mev/mev_relay/mev_relay_launcher.star @@ -48,7 +48,9 @@ def launch_mev_relay( builder_uri, seconds_per_slot, persistent, + global_node_selectors, ): + node_selectors = global_node_selectors redis = redis_module.run( plan, service_name="mev-relay-redis", @@ -56,6 +58,7 @@ def launch_mev_relay( max_cpu=REDIS_MAX_CPU, min_memory=REDIS_MIN_MEMORY, max_memory=REDIS_MAX_MEMORY, + node_selectors=node_selectors, ) # making the password postgres as the relay expects it to be postgres postgres = postgres_module.run( @@ -70,6 +73,7 @@ def launch_mev_relay( max_cpu=POSTGRES_MAX_CPU, min_memory=POSTGRES_MIN_MEMORY, max_memory=POSTGRES_MAX_MEMORY, + node_selectors=node_selectors, ) network_name = NETWORK_ID_TO_NAME.get(network_id, network_id) @@ -110,6 +114,7 @@ def launch_mev_relay( max_cpu=RELAY_MAX_CPU, min_memory=RELAY_MIN_MEMORY, max_memory=RELAY_MAX_MEMORY, + node_selectors=node_selectors, ), ) @@ -145,6 +150,7 @@ def launch_mev_relay( max_cpu=RELAY_MAX_CPU, min_memory=RELAY_MIN_MEMORY, max_memory=RELAY_MAX_MEMORY, + node_selectors=node_selectors, ), ) @@ -177,6 +183,7 @@ def launch_mev_relay( max_cpu=RELAY_MAX_CPU, min_memory=RELAY_MIN_MEMORY, max_memory=RELAY_MAX_MEMORY, + node_selectors=node_selectors, ), ) diff --git a/src/mev/mock_mev/mock_mev_launcher.star b/src/mev/mock_mev/mock_mev_launcher.star index a7205f61b..226831673 100644 --- a/src/mev/mock_mev/mock_mev_launcher.star +++ b/src/mev/mock_mev/mock_mev_launcher.star @@ -10,7 +10,14 @@ MIN_MEMORY = 128 MAX_MEMORY = 1024 -def launch_mock_mev(plan, el_uri, beacon_uri, jwt_secret, global_client_log_level): +def launch_mock_mev( + plan, + el_uri, + beacon_uri, + jwt_secret, + global_client_log_level, + global_node_selectors, +): mock_builder = plan.add_service( name=MOCK_MEV_SERVICE_NAME, config=ServiceConfig( @@ -31,6 +38,7 @@ def launch_mock_mev(plan, el_uri, beacon_uri, jwt_secret, global_client_log_leve max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=global_node_selectors, ), ) return "http://{0}@{1}:{2}".format( diff --git a/src/participant_network.star b/src/participant_network.star index 68a75696a..da4265635 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -541,6 +541,10 @@ def launch_participant_network( for index, participant in enumerate(participants): cl_client_type = participant.cl_client_type el_client_type = participant.el_client_type + node_selectors = input_parser.get_client_node_selectors( + participant.node_selectors, + global_node_selectors, + ) if cl_client_type not in cl_launchers: fail( @@ -577,6 +581,7 @@ def launch_participant_network( plan, snooper_service_name, el_client_context, + node_selectors, ) plan.print( "Successfully added {0} snooper participants".format( @@ -618,8 +623,7 @@ def launch_participant_network( participant.validator_tolerations, participant.tolerations, global_tolerations, - participant.node_selectors, - global_node_selectors, + node_selectors, participant.cl_split_mode_enabled, ) else: @@ -656,8 +660,7 @@ def launch_participant_network( participant.validator_tolerations, participant.tolerations, global_tolerations, - participant.node_selectors, - global_node_selectors, + node_selectors, participant.cl_split_mode_enabled, ) @@ -683,6 +686,7 @@ def launch_participant_network( ethereum_metrics_exporter_service_name, el_client_context, cl_client_context, + node_selectors, ) plan.print( "Successfully added {0} ethereum metrics exporter participants".format( @@ -706,6 +710,7 @@ def launch_participant_network( xatu_sentry_params, network_params, pair_name, + node_selectors, ) plan.print( "Successfully added {0} xatu sentry participants".format( diff --git a/src/prometheus/prometheus_launcher.star b/src/prometheus/prometheus_launcher.star index 753edc6d8..4e66e8505 100644 --- a/src/prometheus/prometheus_launcher.star +++ b/src/prometheus/prometheus_launcher.star @@ -26,6 +26,7 @@ def launch_prometheus( additional_metrics_jobs, ethereum_metrics_exporter_contexts, xatu_sentry_contexts, + global_node_selectors, ): metrics_jobs = get_metrics_jobs( el_client_contexts, @@ -35,7 +36,13 @@ def launch_prometheus( xatu_sentry_contexts, ) prometheus_url = prometheus.run( - plan, metrics_jobs, MIN_CPU, MAX_CPU, MIN_MEMORY, MAX_MEMORY + plan, + metrics_jobs, + MIN_CPU, + MAX_CPU, + MIN_MEMORY, + MAX_MEMORY, + node_selectors=global_node_selectors, ) return prometheus_url diff --git a/src/snooper/snooper_engine_launcher.star b/src/snooper/snooper_engine_launcher.star index 24bc94b2e..636f0edab 100644 --- a/src/snooper/snooper_engine_launcher.star +++ b/src/snooper/snooper_engine_launcher.star @@ -25,10 +25,10 @@ MIN_MEMORY = 10 MAX_MEMORY = 300 -def launch(plan, service_name, el_client_context): +def launch(plan, service_name, el_client_context, node_selectors): snooper_service_name = "{0}".format(service_name) - snooper_config = get_config(service_name, el_client_context) + snooper_config = get_config(service_name, el_client_context, node_selectors) snooper_service = plan.add_service(snooper_service_name, snooper_config) snooper_http_port = snooper_service.ports[SNOOPER_ENGINE_RPC_PORT_ID] @@ -37,7 +37,7 @@ def launch(plan, service_name, el_client_context): ) -def get_config(service_name, el_client_context): +def get_config(service_name, el_client_context, node_selectors): engine_rpc_port_num = "http://{0}:{1}".format( el_client_context.ip_addr, el_client_context.engine_rpc_port_num, @@ -58,4 +58,5 @@ def get_config(service_name, el_client_context): max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/transaction_spammer/transaction_spammer.star b/src/transaction_spammer/transaction_spammer.star index 8aa3c4e71..275492a6d 100644 --- a/src/transaction_spammer/transaction_spammer.star +++ b/src/transaction_spammer/transaction_spammer.star @@ -9,18 +9,30 @@ MAX_MEMORY = 300 def launch_transaction_spammer( - plan, prefunded_addresses, el_uri, tx_spammer_params, electra_fork_epoch + plan, + prefunded_addresses, + el_uri, + tx_spammer_params, + electra_fork_epoch, + global_node_selectors, ): config = get_config( prefunded_addresses, el_uri, tx_spammer_params.tx_spammer_extra_args, electra_fork_epoch, + global_node_selectors, ) plan.add_service(SERVICE_NAME, config) -def get_config(prefunded_addresses, el_uri, tx_spammer_extra_args, electra_fork_epoch): +def get_config( + prefunded_addresses, + el_uri, + tx_spammer_extra_args, + electra_fork_epoch, + node_selectors, +): # Temp hack to use the old tx-fuzz image until we can get the new one working if electra_fork_epoch != None: tx_spammer_image = "ethpandaops/tx-fuzz:kaustinen-281adbc" @@ -43,4 +55,5 @@ def get_config(prefunded_addresses, el_uri, tx_spammer_extra_args, electra_fork_ max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ) diff --git a/src/xatu_sentry/xatu_sentry_launcher.star b/src/xatu_sentry/xatu_sentry_launcher.star index 3236fcfe8..39077ec37 100644 --- a/src/xatu_sentry/xatu_sentry_launcher.star +++ b/src/xatu_sentry/xatu_sentry_launcher.star @@ -22,6 +22,7 @@ def launch( xatu_sentry_params, network_params, pair_name, + node_selectors, ): config_template = read_file(static_files.XATU_SENTRY_CONFIG_TEMPLATE_FILEPATH) @@ -81,6 +82,7 @@ def launch( max_cpu=MAX_CPU, min_memory=MIN_MEMORY, max_memory=MAX_MEMORY, + node_selectors=node_selectors, ), ) From 51f1cfef252e6a86b388b71bfa71f448b9001bfa Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Mon, 12 Feb 2024 13:04:15 +0100 Subject: [PATCH 90/90] make tolerations neater --- src/el/besu/besu_launcher.star | 14 ++------------ src/el/erigon/erigon_launcher.star | 13 ++----------- src/el/ethereumjs/ethereumjs_launcher.star | 13 ++----------- src/el/geth/geth_launcher.star | 13 ++----------- src/el/nethermind/nethermind_launcher.star | 13 ++----------- src/el/reth/reth_launcher.star | 13 ++----------- src/participant_network.star | 15 +++++++++------ 7 files changed, 21 insertions(+), 73 deletions(-) diff --git a/src/el/besu/besu_launcher.star b/src/el/besu/besu_launcher.star index 00f7fe051..7b6900719 100644 --- a/src/el/besu/besu_launcher.star +++ b/src/el/besu/besu_launcher.star @@ -76,22 +76,12 @@ def launch( extra_labels, persistent, el_volume_size, - el_tolerations, - participant_tolerations, - global_tolerations, - participant_node_selectors, - global_node_selectors, + tolerations, + node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS ) - tolerations = input_parser.get_client_tolerations( - el_tolerations, participant_tolerations, global_tolerations - ) - - node_selectors = input_parser.get_client_node_selectors( - participant_node_selectors, global_node_selectors - ) network_name = shared_utils.get_network_name(launcher.network) diff --git a/src/el/erigon/erigon_launcher.star b/src/el/erigon/erigon_launcher.star index c34ddc226..02539e8d0 100644 --- a/src/el/erigon/erigon_launcher.star +++ b/src/el/erigon/erigon_launcher.star @@ -76,21 +76,12 @@ def launch( extra_labels, persistent, el_volume_size, - el_tolerations, - participant_tolerations, - global_tolerations, - participant_node_selectors, - global_node_selectors, + tolerations, + node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS ) - tolerations = input_parser.get_client_tolerations( - el_tolerations, participant_tolerations, global_tolerations - ) - node_selectors = input_parser.get_client_node_selectors( - participant_node_selectors, global_node_selectors - ) network_name = shared_utils.get_network_name(launcher.network) diff --git a/src/el/ethereumjs/ethereumjs_launcher.star b/src/el/ethereumjs/ethereumjs_launcher.star index 616ad34d3..d15e17717 100644 --- a/src/el/ethereumjs/ethereumjs_launcher.star +++ b/src/el/ethereumjs/ethereumjs_launcher.star @@ -78,21 +78,12 @@ def launch( extra_labels, persistent, el_volume_size, - el_tolerations, - participant_tolerations, - global_tolerations, - participant_node_selectors, - global_node_selectors, + tolerations, + node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS ) - tolerations = input_parser.get_client_tolerations( - el_tolerations, participant_tolerations, global_tolerations - ) - node_selectors = input_parser.get_client_node_selectors( - participant_node_selectors, global_node_selectors - ) network_name = shared_utils.get_network_name(launcher.network) diff --git a/src/el/geth/geth_launcher.star b/src/el/geth/geth_launcher.star index 80b5fd9f6..e2a61c044 100644 --- a/src/el/geth/geth_launcher.star +++ b/src/el/geth/geth_launcher.star @@ -87,21 +87,12 @@ def launch( extra_labels, persistent, el_volume_size, - el_tolerations, - participant_tolerations, - global_tolerations, - participant_node_selectors, - global_node_selectors, + tolerations, + node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS ) - tolerations = input_parser.get_client_tolerations( - el_tolerations, participant_tolerations, global_tolerations - ) - node_selectors = input_parser.get_client_node_selectors( - participant_node_selectors, global_node_selectors - ) network_name = shared_utils.get_network_name(launcher.network) diff --git a/src/el/nethermind/nethermind_launcher.star b/src/el/nethermind/nethermind_launcher.star index 0d583f682..9a90592ea 100644 --- a/src/el/nethermind/nethermind_launcher.star +++ b/src/el/nethermind/nethermind_launcher.star @@ -74,21 +74,12 @@ def launch( extra_labels, persistent, el_volume_size, - el_tolerations, - participant_tolerations, - global_tolerations, - participant_node_selectors, - global_node_selectors, + tolerations, + node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS ) - tolerations = input_parser.get_client_tolerations( - el_tolerations, participant_tolerations, global_tolerations - ) - node_selectors = input_parser.get_client_node_selectors( - participant_node_selectors, global_node_selectors - ) network_name = shared_utils.get_network_name(launcher.network) diff --git a/src/el/reth/reth_launcher.star b/src/el/reth/reth_launcher.star index 19012fd65..c391aea86 100644 --- a/src/el/reth/reth_launcher.star +++ b/src/el/reth/reth_launcher.star @@ -77,21 +77,12 @@ def launch( extra_labels, persistent, el_volume_size, - el_tolerations, - participant_tolerations, - global_tolerations, - participant_node_selectors, - global_node_selectors, + tolerations, + node_selectors, ): log_level = input_parser.get_client_log_level_or_default( participant_log_level, global_log_level, VERBOSITY_LEVELS ) - tolerations = input_parser.get_client_tolerations( - el_tolerations, participant_tolerations, global_tolerations - ) - node_selectors = input_parser.get_client_node_selectors( - participant_node_selectors, global_node_selectors - ) network_name = shared_utils.get_network_name(launcher.network) diff --git a/src/participant_network.star b/src/participant_network.star index da4265635..13bb1e97a 100644 --- a/src/participant_network.star +++ b/src/participant_network.star @@ -424,7 +424,13 @@ def launch_participant_network( for index, participant in enumerate(participants): cl_client_type = participant.cl_client_type el_client_type = participant.el_client_type - + node_selectors = input_parser.get_client_node_selectors( + participant.node_selectors, + global_node_selectors, + ) + tolerations = input_parser.get_client_tolerations( + participant.el_tolerations, participant.tolerations, global_tolerations + ) if el_client_type not in el_launchers: fail( "Unsupported launcher '{0}', need one of '{1}'".format( @@ -461,11 +467,8 @@ def launch_participant_network( participant.el_extra_labels, persistent, participant.el_client_volume_size, - participant.el_tolerations, - participant.tolerations, - global_tolerations, - participant.node_selectors, - global_node_selectors, + tolerations, + node_selectors, ) # Add participant el additional prometheus metrics