diff --git a/.github/tests/external-l1/ethereum.yaml b/.github/tests/external-l1/ethereum.yaml new file mode 100644 index 00000000..f098a522 --- /dev/null +++ b/.github/tests/external-l1/ethereum.yaml @@ -0,0 +1,13 @@ +network_params: + preset: minimal + genesis_delay: 5 + additional_preloaded_contracts: ' + { + "0x4e59b44847b379578588920cA78FbF26c0B4956C": { + "balance": "0ETH", + "code": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3", + "storage": {}, + "nonce": "1" + } + } + ' diff --git a/.github/tests/external-l1/optimism.yaml b/.github/tests/external-l1/optimism.yaml new file mode 100644 index 00000000..9aa8f8bf --- /dev/null +++ b/.github/tests/external-l1/optimism.yaml @@ -0,0 +1,7 @@ +external_l1_network_params: + network_id: "3151908" + rpc_kind: standard + el_rpc_url: http://el-1-geth-lighthouse:8545 + el_ws_url: ws://el-1-geth-lighthouse:8546 + cl_rpc_url: http://cl-1-lighthouse-geth:4000 + priv_key: "0xbcdf20249abf0ed6d944c0288fad489e33f66b3960d9e6229c1cd214ed3bbe31" diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 2fdce7be..d6b27a96 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -58,3 +58,23 @@ jobs: DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} with: args: "The nightly test for ${{matrix.file_name}} on optimism-package has failed find it here ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" + + run_with_external_l1_args: + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Setup Kurtosis + run: | + echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list + sudo apt update + sudo apt install kurtosis-cli + kurtosis analytics disable + + - name: Deploy L1 + run: kurtosis run --enclave test --args-file ./.github/tests/external-l1/ethereum.yaml github.com/ethpandaops/ethereum-package + + - name: Run Starlark + run: | + kurtosis run --enclave test --verbosity detailed --args-file ./.github/tests/external-l1/optimism.yaml ${{ github.workspace }} diff --git a/kurtosis.yml b/kurtosis.yml index 5973d737..88e68aad 100644 --- a/kurtosis.yml +++ b/kurtosis.yml @@ -1,4 +1,4 @@ -name: "github.com/ethpandaops/optimism-package" +name: github.com/ethpandaops/optimism-package description: | # Optimism Package This is a Kurtosis package for deploying an Optimism Rollup diff --git a/main.star b/main.star index 69678d2d..36624695 100644 --- a/main.star +++ b/main.star @@ -16,8 +16,14 @@ def run(plan, args): plan.print("Parsing the L1 input args") # If no args are provided, use the default values with minimal preset ethereum_args = args.get("ethereum_package", {}) - if "network_params" not in ethereum_args: - ethereum_args.update(input_parser.default_ethereum_package_network_params()) + external_l1_args = args.get("external_l1_network_params", {}) + if external_l1_args: + external_l1_args = input_parser.external_l1_network_params_input_parser( + plan, external_l1_args + ) + else: + if "network_params" not in ethereum_args: + ethereum_args.update(input_parser.default_ethereum_package_network_params()) # need to do a raw get here in case only optimism_package is provided. # .get will return None if the key is in the config with a None value. @@ -29,21 +35,38 @@ def run(plan, args): persistent = optimism_args_with_right_defaults.persistent # Deploy the L1 - plan.print("Deploying a local L1") - l1 = ethereum_package.run(plan, ethereum_args) - plan.print(l1.network_params) - # Get L1 info - all_l1_participants = l1.all_participants - l1_network_params = l1.network_params - l1_network_id = l1.network_id - l1_priv_key = l1.pre_funded_accounts[ - 12 - ].private_key # reserved for L2 contract deployers - l1_config_env_vars = get_l1_config( - all_l1_participants, l1_network_params, l1_network_id - ) + l1_network = "" + if external_l1_args: + plan.print("Using external L1") + plan.print(external_l1_args) + + l1_rpc_url = external_l1_args.el_rpc_url + l1_priv_key = external_l1_args.priv_key + + l1_config_env_vars = { + "L1_RPC_KIND": external_l1_args.rpc_kind, + "L1_RPC_URL": l1_rpc_url, + "CL_RPC_URL": external_l1_args.cl_rpc_url, + "L1_WS_URL": external_l1_args.el_ws_url, + "L1_CHAIN_ID": external_l1_args.network_id, + } + else: + plan.print("Deploying a local L1") + l1 = ethereum_package.run(plan, ethereum_args) + plan.print(l1.network_params) + # Get L1 info + all_l1_participants = l1.all_participants + l1_network_params = l1.network_params + l1_network_id = l1.network_id + l1_rpc_url = all_l1_participants[0].el_context.rpc_http_url + l1_priv_key = l1.pre_funded_accounts[ + 12 + ].private_key # reserved for L2 contract deployers + l1_config_env_vars = get_l1_config( + all_l1_participants, l1_network_params, l1_network_id + ) - if l1_network_params.network == "kurtosis": + if l1_network == "kurtosis": plan.print("Waiting for L1 to start up") wait_for_sync.wait_for_startup(plan, l1_config_env_vars) else: @@ -65,7 +88,7 @@ def run(plan, args): deployment_output, l1_config_env_vars, l1_priv_key, - all_l1_participants[0].el_context, + l1_rpc_url, global_log_level, global_node_selectors, global_tolerations, @@ -83,7 +106,7 @@ def run(plan, args): optimism_args, l1_config_env_vars, l1_priv_key, - all_l1_participants[0].el_context, + l1_rpc_url, global_log_level, global_node_selectors, global_tolerations, @@ -117,7 +140,7 @@ def run(plan, args): l2_args, l1_config_env_vars, l1_priv_key, - all_l1_participants[0].el_context, + l1_rpc_url, global_log_level, global_node_selectors, global_tolerations, diff --git a/src/blockscout/blockscout_launcher.star b/src/blockscout/blockscout_launcher.star index 8316d9fc..3b68eab0 100644 --- a/src/blockscout/blockscout_launcher.star +++ b/src/blockscout/blockscout_launcher.star @@ -45,7 +45,7 @@ VERIF_USED_PORTS = { def launch_blockscout( plan, l2_services_suffix, - l1_el_context, + l1_rpc_url, l2_el_context, l2_network_name, deployment_output, @@ -79,7 +79,7 @@ def launch_blockscout( config_backend = get_config_backend( postgres_output, - l1_el_context, + l1_rpc_url, l2_el_context, verif_url, l2_network_name, @@ -122,7 +122,7 @@ def get_config_verif(): def get_config_backend( postgres_output, - l1_el_context, + l1_rpc_url, l2_el_context, verif_url, l2_network_name, @@ -139,7 +139,7 @@ def get_config_backend( optimism_env_vars = { "CHAIN_TYPE": "optimism", - "INDEXER_OPTIMISM_L1_RPC": l1_el_context.rpc_http_url, + "INDEXER_OPTIMISM_L1_RPC": l1_rpc_url, # "INDEXER_OPTIMISM_L1_PORTAL_CONTRACT": "", # "INDEXER_OPTIMISM_L1_BATCH_START_BLOCK": "", "INDEXER_OPTIMISM_L1_BATCH_INBOX": "0xff00000000000000000000000000000000042069", diff --git a/src/l2.star b/src/l2.star index f3ff471e..ca80caa6 100644 --- a/src/l2.star +++ b/src/l2.star @@ -15,7 +15,7 @@ def launch_l2( deployment_output, l1_config, l1_priv_key, - l1_bootnode_context, + l1_rpc_url, global_log_level, global_node_selectors, global_tolerations, @@ -67,7 +67,7 @@ def launch_l2( blockscout.launch_blockscout( plan, l2_services_suffix, - l1_bootnode_context, # first l1 EL url + l1_rpc_url, all_el_contexts[0], # first l2 EL url network_params.name, deployment_output, diff --git a/src/package_io/input_parser.star b/src/package_io/input_parser.star index 99e6bae1..737e279b 100644 --- a/src/package_io/input_parser.star +++ b/src/package_io/input_parser.star @@ -28,6 +28,18 @@ DEFAULT_PROPOSER_IMAGES = { DEFAULT_ADDITIONAL_SERVICES = [] +def external_l1_network_params_input_parser(plan, input_args): + sanity_check.external_l1_network_params_input_parser(plan, input_args) + return struct( + network_id=input_args["network_id"], + rpc_kind=input_args["rpc_kind"], + el_rpc_url=input_args["el_rpc_url"], + el_ws_url=input_args["el_ws_url"], + cl_rpc_url=input_args["cl_rpc_url"], + priv_key=input_args["priv_key"], + ) + + def input_parser(plan, input_args): sanity_check.sanity_check(plan, input_args) results = parse_network_params(plan, input_args) diff --git a/src/package_io/sanity_check.star b/src/package_io/sanity_check.star index 3055cd64..e1445326 100644 --- a/src/package_io/sanity_check.star +++ b/src/package_io/sanity_check.star @@ -66,6 +66,16 @@ ROOT_PARAMS = [ ] +EXTERNAL_L1_NETWORK_PARAMS = [ + "network_id", + "rpc_kind", + "el_rpc_url", + "el_ws_url", + "cl_rpc_url", + "priv_key", +] + + def deep_validate_params(plan, input_args, category, allowed_params): if category in input_args: for item in input_args[category]: @@ -149,3 +159,13 @@ def sanity_check(plan, optimism_config): ) plan.print("Sanity check for OP package passed") + + +def external_l1_network_params_input_parser(plan, external_l1_network_params): + for key in external_l1_network_params.keys(): + if key not in EXTERNAL_L1_NETWORK_PARAMS: + fail( + "Invalid parameter {0}, allowed fields: {1}".format( + key, EXTERNAL_L1_NETWORK_PARAMS + ) + )