From b854ae3f5fc2ba28bb2f6c39dd21334bdc6d40ce Mon Sep 17 00:00:00 2001 From: Pablo Castellano Date: Wed, 15 Nov 2023 14:39:30 +0300 Subject: [PATCH] feat: add support for Blobscan Co-authored-by: Tedi Mitiku --- main.star | 18 +++- network_params.yaml | 1 + src/blobscan/blobscan_launcher.star | 124 ++++++++++++++++++++++++++++ src/dora/dora_launcher.star | 2 +- 4 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 src/blobscan/blobscan_launcher.star diff --git a/main.star b/main.star index 26c84e147..641ad1bf0 100644 --- a/main.star +++ b/main.star @@ -21,6 +21,7 @@ beacon_metrics_gazer = import_module( "./src/beacon_metrics_gazer/beacon_metrics_gazer_launcher.star" ) dora = import_module("./src/dora/dora_launcher.star") +blobscan = import_module("./src/blobscan/blobscan_launcher.star") full_beaconchain_explorer = import_module( "./src/full_beaconchain/full_beaconchain_launcher.star" ) @@ -50,6 +51,8 @@ MOCK_MEV_TYPE = "mock" FULL_MEV_TYPE = "full" PATH_TO_PARSED_BEACON_STATE = "/genesis/output/parsedBeaconState.json" +DORA_BASE_URL = "" + def run(plan, args={}): args_with_right_defaults = input_parser.input_parser(plan, args) @@ -328,7 +331,7 @@ def run(plan, args={}): elif additional_service == "dora": plan.print("Launching dora") dora_config_template = read_file(static_files.DORA_CONFIG_TEMPLATE_FILEPATH) - dora.launch_dora( + dora_config = dora.launch_dora( plan, dora_config_template, all_cl_client_contexts, @@ -336,6 +339,19 @@ def run(plan, args={}): network_params.electra_fork_epoch, ) plan.print("Successfully launched dora") + DORA_BASE_URL = "http://{0}:{1}".format( + dora_config.ip_address, dora_config.ports["http"].number + ) + elif additional_service == "blobscan": + plan.print("Launching blobscan") + blobscan.launch_blobscan( + plan, + all_cl_client_contexts, + all_el_client_contexts, + network_params.network_id, + DORA_BASE_URL, + ) + plan.print("Successfully launched blobscan") elif additional_service == "full_beaconchain_explorer": plan.print("Launching full-beaconchain-explorer") full_beaconchain_explorer_config_template = read_file( diff --git a/network_params.yaml b/network_params.yaml index 6e5622d26..38a5615e7 100644 --- a/network_params.yaml +++ b/network_params.yaml @@ -50,6 +50,7 @@ additional_services: - beacon_metrics_gazer - dora - prometheus_grafana + - blobscan wait_for_finalization: false global_client_log_level: info snooper_enabled: false diff --git a/src/blobscan/blobscan_launcher.star b/src/blobscan/blobscan_launcher.star new file mode 100644 index 000000000..5f5cfcf87 --- /dev/null +++ b/src/blobscan/blobscan_launcher.star @@ -0,0 +1,124 @@ +shared_utils = import_module("../shared_utils/shared_utils.star") +postgres = import_module("github.com/kurtosis-tech/postgres-package/main.star") + +WEB_SERVICE_NAME = "blobscan-web" +API_SERVICE_NAME = "blobscan-api" +INDEXER_SERVICE_NAME = "blobscan-indexer" + +HTTP_PORT_ID = "http" +WEB_HTTP_PORT_NUMBER = 3000 +API_HTTP_PORT_NUMBER = 3001 + +WEB_PORTS = { + HTTP_PORT_ID: shared_utils.new_port_spec( + WEB_HTTP_PORT_NUMBER, + shared_utils.TCP_PROTOCOL, + shared_utils.HTTP_APPLICATION_PROTOCOL, + ) +} + + +API_PORTS = { + HTTP_PORT_ID: shared_utils.new_port_spec( + API_HTTP_PORT_NUMBER, + shared_utils.TCP_PROTOCOL, + shared_utils.HTTP_APPLICATION_PROTOCOL, + ) +} + +ENTRYPOINT_ARGS = ["/bin/sh", "-c"] + + +def launch_blobscan( + plan, + cl_client_contexts, + el_client_contexts, + chain_id, + beacon_explorer_url, +): + beacon_node_rpc_uri = "http://{0}:{1}".format( + cl_client_contexts[0].ip_addr, cl_client_contexts[0].http_port_num + ) + execution_node_rpc_uri = "http://{0}:{1}".format( + el_client_contexts[0].ip_addr, el_client_contexts[0].rpc_port_num + ) + + postgres_output = postgres.run(plan) + 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, beacon_explorer_url, chain_id + ) + plan.add_service(WEB_SERVICE_NAME, web_config) + + indexer_config = get_indexer_config( + beacon_node_rpc_uri, execution_node_rpc_uri, blobscan_api_url + ) + plan.add_service(INDEXER_SERVICE_NAME, indexer_config) + + +def get_api_config(database_url, beacon_node_rpc, chain_id): + IMAGE_NAME = "blossomlabs/blobscan:stable" + + return ServiceConfig( + image=IMAGE_NAME, + ports=API_PORTS, + env_vars={ + "BEACON_NODE_ENDPOINT": beacon_node_rpc, + "CHAIN_ID": chain_id, + "DATABASE_URL": database_url, + "SECRET_KEY": "supersecret", + }, + cmd=["api"], + ready_conditions=ReadyCondition( + recipe=GetHttpRequestRecipe( + port_id="http", + endpoint="/api/healthcheck", + ), + field="code", + assertion="==", + target_value=200, + interval="5s", + timeout="5s", + ), + ) + + +def get_web_config(database_url, beacon_node_rpc, beacon_explorer_url, chain_id): + IMAGE_NAME = "blossomlabs/blobscan:stable" + + return ServiceConfig( + image=IMAGE_NAME, + ports=WEB_PORTS, + env_vars={ + "DATABASE_URL": database_url, + "SECRET_KEY": "supersecret", + "NEXT_PUBLIC_NETWORK_NAME": "local-devnet", + "NEXT_PUBLIC_BEACON_BASE_URL": "http://fix-me.localhost", # TODO: get url from beaconchain explorer + "NEXT_PUBLIC_EXPLORER_BASE_URL": beacon_explorer_url, + "BEACON_NODE_ENDPOINT": beacon_node_rpc, + "CHAIN_ID": chain_id, + }, + cmd=["web"], + ) + + +def get_indexer_config(beacon_node_rpc, execution_node_rpc, blobscan_api_url): + IMAGE_NAME = "blossomlabs/blobscan-indexer:master" + + return ServiceConfig( + image=IMAGE_NAME, + env_vars={ + "SECRET_KEY": "supersecret", + "BLOBSCAN_API_ENDPOINT": blobscan_api_url, + "EXECUTION_NODE_ENDPOINT": execution_node_rpc, + "BEACON_NODE_ENDPOINT": beacon_node_rpc, + }, + entrypoint=ENTRYPOINT_ARGS, + cmd=[" && ".join(["sleep 90", "/app/blob-indexer"])], + ) diff --git a/src/dora/dora_launcher.star b/src/dora/dora_launcher.star index 59c7ce272..1134fada7 100644 --- a/src/dora/dora_launcher.star +++ b/src/dora/dora_launcher.star @@ -55,7 +55,7 @@ def launch_dora( electra_fork_epoch, ) - plan.add_service(SERVICE_NAME, config) + return plan.add_service(SERVICE_NAME, config) def get_config(