From b8edbfd0ccb611749767fd64ef450de5de660428 Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Sat, 15 Feb 2025 10:16:07 +0900 Subject: [PATCH 01/28] test: use network-prover for multi-attach-cdk CI Signed-off-by: Ji Hwan --- .github/tests/chains/l1-cdk1-cdk2.yml | 1 + .github/workflows/deploy.yml | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/.github/tests/chains/l1-cdk1-cdk2.yml b/.github/tests/chains/l1-cdk1-cdk2.yml index 71d39f2e..1cf42b14 100644 --- a/.github/tests/chains/l1-cdk1-cdk2.yml +++ b/.github/tests/chains/l1-cdk1-cdk2.yml @@ -11,6 +11,7 @@ deployment_stages: args: agglayer_prover_sp1_key: null + agglayer_prover_primary_prover: "network-prover" consensus_contract_type: pessimistic erigon_strict_mode: false gas_token_enabled: false diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ba72d94b..4d2369ef 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -281,9 +281,11 @@ jobs: fi echo "Waiting for deposit to be autoclaimed..." - sleep 60 - + sleep 30 + op_rollup_rpc_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} op-el-1-op-geth-op-node-op-kurtosis rpc) + op_bridge_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} sovereign-bridge-service-001 rpc) + op_private_key=$(cast wallet private-key --mnemonic "test test test test test test test test test test test junk") while true; do echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔄 Checking if the deposit was claimed..." balance=$(cast balance --ether --rpc-url $op_rollup_rpc_url $eth_address) @@ -292,8 +294,23 @@ jobs: echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Deposit claimed, balance is $balance" exit 0 else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Deposit has not been claimed yet... Retrying in 15 seconds..." - sleep 15 + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔄 Attempting to manually claim the deposit..." + polycli ulxly claim asset \ + --bridge-address 0x9A1f8eA578835d2b7b1e1EB8CD5EE3Bb7692338C \ + --bridge-service-url $op_bridge_url \ + --deposit-count 1 \ + --destination-address 0x8943545177806ED17B9F23F0a21ee5948eCaa776 \ + --deposit-network 0 \ + --private-key $op_private_key \ + --rpc-url $op_rollup_rpc_url + ret_code="$?" + if [[ $ret_code -eq 0 ]]; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Claim transaction successfuly sent!" + exit 0 + else + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Claim transaction not available for now. Retrying in 15 seconds..." + sleep 15 + fi fi done From 891d1594f45daf71bb2ea83c1c1b14a8d288ed18 Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Sat, 15 Feb 2025 23:32:39 +0900 Subject: [PATCH 02/28] chore: update bridge-service version Signed-off-by: Ji Hwan --- input_parser.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input_parser.star b/input_parser.star index 8dab801f..77820914 100644 --- a/input_parser.star +++ b/input_parser.star @@ -41,7 +41,7 @@ DEFAULT_IMAGES = { "cdk_node_image": "ghcr.io/0xpolygon/cdk:0.5.1", # https://github.com/0xpolygon/cdk/pkgs/container/cdk "cdk_validium_node_image": "0xpolygon/cdk-validium-node:0.7.0-cdk", # https://hub.docker.com/r/0xpolygon/cdk-validium-node/tags "zkevm_bridge_proxy_image": "haproxy:3.1-bookworm", # https://hub.docker.com/_/haproxy/tags - "zkevm_bridge_service_image": "hermeznetwork/zkevm-bridge-service:v0.6.0-RC7", # https://hub.docker.com/r/hermeznetwork/zkevm-bridge-service/tags + "zkevm_bridge_service_image": "hermeznetwork/zkevm-bridge-service:v0.6.0-RC9", # https://hub.docker.com/r/hermeznetwork/zkevm-bridge-service/tags "zkevm_bridge_ui_image": "leovct/zkevm-bridge-ui:multi-network", # https://hub.docker.com/r/leovct/zkevm-bridge-ui/tags "zkevm_contracts_image": "leovct/zkevm-contracts:v9.0.0-rc.5-pp-fork.12", # https://hub.docker.com/repository/docker/leovct/zkevm-contracts/tags "zkevm_da_image": "0xpolygon/cdk-data-availability:0.0.11", # https://hub.docker.com/r/0xpolygon/cdk-data-availability/tags From 2078bfe7006a3eaf2ea5b810d28f208b8c976db7 Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Sun, 16 Feb 2025 00:20:27 +0900 Subject: [PATCH 03/28] fix: increase timeout for bridging Signed-off-by: Ji Hwan --- .github/workflows/deploy.yml | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 4d2369ef..4c36a389 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -189,7 +189,7 @@ jobs: multi-cdk-chains: runs-on: ubuntu-latest - timeout-minutes: 20 + timeout-minutes: 25 steps: - uses: actions/checkout@v4 @@ -284,8 +284,6 @@ jobs: sleep 30 op_rollup_rpc_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} op-el-1-op-geth-op-node-op-kurtosis rpc) - op_bridge_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} sovereign-bridge-service-001 rpc) - op_private_key=$(cast wallet private-key --mnemonic "test test test test test test test test test test test junk") while true; do echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔄 Checking if the deposit was claimed..." balance=$(cast balance --ether --rpc-url $op_rollup_rpc_url $eth_address) @@ -294,23 +292,8 @@ jobs: echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Deposit claimed, balance is $balance" exit 0 else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔄 Attempting to manually claim the deposit..." - polycli ulxly claim asset \ - --bridge-address 0x9A1f8eA578835d2b7b1e1EB8CD5EE3Bb7692338C \ - --bridge-service-url $op_bridge_url \ - --deposit-count 1 \ - --destination-address 0x8943545177806ED17B9F23F0a21ee5948eCaa776 \ - --deposit-network 0 \ - --private-key $op_private_key \ - --rpc-url $op_rollup_rpc_url - ret_code="$?" - if [[ $ret_code -eq 0 ]]; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Claim transaction successfuly sent!" - exit 0 - else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Claim transaction not available for now. Retrying in 15 seconds..." - sleep 15 - fi + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Deposit has not been claimed yet... Retrying in 15 seconds..." + sleep 15 fi done From 158744db3d8616430e0f8ff3c9ae3761bf7a1660 Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Sun, 16 Feb 2025 00:47:53 +0900 Subject: [PATCH 04/28] chore: update cdk matrix Signed-off-by: Ji Hwan --- CDK_VERSION_MATRIX.MD | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CDK_VERSION_MATRIX.MD b/CDK_VERSION_MATRIX.MD index 0cc8446f..349a2a33 100644 --- a/CDK_VERSION_MATRIX.MD +++ b/CDK_VERSION_MATRIX.MD @@ -4,8 +4,8 @@ Which versions of the CDK stack are meant to work together? Fork ID|Consensus|CDK Erigon|ZkEVM Prover|ZkEVM Contracts|Data Availability|Bridge ---|---|---|---|---|---|--- -13|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v9.0.0-RC2-fork.13](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v9.0.0-RC2)|[v8.1.0-rc.1-fork.13](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v8.1.0-rc.1-fork.13)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC7](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC7) -12|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v8.0.0-RC14-fork.12](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v8.0.0-RC14)|[v8.0.0-fork.12](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v8.0.0-fork.12)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC7](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC7) -12|sovereign|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v8.0.0-RC14-fork.12](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v8.0.0-RC14)|[v9.0.0-rc.5-pp-fork.12](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v9.0.0-rc.5-pp-fork.12)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC7](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC7) -11|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v7.0.4-fork.11](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v7.0.4)|[v7.0.0-rc.2-fork.11](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v7.0.0-rc.2-fork.11)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC7](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC7) -9|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v6.0.8](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v6.0.8)|[v6.0.0-rc.1-fork.9](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v6.0.0-rc.1-fork.9)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC7](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC7) +13|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v9.0.0-RC2-fork.13](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v9.0.0-RC2)|[v8.1.0-rc.1-fork.13](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v8.1.0-rc.1-fork.13)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) +12|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v8.0.0-RC14-fork.12](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v8.0.0-RC14)|[v8.0.0-fork.12](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v8.0.0-fork.12)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) +12|sovereign|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v8.0.0-RC14-fork.12](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v8.0.0-RC14)|[v9.0.0-rc.5-pp-fork.12](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v9.0.0-rc.5-pp-fork.12)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) +11|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v7.0.4-fork.11](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v7.0.4)|[v7.0.0-rc.2-fork.11](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v7.0.0-rc.2-fork.11)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) +9|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v6.0.8](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v6.0.8)|[v6.0.0-rc.1-fork.9](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v6.0.0-rc.1-fork.9)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) From c90fa885596cd4c53a1d5cf53a311bc9368ff827 Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Tue, 18 Feb 2025 09:36:58 +0900 Subject: [PATCH 05/28] chore: cleanup Signed-off-by: Ji Hwan --- .github/tests/chains/l1-cdk1-cdk2.yml | 2 +- .github/workflows/deploy.yml | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/tests/chains/l1-cdk1-cdk2.yml b/.github/tests/chains/l1-cdk1-cdk2.yml index 1cf42b14..85fc73b1 100644 --- a/.github/tests/chains/l1-cdk1-cdk2.yml +++ b/.github/tests/chains/l1-cdk1-cdk2.yml @@ -11,7 +11,7 @@ deployment_stages: args: agglayer_prover_sp1_key: null - agglayer_prover_primary_prover: "network-prover" + agglayer_prover_primary_prover: "mock-prover" consensus_contract_type: pessimistic erigon_strict_mode: false gas_token_enabled: false diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 4c36a389..ce57b7e4 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -279,9 +279,6 @@ jobs: echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Deposit transaction failed!" exit 1 fi - - echo "Waiting for deposit to be autoclaimed..." - sleep 30 op_rollup_rpc_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} op-el-1-op-geth-op-node-op-kurtosis rpc) while true; do From 2e0d8413b79eeeda1020319e47f9e6f4f9d2e18e Mon Sep 17 00:00:00 2001 From: Xavier Romero Date: Wed, 5 Feb 2025 13:44:17 +0100 Subject: [PATCH 06/28] L1 chaos testing --- docs/mitm.md | 20 ++++ scripts/mitm/failures.py | 178 +++++++++++++++++++++++++++++++ scripts/mitm/test_l1_failures.sh | 110 +++++++++++++++++++ 3 files changed, 308 insertions(+) create mode 100644 scripts/mitm/failures.py create mode 100755 scripts/mitm/test_l1_failures.sh diff --git a/docs/mitm.md b/docs/mitm.md index 2711b2c2..73950b7b 100644 --- a/docs/mitm.md +++ b/docs/mitm.md @@ -24,6 +24,26 @@ To do so, you have to set to True the desired component. With this, the component will send queries to MITM, and they will be forwarded to the real L1. You can modify ```/scripts/empty.py``` on the MITM service to achieve whatever you want. +## L1 missbehaving + +Several L1 missbehaving scenarios had been implemented with MITM and can be easily tested. + +You can test them all by just executing this [existing script](/scripts/mitm/test_l1_failures.sh) (form the repo's root folder) +```bash +./scripts/mitm/test_l1_failures.sh +``` +Existing failures are implemented on [/scripts/mitm/failures.py](/scripts/mitm/failures.py), right now: +- ```HttpErrorResponse```: Returning random http error codes +- ```NullResponse```: Returning no data with 200 http code +- ```EmptyJSONResultResponse```: Returning JSON with empty result field +- ```EmptyJSONResponse```: Returning and empty JSON +- ```ArbirtraryHTMLResponse```: Returning a fixed HTML content +- ```ArbirtraryJSONResponse```: Returning a fixed JSON content +- ```SlowResponse```: Delay response for few seconds +- ```CorruptedJSONResponse```: Change a random byte on the returned JSON +- ```NoResponse```: Closing the HTTP connection without returning any answer +- ```AddJSONFieldsResponse```: Adding arbitrary JSON fields to the returned answer + ## Reorg + Null answers diff --git a/scripts/mitm/failures.py b/scripts/mitm/failures.py new file mode 100644 index 00000000..d2bbd849 --- /dev/null +++ b/scripts/mitm/failures.py @@ -0,0 +1,178 @@ +import json +from time import sleep +from random import randint +from mitmproxy import http # noqa +from mitmproxy.script import concurrent # noqa + + +class GenericFailure: + def __init__(self, ratio): + self.ratio = ratio + + def _random_select(self): + assert (0.0 <= self.ratio <= 1.0) + a = int(self.ratio * 100) + b = randint(0, 99) + + if a > b: + return True + else: + return False + + def _set_my_header(self, flow): + flow.response.headers["mitm"] = "Intercepted" + + +class GenericResponseFailure(GenericFailure): + def _my_response(self, flow): + pass + + def _eligible_response(self, flow): + return True + + @concurrent + def response(self, flow): + if not self._eligible_response(flow): + return + + if not self._random_select(): + return + + self._set_my_header(flow) + self._my_response(flow) + + +class GenericRequestFailure(GenericFailure): + def _my_request(self, flow): + pass + + def _eligible_request(self, flow): + return True + + @concurrent + def request(self, flow): + if not self._eligible_request(flow): + return + + if not self._random_select(): + return + + self._my_request(flow) + + +# Error classes + +class HttpErrorResponse(GenericRequestFailure): + DEFAULT_ERROR_CODES = [401, 403, 404, 405, 429, 500, 502, 503, 504] + + def __init__(self, ratio, error_codes=DEFAULT_ERROR_CODES): + self.error_codes = error_codes + super().__init__(ratio) + + def _my_request(self, flow): + error_code = self.error_codes[randint(0, len(self.error_codes) - 1)] + flow.response = \ + http.Response.make( + error_code, + f"HTTP Error {error_code}", + {"Content-Type": "text/plain"} + ) + + +class NullResponse(GenericRequestFailure): + def _my_request(self, flow): + flow.response = http.Response.make(200, "", {}) + self._set_my_header(flow) + + +class EmptyJSONResultResponse(GenericRequestFailure): + def _my_request(self, flow): + body = json.dumps({"result": None}) + flow.response = \ + http.Response.make(200, body, {"Content-Type": "application/json"}) + + +class EmptyJSONResponse(GenericRequestFailure): + def _my_request(self, flow): + body = json.dumps({}) + flow.response = \ + http.Response.make(200, body, {"Content-Type": "application/json"}) + + +class ArbirtraryHTMLResponse(GenericRequestFailure): + def _my_request(self, flow): + flow.response = \ + http.Response.make( + 200, + "Random HTML", + {"Content-Type": "text/html"} + ) + + +class ArbirtraryJSONResponse(GenericRequestFailure): + def _my_request(self, flow): + flow.response = \ + http.Response.make( + 200, + json.dumps({"result": "Random JSON"}), + {"Content-Type": "application/json"} + ) + + +class SlowResponse(GenericResponseFailure): + RANDOM_MIN_SECONDS = 1 + RANDOM_MAX_SECONDS = 5 + + def _my_response(self, flow): + sleep( + randint(self.RANDOM_MIN_SECONDS, self.RANDOM_MAX_SECONDS) + ) + + +class CorruptedJSONResponse(GenericResponseFailure): + def _eligible_response(self, flow): + if flow.response.headers.get("Content-Type") == "application/json": + if len(flow.response.text) < 2: + return False + try: + body = json.loads(flow.response.text) + return (isinstance(body, dict) and body.get("result")) + except json.JSONDecodeError: + return False + else: + return False + + def _my_response(self, flow): + flow.response.text = \ + flow.response.text[:randint(0, len(flow.response.text) - 1)] \ + + "0" \ + + flow.response.text[randint(0, len(flow.response.text) - 1):] + + +class NoResponse(GenericRequestFailure): + def _my_request(self, flow): + flow.kill() + + +class AddJSONFieldsResponse(GenericResponseFailure): + MIN_EXTRA_FIELDS = 1 + MAX_EXTRA_FIELDS = 5 + + def _eligible_response(self, flow): + if flow.response.headers.get("Content-Type") == "application/json": + try: + body = json.loads(flow.response.text) + return (isinstance(body, dict) and body.get("result")) + except json.JSONDecodeError: + return False + else: + return False + + def _my_response(self, flow): + body = json.loads(flow.response.text) + for _ in range(randint(self.MIN_EXTRA_FIELDS, self.MAX_EXTRA_FIELDS)): + if isinstance(body["result"], dict): + body["result"][f"new_field_{_}"] = f"new_value_{_}" + elif isinstance(body["result"], list): + body["result"].append({f"new_value_{_}": f"new_value_{_}"}) + flow.response.text = json.dumps(body) diff --git a/scripts/mitm/test_l1_failures.sh b/scripts/mitm/test_l1_failures.sh new file mode 100755 index 00000000..fc71ff11 --- /dev/null +++ b/scripts/mitm/test_l1_failures.sh @@ -0,0 +1,110 @@ +ENCLAVE_NAME=test-failures +CDK_NODE_VERS=0.5.1-rc4 +REAL_RPC_URL=http://anvil-001:8545 + +L1_PROXY_NAME=mitm +L1_PROXY_PORT=8234 + +# Just in case docker/stack was already running +docker stop $L1_PROXY_NAME > /dev/null 2>&1 +kurtosis enclave stop $ENCLAVE_NAME > /dev/null 2>&1 +kurtosis enclave rm $ENCLAVE_NAME > /dev/null 2>&1 + +# Add empty enclave so we can set our MITM there in advance. +kurtosis enclave add --name $ENCLAVE_NAME + +# Launch mitm docker in the background +MITM_IP=$(docker network inspect kt-$ENCLAVE_NAME | jq -r .[0].IPAM.Config[0].Subnet | cut -f1-3 -d.).199 +echo "" > remove_me_later.py +(sleep 10 && docker run --detach --rm --name $L1_PROXY_NAME --network kt-${ENCLAVE_NAME} --ip $MITM_IP \ + -v $(pwd)/scripts/mitm/failures.py:/failures.py:ro \ + -v $(pwd)/remove_me_later.py:/mitm.py:ro \ + -p 127.0.0.1:8545:$L1_PROXY_PORT \ + mitmproxy/mitmproxy \ + mitmdump --mode reverse:http://anvil-001:8545 -p 8234 -s /mitm.py) & + +# Deploy Kurtosis stack. +kurtosis run --enclave $ENCLAVE_NAME . \ + '{ "args": { + "l1_rpc_url": "http://'$L1_PROXY_NAME':'$L1_PROXY_PORT'", + "cdk_node_image": "ghcr.io/0xpolygon/cdk:'$CDK_NODE_VERS'", + "l1_engine": "anvil", + } + }' + + +wait_for_verification() { + local timeout=$1 + local start_time=$(date +%s) + + # Get current batch: + BATCH=$(cast rpc zkevm_batchNumber) + BATCH=$(echo $BATCH | tr -d '"' | xargs printf "%d") + echo "Current batch $BATCH set as target to be verified." + + VIRTUAL_BATCH=$(cast rpc zkevm_virtualBatchNumber) + VIRTUAL_BATCH=$(echo $VIRTUAL_BATCH | tr -d '"' | xargs printf "%d") + + VERIFIED_BATCH=$(cast rpc zkevm_verifiedBatchNumber) + VERIFIED_BATCH=$(echo $VERIFIED_BATCH | tr -d '"' | xargs printf "%d") + + # while verified batch is less than the current batch, sleep + while [ $VERIFIED_BATCH -lt $BATCH ]; do + # Check elapsed time + local current_time=$(date +%s) + local elapsed=$((current_time - start_time)) + if [ $elapsed -ge $timeout ]; then + echo "Timeout reached ($timeout seconds). Exiting..." + return 1 + fi + + echo "Verified batch is $VERIFIED_BATCH, Virtual batch is $VIRTUAL_BATCH, target batch is $BATCH. Sleeping for a while..." + sleep 10 + VIRTUAL_BATCH=$(cast rpc zkevm_virtualBatchNumber) + VIRTUAL_BATCH=$(echo $VIRTUAL_BATCH | tr -d '"' | xargs printf "%d") + VERIFIED_BATCH=$(cast rpc zkevm_verifiedBatchNumber) + VERIFIED_BATCH=$(echo $VERIFIED_BATCH | tr -d '"' | xargs printf "%d") + done + echo "DONE. Verified batch is $VERIFIED_BATCH, Virtual batch is $VIRTUAL_BATCH, target batch was $BATCH." + return 0 +} + +export ETH_RPC_URL=$(kurtosis port print $ENCLAVE_NAME cdk-erigon-sequencer-001 rpc) + +TEST_PERCENTAGE=0.50 +TEST_DURATION=120 +TIMEOUT=300 + +# Test failures, 2 minutes each +classes=$(sed -n 's/^class \([A-Za-z0-9]\+\).*/\1/p' scripts/mitm/failures.py | grep -v Generic) +for class in $classes; do + echo "import failures" > remove_me_later.py + echo "addons = [failures.${class}(${TEST_PERCENTAGE})]" >> remove_me_later.py + echo >> remove_me_later.py + echo "Testing failure class $class for a $TEST_DURATION seconds" + sleep $TEST_DURATION + echo "Resuming normal operation" + echo "" > remove_me_later.py + wait_for_verification $TIMEOUT + if [ $? -eq 0 ]; then + echo "Verification successful!" + else + echo "Verification timed out. Restarting cdk-node and retrying..." + kurtosis service stop $ENCLAVE_NAME cdk-node-001 + kurtosis service start $ENCLAVE_NAME cdk-node-001 + wait_for_verification $TIMEOUT + if [ $? -eq 0 ]; then + echo "Verification successful AFTER RESTART!" + else + echo "Verification was unable to complete even after restart" + exit 1 + fi + fi +done + + +# Clean UP +docker stop $L1_PROXY_NAME +kurtosis enclave stop $ENCLAVE_NAME +kurtosis enclave rm $ENCLAVE_NAME +rm remove_me_later.py From 24367bd5f32c2093cd08cce440cda3f9c32c01a2 Mon Sep 17 00:00:00 2001 From: Xavier Romero Date: Thu, 6 Feb 2025 09:57:53 +0100 Subject: [PATCH 07/28] Adding L1 failures --- docs/mitm.md | 2 +- scripts/mitm/bridge.sh | 34 ++++++++ scripts/mitm/failures.py | 140 ++++++++++++++++++++++++++++++- scripts/mitm/test_l1_failures.sh | 109 +++++++++++++++++------- 4 files changed, 249 insertions(+), 36 deletions(-) create mode 100755 scripts/mitm/bridge.sh diff --git a/docs/mitm.md b/docs/mitm.md index 73950b7b..f04e6e4d 100644 --- a/docs/mitm.md +++ b/docs/mitm.md @@ -43,7 +43,7 @@ Existing failures are implemented on [/scripts/mitm/failures.py](/scripts/mitm/f - ```CorruptedJSONResponse```: Change a random byte on the returned JSON - ```NoResponse```: Closing the HTTP connection without returning any answer - ```AddJSONFieldsResponse```: Adding arbitrary JSON fields to the returned answer - +- ```RedirectRequest```: Sending the request to a different(specified) server ## Reorg + Null answers diff --git a/scripts/mitm/bridge.sh b/scripts/mitm/bridge.sh new file mode 100755 index 00000000..62b589ea --- /dev/null +++ b/scripts/mitm/bridge.sh @@ -0,0 +1,34 @@ +ENCLAVE_NAME=test-failures +FUNDED_PRV_KEY=0x12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625 +ETH_RPC_URL=$(kurtosis port print $ENCLAVE_NAME cdk-erigon-sequencer-001 rpc) +L1_RPC_URL=$(kurtosis port print $ENCLAVE_NAME anvil-001 rpc) + +# Fund claimtxmanager +cast send --legacy --rpc-url $(kurtosis port print $ENCLAVE_NAME cdk-erigon-rpc-001 rpc) --private-key "$FUNDED_PRV_KEY" --value 10ether 0x5f5dB0D4D58310F53713eF4Df80ba6717868A9f8 + +# Deposit on L1 to avoid negative balance +polycli ulxly bridge asset \ + --value $(cast to-wei 90) \ + --gas-limit "1250000" \ + --bridge-address 0x83F138B325164b162b320F797b57f6f7E235ABAC \ + --destination-address 0xE34aaF64b29273B7D567FCFc40544c014EEe9970 \ + --destination-network 1 \ + --rpc-url "$L1_RPC_URL" \ + --private-key "$FUNDED_PRV_KEY" \ + --chain-id 271828 \ + --pretty-logs=false + +# Start depositing on L2 +while true; do + polycli ulxly bridge asset \ + --value 10 \ + --gas-limit "250000" \ + --bridge-address 0x83F138B325164b162b320F797b57f6f7E235ABAC \ + --destination-address 0xE34aaF64b29273B7D567FCFc40544c014EEe9970 \ + --destination-network 0 \ + --rpc-url "$ETH_RPC_URL" \ + --private-key "$FUNDED_PRV_KEY" \ + --chain-id 10101 \ + --pretty-logs=false + sleep 5 +done diff --git a/scripts/mitm/failures.py b/scripts/mitm/failures.py index d2bbd849..a15a4761 100644 --- a/scripts/mitm/failures.py +++ b/scripts/mitm/failures.py @@ -6,8 +6,14 @@ class GenericFailure: - def __init__(self, ratio): + def __init__(self, ratio, selected_peers=[]): self.ratio = ratio + self.peers = selected_peers + + def _eligible_peer(self, flow): + _peer = flow.client_conn.peername + _peer_addr = _peer[0] if _peer else None + return (not self.peers) or (_peer_addr in self.peers) def _random_select(self): assert (0.0 <= self.ratio <= 1.0) @@ -35,6 +41,9 @@ def response(self, flow): if not self._eligible_response(flow): return + if not self._eligible_peer(flow): + return + if not self._random_select(): return @@ -54,6 +63,9 @@ def request(self, flow): if not self._eligible_request(flow): return + if not self._eligible_peer(flow): + return + if not self._random_select(): return @@ -65,9 +77,11 @@ def request(self, flow): class HttpErrorResponse(GenericRequestFailure): DEFAULT_ERROR_CODES = [401, 403, 404, 405, 429, 500, 502, 503, 504] - def __init__(self, ratio, error_codes=DEFAULT_ERROR_CODES): + def __init__( + self, ratio, selected_peers=[], error_codes=DEFAULT_ERROR_CODES + ): self.error_codes = error_codes - super().__init__(ratio) + super().__init__(ratio, selected_peers) def _my_request(self, flow): error_code = self.error_codes[randint(0, len(self.error_codes) - 1)] @@ -176,3 +190,123 @@ def _my_response(self, flow): elif isinstance(body["result"], list): body["result"].append({f"new_value_{_}": f"new_value_{_}"}) flow.response.text = json.dumps(body) + + +class RedirectRequest(GenericRequestFailure): + def __init__(self, ratio, selected_peers=[], redirect_url=None): + self.scheme = redirect_url.split("://")[0] + self.host = redirect_url.split("://")[1].split(":")[0] + self.port = int(redirect_url.split(":")[2]) + super().__init__(ratio, selected_peers) + + def _my_request(self, flow): + flow.request.scheme = self.scheme + flow.request.host = self.host + flow.request.port = self.port + flow.request.headers["Host"] = self.host + + +class InvalidJSONResponse(GenericRequestFailure): + def _my_request(self, flow): + flow.response = \ + http.Response.make( + 200, + '{"result": This is a invalid JSOM}', + {"Content-Type": "application/json"} + ) + + +class RemoveJSONFieldsResponse(GenericResponseFailure): + MIN_REMOVED_FIELDS = 1 + MAX_REMOVED_FIELDS = 3 + + def _eligible_response(self, flow): + if flow.response.headers.get("Content-Type") == "application/json": + try: + body = json.loads(flow.response.text) + return ( + isinstance(body, dict) and + body.get("result") and + isinstance(body["result"], dict) and + (len(body["result"]) >= self.MAX_REMOVED_FIELDS) + ) + except json.JSONDecodeError: + return False + else: + return False + + def _my_response(self, flow): + body = json.loads(flow.response.text) + for _ in range( + randint(self.MIN_REMOVED_FIELDS, self.MAX_REMOVED_FIELDS) + ): + key = list(body["result"].keys())[ + randint(0, len(body["result"]) - 1) + ] + del body["result"][key] + + flow.response.text = json.dumps(body) + + +class WrongContentTypeResponse(GenericResponseFailure): + def _eligible_response(self, flow): + return \ + (flow.response.headers.get("Content-Type") == "application/json") + + def _my_response(self, flow): + flow.response.headers["Content-Type"] = "application/pdf" + + +class WrongContentLengthResponse(GenericResponseFailure): + def _my_response(self, flow): + if flow.response.headers.get("Content-Length", 0) % 2 == 0: + flow.response.headers["Content-Length"] = "0" + else: + flow.response.headers["Content-Length"] = "1099511627776" + + +# class OlderLatestBlock(GenericResponseFailure, GenericRequestFailure): +# BLOCK_DIFF = 20 + +# def __init__(self, ratio): +# self.fids = [] +# super().__init__(ratio) + +# def _eligible_request(self, flow): +# content = json.loads(flow.request.content) +# print(f"Content: {content}") +# eligible = ( +# (flow.request.headers.get("Content-Type") == "application/json") +# and isinstance(content, dict) +# and ( +# content.get("method") == "eth_blockNumber" +# or ( +# content.get("method") == "eth_getBlockByNumber" +# and any( +# x in content.get("params", []) +# for x in ["finalized", "safe", "latest"] +# ) +# ) +# ) +# ) +# print(f"Eligible request: {eligible}") +# return eligible + +# def _my_request(self, flow): +# content = json.loads(flow.request.content) +# if content.get("method") == "eth_getBlockByNumber": +# # let's query the server here + +# else: +# self.fids.append(flow.id) + +# def _eligible_response(self, flow): +# return flow.id in self.fids + +# def _my_response(self, flow): +# self.fids.remove(flow.id) +# body = json.loads(flow.response.text) +# print(f"Old block: {body['result']}") +# body["result"] = hex(int(body["result"], 16) - self.BLOCK_DIFF) +# print(f"New block: {body['result']}") +# flow.response.text = json.dumps(body) diff --git a/scripts/mitm/test_l1_failures.sh b/scripts/mitm/test_l1_failures.sh index fc71ff11..eee47e5b 100755 --- a/scripts/mitm/test_l1_failures.sh +++ b/scripts/mitm/test_l1_failures.sh @@ -1,10 +1,39 @@ ENCLAVE_NAME=test-failures -CDK_NODE_VERS=0.5.1-rc4 REAL_RPC_URL=http://anvil-001:8545 +# MITM PROXY L1_PROXY_NAME=mitm L1_PROXY_PORT=8234 +KURTOSIS_ARGS='{ + "args": { + "l1_engine": "anvil", + "l1_rpc_url": "http://'$L1_PROXY_NAME':'$L1_PROXY_PORT'", + "cdk_node_image": "ghcr.io/0xpolygon/cdk:0.5.1-rc4", + "zkevm_contracts_image": "leovct/zkevm-contracts:v9.0.0-rc.5-pp-fork.12", + "deploy_l2_contracts": true, + "consensus_contract_type": "pessimistic", + "erigon_strict_mode": false, + "gas_token_enabled": false, + "zkevm_use_real_verifier": false, + "enable_normalcy": true, + "agglayer_prover_sp1_key": "", + "agglayer_prover_primary_prover": "mock-prover", + "sequencer_type": "erigon" + } +}' + +# TEST PARAMS +TEST_PERCENTAGE=0.50 # % of l1 requests to fail +TEST_DURATION=180 # amount of time to test each failure +TIMEOUT=240 # Time to wait for everything to settle after the failure +CHECK_SC_VERIFICATION=0 # Disable when using soverign chain +TEST_COMPONENT=agglayer # Set if you want to test a single component +CLASSES="ArbirtraryHTMLResponse" # Set if you want to test a specific error class + +# Cleanup everything when done +CLEANUP=0 + # Just in case docker/stack was already running docker stop $L1_PROXY_NAME > /dev/null 2>&1 kurtosis enclave stop $ENCLAVE_NAME > /dev/null 2>&1 @@ -15,7 +44,7 @@ kurtosis enclave add --name $ENCLAVE_NAME # Launch mitm docker in the background MITM_IP=$(docker network inspect kt-$ENCLAVE_NAME | jq -r .[0].IPAM.Config[0].Subnet | cut -f1-3 -d.).199 -echo "" > remove_me_later.py +echo > remove_me_later.py (sleep 10 && docker run --detach --rm --name $L1_PROXY_NAME --network kt-${ENCLAVE_NAME} --ip $MITM_IP \ -v $(pwd)/scripts/mitm/failures.py:/failures.py:ro \ -v $(pwd)/remove_me_later.py:/mitm.py:ro \ @@ -24,14 +53,12 @@ echo "" > remove_me_later.py mitmdump --mode reverse:http://anvil-001:8545 -p 8234 -s /mitm.py) & # Deploy Kurtosis stack. -kurtosis run --enclave $ENCLAVE_NAME . \ - '{ "args": { - "l1_rpc_url": "http://'$L1_PROXY_NAME':'$L1_PROXY_PORT'", - "cdk_node_image": "ghcr.io/0xpolygon/cdk:'$CDK_NODE_VERS'", - "l1_engine": "anvil", - } - }' +kurtosis run --enclave $ENCLAVE_NAME . "$KURTOSIS_ARGS" +export ETH_RPC_URL=$(kurtosis port print $ENCLAVE_NAME cdk-erigon-sequencer-001 rpc) + +echo "Kurtosis stack is ready !!" +read -p "Press any key to continue.." wait_for_verification() { local timeout=$1 @@ -69,42 +96,60 @@ wait_for_verification() { return 0 } -export ETH_RPC_URL=$(kurtosis port print $ENCLAVE_NAME cdk-erigon-sequencer-001 rpc) -TEST_PERCENTAGE=0.50 -TEST_DURATION=120 -TIMEOUT=300 +if [ -n "$TEST_COMPONENT" ]; then + DOCKER_ID=$(docker ps | grep $(kurtosis service inspect $ENCLAVE_NAME $TEST_COMPONENT | grep UUID | awk '{print $2}') | awk '{print $1}') + COMPONENT_IP=$(docker inspect $DOCKER_ID | jq -r '.[0].NetworkSettings.Networks."kt-'$ENCLAVE_NAME'".IPAddress') + SELECTED_PEERS="'$COMPONENT_IP'" + echo "Selected peers: $SELECTED_PEERS" +fi + +# Set CLASSESS if empty +if [ -z "$CLASSES" ]; then + CLASSES=$(sed -n 's/^class \([A-Za-z0-9]\+\).*/\1/p' scripts/mitm/failures.py | grep -v Generic) +fi # Test failures, 2 minutes each -classes=$(sed -n 's/^class \([A-Za-z0-9]\+\).*/\1/p' scripts/mitm/failures.py | grep -v Generic) -for class in $classes; do +for class in $CLASSES; do echo "import failures" > remove_me_later.py - echo "addons = [failures.${class}(${TEST_PERCENTAGE})]" >> remove_me_later.py + if [ "$class" == "RedirectRequest" ]; then + redirect_url="http://cdk-erigon-rpc-001:8123" + echo "addons = [failures.${class}(${TEST_PERCENTAGE}, [$SELECTED_PEERS], '${redirect_url}')]" >> remove_me_later.py + else + echo "addons = [failures.${class}(${TEST_PERCENTAGE}, [$SELECTED_PEERS])]" >> remove_me_later.py + fi echo >> remove_me_later.py echo "Testing failure class $class for a $TEST_DURATION seconds" sleep $TEST_DURATION echo "Resuming normal operation" - echo "" > remove_me_later.py - wait_for_verification $TIMEOUT - if [ $? -eq 0 ]; then - echo "Verification successful!" - else - echo "Verification timed out. Restarting cdk-node and retrying..." - kurtosis service stop $ENCLAVE_NAME cdk-node-001 - kurtosis service start $ENCLAVE_NAME cdk-node-001 + echo > remove_me_later.py + if [ $CHECK_SC_VERIFICATION -eq 1 ]; then wait_for_verification $TIMEOUT if [ $? -eq 0 ]; then - echo "Verification successful AFTER RESTART!" + echo "Verification successful!" else - echo "Verification was unable to complete even after restart" - exit 1 + echo "Verification timed out. Restarting cdk-node and retrying..." + kurtosis service stop $ENCLAVE_NAME cdk-node-001 + kurtosis service start $ENCLAVE_NAME cdk-node-001 + wait_for_verification $TIMEOUT + if [ $? -eq 0 ]; then + echo "Verification successful AFTER RESTART!" + else + echo "Verification was unable to complete even after restart" + exit 1 + fi fi + else + echo "Waiting for 20 seconds to let everything settle..." + sleep 20 fi done - # Clean UP -docker stop $L1_PROXY_NAME -kurtosis enclave stop $ENCLAVE_NAME -kurtosis enclave rm $ENCLAVE_NAME -rm remove_me_later.py +if [ $CLEANUP -eq 1 ]; then + echo "Cleaning up..." + kurtosis enclave stop $ENCLAVE_NAME + kurtosis enclave rm $ENCLAVE_NAME + docker stop $L1_PROXY_NAME + rm remove_me_later.py +fi From 5013df23a2bcc792e22216e6df5b3d5be55a40e8 Mon Sep 17 00:00:00 2001 From: Xavier Romero Date: Thu, 13 Feb 2025 09:07:04 +0100 Subject: [PATCH 08/28] Introduce pauses --- scripts/mitm/test_l1_failures.sh | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/scripts/mitm/test_l1_failures.sh b/scripts/mitm/test_l1_failures.sh index eee47e5b..a9b86916 100755 --- a/scripts/mitm/test_l1_failures.sh +++ b/scripts/mitm/test_l1_failures.sh @@ -29,10 +29,8 @@ TEST_DURATION=180 # amount of time to test each failure TIMEOUT=240 # Time to wait for everything to settle after the failure CHECK_SC_VERIFICATION=0 # Disable when using soverign chain TEST_COMPONENT=agglayer # Set if you want to test a single component -CLASSES="ArbirtraryHTMLResponse" # Set if you want to test a specific error class +CLASSES="HttpErrorResponse" # Set if you want to test a specific error class -# Cleanup everything when done -CLEANUP=0 # Just in case docker/stack was already running docker stop $L1_PROXY_NAME > /dev/null 2>&1 @@ -145,11 +143,10 @@ for class in $CLASSES; do fi done +read -p "Press any key to cleanup everything.." # Clean UP -if [ $CLEANUP -eq 1 ]; then - echo "Cleaning up..." - kurtosis enclave stop $ENCLAVE_NAME - kurtosis enclave rm $ENCLAVE_NAME - docker stop $L1_PROXY_NAME - rm remove_me_later.py -fi +echo "Cleaning up..." +kurtosis enclave stop $ENCLAVE_NAME +kurtosis enclave rm $ENCLAVE_NAME +docker stop $L1_PROXY_NAME +rm remove_me_later.py From ffa4f9635ec4c95d7ee837b9b927d77fd5ed4ace Mon Sep 17 00:00:00 2001 From: Xavier Romero Date: Mon, 17 Feb 2025 11:34:10 +0100 Subject: [PATCH 09/28] Anvil params --- anvil.star | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/anvil.star b/anvil.star index 5729f2b9..fa49ff2a 100644 --- a/anvil.star +++ b/anvil.star @@ -1,6 +1,6 @@ -ANVIL_BLOCK_TIME = 1 +ANVIL_BLOCK_TIME = 5 ANVIL_SLOTS_IN_AN_EPOCH = ( - 2 # Setting to X leads to block N-(X+1) being finalized, being N latest block + 32 # Setting to X leads to block N-(X+1) being finalized, being N latest block ) STATE_PATH = "/tmp" From a4ef3405be4eedf8bfeaa475b65c78d69b21ece0 Mon Sep 17 00:00:00 2001 From: Xavier Romero Date: Mon, 17 Feb 2025 17:37:13 +0100 Subject: [PATCH 10/28] safe reorg --- anvil.star | 10 +- input_parser.star | 6 ++ mitm.star | 23 +++-- scripts/mitm/l1_safe_reorg.sh | 173 ++++++++++++++++++++++++++++++++++ 4 files changed, 196 insertions(+), 16 deletions(-) create mode 100755 scripts/mitm/l1_safe_reorg.sh diff --git a/anvil.star b/anvil.star index fa49ff2a..58f2a47e 100644 --- a/anvil.star +++ b/anvil.star @@ -1,20 +1,18 @@ -ANVIL_BLOCK_TIME = 5 -ANVIL_SLOTS_IN_AN_EPOCH = ( - 32 # Setting to X leads to block N-(X+1) being finalized, being N latest block -) STATE_PATH = "/tmp" def run(plan, args): chain_id = str(args["l1_chain_id"]) + block_time = args.get("l1_anvil_block_time") + slots_in_epoch = args.get("l1_anvil_slots_in_epoch") service_files = {} mnemonic = args.get("l1_preallocated_mnemonic") cmd = ( "anvil --block-time " - + str(ANVIL_BLOCK_TIME) + + str(block_time) + " --slots-in-an-epoch " - + str(ANVIL_SLOTS_IN_AN_EPOCH) + + str(slots_in_epoch) + " --chain-id " + chain_id + " --host 0.0.0.0 --port " diff --git a/input_parser.star b/input_parser.star index 8c12a841..0f6d377c 100644 --- a/input_parser.star +++ b/input_parser.star @@ -219,6 +219,12 @@ DEFAULT_L1_ARGS = { "l1_participants_count": 1, # Whether to deploy https://github.com/AggLayer/lxly-bridge-and-call "l1_deploy_lxly_bridge_and_call": True, + # Anvil: l1_anvil_slots_in_epoch will set the gap of blocks finalized vs safe vs latest + # l1_anvil_block_time * l1_anvil_slots_in_epoch -> total seconds to transition a block from latest to safe + # l1_anvil_block_time: seconds per block + "l1_anvil_block_time": 1, + # l1_anvil_slots_in_epoch: number of slots in an epoch + "l1_anvil_slots_in_epoch": 1, # Set this to true if the L1 contracts for the rollup are already # deployed. This also means that you'll need some way to run # recovery from outside of kurtosis diff --git a/mitm.star b/mitm.star index a85518d8..5ef5bd1e 100644 --- a/mitm.star +++ b/mitm.star @@ -1,17 +1,18 @@ SRC_MITM_SCRIPT_PATH = "./scripts/mitm" -DST_MITM_SCRIPT_PATH = "/scripts" +SRC_MITM_SCRIPTS = ["empty.py", "failures.py"] DEFAULT_SCRIPT = "empty.py" +DST_MITM_SCRIPT_PATH = "/scripts" def run(plan, args): - mitm_script = plan.upload_files( - name="mitm-script", - src=SRC_MITM_SCRIPT_PATH + "/" + DEFAULT_SCRIPT, - description="Uploading MITM script", - ) - service_files = { - DST_MITM_SCRIPT_PATH: mitm_script, - } + artifacts = [] + for script in SRC_MITM_SCRIPTS: + mitm_script = plan.upload_files( + name="mitm-script-" + script, + src=SRC_MITM_SCRIPT_PATH + "/" + script, + description="Uploading MITM script " + script, + ) + artifacts.append(mitm_script) plan.add_service( name="mitm" + args["deployment_suffix"], @@ -20,7 +21,9 @@ def run(plan, args): ports={ "rpc": PortSpec(args["mitm_port"], application_protocol="http"), }, - files=service_files, + files={ + DST_MITM_SCRIPT_PATH: Directory(artifact_names=artifacts), + }, cmd=[ "sh", "-c", diff --git a/scripts/mitm/l1_safe_reorg.sh b/scripts/mitm/l1_safe_reorg.sh new file mode 100755 index 00000000..67dfdc55 --- /dev/null +++ b/scripts/mitm/l1_safe_reorg.sh @@ -0,0 +1,173 @@ +#!/bin/bash +# Get arg and check its either PP of FEP +MODE=$1 +if [ "$MODE" != "pp" ] && [ "$MODE" != "fep" ]; then + echo "Usage: $0 [pp|fep]" + exit 1 +fi +ENCLAVE_NAME="reorgtester" +FUNDED_PRV_KEY=0x12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625 +BLOCK_TIME=6 +BLOCKS_PER_EPOCH=32 + +KURTOSIS_PP_ARGS='{ + "args": { + "l1_engine": "anvil", + "l1_anvil_block_time": '$BLOCK_TIME', + "l1_anvil_slots_in_epoch": '$BLOCKS_PER_EPOCH', + "mitm_proxied_components": {"agglayer": true, "cdk-node": true}, + "cdk_node_image": "ghcr.io/0xpolygon/cdk:0.5.1-rc4", + "zkevm_contracts_image": "leovct/zkevm-contracts:v9.0.0-rc.5-pp-fork.12", + "deploy_l2_contracts": true, + "consensus_contract_type": "pessimistic", + "erigon_strict_mode": false, + "gas_token_enabled": false, + "zkevm_use_real_verifier": false, + "enable_normalcy": true, + "agglayer_prover_sp1_key": "", + "agglayer_prover_primary_prover": "mock-prover", + "sequencer_type": "erigon" + } +}' +KURTOSIS_FEP_ARGS='{ + "args": { + "l1_engine": "anvil", + "l1_anvil_block_time": '$BLOCK_TIME', + "l1_anvil_slots_in_epoch": '$BLOCKS_PER_EPOCH', + "mitm_proxied_components": {"agglayer": true, "cdk-node": true}, + "cdk_node_image": "ghcr.io/0xpolygon/cdk:0.5.1-rc4", + "consensus_contract_type": "rollup", + "additional_services": ["tx_spammer"] + } +}' + +if [ "$MODE" == "pp" ]; then + KURTOSIS_ARGS=$KURTOSIS_PP_ARGS +else + KURTOSIS_ARGS=$KURTOSIS_FEP_ARGS +fi +kurtosis run --enclave $ENCLAVE_NAME . "$KURTOSIS_ARGS" + +L1_RPC_URL=$(kurtosis port print $ENCLAVE_NAME anvil-001 rpc) +L2_RPC_URL=$(kurtosis port print $ENCLAVE_NAME cdk-erigon-rpc-001 rpc) + +# Fund claimtxmanager +sleep 10 +cast send --legacy --rpc-url $L2_RPC_URL --private-key "$FUNDED_PRV_KEY" --value 10ether 0x5f5dB0D4D58310F53713eF4Df80ba6717868A9f8 + +# Deposit on L1 to avoid negative balance +polycli ulxly bridge asset \ + --value $(cast to-wei 90) \ + --gas-limit "1250000" \ + --bridge-address 0x83F138B325164b162b320F797b57f6f7E235ABAC \ + --destination-address 0xE34aaF64b29273B7D567FCFc40544c014EEe9970 \ + --destination-network 1 \ + --rpc-url "$L1_RPC_URL" \ + --private-key "$FUNDED_PRV_KEY" \ + --chain-id 271828 \ + --pretty-logs=false + +# Wait for tx to be finalized: block_time*slots_in_epoch +sleep $((BLOCK_TIME*BLOCKS_PER_EPOCH*2)) + + +LATEST_BLOCK=$(cast bn --rpc-url $L1_RPC_URL latest) +SAFE_BLOCK=$(cast bn --rpc-url $L1_RPC_URL safe) +FINALIZED_BLOCK=$(cast bn --rpc-url $L1_RPC_URL finalized) +echo "L1 | Latest: $LATEST_BLOCK, Safe: $SAFE_BLOCK, Finalized: $FINALIZED_BLOCK" + +# Wait until there at least 5 finalez blocks on L1 +while [ $FINALIZED_BLOCK -lt 5 ]; do + echo "Waiting for at least 5 finalized blocks ($FINALIZED_BLOCK so far)" + sleep $BLOCK_TIME + FINALIZED_BLOCK=$(cast bn --rpc-url $L1_RPC_URL finalized) +done + +FORK_BLOCK=$(cast bn --rpc-url $L1_RPC_URL latest) + +docker run --detach --name fork --rm --network kt-${ENCLAVE_NAME} -p 8545:8545 \ + ghcr.io/foundry-rs/foundry:v1.0.0-rc \ + "anvil \ + --block-time $BLOCK_TIME \ + -p 8545 \ + --slots-in-an-epoch $BLOCKS_PER_EPOCH \ + --host 0.0.0.0 \ + --fork-url http://anvil-001:8545 \ + --fork-block-number $FORK_BLOCK" + +echo "Deployed fork from block $FORK_BLOCK" +FORK_RPC_URL=http://localhost:8545 + +sleep 3 + +F_LATEST_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL latest) +F_SAFE_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL safe) +F_FINALIZED_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL finalized) +echo "Fork | Latest: $F_LATEST_BLOCK, Safe: $F_SAFE_BLOCK, Finalized: $F_FINALIZED_BLOCK" + +# Set fork on cdknode +kurtosis service exec $ENCLAVE_NAME mitm-001 \ + 'echo "import failures" > /scripts/empty.py' +kurtosis service exec $ENCLAVE_NAME mitm-001 \ + 'echo "addons = [ failures.RedirectRequest(ratio=1.0, selected_peers=[], redirect_url=\"http://fork:8545\") ]" >> /scripts/empty.py' + + +# Let's keep the fork until we're 5 blocks behind finalized +while [ $FINALIZED_BLOCK -lt $((FORK_BLOCK - 6)) ]; do + polycli ulxly bridge asset \ + --value 10 \ + --gas-limit "250000" \ + --bridge-address 0x83F138B325164b162b320F797b57f6f7E235ABAC \ + --destination-address 0xE34aaF64b29273B7D567FCFc40544c014EEe9970 \ + --destination-network 0 \ + --rpc-url "$L2_RPC_URL" \ + --private-key "$FUNDED_PRV_KEY" \ + --chain-id 10101 \ + --pretty-logs=false + echo "Forkid from $FORK_BLOCK still ahead from finalized $FINALIZED_BLOCK" + sleep $BLOCK_TIME + + F_LATEST_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL latest) + F_SAFE_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL safe) + F_FINALIZED_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL finalized) + echo "Fork | Latest: $F_LATEST_BLOCK, Safe: $F_SAFE_BLOCK, Finalized: $F_FINALIZED_BLOCK" + + LATEST_BLOCK=$(cast bn --rpc-url $L1_RPC_URL latest) + SAFE_BLOCK=$(cast bn --rpc-url $L1_RPC_URL safe) + FINALIZED_BLOCK=$(cast bn --rpc-url $L1_RPC_URL finalized) + echo "L1 | Latest: $LATEST_BLOCK, Safe: $SAFE_BLOCK, Finalized: $FINALIZED_BLOCK" +done + +# Disable fork +kurtosis service exec $ENCLAVE_NAME mitm-001 'echo > /scripts/empty.py' + +LATEST_BLOCK=$(cast bn --rpc-url $L1_RPC_URL latest) +SAFE_BLOCK=$(cast bn --rpc-url $L1_RPC_URL safe) +FINALIZED_BLOCK=$(cast bn --rpc-url $L1_RPC_URL finalized) +echo "L1 | Latest: $LATEST_BLOCK, Safe: $SAFE_BLOCK, Finalized: $FINALIZED_BLOCK" + +read -p "Press any key to continue sending bridges.." + +while true; do + polycli ulxly bridge asset \ + --value 10 \ + --gas-limit "250000" \ + --bridge-address 0x83F138B325164b162b320F797b57f6f7E235ABAC \ + --destination-address 0xE34aaF64b29273B7D567FCFc40544c014EEe9970 \ + --destination-network 0 \ + --rpc-url "$L2_RPC_URL" \ + --private-key "$FUNDED_PRV_KEY" \ + --chain-id 10101 \ + --pretty-logs=false + # In the following line -t for timeout, -N for just 1 character + read -p "Press any key to stop sending bridges" -t 5 -N 1 input + if [[ -n $input ]]; then + echo + break + fi +done + +read -p "Press any key to clean up !!" +docker stop fork +kurtosis enclave stop $ENCLAVE_NAME +kurtosis enclave rm $ENCLAVE_NAME From c0f8eaa9aec48c3b4893abddc25fa0819422c2e1 Mon Sep 17 00:00:00 2001 From: Xavier Romero Date: Tue, 18 Feb 2025 09:14:44 +0100 Subject: [PATCH 11/28] update doc --- docs/anvil.md | 27 +++++++++++++++++++-------- scripts/mitm/bridge.sh | 34 ---------------------------------- 2 files changed, 19 insertions(+), 42 deletions(-) delete mode 100755 scripts/mitm/bridge.sh diff --git a/docs/anvil.md b/docs/anvil.md index 45ea8f81..73a55a3e 100644 --- a/docs/anvil.md +++ b/docs/anvil.md @@ -6,15 +6,26 @@ l1_engine: anvil ``` Please, understand that by doing: -- l1_chain_id is taken into account -- l1_rpc_url is automatically set to http://anvil-001:8545 -- l1_ws_url is automatically set to ws://anvil-001:8545 +- ```l1_chain_id``` is taken into account +- ```l1_rpc_url``` is automatically set to http://anvil-001:8545 +- ```l1_ws_url``` is automatically set to ws://anvil-001:8545 - These params are ignored: - - l1_beacon_url - - l1_additional_services - - l1_preset - - l1_seconds_per_slot - - l1_participants_count + - ```l1_beacon_url``` + - ```l1_additional_services``` + - ```l1_preset``` + - ```l1_seconds_per_slot``` + - ```l1_participants_count``` + +## Parameters +These are optional config params for Anvil: +- ```l1_anvil_block_time```: seconds per block +- ```l1_anvil_slots_in_epoch```: number of slots in an epoch + +For instance setting +- ```l1_anvil_block_time: 6``` +- ```l1_anvil_slots_in_epoch: 32``` + +Will produce blocks each 6 seconds, and the most recent safe block will be the latest one - 32 (that one from 32 * 6 seconds ago). ## State dump and recover diff --git a/scripts/mitm/bridge.sh b/scripts/mitm/bridge.sh deleted file mode 100755 index 62b589ea..00000000 --- a/scripts/mitm/bridge.sh +++ /dev/null @@ -1,34 +0,0 @@ -ENCLAVE_NAME=test-failures -FUNDED_PRV_KEY=0x12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625 -ETH_RPC_URL=$(kurtosis port print $ENCLAVE_NAME cdk-erigon-sequencer-001 rpc) -L1_RPC_URL=$(kurtosis port print $ENCLAVE_NAME anvil-001 rpc) - -# Fund claimtxmanager -cast send --legacy --rpc-url $(kurtosis port print $ENCLAVE_NAME cdk-erigon-rpc-001 rpc) --private-key "$FUNDED_PRV_KEY" --value 10ether 0x5f5dB0D4D58310F53713eF4Df80ba6717868A9f8 - -# Deposit on L1 to avoid negative balance -polycli ulxly bridge asset \ - --value $(cast to-wei 90) \ - --gas-limit "1250000" \ - --bridge-address 0x83F138B325164b162b320F797b57f6f7E235ABAC \ - --destination-address 0xE34aaF64b29273B7D567FCFc40544c014EEe9970 \ - --destination-network 1 \ - --rpc-url "$L1_RPC_URL" \ - --private-key "$FUNDED_PRV_KEY" \ - --chain-id 271828 \ - --pretty-logs=false - -# Start depositing on L2 -while true; do - polycli ulxly bridge asset \ - --value 10 \ - --gas-limit "250000" \ - --bridge-address 0x83F138B325164b162b320F797b57f6f7E235ABAC \ - --destination-address 0xE34aaF64b29273B7D567FCFc40544c014EEe9970 \ - --destination-network 0 \ - --rpc-url "$ETH_RPC_URL" \ - --private-key "$FUNDED_PRV_KEY" \ - --chain-id 10101 \ - --pretty-logs=false - sleep 5 -done From 71f99ff9d31fd32bf4d878813a6b7c11f8629349 Mon Sep 17 00:00:00 2001 From: Xavier Romero Date: Tue, 18 Feb 2025 09:31:58 +0100 Subject: [PATCH 12/28] Linter --- scripts/mitm/l1_safe_reorg.sh | 58 ++++++++++++------------- scripts/mitm/test_l1_failures.sh | 74 +++++++++++++++++--------------- 2 files changed, 68 insertions(+), 64 deletions(-) diff --git a/scripts/mitm/l1_safe_reorg.sh b/scripts/mitm/l1_safe_reorg.sh index 67dfdc55..d6ada169 100755 --- a/scripts/mitm/l1_safe_reorg.sh +++ b/scripts/mitm/l1_safe_reorg.sh @@ -53,11 +53,11 @@ L2_RPC_URL=$(kurtosis port print $ENCLAVE_NAME cdk-erigon-rpc-001 rpc) # Fund claimtxmanager sleep 10 -cast send --legacy --rpc-url $L2_RPC_URL --private-key "$FUNDED_PRV_KEY" --value 10ether 0x5f5dB0D4D58310F53713eF4Df80ba6717868A9f8 +cast send --legacy --rpc-url "$L2_RPC_URL" --private-key "$FUNDED_PRV_KEY" --value 10ether 0x5f5dB0D4D58310F53713eF4Df80ba6717868A9f8 # Deposit on L1 to avoid negative balance polycli ulxly bridge asset \ - --value $(cast to-wei 90) \ + --value "$(cast to-wei 90)" \ --gas-limit "1250000" \ --bridge-address 0x83F138B325164b162b320F797b57f6f7E235ABAC \ --destination-address 0xE34aaF64b29273B7D567FCFc40544c014EEe9970 \ @@ -71,19 +71,19 @@ polycli ulxly bridge asset \ sleep $((BLOCK_TIME*BLOCKS_PER_EPOCH*2)) -LATEST_BLOCK=$(cast bn --rpc-url $L1_RPC_URL latest) -SAFE_BLOCK=$(cast bn --rpc-url $L1_RPC_URL safe) -FINALIZED_BLOCK=$(cast bn --rpc-url $L1_RPC_URL finalized) +LATEST_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" latest) +SAFE_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" safe) +FINALIZED_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" finalized) echo "L1 | Latest: $LATEST_BLOCK, Safe: $SAFE_BLOCK, Finalized: $FINALIZED_BLOCK" # Wait until there at least 5 finalez blocks on L1 -while [ $FINALIZED_BLOCK -lt 5 ]; do +while [ "$FINALIZED_BLOCK" -lt 5 ]; do echo "Waiting for at least 5 finalized blocks ($FINALIZED_BLOCK so far)" sleep $BLOCK_TIME - FINALIZED_BLOCK=$(cast bn --rpc-url $L1_RPC_URL finalized) + FINALIZED_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" finalized) done -FORK_BLOCK=$(cast bn --rpc-url $L1_RPC_URL latest) +FORK_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" latest) docker run --detach --name fork --rm --network kt-${ENCLAVE_NAME} -p 8545:8545 \ ghcr.io/foundry-rs/foundry:v1.0.0-rc \ @@ -100,20 +100,20 @@ FORK_RPC_URL=http://localhost:8545 sleep 3 -F_LATEST_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL latest) -F_SAFE_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL safe) -F_FINALIZED_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL finalized) +F_LATEST_BLOCK=$(cast bn --rpc-url "$FORK_RPC_URL" latest) +F_SAFE_BLOCK=$(cast bn --rpc-url "$FORK_RPC_URL" safe) +F_FINALIZED_BLOCK=$(cast bn --rpc-url "$FORK_RPC_URL" finalized) echo "Fork | Latest: $F_LATEST_BLOCK, Safe: $F_SAFE_BLOCK, Finalized: $F_FINALIZED_BLOCK" # Set fork on cdknode -kurtosis service exec $ENCLAVE_NAME mitm-001 \ +kurtosis service exec "$ENCLAVE_NAME" mitm-001 \ 'echo "import failures" > /scripts/empty.py' -kurtosis service exec $ENCLAVE_NAME mitm-001 \ +kurtosis service exec "$ENCLAVE_NAME" mitm-001 \ 'echo "addons = [ failures.RedirectRequest(ratio=1.0, selected_peers=[], redirect_url=\"http://fork:8545\") ]" >> /scripts/empty.py' # Let's keep the fork until we're 5 blocks behind finalized -while [ $FINALIZED_BLOCK -lt $((FORK_BLOCK - 6)) ]; do +while [ "$FINALIZED_BLOCK" -lt $((FORK_BLOCK - 6)) ]; do polycli ulxly bridge asset \ --value 10 \ --gas-limit "250000" \ @@ -127,26 +127,26 @@ while [ $FINALIZED_BLOCK -lt $((FORK_BLOCK - 6)) ]; do echo "Forkid from $FORK_BLOCK still ahead from finalized $FINALIZED_BLOCK" sleep $BLOCK_TIME - F_LATEST_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL latest) - F_SAFE_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL safe) - F_FINALIZED_BLOCK=$(cast bn --rpc-url $FORK_RPC_URL finalized) + F_LATEST_BLOCK=$(cast bn --rpc-url "$FORK_RPC_URL" latest) + F_SAFE_BLOCK=$(cast bn --rpc-url "$FORK_RPC_URL" safe) + F_FINALIZED_BLOCK=$(cast bn --rpc-url "$FORK_RPC_URL" finalized) echo "Fork | Latest: $F_LATEST_BLOCK, Safe: $F_SAFE_BLOCK, Finalized: $F_FINALIZED_BLOCK" - LATEST_BLOCK=$(cast bn --rpc-url $L1_RPC_URL latest) - SAFE_BLOCK=$(cast bn --rpc-url $L1_RPC_URL safe) - FINALIZED_BLOCK=$(cast bn --rpc-url $L1_RPC_URL finalized) + LATEST_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" latest) + SAFE_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" safe) + FINALIZED_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" finalized) echo "L1 | Latest: $LATEST_BLOCK, Safe: $SAFE_BLOCK, Finalized: $FINALIZED_BLOCK" done # Disable fork -kurtosis service exec $ENCLAVE_NAME mitm-001 'echo > /scripts/empty.py' +kurtosis service exec "$ENCLAVE_NAME" mitm-001 'echo > /scripts/empty.py' -LATEST_BLOCK=$(cast bn --rpc-url $L1_RPC_URL latest) -SAFE_BLOCK=$(cast bn --rpc-url $L1_RPC_URL safe) -FINALIZED_BLOCK=$(cast bn --rpc-url $L1_RPC_URL finalized) +LATEST_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" latest) +SAFE_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" safe) +FINALIZED_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" finalized) echo "L1 | Latest: $LATEST_BLOCK, Safe: $SAFE_BLOCK, Finalized: $FINALIZED_BLOCK" -read -p "Press any key to continue sending bridges.." +read -r -p "Press any key to continue sending bridges.." while true; do polycli ulxly bridge asset \ @@ -160,14 +160,14 @@ while true; do --chain-id 10101 \ --pretty-logs=false # In the following line -t for timeout, -N for just 1 character - read -p "Press any key to stop sending bridges" -t 5 -N 1 input + read -r -p "Press any key to stop sending bridges" -t 5 -N 1 input if [[ -n $input ]]; then echo break fi done -read -p "Press any key to clean up !!" +read -r -p "Press any key to clean up !!" docker stop fork -kurtosis enclave stop $ENCLAVE_NAME -kurtosis enclave rm $ENCLAVE_NAME +kurtosis enclave stop "$ENCLAVE_NAME" +kurtosis enclave rm "$ENCLAVE_NAME" diff --git a/scripts/mitm/test_l1_failures.sh b/scripts/mitm/test_l1_failures.sh index a9b86916..f9f06c7a 100755 --- a/scripts/mitm/test_l1_failures.sh +++ b/scripts/mitm/test_l1_failures.sh @@ -1,3 +1,4 @@ +#!/bin/bash ENCLAVE_NAME=test-failures REAL_RPC_URL=http://anvil-001:8545 @@ -33,52 +34,57 @@ CLASSES="HttpErrorResponse" # Set if you want to test a specific error cl # Just in case docker/stack was already running -docker stop $L1_PROXY_NAME > /dev/null 2>&1 -kurtosis enclave stop $ENCLAVE_NAME > /dev/null 2>&1 -kurtosis enclave rm $ENCLAVE_NAME > /dev/null 2>&1 +docker stop "$L1_PROXY_NAME" > /dev/null 2>&1 +kurtosis enclave stop "$ENCLAVE_NAME" > /dev/null 2>&1 +kurtosis enclave rm "$ENCLAVE_NAME" > /dev/null 2>&1 # Add empty enclave so we can set our MITM there in advance. kurtosis enclave add --name $ENCLAVE_NAME # Launch mitm docker in the background -MITM_IP=$(docker network inspect kt-$ENCLAVE_NAME | jq -r .[0].IPAM.Config[0].Subnet | cut -f1-3 -d.).199 +MITM_IP=$(docker network inspect kt-${ENCLAVE_NAME} | jq -r .[0].IPAM.Config[0].Subnet | cut -f1-3 -d.).199 echo > remove_me_later.py -(sleep 10 && docker run --detach --rm --name $L1_PROXY_NAME --network kt-${ENCLAVE_NAME} --ip $MITM_IP \ - -v $(pwd)/scripts/mitm/failures.py:/failures.py:ro \ - -v $(pwd)/remove_me_later.py:/mitm.py:ro \ +(sleep 10 && docker run --detach --rm --name $L1_PROXY_NAME --network kt-${ENCLAVE_NAME} --ip "$MITM_IP" \ + -v "$(pwd)"/scripts/mitm/failures.py:/failures.py:ro \ + -v "$(pwd)"/remove_me_later.py:/mitm.py:ro \ -p 127.0.0.1:8545:$L1_PROXY_PORT \ mitmproxy/mitmproxy \ - mitmdump --mode reverse:http://anvil-001:8545 -p 8234 -s /mitm.py) & + mitmdump --mode reverse:$REAL_RPC_URL -p 8234 -s /mitm.py) & # Deploy Kurtosis stack. -kurtosis run --enclave $ENCLAVE_NAME . "$KURTOSIS_ARGS" -export ETH_RPC_URL=$(kurtosis port print $ENCLAVE_NAME cdk-erigon-sequencer-001 rpc) - +kurtosis run --enclave "$ENCLAVE_NAME" . "$KURTOSIS_ARGS" +ETH_RPC_URL=$(kurtosis port print "$ENCLAVE_NAME" cdk-erigon-sequencer-001 rpc) +export ETH_RPC_URL echo "Kurtosis stack is ready !!" -read -p "Press any key to continue.." +read -r -p "Press any key to continue.." wait_for_verification() { local timeout=$1 - local start_time=$(date +%s) + local start_time + start_time=$(date +%s) + # Get current batch: BATCH=$(cast rpc zkevm_batchNumber) - BATCH=$(echo $BATCH | tr -d '"' | xargs printf "%d") + BATCH=$(echo "$BATCH" | tr -d '"' | xargs printf "%d") echo "Current batch $BATCH set as target to be verified." VIRTUAL_BATCH=$(cast rpc zkevm_virtualBatchNumber) - VIRTUAL_BATCH=$(echo $VIRTUAL_BATCH | tr -d '"' | xargs printf "%d") + VIRTUAL_BATCH=$(echo "$VIRTUAL_BATCH" | tr -d '"' | xargs printf "%d") VERIFIED_BATCH=$(cast rpc zkevm_verifiedBatchNumber) - VERIFIED_BATCH=$(echo $VERIFIED_BATCH | tr -d '"' | xargs printf "%d") + VERIFIED_BATCH=$(echo "$VERIFIED_BATCH" | tr -d '"' | xargs printf "%d") # while verified batch is less than the current batch, sleep - while [ $VERIFIED_BATCH -lt $BATCH ]; do + while [ "$VERIFIED_BATCH" -lt "$BATCH" ]; do # Check elapsed time - local current_time=$(date +%s) - local elapsed=$((current_time - start_time)) - if [ $elapsed -ge $timeout ]; then + local current_time + current_time=$(date +%s) + local elapsed + elapsed=$((current_time - start_time)) + + if [ "$elapsed" -ge "$timeout" ]; then echo "Timeout reached ($timeout seconds). Exiting..." return 1 fi @@ -86,9 +92,9 @@ wait_for_verification() { echo "Verified batch is $VERIFIED_BATCH, Virtual batch is $VIRTUAL_BATCH, target batch is $BATCH. Sleeping for a while..." sleep 10 VIRTUAL_BATCH=$(cast rpc zkevm_virtualBatchNumber) - VIRTUAL_BATCH=$(echo $VIRTUAL_BATCH | tr -d '"' | xargs printf "%d") + VIRTUAL_BATCH=$(echo "$VIRTUAL_BATCH" | tr -d '"' | xargs printf "%d") VERIFIED_BATCH=$(cast rpc zkevm_verifiedBatchNumber) - VERIFIED_BATCH=$(echo $VERIFIED_BATCH | tr -d '"' | xargs printf "%d") + VERIFIED_BATCH=$(echo "$VERIFIED_BATCH" | tr -d '"' | xargs printf "%d") done echo "DONE. Verified batch is $VERIFIED_BATCH, Virtual batch is $VIRTUAL_BATCH, target batch was $BATCH." return 0 @@ -96,8 +102,8 @@ wait_for_verification() { if [ -n "$TEST_COMPONENT" ]; then - DOCKER_ID=$(docker ps | grep $(kurtosis service inspect $ENCLAVE_NAME $TEST_COMPONENT | grep UUID | awk '{print $2}') | awk '{print $1}') - COMPONENT_IP=$(docker inspect $DOCKER_ID | jq -r '.[0].NetworkSettings.Networks."kt-'$ENCLAVE_NAME'".IPAddress') + DOCKER_ID="$(docker ps | grep "$(kurtosis service inspect "$ENCLAVE_NAME" "$TEST_COMPONENT" | grep UUID | awk '{print $2}')" | awk '{print $1}')" + COMPONENT_IP=$(docker inspect "$DOCKER_ID" | jq -r '.[0].NetworkSettings.Networks."kt-'$ENCLAVE_NAME'".IPAddress') SELECTED_PEERS="'$COMPONENT_IP'" echo "Selected peers: $SELECTED_PEERS" fi @@ -121,16 +127,14 @@ for class in $CLASSES; do sleep $TEST_DURATION echo "Resuming normal operation" echo > remove_me_later.py - if [ $CHECK_SC_VERIFICATION -eq 1 ]; then - wait_for_verification $TIMEOUT - if [ $? -eq 0 ]; then + if [ "$CHECK_SC_VERIFICATION" -eq 1 ]; then + if wait_for_verification "$TIMEOUT"; then echo "Verification successful!" else echo "Verification timed out. Restarting cdk-node and retrying..." - kurtosis service stop $ENCLAVE_NAME cdk-node-001 - kurtosis service start $ENCLAVE_NAME cdk-node-001 - wait_for_verification $TIMEOUT - if [ $? -eq 0 ]; then + kurtosis service stop "$ENCLAVE_NAME" cdk-node-001 + kurtosis service start "$ENCLAVE_NAME" cdk-node-001 + if wait_for_verification "$TIMEOUT"; then echo "Verification successful AFTER RESTART!" else echo "Verification was unable to complete even after restart" @@ -143,10 +147,10 @@ for class in $CLASSES; do fi done -read -p "Press any key to cleanup everything.." +read -r -p "Press any key to cleanup everything.." # Clean UP echo "Cleaning up..." -kurtosis enclave stop $ENCLAVE_NAME -kurtosis enclave rm $ENCLAVE_NAME -docker stop $L1_PROXY_NAME +kurtosis enclave stop "$ENCLAVE_NAME" +kurtosis enclave rm "$ENCLAVE_NAME" +docker stop "$L1_PROXY_NAME" rm remove_me_later.py From 962bf82245885f60fddb18af0b09b69f5d2015f3 Mon Sep 17 00:00:00 2001 From: Xavier Romero <47888584+xavier-romero@users.noreply.github.com> Date: Tue, 18 Feb 2025 10:36:44 +0100 Subject: [PATCH 13/28] Update scripts/mitm/l1_safe_reorg.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Léo Vincent <28714795+leovct@users.noreply.github.com> --- scripts/mitm/l1_safe_reorg.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/mitm/l1_safe_reorg.sh b/scripts/mitm/l1_safe_reorg.sh index d6ada169..2ecdef9e 100755 --- a/scripts/mitm/l1_safe_reorg.sh +++ b/scripts/mitm/l1_safe_reorg.sh @@ -76,7 +76,7 @@ SAFE_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" safe) FINALIZED_BLOCK=$(cast bn --rpc-url "$L1_RPC_URL" finalized) echo "L1 | Latest: $LATEST_BLOCK, Safe: $SAFE_BLOCK, Finalized: $FINALIZED_BLOCK" -# Wait until there at least 5 finalez blocks on L1 +# Wait until there at least 5 finaled blocks on L1 while [ "$FINALIZED_BLOCK" -lt 5 ]; do echo "Waiting for at least 5 finalized blocks ($FINALIZED_BLOCK so far)" sleep $BLOCK_TIME From 80c2a0feb7ce47824271f890a3c78c6381db8623 Mon Sep 17 00:00:00 2001 From: leovct Date: Tue, 18 Feb 2025 12:22:23 +0100 Subject: [PATCH 14/28] docs: update zkevm-pless doc --- docs/permissionless-zkevm-node.md | 98 +++++++++++++------------------ 1 file changed, 40 insertions(+), 58 deletions(-) diff --git a/docs/permissionless-zkevm-node.md b/docs/permissionless-zkevm-node.md index 00898b7c..803847b0 100644 --- a/docs/permissionless-zkevm-node.md +++ b/docs/permissionless-zkevm-node.md @@ -1,68 +1,50 @@ ---- -comments: true ---- - -In addition to the core stack, you can also attach and synchronize a permissionless zkevm node. +# How to set up a permissionless zkevm node? + +We'll show you how to set up a permissionless zkevm node against Cardona / Sepolia testnet. Note that you can set up such node against any other network, including kurtosis-cdk networks. + +Let's create a `params.yml` file with the following content. + +```yml +# Set all the deployment stages to false. +# We'll deploy the permissionless zkevm node using the additional_services flag. +deployment_stages: + deploy_l1: false + deploy_zkevm_contracts_on_l1: false + deploy_databases: false + deploy_cdk_central_environment: false + deploy_cdk_bridge_infra: false + deploy_cdk_bridge_ui: false + deploy_agglayer: false + deploy_cdk_erigon_node: false + deploy_optimism_rollup: false + deploy_l2_contracts: false + +args: + verbosity: debug + consensus_contract_type: rollup + zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.8 + zkevm_node_image: hermeznetwork/zkevm-node:v0.7.3 + additional_services: + - pless_zkevm_node + l1_rpc_url: CHANGE_ME + genesis_file: ../.github/tests/nightly/pless-zkevm-node/cardona-sepolia-testnet-genesis.json +``` -## Prerequisites +You will need two things: -1. You have followed the [deployment guide](deploy-stack.md) and have a running CDK stack. +1) An RPC url - you can use any RPC node provider. +2) The genesis file - you can take a look at `.github/tests/nightly/pless-zkevm-node`. -2. Grab the genesis file artifact and add it to the `permissionless_node` kurtosis package. +If you want to run the permissionless zkevm node against a kurtosis-cdk stack, you can retrieve the genesis using the following commands. -```sh +```bash rm -r /tmp/zkevm kurtosis files download cdk-v1 genesis /tmp -cp /tmp/genesis.json templates/permissionless-node/genesis.json +cat /tmp/genesis.json ``` -## Add permissionless node to the enclave +To deploy the permissionless node, you can use the following command. -Run the following command: - -```sh -yq -Y --in-place 'with_entries(if .key == "deploy_zkevm_permissionless_node" then .value = true elif .value | type == "boolean" then .value = false else . end)' params.yml -kurtosis run --enclave cdk-v1 --args-file params.yml . +```bash +kurtosis run --enclave cdk --args-file params.yml . ``` - -## Sync an external permissionless node - -You can also use the package you have just set up to sync data from a production network. - -1. Some of the parameters in the Kurtosis genesis file need to be replaced, or better still you could replace the whole genesis file with one representing the external network. - - The parameters that need to change in the file are as follows: - - ```json - "rollupCreationBlockNumber": 22, - "rollupManagerCreationBlockNumber": 18, - "genesisBlockNumber": 22, - "L1Config": { - "chainId": 271828, - "polygonZkEVMGlobalExitRootAddress": "0x1f7ad7caA53e35b4f0D138dC5CBF91aC108a2674", - "polygonRollupManagerAddress": "0x2F50ef6b8e8Ee4E579B17619A92dE3E2ffbD8AD2", - "polTokenAddress": "0xEdE9cf798E0fE25D35469493f43E88FeA4a5da0E", - "polygonZkEVMAddress": "0x1Fe038B54aeBf558638CA51C91bC8cCa06609e91" - } - ``` - - !!! tip - The [run-contract-setup.sh](https://github.com/0xPolygon/kurtosis-cdk/blob/main/templates/run-contract-setup.sh) file may help you understand how these fields populate. - -2. When you have the updated genesis file ready, drop it into `./templates/permissionless-node/genesis.json`. - -3. In addition to the genesis setup, tweak the parameter `l1_rpc_url` in the [params.yml](https://github.com/0xPolygon/kurtosis-cdk/blob/main/params.yml) file: - - `l1_rpc_url: http://el-1-geth-lighthouse:8545` -> `l1_rpc_url: ` - - !!! tip - - There are other parameters that seem like they should be changed, e.g. `l1_chain_id`, but they aren't used for the permissionless setup. - -4. Now you can start synchronizing with the following command: - - ```sh - yq -Y --in-place 'with_entries(if .key == "deploy_zkevm_permissionless_node" then .value = true elif .value | type == "boolean" then .value = false else . end)' params.yml - kurtosis run --enclave cdk-v1 --args-file params.yml . - ``` - -
From 6ae7fcb17ebd1e572ed04e0fd549aec4a2d59b6f Mon Sep 17 00:00:00 2001 From: leovct Date: Tue, 18 Feb 2025 12:22:32 +0100 Subject: [PATCH 15/28] chore: small version bump --- .../cardona-sepolia-testnet-pless-zkevm-node.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/tests/nightly/pless-zkevm-node/cardona-sepolia-testnet-pless-zkevm-node.yml b/.github/tests/nightly/pless-zkevm-node/cardona-sepolia-testnet-pless-zkevm-node.yml index 384bebe1..5b10749b 100644 --- a/.github/tests/nightly/pless-zkevm-node/cardona-sepolia-testnet-pless-zkevm-node.yml +++ b/.github/tests/nightly/pless-zkevm-node/cardona-sepolia-testnet-pless-zkevm-node.yml @@ -10,14 +10,10 @@ deployment_stages: args: verbosity: debug + consensus_contract_type: rollup + zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.8 + zkevm_node_image: hermeznetwork/zkevm-node:v0.7.3 additional_services: - pless_zkevm_node l1_rpc_url: CHANGE_ME genesis_file: ../../.github/tests/nightly/pless-zkevm-node/cardona-sepolia-testnet-genesis.json - consensus_contract_type: rollup - - # Cardona/Sepolia is using fork id 9. - # https://sepolia.etherscan.io/address/0x32d33D5137a7cFFb54c5Bf8371172bcEc5f310ff#readProxyContract#F25 - # rollupIDToRollupData(1) => forkID=9 - zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.6 - zkevm_node_image: hermeznetwork/zkevm-node:v0.7.3-RC1 From 85f3b813ed90aafdc6b07a76949ac0eaa0a97b94 Mon Sep 17 00:00:00 2001 From: Xavier Romero <47888584+xavier-romero@users.noreply.github.com> Date: Tue, 18 Feb 2025 15:38:18 +0100 Subject: [PATCH 16/28] feat: add bc, update versions, reduce image size in toolbox (#490) * Add bc, update versions, reduce image size * docs: use foundry stable version * docs: set foundry version * docs: size update * chore: bump toolbox img --------- Co-authored-by: leovct --- docker/README.md | 10 +++++----- docker/toolbox.Dockerfile | 5 +++-- src/package_io/constants.star | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/docker/README.md b/docker/README.md index 6c5b60bc..e6d5685f 100644 --- a/docker/README.md +++ b/docker/README.md @@ -72,8 +72,8 @@ version="v8.0.0-rc.4-fork.12" docker build . \ --tag local/zkevm-contracts:$version \ --build-arg ZKEVM_CONTRACTS_BRANCH=$version \ - --build-arg POLYCLI_VERSION=main \ - --build-arg FOUNDRY_VERSION=nightly \ + --build-arg POLYCLI_VERSION="v0.1.73" \ + --build-arg FOUNDRY_VERSION=stable \ --file zkevm-contracts.Dockerfile ``` @@ -123,8 +123,8 @@ Build the `toolbox` image. ```bash docker build . \ --tag local/toolbox:local \ - --build-arg POLYCLI_VERSION=main \ - --build-arg FOUNDRY_VERSION=nightly \ + --build-arg POLYCLI_VERSION="v0.1.73" \ + --build-arg FOUNDRY_VERSION=stable \ --file toolbox.Dockerfile ``` @@ -133,5 +133,5 @@ Check the size of the image. ```bash $ docker images --filter "reference=local/toolbox" REPOSITORY TAG IMAGE ID CREATED SIZE -local/toolbox local 3f85f026aaf9 2 seconds ago 490MB +local/toolbox local 3f85f026aaf9 2 seconds ago 448MB ``` diff --git a/docker/toolbox.Dockerfile b/docker/toolbox.Dockerfile index 965d5cff..3dd154b0 100644 --- a/docker/toolbox.Dockerfile +++ b/docker/toolbox.Dockerfile @@ -18,11 +18,12 @@ COPY --from=polycli-builder /opt/polygon-cli/bindings /opt/bindings # WARNING (SC1091): (Sourced) file not included in mock. # hadolint ignore=DL3008,DL3013,DL4006,SC1091 RUN apt-get update \ - && apt-get install --yes --no-install-recommends curl git jq pipx \ + && apt-get install --yes --no-install-recommends bc curl git jq pipx \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && pipx ensurepath \ && pipx install yq \ && curl --silent --location --proto "=https" https://foundry.paradigm.xyz | bash \ && /root/.foundry/bin/foundryup --install ${FOUNDRY_VERSION} \ - && cp /root/.foundry/bin/* /usr/local/bin + && ln -s /root/.foundry/bin/* /usr/local/bin/ \ + && rm -fr /root/.foundry/versions/* diff --git a/src/package_io/constants.star b/src/package_io/constants.star index 27e6ec03..5545d6ef 100644 --- a/src/package_io/constants.star +++ b/src/package_io/constants.star @@ -11,4 +11,4 @@ SEQUENCER_TYPE = struct( ZKEVM="zkevm", ) -TOOLBOX_IMAGE = "leovct/toolbox:0.0.7" +TOOLBOX_IMAGE = "leovct/toolbox:0.0.8" From 1b485cce10e4046a1286394d22a008aa07c33922 Mon Sep 17 00:00:00 2001 From: Xavier Romero Date: Tue, 18 Feb 2025 12:35:42 +0100 Subject: [PATCH 17/28] Add bridge spammer --- input_parser.star | 2 + main.star | 9 +++ src/additional_services/bridge_spammer.star | 45 +++++++++++++ .../bridge-spammer-config/spam.sh | 64 +++++++++++++++++++ 4 files changed, 120 insertions(+) create mode 100644 src/additional_services/bridge_spammer.star create mode 100644 static_files/additional_services/bridge-spammer-config/spam.sh diff --git a/input_parser.star b/input_parser.star index 0f6d377c..452333b4 100644 --- a/input_parser.star +++ b/input_parser.star @@ -184,6 +184,7 @@ DEFAULT_L1_ARGS = { # - assertoor # - broadcaster # - tx_spammer + # - bridge_spammer # - blob_spammer # - custom_flood # - goomy_blob @@ -389,6 +390,7 @@ DEFAULT_ARGS = ( # - pless_zkevm_node # - prometheus_grafana # - tx_spammer + # - bridge_spammer "additional_services": [], # Only relevant when deploying to an external L1. "polygon_zkevm_explorer": "https://explorer.private/", diff --git a/main.star b/main.star index 22a28274..6f33db3f 100644 --- a/main.star +++ b/main.star @@ -28,6 +28,7 @@ panoptichain_package = "./src/additional_services/panoptichain.star" pless_zkevm_node_package = "./src/additional_services/pless_zkevm_node.star" prometheus_package = "./src/additional_services/prometheus.star" tx_spammer_package = "./src/additional_services/tx_spammer.star" +bridge_spammer_package = "./src/additional_services/bridge_spammer.star" assertoor_package = "./src/additional_services/assertoor.star" @@ -241,6 +242,14 @@ def run(plan, args={}): deploy_additional_service( plan, "tx_spammer", tx_spammer_package, args, contract_setup_addresses ) + elif additional_service == "bridge_spammer": + deploy_additional_service( + plan, + "bridge_spammer", + bridge_spammer_package, + args, + contract_setup_addresses, + ) elif additional_service == "assertoor": deploy_additional_service(plan, "assertoor", assertoor_package, args) else: diff --git a/src/additional_services/bridge_spammer.star b/src/additional_services/bridge_spammer.star new file mode 100644 index 00000000..efd424b5 --- /dev/null +++ b/src/additional_services/bridge_spammer.star @@ -0,0 +1,45 @@ +constants = import_module("../../src/package_io/constants.star") + + +def run(plan, args, contract_setup_addresses): + l2_rpc_service = plan.get_service(args["l2_rpc_name"] + args["deployment_suffix"]) + l2_rpc_url = "http://{}:{}".format( + l2_rpc_service.ip_address, l2_rpc_service.ports["rpc"].number + ) + bridge_spammer_config_artifact = plan.render_templates( + name="bridge-spammer-script", + config={ + "spam.sh": struct( + template=read_file( + src="../../static_files/additional_services/bridge-spammer-config/spam.sh" + ), + data={ + "l2_rpc_url": l2_rpc_url, + "zkevm_l2_admin_private_key": args["zkevm_l2_admin_private_key"], + "zkevm_l2_claimtxmanager_address": args[ + "zkevm_l2_claimtxmanager_address" + ], + "l1_rpc_url": args["l1_rpc_url"], + "l1_chain_id": args["l1_chain_id"], + "zkevm_rollup_chain_id": args["zkevm_rollup_chain_id"], + "zkevm_bridge_address": contract_setup_addresses[ + "zkevm_bridge_address" + ], + }, + ), + }, + ) + + plan.add_service( + name="bridge-spammer" + args["deployment_suffix"], + config=ServiceConfig( + image=constants.TOOLBOX_IMAGE, + files={ + "/opt/scripts": Directory( + artifact_names=[bridge_spammer_config_artifact] + ), + }, + entrypoint=["bash", "-c"], + cmd=["chmod +x /opt/scripts/spam.sh && /opt/scripts/spam.sh"], + ), + ) diff --git a/static_files/additional_services/bridge-spammer-config/spam.sh b/static_files/additional_services/bridge-spammer-config/spam.sh new file mode 100644 index 00000000..7cc1199b --- /dev/null +++ b/static_files/additional_services/bridge-spammer-config/spam.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# This script simulates blockchain activity by sending bridges. + +set -e + +claimtx_value="10ether" +spammer_value="50ether" + +l1_wei_deposit_amount=$(echo "$spammer_value" | sed 's/ether//g' | cast to-wei) +l1_wei_deposit_amount=$(echo "scale=0; $l1_wei_deposit_amount * 95 / 100" | bc) +l2_wei_deposit_amount=1 + +# Fund claimtx manager +cast send \ + --legacy \ + --rpc-url "{{.l2_rpc_url}}" \ + --private-key "{{.zkevm_l2_admin_private_key}}" \ + --value "$claimtx_value" \ + "{{.zkevm_l2_claimtxmanager_address}}" + +# Create and fund test account +cast wallet new --json | jq '.[0]' | tee .spam.wallet.json + +eth_address="$(jq -r '.address' .spam.wallet.json)" +private_key="$(jq -r '.private_key' .spam.wallet.json)" + +until cast send --legacy --private-key "{{.zkevm_l2_admin_private_key}}" --rpc-url "{{.l1_rpc_url}}" --value "$spammer_value" "$eth_address"; do + echo "Attempting to fund a test account on L1 for the bridge spammer" +done + +until cast send --legacy --private-key "{{.zkevm_l2_admin_private_key}}" --rpc-url "{{.l2_rpc_url}}" --value "$spammer_value" "$eth_address"; do + echo "Attempting to fund a test account on L2 for the bridge spammer" +done + +# Deposit on L1 to avoid negative balance +polycli ulxly bridge asset \ + --value "$l1_wei_deposit_amount" \ + --gas-limit "1250000" \ + --bridge-address "{{.zkevm_bridge_address}}" \ + --destination-address "$eth_address" \ + --destination-network 1 \ + --rpc-url "{{.l1_rpc_url}}" \ + --private-key "$private_key" \ + --chain-id "{{.l1_chain_id}}" \ + --pretty-logs=false + +# Allow some time for bridge processing +sleep 10 + +# Start depositing on L2 +while true; do + polycli ulxly bridge asset \ + --value "$l2_wei_deposit_amount" \ + --gas-limit "1250000" \ + --bridge-address "{{.zkevm_bridge_address}}" \ + --destination-address "$eth_address" \ + --destination-network 0 \ + --rpc-url "{{.l2_rpc_url}}" \ + --private-key "$private_key" \ + --chain-id "{{.zkevm_rollup_chain_id}}" \ + --pretty-logs=false + sleep 1 +done From 5f488d724f6273cbc707f18a845b1c4e59e73061 Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Wed, 19 Feb 2025 01:18:39 +0900 Subject: [PATCH 18/28] fix: fund op-batcher address to increment l2 finality Signed-off-by: Ji Hwan --- input_parser.star | 16 ++++++++-------- .../sovereign-rollup/run-sovereign-setup.sh | 9 +++++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/input_parser.star b/input_parser.star index 0f6d377c..c19657b7 100644 --- a/input_parser.star +++ b/input_parser.star @@ -118,7 +118,7 @@ DEFAULT_STATIC_PORTS = { # Addresses and private keys of the different components. # They have been generated using the following command: -# polycli wallet inspect --mnemonic 'lab code glass agree maid neutral vessel horror deny frequent favorite soft gate galaxy proof vintage once figure diary virtual scissors marble shrug drop' --addresses 12 | tee keys.txt | jq -r '.Addresses[] | [.ETHAddress, .HexPrivateKey] | @tsv' | awk 'BEGIN{split("sequencer,aggregator,claimtxmanager,timelock,admin,loadtest,agglayer,dac,proofsigner,l1testing,claimsponsor,aggoracle",roles,",")} {print "# " roles[NR] "\n\"zkevm_l2_" roles[NR] "_address\": \"" $1 "\","; print "\"zkevm_l2_" roles[NR] "_private_key\": \"0x" $2 "\",\n"}' +# polycli wallet inspect --mnemonic 'lab code glass agree maid neutral vessel horror deny frequent favorite soft gate galaxy proof vintage once figure diary virtual scissors marble shrug drop' --addresses 14 | tee keys.txt | jq -r '.Addresses[] | [.ETHAddress, .HexPrivateKey] | @tsv' | awk 'BEGIN{split("sequencer,aggregator,claimtxmanager,timelock,admin,loadtest,agglayer,dac,proofsigner,l1testing,claimsponsor,aggoracle,sovereignadmin,claimtx",roles,",")} {print "# " roles[NR] "\n\"zkevm_l2_" roles[NR] "_address\": \"" $1 "\","; print "\"zkevm_l2_" roles[NR] "_private_key\": \"0x" $2 "\",\n"}' DEFAULT_ACCOUNTS = { # sequencer "zkevm_l2_sequencer_address": "0x5b06837A43bdC3dD9F114558DAf4B26ed49842Ed", @@ -154,12 +154,12 @@ DEFAULT_ACCOUNTS = { "zkevm_l2_claimsponsor_address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", "zkevm_l2_claimsponsor_private_key": "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", # AggKit Addresses - "zkevm_l2_aggoracle_address": "0x2Ac2c49Ee3Ac5f663115C86F405Ea855B365D5Ec", - "zkevm_l2_aggoracle_private_key": "0xd65de4634c214d45673528bf55be28fe43b0664c99cc99089ef75a922b3a22fd", - "zkevm_l2_sovereignadmin_address": "0x8281AdB2fC133536ACDC4c923bc573A26f66F260", - "zkevm_l2_sovereignadmin_private_key": "0x45f3ccdaff88ab1b3bb41472f09d5cde7cb20a6cbbc9197fddf64e2f3d67aaf2", - "zkevm_l2_claimtx_address": "0x3754Aa77EE1E8AfB200Ce36a8c943ed8F5AaB7BC", - "zkevm_l2_claimtx_private_key": "0xfa333c42db7bc56277bf67c93ba19e4f414d802ef9886b8b5dc7c450655ae77f", + "zkevm_l2_aggoracle_address": "0xc653eCD4AC5153a3700Fb13442Bcf00A691cca16", + "zkevm_l2_aggoracle_private_key": "0xa574853f4757bfdcbb59b03635324463750b27e16df897f3d00dc6bef2997ae0", + "zkevm_l2_sovereignadmin_address": "0x635243A11B41072264Df6c9186e3f473402F94e9", + "zkevm_l2_sovereignadmin_private_key": "0x986b325f6f855236b0b04582a19fe0301eeecb343d0f660c61805299dbf250eb", + "zkevm_l2_claimtx_address": "0xE0005545D8b2a84c2380fAaa2201D92345Bd0F6F", + "zkevm_l2_claimtx_private_key": "0x01a2cdedc257344b84a53d2056a85ad58fdf51e8f65d9259028d89595d4768a8", } DEFAULT_L1_ARGS = { @@ -324,7 +324,7 @@ DEFAULT_OP_STACK_ARGS = { "el_image": "us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101500.0-rc.3", "cl_type": "op-node", "cl_image": "us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.11.0-rc.2", - "count": 2, + "count": 1, }, ], # "batcher_params": { diff --git a/templates/sovereign-rollup/run-sovereign-setup.sh b/templates/sovereign-rollup/run-sovereign-setup.sh index 5c149ecc..a57b6de5 100755 --- a/templates/sovereign-rollup/run-sovereign-setup.sh +++ b/templates/sovereign-rollup/run-sovereign-setup.sh @@ -1,6 +1,15 @@ #!/bin/bash # shellcheck disable=SC2034,SC2086 +# Fund L1 OP addresses. +# 0xD3F2c5AFb2D76f5579F326b0cD7DA5F5a4126c35 is the OP Batcher Address on L1 +# The private key is an L1 prefunded address +cast send \ + --private-key bcdf20249abf0ed6d944c0288fad489e33f66b3960d9e6229c1cd214ed3bbe31 \ + --rpc-url http://el-1-geth-lighthouse:8545 \ + --value 100ether \ + "0xD3F2c5AFb2D76f5579F326b0cD7DA5F5a4126c35" \ + # Create New Rollup Step cd /opt/zkevm-contracts || exit From 923dc458a9b5ed37bc4a2bfd1f1989e203fa619c Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Wed, 19 Feb 2025 01:35:39 +0900 Subject: [PATCH 19/28] chore: use configurable parameters as input Signed-off-by: Ji Hwan --- .../sovereign-rollup/run-sovereign-setup.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/templates/sovereign-rollup/run-sovereign-setup.sh b/templates/sovereign-rollup/run-sovereign-setup.sh index a57b6de5..6d508941 100755 --- a/templates/sovereign-rollup/run-sovereign-setup.sh +++ b/templates/sovereign-rollup/run-sovereign-setup.sh @@ -3,11 +3,11 @@ # Fund L1 OP addresses. # 0xD3F2c5AFb2D76f5579F326b0cD7DA5F5a4126c35 is the OP Batcher Address on L1 -# The private key is an L1 prefunded address +# bcdf20249abf0ed6d944c0288fad489e33f66b3960d9e6229c1cd214ed3bbe31 is the L1 prefunded address' private key cast send \ --private-key bcdf20249abf0ed6d944c0288fad489e33f66b3960d9e6229c1cd214ed3bbe31 \ - --rpc-url http://el-1-geth-lighthouse:8545 \ - --value 100ether \ + --rpc-url "{{.l1_rpc_url}}" \ + --value "{{.l2_funding_amount}}" \ "0xD3F2c5AFb2D76f5579F326b0cD7DA5F5a4126c35" \ # Create New Rollup Step @@ -21,7 +21,7 @@ cp /opt/contract-deploy/sovereign-genesis.json /opt/zkevm-contracts/tools/create npx hardhat run ./tools/createNewRollup/createNewRollup.ts --network localhost rollup_manager_addr="0x2F50ef6b8e8Ee4E579B17619A92dE3E2ffbD8AD2" -cast call --json --rpc-url http://el-1-geth-lighthouse:8545 $rollup_manager_addr 'rollupIDToRollupData(uint32)(address,uint64,address,uint64,bytes32,uint64,uint64,uint64,uint64,uint64,uint64,uint8)' 2 | jq '{"sovereignRollupContract": .[0], "sovereignChainID": .[1], "verifier": .[2], "forkID": .[3], "lastLocalExitRoot": .[4], "lastBatchSequenced": .[5], "lastVerifiedBatch": .[6], "_legacyLastPendingState": .[7], "_legacyLastPendingStateConsolidated": .[8], "lastVerifiedBatchBeforeUpgrade": .[9], "rollupTypeID": .[10], "rollupVerifierType": .[11]}' > /opt/zkevm-contracts/sovereign-rollup-out.json +cast call --json --rpc-url "{{.l1_rpc_url}}" $rollup_manager_addr 'rollupIDToRollupData(uint32)(address,uint64,address,uint64,bytes32,uint64,uint64,uint64,uint64,uint64,uint64,uint8)' 2 | jq '{"sovereignRollupContract": .[0], "sovereignChainID": .[1], "verifier": .[2], "forkID": .[3], "lastLocalExitRoot": .[4], "lastBatchSequenced": .[5], "lastVerifiedBatch": .[6], "_legacyLastPendingState": .[7], "_legacyLastPendingStateConsolidated": .[8], "lastVerifiedBatchBeforeUpgrade": .[9], "rollupTypeID": .[10], "rollupVerifierType": .[11]}' > /opt/zkevm-contracts/sovereign-rollup-out.json # These are some accounts that we want to fund for operations for running claims. bridge_admin_addr=0x72aA7C55e1c7BF4017F22a3bc19722de11911A81 @@ -35,9 +35,9 @@ rpc_url=http://op-el-1-op-geth-op-node-op-kurtosis:8545 # This is the default prefunded account for the OP Network private_key=$(cast wallet private-key --mnemonic 'test test test test test test test test test test test junk') -cast send --value 10ether --rpc-url $rpc_url --private-key $private_key $bridge_admin_addr -cast send --value 10ether --rpc-url $rpc_url --private-key $private_key $aggoracle_addr -cast send --value 100ether --rpc-url $rpc_url --private-key $private_key $claimtx_addr +cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key $private_key $bridge_admin_addr +cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key $private_key $aggoracle_addr +cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key $private_key $claimtx_addr # Contract Deployment Step cd /opt/zkevm-contracts || exit @@ -56,7 +56,7 @@ ger_proxy_addr=$(cast compute-address --nonce $((bridge_impl_nonce+2)) $bridge_a bridge_proxy_addr=$(cast compute-address --nonce $((bridge_impl_nonce+3)) $bridge_admin_addr | sed 's/.*: //') # This is one way to prefund the bridge. It can also be done with a deposit to some unclaimable network. This step is important and needs to be discussed -cast send --value 1000ether --rpc-url $rpc_url --private-key $private_key $bridge_proxy_addr +cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key $private_key $bridge_proxy_addr forge create --broadcast --rpc-url $rpc_url --private-key $bridge_admin_private_key BridgeL2SovereignChain forge create --broadcast --rpc-url $rpc_url --private-key $bridge_admin_private_key GlobalExitRootManagerL2SovereignChain --constructor-args $bridge_proxy_addr calldata=$(cast calldata 'initialize(address _globalExitRootUpdater, address _globalExitRootRemover)' $aggoracle_addr $aggoracle_addr) From 36ee969c0c7ede3766a01da0f292bf59c2a81138 Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Wed, 19 Feb 2025 09:16:07 +0900 Subject: [PATCH 20/28] chore: update sovereign addresses to match input_parser Signed-off-by: Ji Hwan --- templates/sovereign-rollup/aggkit-config.toml | 2 +- templates/sovereign-rollup/create_new_rollup.json | 10 +++++----- templates/sovereign-rollup/run-sovereign-setup.sh | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/templates/sovereign-rollup/aggkit-config.toml b/templates/sovereign-rollup/aggkit-config.toml index 95657b1c..9b33abe1 100644 --- a/templates/sovereign-rollup/aggkit-config.toml +++ b/templates/sovereign-rollup/aggkit-config.toml @@ -20,7 +20,7 @@ ContractVersions = "banana" IsValidiumMode = false # This is the admin account for now -L2Coinbase = "0x8281AdB2fC133536ACDC4c923bc573A26f66F260" +L2Coinbase = "0x635243A11B41072264Df6c9186e3f473402F94e9" SequencerPrivateKeyPath = "" SequencerPrivateKeyPassword = "" diff --git a/templates/sovereign-rollup/create_new_rollup.json b/templates/sovereign-rollup/create_new_rollup.json index 11c98fa4..e4931c50 100644 --- a/templates/sovereign-rollup/create_new_rollup.json +++ b/templates/sovereign-rollup/create_new_rollup.json @@ -2,9 +2,9 @@ "type": "EOA", "trustedSequencerURL": "http://op-el-1-op-geth-op-node-op-kurtosis:8545", "networkName": "SovereignChain", - "trustedSequencer": "0x8281AdB2fC133536ACDC4c923bc573A26f66F260", + "trustedSequencer": "0x635243A11B41072264Df6c9186e3f473402F94e9", "chainID": 2151908, - "rollupAdminAddress": "0x8281AdB2fC133536ACDC4c923bc573A26f66F260", + "rollupAdminAddress": "0x635243A11B41072264Df6c9186e3f473402F94e9", "consensusContractName": "PolygonPessimisticConsensus", "gasTokenAddress": "0x0000000000000000000000000000000000000000", "deployerPvtKey": "0x12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625", @@ -17,10 +17,10 @@ "rollupTypeId": 1, "isVanillaClient": true, "sovereignParams": { - "bridgeManager": "0x8281AdB2fC133536ACDC4c923bc573A26f66F260", + "bridgeManager": "0x635243A11B41072264Df6c9186e3f473402F94e9", "sovereignWETHAddress": "0x0000000000000000000000000000000000000000", "sovereignWETHAddressIsNotMintable": false, - "globalExitRootUpdater": "0x8281AdB2fC133536ACDC4c923bc573A26f66F260", - "globalExitRootRemover": "0x8281AdB2fC133536ACDC4c923bc573A26f66F260" + "globalExitRootUpdater": "0x635243A11B41072264Df6c9186e3f473402F94e9", + "globalExitRootRemover": "0x635243A11B41072264Df6c9186e3f473402F94e9" } } \ No newline at end of file diff --git a/templates/sovereign-rollup/run-sovereign-setup.sh b/templates/sovereign-rollup/run-sovereign-setup.sh index 6d508941..a679ed98 100755 --- a/templates/sovereign-rollup/run-sovereign-setup.sh +++ b/templates/sovereign-rollup/run-sovereign-setup.sh @@ -26,9 +26,9 @@ cast call --json --rpc-url "{{.l1_rpc_url}}" $rollup_manager_addr 'rollupIDToRo # These are some accounts that we want to fund for operations for running claims. bridge_admin_addr=0x72aA7C55e1c7BF4017F22a3bc19722de11911A81 bridge_admin_private_key=0x5f3556010771f2cc34eb2669401ee1109bc05aed993024ed10ff04ba7309e28b -aggoracle_addr=0x2Ac2c49Ee3Ac5f663115C86F405Ea855B365D5Ec +aggoracle_addr=0xc653eCD4AC5153a3700Fb13442Bcf00A691cca16 aggoracle_private_key=0xd65de4634c214d45673528bf55be28fe43b0664c99cc99089ef75a922b3a22fd -claimtx_addr=0x3754Aa77EE1E8AfB200Ce36a8c943ed8F5AaB7BC +claimtx_addr=0xE0005545D8b2a84c2380fAaa2201D92345Bd0F6F claimtx_private_key=0xfa333c42db7bc56277bf67c93ba19e4f414d802ef9886b8b5dc7c450655ae77f rpc_url=http://op-el-1-op-geth-op-node-op-kurtosis:8545 From 4c6832cb9dc60b11d0e5094dedbb4ac8a56ce30b Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Wed, 19 Feb 2025 13:51:45 +0900 Subject: [PATCH 21/28] refactor: remove hardcoded addresses Signed-off-by: Ji Hwan --- input_parser.star | 5 ++++ templates/sovereign-rollup/aggkit-config.toml | 22 ++++++++--------- .../sovereign-rollup/create_new_rollup.json | 24 +++++++++---------- .../sovereign-rollup/run-sovereign-setup.sh | 20 ++++++++-------- 4 files changed, 38 insertions(+), 33 deletions(-) diff --git a/input_parser.star b/input_parser.star index c19657b7..fdec4f43 100644 --- a/input_parser.star +++ b/input_parser.star @@ -257,6 +257,8 @@ DEFAULT_L2_ARGS = { "l2_deploy_lxly_bridge_and_call": True, # This is used by erigon for naming the config files "chain_name": "kurtosis", + # Config name for OP stack rollup + "sovereign_chain_name": "op-sovereign", } DEFAULT_ROLLUP_ARGS = { @@ -283,6 +285,7 @@ DEFAULT_ROLLUP_ARGS = { "gas_token_enabled": False, # The address of the L1 ERC20 contract that will be used as the gas token on the rollup. # If the address is empty, a contract will be deployed automatically. + # This value will also be used for sovereignWETHAddress parameter in the Sovereign rollup. "gas_token_address": "", # Set to true to use Kurtosis dynamic ports (default) and set to false to use static ports. # You can either use the default static ports defined in this file or specify your custom static @@ -309,6 +312,8 @@ DEFAULT_ROLLUP_ARGS = { # This is a path where the cdk-node will write data # https://github.com/0xPolygon/cdk/blob/d0e76a3d1361158aa24135f25d37ecc4af959755/config/default.go#L50 "zkevm_path_rw_data": "/tmp/", + # OP Stack RPC URL + "op_el_rpc_url": "http://op-el-1-op-geth-op-node-op-kurtosis:8545", } # https://github.com/ethpandaops/optimism-package diff --git a/templates/sovereign-rollup/aggkit-config.toml b/templates/sovereign-rollup/aggkit-config.toml index 9b33abe1..4dd91569 100644 --- a/templates/sovereign-rollup/aggkit-config.toml +++ b/templates/sovereign-rollup/aggkit-config.toml @@ -10,17 +10,17 @@ # production environments. DYOR # The below configs are the default mandatory parameters to be used. -PathRWData = "/tmp/" -L1URL="http://el-1-geth-lighthouse:8545" -L2URL="http://op-el-1-op-geth-op-node-op-kurtosis:8545" -AggLayerURL="http://agglayer:4444" +PathRWData = "{{.zkevm_path_rw_data}}" +L1URL="{{.l1_rpc_url}}" +L2URL="{{.op_el_rpc_url}}" +AggLayerURL="http://agglayer:{{.agglayer_port}}" ForkId = 12 ContractVersions = "banana" IsValidiumMode = false # This is the admin account for now -L2Coinbase = "0x635243A11B41072264Df6c9186e3f473402F94e9" +L2Coinbase = "{{.zkevm_l2_sovereignadmin_address}}" SequencerPrivateKeyPath = "" SequencerPrivateKeyPassword = "" @@ -29,7 +29,7 @@ AggregatorPrivateKeyPassword = "" SenderProofToL1Addr = "" polygonBridgeAddr = "{{.zkevm_bridge_address}}" -RPCURL = "http://op-el-1-op-geth-op-node-op-kurtosis:8545" +RPCURL = "{{.op_el_rpc_url}}" WitnessURL = "" # These values can be overriden directly from genesis.json @@ -158,7 +158,7 @@ AggsenderPrivateKey = {Path = "/etc/aggkit/sovereignadmin.keystore", Password = # ------------------------------------------------------------------------------ # URLRPCL2 is the URL of the L2 RPC node # ------------------------------------------------------------------------------ -# URLRPCL2 = "http://op-el-1-op-geth-op-node-op-kurtosis:8545" +# URLRPCL2 = "{{.op_el_rpc_url}}" # ------------------------------------------------------------------------------ # BlockFinality indicates which finality follows AggLayer accepted values are: @@ -236,7 +236,7 @@ AggsenderPrivateKey = {Path = "/etc/aggkit/sovereignadmin.keystore", Password = # ------------------------------------------------------------------------------ # URLRPCL1 is the URL of the L1 RPC node # ------------------------------------------------------------------------------ -# URLRPCL1 = "http://el-1-geth-lighthouse:8545" +# URLRPCL1 = "{{.l1_rpc_url}}" # ------------------------------------------------------------------------------ # BlockFinality indicates which finality follows AggLayer accepted values are: @@ -258,7 +258,7 @@ GlobalExitRootL2 = "{{.sovereign_ger_proxy_addr}}" # ------------------------------------------------------------------------------ # URLRPCL2 is the URL of the L2 RPC node # ------------------------------------------------------------------------------ -# URLRPCL2 = "http://op-el-1-op-geth-op-node-op-kurtosis:8545" +# URLRPCL2 = "{{.op_el_rpc_url}}" # ------------------------------------------------------------------------------ # GasOffset is the gas to add on the estimated gas when sending the claim txs @@ -342,7 +342,7 @@ PrivateKeys = [{Path = "/etc/aggkit/aggoracle.keystore", Password = "{{.zkevm_l2 # ------------------------------------------------------------------------------ # StoragePath is the path of the internal storage # ------------------------------------------------------------------------------ -# StoragePath = "/tmp/ethtxmanager-aggoracle.sqlite" +# StoragePath = "{{.zkevm_path_rw_data}}ethtxmanager-aggoracle.sqlite" # ------------------------------------------------------------------------------ # ReadPendingL1Txs is a flag to enable the reading of pending L1 txs @@ -387,7 +387,7 @@ BridgeAddr = "{{.sovereign_bridge_proxy_addr}}" # ------------------------------------------------------------------------------ # DBPath path of the sqlite db # ------------------------------------------------------------------------------ -# DBPath = "/tmp/bridgel2sync.sqlite" +# DBPath = "{{.zkevm_path_rw_data}}bridgel2sync.sqlite" # ------------------------------------------------------------------------------ # BlockFinality indicates the status of the blocks that will be queried to sync diff --git a/templates/sovereign-rollup/create_new_rollup.json b/templates/sovereign-rollup/create_new_rollup.json index e4931c50..d5c362f7 100644 --- a/templates/sovereign-rollup/create_new_rollup.json +++ b/templates/sovereign-rollup/create_new_rollup.json @@ -1,26 +1,26 @@ { - "type": "EOA", - "trustedSequencerURL": "http://op-el-1-op-geth-op-node-op-kurtosis:8545", - "networkName": "SovereignChain", - "trustedSequencer": "0x635243A11B41072264Df6c9186e3f473402F94e9", + "type":"EOA", + "trustedSequencerURL": "{{ .op_el_rpc_url }}", + "networkName": "{{ .sovereign_chain_name }}", + "trustedSequencer": "{{ .zkevm_l2_sovereignadmin_address }}", "chainID": 2151908, - "rollupAdminAddress": "0x635243A11B41072264Df6c9186e3f473402F94e9", + "rollupAdminAddress": "{{ .zkevm_l2_sovereignadmin_address }}", "consensusContractName": "PolygonPessimisticConsensus", - "gasTokenAddress": "0x0000000000000000000000000000000000000000", - "deployerPvtKey": "0x12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625", + "gasTokenAddress": "{{ .gas_token_address }}", + "deployerPvtKey": " {{ .zkevm_l2_admin_private_key }} ", "maxFeePerGas": "", "maxPriorityFeePerGas": "", "multiplierGas": "", "timelockDelay": 0, "timelockSalt": "", - "rollupManagerAddress": "0x2F50ef6b8e8Ee4E579B17619A92dE3E2ffbD8AD2", + "rollupManagerAddress": "{{ .zkevm_rollup_manager_address }}", "rollupTypeId": 1, "isVanillaClient": true, "sovereignParams": { - "bridgeManager": "0x635243A11B41072264Df6c9186e3f473402F94e9", - "sovereignWETHAddress": "0x0000000000000000000000000000000000000000", + "bridgeManager": "{{ .zkevm_l2_sovereignadmin_address }}", + "sovereignWETHAddress": "{{ .gas_token_address }}", "sovereignWETHAddressIsNotMintable": false, - "globalExitRootUpdater": "0x635243A11B41072264Df6c9186e3f473402F94e9", - "globalExitRootRemover": "0x635243A11B41072264Df6c9186e3f473402F94e9" + "globalExitRootUpdater": "{{ .zkevm_l2_sovereignadmin_address }}", + "globalExitRootRemover": "{{ .zkevm_l2_sovereignadmin_address }}" } } \ No newline at end of file diff --git a/templates/sovereign-rollup/run-sovereign-setup.sh b/templates/sovereign-rollup/run-sovereign-setup.sh index a679ed98..f875afcb 100755 --- a/templates/sovereign-rollup/run-sovereign-setup.sh +++ b/templates/sovereign-rollup/run-sovereign-setup.sh @@ -1,8 +1,7 @@ #!/bin/bash -# shellcheck disable=SC2034,SC2086 # Fund L1 OP addresses. -# 0xD3F2c5AFb2D76f5579F326b0cD7DA5F5a4126c35 is the OP Batcher Address on L1 +# 0xD3F2c5AFb2D76f5579F326b0cD7DA5F5a4126c35 is the default OP Batcher Address on L1 # bcdf20249abf0ed6d944c0288fad489e33f66b3960d9e6229c1cd214ed3bbe31 is the L1 prefunded address' private key cast send \ --private-key bcdf20249abf0ed6d944c0288fad489e33f66b3960d9e6229c1cd214ed3bbe31 \ @@ -20,18 +19,19 @@ cp /opt/contract-deploy/create_new_rollup.json /opt/zkevm-contracts/tools/create cp /opt/contract-deploy/sovereign-genesis.json /opt/zkevm-contracts/tools/createNewRollup/genesis.json npx hardhat run ./tools/createNewRollup/createNewRollup.ts --network localhost -rollup_manager_addr="0x2F50ef6b8e8Ee4E579B17619A92dE3E2ffbD8AD2" +# Extract the rollup manager address from the JSON file +rollup_manager_addr="$(jq -r '.polygonRollupManagerAddress' /opt/zkevm/combined-001.json)" cast call --json --rpc-url "{{.l1_rpc_url}}" $rollup_manager_addr 'rollupIDToRollupData(uint32)(address,uint64,address,uint64,bytes32,uint64,uint64,uint64,uint64,uint64,uint64,uint8)' 2 | jq '{"sovereignRollupContract": .[0], "sovereignChainID": .[1], "verifier": .[2], "forkID": .[3], "lastLocalExitRoot": .[4], "lastBatchSequenced": .[5], "lastVerifiedBatch": .[6], "_legacyLastPendingState": .[7], "_legacyLastPendingStateConsolidated": .[8], "lastVerifiedBatchBeforeUpgrade": .[9], "rollupTypeID": .[10], "rollupVerifierType": .[11]}' > /opt/zkevm-contracts/sovereign-rollup-out.json # These are some accounts that we want to fund for operations for running claims. -bridge_admin_addr=0x72aA7C55e1c7BF4017F22a3bc19722de11911A81 -bridge_admin_private_key=0x5f3556010771f2cc34eb2669401ee1109bc05aed993024ed10ff04ba7309e28b -aggoracle_addr=0xc653eCD4AC5153a3700Fb13442Bcf00A691cca16 -aggoracle_private_key=0xd65de4634c214d45673528bf55be28fe43b0664c99cc99089ef75a922b3a22fd -claimtx_addr=0xE0005545D8b2a84c2380fAaa2201D92345Bd0F6F -claimtx_private_key=0xfa333c42db7bc56277bf67c93ba19e4f414d802ef9886b8b5dc7c450655ae77f +bridge_admin_addr="{{.zkevm_l2_sovereignadmin_address}}" +bridge_admin_private_key="{{.zkevm_l2_sovereignadmin_private_key}}" +aggoracle_addr="{{.zkevm_l2_aggoracle_address}}" +aggoracle_private_key="{{.zkevm_l2_aggoracle_private_key}}" +claimtx_addr="{{.zkevm_l2_claimtx_address}}" +claimtx_private_key="{{.zkevm_l2_claimtx_private_key}}" -rpc_url=http://op-el-1-op-geth-op-node-op-kurtosis:8545 +rpc_url="{{.op_el_rpc_url}}" # This is the default prefunded account for the OP Network private_key=$(cast wallet private-key --mnemonic 'test test test test test test test test test test test junk') From 8a09a05c1c09c6a974acd0c2bdab1ae804d21131 Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Wed, 19 Feb 2025 14:07:44 +0900 Subject: [PATCH 22/28] chore: shellcheck fix Signed-off-by: Ji Hwan --- .../sovereign-rollup/run-sovereign-setup.sh | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/templates/sovereign-rollup/run-sovereign-setup.sh b/templates/sovereign-rollup/run-sovereign-setup.sh index f875afcb..e2969b38 100755 --- a/templates/sovereign-rollup/run-sovereign-setup.sh +++ b/templates/sovereign-rollup/run-sovereign-setup.sh @@ -21,23 +21,23 @@ cp /opt/contract-deploy/sovereign-genesis.json /opt/zkevm-contracts/tools/create npx hardhat run ./tools/createNewRollup/createNewRollup.ts --network localhost # Extract the rollup manager address from the JSON file rollup_manager_addr="$(jq -r '.polygonRollupManagerAddress' /opt/zkevm/combined-001.json)" -cast call --json --rpc-url "{{.l1_rpc_url}}" $rollup_manager_addr 'rollupIDToRollupData(uint32)(address,uint64,address,uint64,bytes32,uint64,uint64,uint64,uint64,uint64,uint64,uint8)' 2 | jq '{"sovereignRollupContract": .[0], "sovereignChainID": .[1], "verifier": .[2], "forkID": .[3], "lastLocalExitRoot": .[4], "lastBatchSequenced": .[5], "lastVerifiedBatch": .[6], "_legacyLastPendingState": .[7], "_legacyLastPendingStateConsolidated": .[8], "lastVerifiedBatchBeforeUpgrade": .[9], "rollupTypeID": .[10], "rollupVerifierType": .[11]}' > /opt/zkevm-contracts/sovereign-rollup-out.json +cast call --json --rpc-url "{{.l1_rpc_url}}" "$rollup_manager_addr" 'rollupIDToRollupData(uint32)(address,uint64,address,uint64,bytes32,uint64,uint64,uint64,uint64,uint64,uint64,uint8)' 2 | jq '{"sovereignRollupContract": .[0], "sovereignChainID": .[1], "verifier": .[2], "forkID": .[3], "lastLocalExitRoot": .[4], "lastBatchSequenced": .[5], "lastVerifiedBatch": .[6], "_legacyLastPendingState": .[7], "_legacyLastPendingStateConsolidated": .[8], "lastVerifiedBatchBeforeUpgrade": .[9], "rollupTypeID": .[10], "rollupVerifierType": .[11]}' > /opt/zkevm-contracts/sovereign-rollup-out.json # These are some accounts that we want to fund for operations for running claims. bridge_admin_addr="{{.zkevm_l2_sovereignadmin_address}}" bridge_admin_private_key="{{.zkevm_l2_sovereignadmin_private_key}}" aggoracle_addr="{{.zkevm_l2_aggoracle_address}}" -aggoracle_private_key="{{.zkevm_l2_aggoracle_private_key}}" +# aggoracle_private_key="{{.zkevm_l2_aggoracle_private_key}}" claimtx_addr="{{.zkevm_l2_claimtx_address}}" -claimtx_private_key="{{.zkevm_l2_claimtx_private_key}}" +# claimtx_private_key="{{.zkevm_l2_claimtx_private_key}}" rpc_url="{{.op_el_rpc_url}}" # This is the default prefunded account for the OP Network private_key=$(cast wallet private-key --mnemonic 'test test test test test test test test test test test junk') -cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key $private_key $bridge_admin_addr -cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key $private_key $aggoracle_addr -cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key $private_key $claimtx_addr +cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key "$private_key" $bridge_admin_addr +cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key "$private_key" $aggoracle_addr +cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key "$private_key" $claimtx_addr # Contract Deployment Step cd /opt/zkevm-contracts || exit @@ -50,17 +50,17 @@ libs = ['node_modules']" > foundry.toml echo "Building contracts with forge build" forge build contracts/v2/sovereignChains/BridgeL2SovereignChain.sol contracts/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.sol bridge_impl_nonce=$(cast nonce --rpc-url $rpc_url $bridge_admin_addr) -bridge_impl_addr=$(cast compute-address --nonce $bridge_impl_nonce $bridge_admin_addr | sed 's/.*: //') +bridge_impl_addr=$(cast compute-address --nonce "$bridge_impl_nonce" $bridge_admin_addr | sed 's/.*: //') ger_impl_addr=$(cast compute-address --nonce $((bridge_impl_nonce+1)) $bridge_admin_addr | sed 's/.*: //') ger_proxy_addr=$(cast compute-address --nonce $((bridge_impl_nonce+2)) $bridge_admin_addr | sed 's/.*: //') bridge_proxy_addr=$(cast compute-address --nonce $((bridge_impl_nonce+3)) $bridge_admin_addr | sed 's/.*: //') # This is one way to prefund the bridge. It can also be done with a deposit to some unclaimable network. This step is important and needs to be discussed -cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key $private_key $bridge_proxy_addr +cast send --value "{{.l2_funding_amount}}" --rpc-url $rpc_url --private-key "$private_key" "$bridge_proxy_addr" forge create --broadcast --rpc-url $rpc_url --private-key $bridge_admin_private_key BridgeL2SovereignChain -forge create --broadcast --rpc-url $rpc_url --private-key $bridge_admin_private_key GlobalExitRootManagerL2SovereignChain --constructor-args $bridge_proxy_addr +forge create --broadcast --rpc-url $rpc_url --private-key $bridge_admin_private_key GlobalExitRootManagerL2SovereignChain --constructor-args "$bridge_proxy_addr" calldata=$(cast calldata 'initialize(address _globalExitRootUpdater, address _globalExitRootRemover)' $aggoracle_addr $aggoracle_addr) -forge create --broadcast --rpc-url $rpc_url --private-key $bridge_admin_private_key TransparentUpgradeableProxy --constructor-args $ger_impl_addr $bridge_admin_addr $calldata +forge create --broadcast --rpc-url $rpc_url --private-key $bridge_admin_private_key TransparentUpgradeableProxy --constructor-args "$ger_impl_addr" $bridge_admin_addr "$calldata" initNetworkID=2 initGasTokenAddress=$(cast az) @@ -72,8 +72,8 @@ initBridgeManager=$bridge_admin_addr initSovereignWETHAddress=$(cast az) initSovereignWETHAddressIsNotMintable=false -calldata=$(cast calldata 'function initialize(uint32 _networkID, address _gasTokenAddress, uint32 _gasTokenNetwork, address _globalExitRootManager, address _polygonRollupManager, bytes _gasTokenMetadata, address _bridgeManager, address _sovereignWETHAddress, bool _sovereignWETHAddressIsNotMintable)' $initNetworkID $initGasTokenAddress $initGasTokenNetwork $initGlobalExitRootManager $initPolygonRollupManager $initGasTokenMetadata $initBridgeManager $initSovereignWETHAddress $initSovereignWETHAddressIsNotMintable) -forge create --broadcast --rpc-url $rpc_url --private-key $bridge_admin_private_key TransparentUpgradeableProxy --constructor-args $bridge_impl_addr $bridge_admin_addr $calldata +calldata=$(cast calldata 'function initialize(uint32 _networkID, address _gasTokenAddress, uint32 _gasTokenNetwork, address _globalExitRootManager, address _polygonRollupManager, bytes _gasTokenMetadata, address _bridgeManager, address _sovereignWETHAddress, bool _sovereignWETHAddressIsNotMintable)' $initNetworkID "$initGasTokenAddress" $initGasTokenNetwork "$initGlobalExitRootManager" "$initPolygonRollupManager" $initGasTokenMetadata $initBridgeManager "$initSovereignWETHAddress" $initSovereignWETHAddressIsNotMintable) +forge create --broadcast --rpc-url $rpc_url --private-key $bridge_admin_private_key TransparentUpgradeableProxy --constructor-args "$bridge_impl_addr" $bridge_admin_addr "$calldata" jq --arg bridge_impl_addr "$bridge_impl_addr" '. += {"bridge_impl_addr": $bridge_impl_addr}' /opt/zkevm-contracts/sovereign-rollup-out.json > /opt/zkevm-contracts/sovereign-rollup-out.json.temp && mv /opt/zkevm-contracts/sovereign-rollup-out.json.temp /opt/zkevm-contracts/sovereign-rollup-out.json jq --arg ger_impl_addr "$ger_impl_addr" '. += {"ger_impl_addr": $ger_impl_addr}' /opt/zkevm-contracts/sovereign-rollup-out.json > /opt/zkevm-contracts/sovereign-rollup-out.json.temp && mv /opt/zkevm-contracts/sovereign-rollup-out.json.temp /opt/zkevm-contracts/sovereign-rollup-out.json From 2c7cf2301fa3917a23efce3af193865de28737f3 Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Wed, 19 Feb 2025 15:58:36 +0900 Subject: [PATCH 23/28] chore: cleanup and fixes Signed-off-by: Ji Hwan --- input_parser.star | 6 ++++-- templates/sovereign-rollup/create_new_rollup.json | 2 +- templates/sovereign-rollup/run-sovereign-setup.sh | 11 +++++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/input_parser.star b/input_parser.star index fdec4f43..6cf93934 100644 --- a/input_parser.star +++ b/input_parser.star @@ -286,7 +286,8 @@ DEFAULT_ROLLUP_ARGS = { # The address of the L1 ERC20 contract that will be used as the gas token on the rollup. # If the address is empty, a contract will be deployed automatically. # This value will also be used for sovereignWETHAddress parameter in the Sovereign rollup. - "gas_token_address": "", + # Default value is 0x0000000000000000000000000000000000000000 + "gas_token_address": "0x0000000000000000000000000000000000000000", # Set to true to use Kurtosis dynamic ports (default) and set to false to use static ports. # You can either use the default static ports defined in this file or specify your custom static # ports. @@ -638,7 +639,8 @@ def args_sanity_check(plan, deployment_stages, args, op_stack_args): # Gas token enabled and gas token address check if ( not args.get("gas_token_enabled", False) - and args.get("gas_token_address", "") != "" + and args.get("gas_token_address", "0x0000000000000000000000000000000000000000") + != "0x0000000000000000000000000000000000000000" ): fail( "Gas token address set to '{}' but gas token is not enabled".format( diff --git a/templates/sovereign-rollup/create_new_rollup.json b/templates/sovereign-rollup/create_new_rollup.json index d5c362f7..ef81953f 100644 --- a/templates/sovereign-rollup/create_new_rollup.json +++ b/templates/sovereign-rollup/create_new_rollup.json @@ -7,7 +7,7 @@ "rollupAdminAddress": "{{ .zkevm_l2_sovereignadmin_address }}", "consensusContractName": "PolygonPessimisticConsensus", "gasTokenAddress": "{{ .gas_token_address }}", - "deployerPvtKey": " {{ .zkevm_l2_admin_private_key }} ", + "deployerPvtKey": "{{ .zkevm_l2_admin_private_key }}", "maxFeePerGas": "", "maxPriorityFeePerGas": "", "multiplierGas": "", diff --git a/templates/sovereign-rollup/run-sovereign-setup.sh b/templates/sovereign-rollup/run-sovereign-setup.sh index e2969b38..8bd6b118 100755 --- a/templates/sovereign-rollup/run-sovereign-setup.sh +++ b/templates/sovereign-rollup/run-sovereign-setup.sh @@ -12,6 +12,13 @@ cast send \ # Create New Rollup Step cd /opt/zkevm-contracts || exit +# Extract the rollup manager address from the JSON file. .zkevm_rollup_manager_address is not available at the time of importing this script. +# So a manual extraction of polygonRollupManagerAddress is done here. +rollup_manager_addr="$(jq -r '.polygonRollupManagerAddress' /opt/zkevm/combined-001.json)" + +# Replace the placeholder with the extracted address +sed -i "s|\"rollupManagerAddress\": \".*\"|\"rollupManagerAddress\":\"$rollup_manager_addr\"|" /opt/contract-deploy/create_new_rollup.json + # This will require genesis.json and create_new_rollup.json to be correctly filled. We are using a pre-defined template for these. # The script and example files exist under https://github.com/0xPolygonHermez/zkevm-contracts/tree/v9.0.0-rc.5-pp/tools/createNewRollup # The templates being used here - create_new_rollup.json and genesis.json were directly referenced from the above source. @@ -19,8 +26,8 @@ cp /opt/contract-deploy/create_new_rollup.json /opt/zkevm-contracts/tools/create cp /opt/contract-deploy/sovereign-genesis.json /opt/zkevm-contracts/tools/createNewRollup/genesis.json npx hardhat run ./tools/createNewRollup/createNewRollup.ts --network localhost -# Extract the rollup manager address from the JSON file -rollup_manager_addr="$(jq -r '.polygonRollupManagerAddress' /opt/zkevm/combined-001.json)" + +# Save Rollup Information to a file. cast call --json --rpc-url "{{.l1_rpc_url}}" "$rollup_manager_addr" 'rollupIDToRollupData(uint32)(address,uint64,address,uint64,bytes32,uint64,uint64,uint64,uint64,uint64,uint64,uint8)' 2 | jq '{"sovereignRollupContract": .[0], "sovereignChainID": .[1], "verifier": .[2], "forkID": .[3], "lastLocalExitRoot": .[4], "lastBatchSequenced": .[5], "lastVerifiedBatch": .[6], "_legacyLastPendingState": .[7], "_legacyLastPendingStateConsolidated": .[8], "lastVerifiedBatchBeforeUpgrade": .[9], "rollupTypeID": .[10], "rollupVerifierType": .[11]}' > /opt/zkevm-contracts/sovereign-rollup-out.json # These are some accounts that we want to fund for operations for running claims. From b54b34c6688cc61b7ca64a78c9933169e6559ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Vincent?= <28714795+leovct@users.noreply.github.com> Date: Wed, 19 Feb 2025 10:00:40 +0100 Subject: [PATCH 24/28] chore: reduce op participants count to one (#494) --- input_parser.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input_parser.star b/input_parser.star index 452333b4..72df33b1 100644 --- a/input_parser.star +++ b/input_parser.star @@ -325,7 +325,7 @@ DEFAULT_OP_STACK_ARGS = { "el_image": "us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101500.0-rc.3", "cl_type": "op-node", "cl_image": "us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.11.0-rc.2", - "count": 2, + "count": 1, }, ], # "batcher_params": { From 6e9703931882efbb7fd89f8aa7eebd0a810c73b0 Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Wed, 19 Feb 2025 04:10:25 -0500 Subject: [PATCH 25/28] fix: deploying l2 contracts (#493) --- .../tests/combinations/fork11-cdk-erigon-rollup.yml | 5 +++-- .../combinations/fork11-cdk-erigon-validium.yml | 5 +++-- .../combinations/fork11-legacy-zkevm-rollup.yml | 8 ++++---- .../tests/combinations/fork12-cdk-erigon-rollup.yml | 3 ++- .../combinations/fork12-cdk-erigon-sovereign.yml | 3 ++- .../combinations/fork12-cdk-erigon-validium.yml | 3 ++- .../tests/combinations/fork13-cdk-erigon-rollup.yml | 3 ++- .../combinations/fork13-cdk-erigon-validium.yml | 3 ++- .../tests/combinations/fork9-cdk-erigon-rollup.yml | 5 +++-- .../combinations/fork9-cdk-erigon-validium.yml | 5 +++-- .../combinations/fork9-legacy-zkevm-rollup.yml | 8 ++++---- .../combinations/fork9-legacy-zkevm-validium.yml | 8 ++++---- .github/tests/forks/fork11.yml | 13 +++++++------ .github/tests/forks/fork12.yml | 5 +++-- .github/tests/forks/fork13.yml | 5 +++-- .github/tests/forks/fork9.yml | 13 +++++++------ templates/contract-deploy/run-l2-contract-setup.sh | 1 + 17 files changed, 55 insertions(+), 41 deletions(-) diff --git a/.github/tests/combinations/fork11-cdk-erigon-rollup.yml b/.github/tests/combinations/fork11-cdk-erigon-rollup.yml index ab3e9f3d..4aa6014e 100644 --- a/.github/tests/combinations/fork11-cdk-erigon-rollup.yml +++ b/.github/tests/combinations/fork11-cdk-erigon-rollup.yml @@ -1,12 +1,13 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true args: verbosity: debug + agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11-patch.1 zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.4-fork.11 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11 - agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 additional_services: - tx_spammer - deploy_l2_contracts: true consensus_contract_type: rollup sequencer_type: erigon diff --git a/.github/tests/combinations/fork11-cdk-erigon-validium.yml b/.github/tests/combinations/fork11-cdk-erigon-validium.yml index a3bebb98..6220fb38 100644 --- a/.github/tests/combinations/fork11-cdk-erigon-validium.yml +++ b/.github/tests/combinations/fork11-cdk-erigon-validium.yml @@ -1,12 +1,13 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true args: verbosity: debug + agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11-patch.1 zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.4-fork.11 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11 - agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 additional_services: - tx_spammer - deploy_l2_contracts: true consensus_contract_type: cdk-validium sequencer_type: erigon diff --git a/.github/tests/combinations/fork11-legacy-zkevm-rollup.yml b/.github/tests/combinations/fork11-legacy-zkevm-rollup.yml index eee0d6e2..de86f62e 100644 --- a/.github/tests/combinations/fork11-legacy-zkevm-rollup.yml +++ b/.github/tests/combinations/fork11-legacy-zkevm-rollup.yml @@ -1,14 +1,14 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true + deploy_cdk_erigon_node: false args: verbosity: debug + agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11-patch.1 zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.4-fork.11 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11 - agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 additional_services: - tx_spammer - deploy_l2_contracts: true consensus_contract_type: rollup sequencer_type: zkevm -deployment_stages: - deploy_cdk_erigon_node: false diff --git a/.github/tests/combinations/fork12-cdk-erigon-rollup.yml b/.github/tests/combinations/fork12-cdk-erigon-rollup.yml index 8b4e8c86..87e53238 100644 --- a/.github/tests/combinations/fork12-cdk-erigon-rollup.yml +++ b/.github/tests/combinations/fork12-cdk-erigon-rollup.yml @@ -1,10 +1,11 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true args: verbosity: debug zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-fork.12-patch.1 zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC14-fork.12 additional_services: - tx_spammer - deploy_l2_contracts: true consensus_contract_type: rollup sequencer_type: erigon diff --git a/.github/tests/combinations/fork12-cdk-erigon-sovereign.yml b/.github/tests/combinations/fork12-cdk-erigon-sovereign.yml index 56ae4319..1300b173 100644 --- a/.github/tests/combinations/fork12-cdk-erigon-sovereign.yml +++ b/.github/tests/combinations/fork12-cdk-erigon-sovereign.yml @@ -1,11 +1,12 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true args: verbosity: debug zkevm_contracts_image: leovct/zkevm-contracts:v9.0.0-rc.5-pp-fork.12 zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC14-fork.12 additional_services: - tx_spammer - deploy_l2_contracts: true consensus_contract_type: pessimistic erigon_strict_mode: false gas_token_enabled: false diff --git a/.github/tests/combinations/fork12-cdk-erigon-validium.yml b/.github/tests/combinations/fork12-cdk-erigon-validium.yml index 58b68c4e..a6b1cc1d 100644 --- a/.github/tests/combinations/fork12-cdk-erigon-validium.yml +++ b/.github/tests/combinations/fork12-cdk-erigon-validium.yml @@ -1,10 +1,11 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true args: verbosity: debug zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-fork.12-patch.1 zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC14-fork.12 additional_services: - tx_spammer - deploy_l2_contracts: true consensus_contract_type: cdk-validium sequencer_type: erigon diff --git a/.github/tests/combinations/fork13-cdk-erigon-rollup.yml b/.github/tests/combinations/fork13-cdk-erigon-rollup.yml index a5453059..bdb59fdf 100644 --- a/.github/tests/combinations/fork13-cdk-erigon-rollup.yml +++ b/.github/tests/combinations/fork13-cdk-erigon-rollup.yml @@ -1,10 +1,11 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true args: verbosity: debug zkevm_contracts_image: leovct/zkevm-contracts:v8.1.0-rc.1-fork.13-patch.1 zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC2-fork.13 additional_services: - tx_spammer - deploy_l2_contracts: true consensus_contract_type: rollup sequencer_type: erigon diff --git a/.github/tests/combinations/fork13-cdk-erigon-validium.yml b/.github/tests/combinations/fork13-cdk-erigon-validium.yml index c18bea00..0de1523f 100644 --- a/.github/tests/combinations/fork13-cdk-erigon-validium.yml +++ b/.github/tests/combinations/fork13-cdk-erigon-validium.yml @@ -1,10 +1,11 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true args: verbosity: debug zkevm_contracts_image: leovct/zkevm-contracts:v8.1.0-rc.1-fork.13-patch.1 zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC2-fork.13 additional_services: - tx_spammer - deploy_l2_contracts: true consensus_contract_type: cdk-validium sequencer_type: erigon diff --git a/.github/tests/combinations/fork9-cdk-erigon-rollup.yml b/.github/tests/combinations/fork9-cdk-erigon-rollup.yml index 494134c9..6dea6a95 100644 --- a/.github/tests/combinations/fork9-cdk-erigon-rollup.yml +++ b/.github/tests/combinations/fork9-cdk-erigon-rollup.yml @@ -1,14 +1,15 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true args: verbosity: debug + agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 zkevm_contracts_image: leovct/zkevm-contracts:v6.0.0-rc.1-fork.9-patch.1 zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.8 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.3 cdk_validium_node_image: 0xpolygon/cdk-validium-node:0.7.0-cdk - agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 additional_services: - pless_zkevm_node - tx_spammer - deploy_l2_contracts: true consensus_contract_type: rollup sequencer_type: erigon diff --git a/.github/tests/combinations/fork9-cdk-erigon-validium.yml b/.github/tests/combinations/fork9-cdk-erigon-validium.yml index f38c2fc4..c1e7b39b 100644 --- a/.github/tests/combinations/fork9-cdk-erigon-validium.yml +++ b/.github/tests/combinations/fork9-cdk-erigon-validium.yml @@ -1,14 +1,15 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true args: verbosity: debug + agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 zkevm_contracts_image: leovct/zkevm-contracts:v6.0.0-rc.1-fork.9-patch.1 zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.8 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.3 cdk_validium_node_image: 0xpolygon/cdk-validium-node:0.7.0-cdk - agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 additional_services: - pless_zkevm_node - tx_spammer - deploy_l2_contracts: true consensus_contract_type: cdk-validium sequencer_type: erigon diff --git a/.github/tests/combinations/fork9-legacy-zkevm-rollup.yml b/.github/tests/combinations/fork9-legacy-zkevm-rollup.yml index d9fbdcd1..203fc43f 100644 --- a/.github/tests/combinations/fork9-legacy-zkevm-rollup.yml +++ b/.github/tests/combinations/fork9-legacy-zkevm-rollup.yml @@ -1,16 +1,16 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true + deploy_cdk_erigon_node: false args: verbosity: debug + agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 zkevm_contracts_image: leovct/zkevm-contracts:v6.0.0-rc.1-fork.9-patch.1 zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.8 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.3 cdk_validium_node_image: 0xpolygon/cdk-validium-node:0.7.0-cdk - agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 additional_services: - pless_zkevm_node - tx_spammer - deploy_l2_contracts: true consensus_contract_type: rollup sequencer_type: zkevm -deployment_stages: - deploy_cdk_erigon_node: false diff --git a/.github/tests/combinations/fork9-legacy-zkevm-validium.yml b/.github/tests/combinations/fork9-legacy-zkevm-validium.yml index 3dd72304..2e23659e 100644 --- a/.github/tests/combinations/fork9-legacy-zkevm-validium.yml +++ b/.github/tests/combinations/fork9-legacy-zkevm-validium.yml @@ -1,16 +1,16 @@ # This file has been generated automatically. +deployment_stages: + deploy_l2_contracts: true + deploy_cdk_erigon_node: false args: verbosity: debug + agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 zkevm_contracts_image: leovct/zkevm-contracts:v6.0.0-rc.1-fork.9-patch.1 zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.8 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.3 cdk_validium_node_image: 0xpolygon/cdk-validium-node:0.7.0-cdk - agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 additional_services: - pless_zkevm_node - tx_spammer - deploy_l2_contracts: true consensus_contract_type: cdk-validium sequencer_type: zkevm -deployment_stages: - deploy_cdk_erigon_node: false diff --git a/.github/tests/forks/fork11.yml b/.github/tests/forks/fork11.yml index 8d4bc654..ff105e63 100644 --- a/.github/tests/forks/fork11.yml +++ b/.github/tests/forks/fork11.yml @@ -1,6 +1,13 @@ +deployment_stages: + deploy_l2_contracts: true + args: verbosity: debug + # Use this specific version of the agglayer to avoid the following issue: + # Error: Unable to get the InitL1InfoRootMap: Event InitL1InfoRootMap not found + agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 + # https://hub.docker.com/repository/docker/leovct/zkevm-contracts/tags?name=fork.11 zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11-patch.1 @@ -10,11 +17,5 @@ args: # https://hub.docker.com/r/hermeznetwork/zkevm-node/tags?name=fork11 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11 - # Use this specific version of the agglayer to avoid the following issue: - # Error: Unable to get the InitL1InfoRootMap: Event InitL1InfoRootMap not found - agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 - additional_services: - tx_spammer - - deploy_l2_contracts: true diff --git a/.github/tests/forks/fork12.yml b/.github/tests/forks/fork12.yml index 657ef5d7..02195db6 100644 --- a/.github/tests/forks/fork12.yml +++ b/.github/tests/forks/fork12.yml @@ -1,3 +1,6 @@ +deployment_stages: + deploy_l2_contracts: true + args: verbosity: debug @@ -9,5 +12,3 @@ args: additional_services: - tx_spammer - - deploy_l2_contracts: true diff --git a/.github/tests/forks/fork13.yml b/.github/tests/forks/fork13.yml index fd0e6ab3..fd7ee592 100644 --- a/.github/tests/forks/fork13.yml +++ b/.github/tests/forks/fork13.yml @@ -1,3 +1,6 @@ +deployment_stages: + deploy_l2_contracts: true + args: verbosity: debug @@ -9,5 +12,3 @@ args: additional_services: - tx_spammer - - deploy_l2_contracts: true diff --git a/.github/tests/forks/fork9.yml b/.github/tests/forks/fork9.yml index d271551d..a810bc0d 100644 --- a/.github/tests/forks/fork9.yml +++ b/.github/tests/forks/fork9.yml @@ -1,6 +1,13 @@ +deployment_stages: + deploy_l2_contracts: true + args: verbosity: debug + # Use this specific version of the agglayer to avoid the following issue: + # Error: Unable to get the InitL1InfoRootMap: Event InitL1InfoRootMap not found + agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 + # https://hub.docker.com/repository/docker/leovct/zkevm-contracts/tags?name=fork.9 zkevm_contracts_image: leovct/zkevm-contracts:v6.0.0-rc.1-fork.9-patch.1 @@ -13,12 +20,6 @@ args: # https://hub.docker.com/r/0xpolygon/cdk-validium-node/tags?name=0.7 cdk_validium_node_image: 0xpolygon/cdk-validium-node:0.7.0-cdk - # Use this specific version of the agglayer to avoid the following issue: - # Error: Unable to get the InitL1InfoRootMap: Event InitL1InfoRootMap not found - agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 - additional_services: - pless_zkevm_node - tx_spammer - - deploy_l2_contracts: true diff --git a/templates/contract-deploy/run-l2-contract-setup.sh b/templates/contract-deploy/run-l2-contract-setup.sh index 7c429897..3c538fe8 100644 --- a/templates/contract-deploy/run-l2-contract-setup.sh +++ b/templates/contract-deploy/run-l2-contract-setup.sh @@ -97,6 +97,7 @@ if [[ "{{.l2_deploy_deterministic_deployment_proxy}}" ]]; then --rpc-url "$l2_rpc_url" \ --private-key "{{.zkevm_l2_admin_private_key}}" \ --value "$gas_cost" \ + --nonce "$account_nonce" \ "$signer_address" cast publish --rpc-url "$l2_rpc_url" "$transaction" if [[ $(cast code --rpc-url "$l2_rpc_url" $deployer_address) == "0x" ]]; then From 138f798f8de08940151f10a9d89e6f02197b0d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Vincent?= <28714795+leovct@users.noreply.github.com> Date: Wed, 19 Feb 2025 10:18:18 +0100 Subject: [PATCH 26/28] ci: remove `multi-cdk-chains` job (#495) * chore: remove `multi-cdk-chains` job * chore: clean up --- .github/workflows/deploy.yml | 339 +---------------------------------- 1 file changed, 1 insertion(+), 338 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ce57b7e4..f6534dea 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -52,11 +52,9 @@ jobs: --rpc-url $(kurtosis port print ${{ env.ENCLAVE_NAME }} cdk-erigon-rpc-001 rpc) - name: Dump enclave - if: ${{ !cancelled() }} run: kurtosis enclave dump ${{ env.ENCLAVE_NAME }} ./dump - name: Upload enclave dump - if: ${{ !cancelled() }} uses: actions/upload-artifact@v4 with: name: dump_run_without_args_${{ github.run_id }} @@ -107,10 +105,6 @@ jobs: - name: Install Kurtosis CDK tools uses: ./.github/actions/setup-kurtosis-cdk - - name: Generate test combinations - working-directory: .github/tests - run: ./combine-ymls.sh - - name: Run Starlark run: kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --args-file=${{ matrix.file_name }} --show-enclave-inspect=false . @@ -169,11 +163,9 @@ jobs: fi - name: Dump enclave - if: ${{ !cancelled() }} run: kurtosis enclave dump ${{ env.ENCLAVE_NAME }} ./dump - name: Generate archive name - if: ${{ !cancelled() }} run: | file_name=$(basename "${{ matrix.file_name }}" ".yml") archive_name="dump_run_with_args_${file_name}_${{ github.run_id }}" @@ -181,335 +173,11 @@ jobs: echo "Generated archive name: ${archive_name}" - name: Upload enclave dump - if: ${{ !cancelled() }} uses: actions/upload-artifact@v4 with: name: ${{ env.ARCHIVE_NAME }} path: ./dump - multi-cdk-chains: - runs-on: ubuntu-latest - timeout-minutes: 25 - steps: - - uses: actions/checkout@v4 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - # This step will only execute if the necessary secrets are available, preventing failures - # on pull requests from forked repositories. - if: ${{ env.DOCKERHUB_USERNAME && env.DOCKERHUB_TOKEN }} - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Install polycli - run: | - tmp_dir=$(mktemp -d) - curl -L "https://github.com/0xPolygon/polygon-cli/releases/download/${{ env.POLYCLI_VERSION }}/polycli_${{ env.POLYCLI_VERSION }}_linux_amd64.tar.gz" | tar -xz -C "$tmp_dir" - mv "$tmp_dir"/* /usr/local/bin/polycli - rm -rf "$tmp_dir" - sudo chmod +x /usr/local/bin/polycli - /usr/local/bin/polycli version - - - name: Install Kurtosis CDK tools - uses: ./.github/actions/setup-kurtosis-cdk - - - name: Replace Agglayer SP1 Prover Key with Github Secrets - run: | - sed -i "s/agglayer_prover_sp1_key: null/agglayer_prover_sp1_key: \"${{ secrets.SP1_PRIVATE_KEY }}\"/" ./.github/tests/chains/l1-cdk1-cdk2.yml - # This step will only execute if the necessary secrets are available, preventing failures - # on pull requests from forked repositories. - if: ${{ env.agglayer_prover_sp1_key && env.agglayer_prover_sp1_key != '' }} - env: - agglayer_prover_sp1_key: ${{ secrets.SP1_PRIVATE_KEY }} - - - name: Deploy L1 chain, cdk-1 PP chain, and cdk-2 Sovereign chain (cdk-erigon sequencer + cdk PP stack + cdk opgeth stack) - run: kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --args-file=./.github/tests/chains/l1-cdk1-cdk2.yml . - - - name: Update the agglayer config - run: | - # Download the agglayer config file. - kurtosis files download ${{ env.ENCLAVE_NAME }} agglayer-config-artifact - cd agglayer-config-artifact - # Update the config by adding the rpc and proof signer of cdk-3. - tomlq -Y --toml-output --in-place '."full-node-rpcs" += {"3": "http://cdk-erigon-rpc-003:8123"}' agglayer-config.toml - # Update the config by adding the rpc and proof signer of cdk-4. - tomlq -Y --toml-output --in-place '."full-node-rpcs" += {"4": "http://cdk-erigon-rpc-004:8123"}' agglayer-config.toml - # Replace the agglayer config. - agglayer_container_id="$(docker ps --filter name=agglayer --format json | jq -r -s '. | map(select(.Names | startswith("agglayer--"))) | .[].ID')" - docker cp agglayer-config.toml "$agglayer_container_id:/etc/zkevm/agglayer-config.toml" - # Restart the agglayer service. - kurtosis service stop ${{ env.ENCLAVE_NAME }} agglayer - kurtosis service start ${{ env.ENCLAVE_NAME }} agglayer - - - name: Attach a cdk-3 FEP L2 chain (cdk-erigon sequencer + cdk FEP stack) - run: kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --args-file=./.github/tests/chains/cdk3.yml . - - - name: Attach a cdk-4 PP L2 chain (cdk-erigon sequencer + cdk PP stack) - if: ${{ env.agglayer_prover_sp1_key || env.agglayer_prover_sp1_key != '' }} - run: kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --args-file=./.github/tests/chains/cdk4.yml . - env: - agglayer_prover_sp1_key: ${{ secrets.SP1_PRIVATE_KEY }} - - - name: Inspect enclave - run: kurtosis enclave inspect ${{ env.ENCLAVE_NAME }} - - - name: Send bridge transactions from L1 to cdk-2 - if: ${{ env.agglayer_prover_sp1_key || env.agglayer_prover_sp1_key != '' }} - working-directory: .github/scripts - shell: bash {0} # By default, GHA runs with `set -e`. This line disables that. - run: | - echo "Sending a bridge transaction from L1 to the cdk-2 RPC..." - l1_rpc_url=http://$(kurtosis port print ${{ env.ENCLAVE_NAME }} el-1-geth-lighthouse rpc) - l1_prefunded_mnemonic="giant issue aisle success illegal bike spike question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy very lucky have athlete" - private_key=$(cast wallet private-key --mnemonic "$l1_prefunded_mnemonic") - eth_address=$(cast wallet address --private-key $private_key) - polycli ulxly bridge asset \ - --bridge-address 0x83F138B325164b162b320F797b57f6f7E235ABAC \ - --destination-network 2 \ - --private-key $private_key \ - --rpc-url $l1_rpc_url \ - --value 10000000000000000000 - if [[ $ret_code -eq 0 ]]; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Deposit transaction successfuly sent!" - else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Deposit transaction failed!" - exit 1 - fi - - op_rollup_rpc_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} op-el-1-op-geth-op-node-op-kurtosis rpc) - while true; do - echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔄 Checking if the deposit was claimed..." - balance=$(cast balance --ether --rpc-url $op_rollup_rpc_url $eth_address) - result=$(echo "$balance > 0" | bc) # Use bc to compare floating-point numbers - if [[ "$result" -eq 1 ]]; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Deposit claimed, balance is $balance" - exit 0 - else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Deposit has not been claimed yet... Retrying in 15 seconds..." - sleep 15 - fi - done - - env: - agglayer_prover_sp1_key: ${{ secrets.SP1_PRIVATE_KEY }} - - - name: Bridge from cdk-2 to L1 - if: ${{ env.agglayer_prover_sp1_key || env.agglayer_prover_sp1_key != '' }} - working-directory: .github/scripts - shell: bash {0} # By default, GHA runs with `set -e`. This line disables that. - run: | - echo "Sending a bridge transaction from cdk-2 to L1..." - op_rollup_rpc_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} op-el-1-op-geth-op-node-op-kurtosis rpc) - l1_prefunded_mnemonic="giant issue aisle success illegal bike spike question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy very lucky have athlete" - private_key=$(cast wallet private-key --mnemonic "$l1_prefunded_mnemonic") - eth_address=$(cast wallet address --private-key $private_key) - polycli ulxly bridge asset \ - --bridge-address 0x9A1f8eA578835d2b7b1e1EB8CD5EE3Bb7692338C \ - --destination-network 0 \ - --private-key $private_key \ - --rpc-url $op_rollup_rpc_url \ - --value $(date +%s) \ - --destination-address 0xC0FFEE0000000000000000000000000000000001 - if [[ $ret_code -eq 0 ]]; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Deposit transaction successfuly sent!" - else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Deposit transaction failed!" - exit 1 - fi - - bridge_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} sovereign-bridge-service-001 rpc) - l1_rpc_url=http://$(kurtosis port print ${{ env.ENCLAVE_NAME }} el-1-geth-lighthouse rpc) - l1_prefunded_mnemonic="giant issue aisle success illegal bike spike question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy very lucky have athlete" - private_key=$(cast wallet private-key --mnemonic "$l1_prefunded_mnemonic") - eth_address=$(cast wallet address --private-key $private_key) - while true; do - echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔄 Attempting to claim the deposit..." - polycli ulxly claim asset \ - --bridge-address 0x83F138B325164b162b320F797b57f6f7E235ABAC \ - --bridge-service-url $bridge_url \ - --deposit-count 0 \ - --destination-address 0xc0FFee0000000000000000000000000000000001 \ - --deposit-network 2 \ - --private-key $private_key \ - --rpc-url $l1_rpc_url - ret_code="$?" - if [[ $ret_code -eq 0 ]]; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Claim transaction successfuly sent!" - exit 0 - else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Claim transaction not available for now. Retrying in 15 seconds..." - sleep 15 - fi - done - env: - agglayer_prover_sp1_key: ${{ secrets.SP1_PRIVATE_KEY }} - - - name: Bridge from cdk-2 to cdk-1 - if: ${{ env.agglayer_prover_sp1_key || env.agglayer_prover_sp1_key != '' }} - working-directory: .github/scripts - shell: bash {0} # By default, GHA runs with `set -e`. This line disables that. - run: | - echo "Sending a bridge transaction from cdk-2 to cdk-1..." - op_rollup_rpc_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} op-el-1-op-geth-op-node-op-kurtosis rpc) - l1_prefunded_mnemonic="giant issue aisle success illegal bike spike question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy very lucky have athlete" - private_key=$(cast wallet private-key --mnemonic "$l1_prefunded_mnemonic") - eth_address=$(cast wallet address --private-key $private_key) - polycli ulxly bridge asset \ - --bridge-address 0x9A1f8eA578835d2b7b1e1EB8CD5EE3Bb7692338C \ - --destination-network 1 \ - --private-key $private_key \ - --rpc-url $op_rollup_rpc_url \ - --value $(date +%s) \ - --destination-address 0xC0FFEE0000000000000000000000000000000002 - if [[ $ret_code -eq 0 ]]; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Deposit transaction successfuly sent!" - else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Deposit transaction failed!" - exit 1 - fi - - l2_rpc_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} cdk-erigon-rpc-001 rpc) - bridge_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} sovereign-bridge-service-001 rpc) - while true; do - echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔄 Attempting to claim the deposit..." - gas_price=$(cast gas-price --rpc-url $l2_rpc_url) - polycli ulxly claim asset \ - --bridge-address 0x83F138B325164b162b320F797b57f6f7E235ABAC \ - --bridge-service-url $bridge_url \ - --deposit-count 1 \ - --destination-address 0xc0FFee0000000000000000000000000000000002 \ - --deposit-network 2 \ - --private-key 0x12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625 \ - --rpc-url $l2_rpc_url \ - --gas-price $gas_price - ret_code="$?" - if [[ $ret_code -eq 0 ]]; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Claim transaction successfuly sent!" - exit 0 - else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Claim transaction not available for now. Retrying in 15 seconds..." - sleep 15 - fi - done - env: - agglayer_prover_sp1_key: ${{ secrets.SP1_PRIVATE_KEY }} - - - name: Send bridge transactions from L1 to the cdk-4 - if: ${{ env.agglayer_prover_sp1_key || env.agglayer_prover_sp1_key != '' }} - working-directory: .github/scripts - shell: bash {0} # By default, GHA runs with `set -e`. This line disables that. - run: | - echo "Sending a bridge transaction from L1 to cdk-4 Erigon RPC..." - bridge_address=$(kurtosis service exec ${{ env.ENCLAVE_NAME }} contracts-001 'jq -r .polygonZkEVMBridgeAddress /opt/zkevm/combined.json' 2>&1 | grep -P '0x\h*') - l1_rpc_url=http://$(kurtosis port print ${{ env.ENCLAVE_NAME }} el-1-geth-lighthouse rpc) - polycli ulxly bridge asset \ - --private-key 12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625 \ - --value 1000000000000000000 \ - --rpc-url $l1_rpc_url \ - --bridge-address $bridge_address \ - --destination-network 4 \ - --force-update-root=true \ - --destination-address 0xc0FFee0000000000000000000000000000000003 - if [[ $ret_code -eq 0 ]]; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Deposit transaction successfuly sent!" - else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Deposit transaction failed!" - exit 1 - fi - - l2_cdk4_rpc_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} cdk-erigon-rpc-004 rpc) - bridge_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} zkevm-bridge-service-004 rpc) - while true; do - echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔄 Attempting to claim the deposit..." - gas_price=$(cast gas-price --rpc-url $l2_cdk4_rpc_url) - polycli ulxly claim asset \ - --bridge-address $bridge_address \ - --private-key 12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625 \ - --deposit-count 4 \ - --destination-address 0xc0FFee0000000000000000000000000000000003 \ - --deposit-network 0 \ - --rpc-url $l2_cdk4_rpc_url \ - --bridge-service-url $bridge_url \ - --gas-price $gas_price - ret_code=$? - if [[ "$ret_code" -eq 0 ]]; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Claim transaction successfuly sent!" - exit 0 - else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Claim transaction not available for now. Retring in 15 seconds..." - sleep 15 - fi - done - env: - agglayer_prover_sp1_key: ${{ secrets.SP1_PRIVATE_KEY }} - - - name: Bridge from cdk-4 to cdk-1. - if: ${{ env.agglayer_prover_sp1_key || env.agglayer_prover_sp1_key != '' }} - working-directory: .github/scripts - shell: bash {0} # By default, GHA runs with `set -e`. This line disables that. - run: | - echo "Sending a bridge transaction from cdk-4 to the cdk-1 Erigon RPC..." - bridge_address=$(kurtosis service exec ${{ env.ENCLAVE_NAME }} contracts-001 'jq -r .polygonZkEVMBridgeAddress /opt/zkevm/combined.json' 2>&1 | grep -P '0x\h*') - l2_cdk4_rpc_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} cdk-erigon-rpc-004 rpc) - gas_price=$(cast gas-price --rpc-url $l2_cdk4_rpc_url) - polycli ulxly bridge asset \ - --private-key 12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625 \ - --value 1000000000000 \ - --rpc-url $l2_cdk4_rpc_url \ - --bridge-address $bridge_address \ - --destination-network 1 \ - --force-update-root=true \ - --destination-address 0xc0FFee0000000000000000000000000000000004 \ - --gas-price $gas_price - ret_code=$? - if [[ $ret_code -eq 0 ]]; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Deposit transaction successfuly sent!" - else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Deposit transaction failed!" - exit 1 - fi - - l2_cdk1_rpc_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} cdk-erigon-rpc-001 rpc) - bridge_url=$(kurtosis port print ${{ env.ENCLAVE_NAME }} zkevm-bridge-service-004 rpc) - while true; do - echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔄 Attempting to claim the deposit..." - gas_price=$(cast gas-price --rpc-url $l2_cdk1_rpc_url) - polycli ulxly claim asset \ - --bridge-address $bridge_address \ - --private-key 12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625 \ - --deposit-count 0 \ - --destination-address 0xc0FFee0000000000000000000000000000000004 \ - --deposit-network 4 \ - --rpc-url $l2_cdk1_rpc_url \ - --bridge-service-url $bridge_url \ - --gas-price $gas_price - ret_code=$? - if [[ $ret_code -eq 0 ]]; then - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Claim transaction successfuly sent!" - exit 0 - else - echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Claim transaction not available for now. Retrying in 15 seconds..." - sleep 15 - fi - done - env: - agglayer_prover_sp1_key: ${{ secrets.SP1_PRIVATE_KEY }} - - - name: Dump enclave - if: ${{ !cancelled() }} - run: kurtosis enclave dump ${{ env.ENCLAVE_NAME }} ./dump - - - name: Upload enclave dump - if: ${{ !cancelled() }} - uses: actions/upload-artifact@v4 - with: - name: dump_attach_cdks_${{ github.run_id }} - path: ./dump - additional-services: runs-on: ubuntu-latest timeout-minutes: 20 @@ -603,11 +271,9 @@ jobs: fi - name: Dump enclave - if: ${{ !cancelled() }} run: kurtosis enclave dump ${{ env.ENCLAVE_NAME }} ./dump - name: Upload enclave dump - if: ${{ !cancelled() }} uses: actions/upload-artifact@v4 with: name: dump_additional_services_${{ github.run_id }} @@ -638,8 +304,7 @@ jobs: run: kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --args-file=./.github/tests/external-l1/deploy-local-l1.yml . - name: Deploy to local L1 chain - run: | - kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --args-file=./.github/tests/external-l1/deploy-cdk-to-local-l1.yml . + run: kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --args-file=./.github/tests/external-l1/deploy-cdk-to-local-l1.yml . - name: Inspect enclave run: kurtosis enclave inspect ${{ env.ENCLAVE_NAME }} @@ -652,11 +317,9 @@ jobs: --rpc-url "$(kurtosis port print ${{ env.ENCLAVE_NAME }} cdk-erigon-rpc-001 rpc)" - name: Dump enclave - if: ${{ !cancelled() }} run: kurtosis enclave dump ${{ env.ENCLAVE_NAME }} ./dump - name: Upload enclave dump - if: ${{ !cancelled() }} uses: actions/upload-artifact@v4 with: name: dump_deploy_to_external_l1_${{ github.run_id }} From 85a6c05eca0147554080848e1d973c31c47b720d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Vincent?= <28714795+leovct@users.noreply.github.com> Date: Wed, 19 Feb 2025 11:08:12 +0100 Subject: [PATCH 27/28] chore: bump versions (#496) * chore: bump versions * fix: cdk-erigon tag --- .../tests/combinations/fork11-cdk-erigon-rollup.yml | 2 +- .../tests/combinations/fork11-cdk-erigon-validium.yml | 2 +- .../tests/combinations/fork11-legacy-zkevm-rollup.yml | 2 +- .../tests/combinations/fork12-cdk-erigon-rollup.yml | 4 ++-- .../tests/combinations/fork12-cdk-erigon-sovereign.yml | 2 +- .../tests/combinations/fork12-cdk-erigon-validium.yml | 4 ++-- .../tests/combinations/fork13-cdk-erigon-rollup.yml | 4 ++-- .../tests/combinations/fork13-cdk-erigon-validium.yml | 4 ++-- .github/tests/forks/fork11.yml | 2 +- .github/tests/forks/fork12.yml | 4 ++-- .github/tests/forks/fork13.yml | 4 ++-- CDK_VERSION_MATRIX.MD | 10 +++++----- input_parser.star | 10 +++++----- 13 files changed, 27 insertions(+), 27 deletions(-) diff --git a/.github/tests/combinations/fork11-cdk-erigon-rollup.yml b/.github/tests/combinations/fork11-cdk-erigon-rollup.yml index 4aa6014e..d29b09a2 100644 --- a/.github/tests/combinations/fork11-cdk-erigon-rollup.yml +++ b/.github/tests/combinations/fork11-cdk-erigon-rollup.yml @@ -5,7 +5,7 @@ args: verbosity: debug agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11-patch.1 - zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.4-fork.11 + zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.4-hotfix.2-fork.11 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11 additional_services: - tx_spammer diff --git a/.github/tests/combinations/fork11-cdk-erigon-validium.yml b/.github/tests/combinations/fork11-cdk-erigon-validium.yml index 6220fb38..201b3f71 100644 --- a/.github/tests/combinations/fork11-cdk-erigon-validium.yml +++ b/.github/tests/combinations/fork11-cdk-erigon-validium.yml @@ -5,7 +5,7 @@ args: verbosity: debug agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11-patch.1 - zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.4-fork.11 + zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.4-hotfix.2-fork.11 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11 additional_services: - tx_spammer diff --git a/.github/tests/combinations/fork11-legacy-zkevm-rollup.yml b/.github/tests/combinations/fork11-legacy-zkevm-rollup.yml index de86f62e..cfcbf65c 100644 --- a/.github/tests/combinations/fork11-legacy-zkevm-rollup.yml +++ b/.github/tests/combinations/fork11-legacy-zkevm-rollup.yml @@ -6,7 +6,7 @@ args: verbosity: debug agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.19 zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11-patch.1 - zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.4-fork.11 + zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.4-hotfix.2-fork.11 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11 additional_services: - tx_spammer diff --git a/.github/tests/combinations/fork12-cdk-erigon-rollup.yml b/.github/tests/combinations/fork12-cdk-erigon-rollup.yml index 87e53238..6282c3c2 100644 --- a/.github/tests/combinations/fork12-cdk-erigon-rollup.yml +++ b/.github/tests/combinations/fork12-cdk-erigon-rollup.yml @@ -3,8 +3,8 @@ deployment_stages: deploy_l2_contracts: true args: verbosity: debug - zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-fork.12-patch.1 - zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC14-fork.12 + zkevm_contracts_image: leovct/zkevm-contracts:v9.0.0-rc.6-pp-fork.12 + zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC16-fork.12 additional_services: - tx_spammer consensus_contract_type: rollup diff --git a/.github/tests/combinations/fork12-cdk-erigon-sovereign.yml b/.github/tests/combinations/fork12-cdk-erigon-sovereign.yml index 1300b173..116dfedc 100644 --- a/.github/tests/combinations/fork12-cdk-erigon-sovereign.yml +++ b/.github/tests/combinations/fork12-cdk-erigon-sovereign.yml @@ -4,7 +4,7 @@ deployment_stages: args: verbosity: debug zkevm_contracts_image: leovct/zkevm-contracts:v9.0.0-rc.5-pp-fork.12 - zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC14-fork.12 + zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC16-fork.12 additional_services: - tx_spammer consensus_contract_type: pessimistic diff --git a/.github/tests/combinations/fork12-cdk-erigon-validium.yml b/.github/tests/combinations/fork12-cdk-erigon-validium.yml index a6b1cc1d..6aed70ca 100644 --- a/.github/tests/combinations/fork12-cdk-erigon-validium.yml +++ b/.github/tests/combinations/fork12-cdk-erigon-validium.yml @@ -3,8 +3,8 @@ deployment_stages: deploy_l2_contracts: true args: verbosity: debug - zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-fork.12-patch.1 - zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC14-fork.12 + zkevm_contracts_image: leovct/zkevm-contracts:v9.0.0-rc.6-pp-fork.12 + zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC16-fork.12 additional_services: - tx_spammer consensus_contract_type: cdk-validium diff --git a/.github/tests/combinations/fork13-cdk-erigon-rollup.yml b/.github/tests/combinations/fork13-cdk-erigon-rollup.yml index bdb59fdf..33152484 100644 --- a/.github/tests/combinations/fork13-cdk-erigon-rollup.yml +++ b/.github/tests/combinations/fork13-cdk-erigon-rollup.yml @@ -3,8 +3,8 @@ deployment_stages: deploy_l2_contracts: true args: verbosity: debug - zkevm_contracts_image: leovct/zkevm-contracts:v8.1.0-rc.1-fork.13-patch.1 - zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC2-fork.13 + zkevm_contracts_image: leovct/zkevm-contracts:v8.1.0-rc.2-fork.13 + zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC3-fork.13 additional_services: - tx_spammer consensus_contract_type: rollup diff --git a/.github/tests/combinations/fork13-cdk-erigon-validium.yml b/.github/tests/combinations/fork13-cdk-erigon-validium.yml index 0de1523f..8eeb124c 100644 --- a/.github/tests/combinations/fork13-cdk-erigon-validium.yml +++ b/.github/tests/combinations/fork13-cdk-erigon-validium.yml @@ -3,8 +3,8 @@ deployment_stages: deploy_l2_contracts: true args: verbosity: debug - zkevm_contracts_image: leovct/zkevm-contracts:v8.1.0-rc.1-fork.13-patch.1 - zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC2-fork.13 + zkevm_contracts_image: leovct/zkevm-contracts:v8.1.0-rc.2-fork.13 + zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC3-fork.13 additional_services: - tx_spammer consensus_contract_type: cdk-validium diff --git a/.github/tests/forks/fork11.yml b/.github/tests/forks/fork11.yml index ff105e63..9f2901ad 100644 --- a/.github/tests/forks/fork11.yml +++ b/.github/tests/forks/fork11.yml @@ -12,7 +12,7 @@ args: zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11-patch.1 # https://hub.docker.com/r/hermeznetwork/zkevm-prover/tags?name=fork.11 - zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.4-fork.11 + zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.4-hotfix.2-fork.11 # https://hub.docker.com/r/hermeznetwork/zkevm-node/tags?name=fork11 zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11 diff --git a/.github/tests/forks/fork12.yml b/.github/tests/forks/fork12.yml index 02195db6..02e03962 100644 --- a/.github/tests/forks/fork12.yml +++ b/.github/tests/forks/fork12.yml @@ -5,10 +5,10 @@ args: verbosity: debug # https://hub.docker.com/repository/docker/leovct/zkevm-contracts/tags?name=fork.12 - zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-fork.12-patch.1 + zkevm_contracts_image: leovct/zkevm-contracts:v9.0.0-rc.6-pp-fork.12 # https://hub.docker.com/r/hermeznetwork/zkevm-prover/tags?name=v8 - zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC14-fork.12 + zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC16-fork.12 additional_services: - tx_spammer diff --git a/.github/tests/forks/fork13.yml b/.github/tests/forks/fork13.yml index fd7ee592..88a432e7 100644 --- a/.github/tests/forks/fork13.yml +++ b/.github/tests/forks/fork13.yml @@ -5,10 +5,10 @@ args: verbosity: debug # https://hub.docker.com/repository/docker/leovct/zkevm-contracts/tags?name=fork.13 - zkevm_contracts_image: leovct/zkevm-contracts:v8.1.0-rc.1-fork.13-patch.1 + zkevm_contracts_image: leovct/zkevm-contracts:v8.1.0-rc.2-fork.13 # https://hub.docker.com/r/hermeznetwork/zkevm-prover/tags?name=v9 - zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC2-fork.13 + zkevm_prover_image: hermeznetwork/zkevm-prover:v9.0.0-RC3-fork.13 additional_services: - tx_spammer diff --git a/CDK_VERSION_MATRIX.MD b/CDK_VERSION_MATRIX.MD index 349a2a33..75c929e3 100644 --- a/CDK_VERSION_MATRIX.MD +++ b/CDK_VERSION_MATRIX.MD @@ -4,8 +4,8 @@ Which versions of the CDK stack are meant to work together? Fork ID|Consensus|CDK Erigon|ZkEVM Prover|ZkEVM Contracts|Data Availability|Bridge ---|---|---|---|---|---|--- -13|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v9.0.0-RC2-fork.13](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v9.0.0-RC2)|[v8.1.0-rc.1-fork.13](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v8.1.0-rc.1-fork.13)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) -12|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v8.0.0-RC14-fork.12](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v8.0.0-RC14)|[v8.0.0-fork.12](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v8.0.0-fork.12)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) -12|sovereign|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v8.0.0-RC14-fork.12](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v8.0.0-RC14)|[v9.0.0-rc.5-pp-fork.12](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v9.0.0-rc.5-pp-fork.12)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) -11|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v7.0.4-fork.11](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v7.0.4)|[v7.0.0-rc.2-fork.11](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v7.0.0-rc.2-fork.11)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) -9|validium|[v2.61.9-RC1](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.9-RC1)|[v6.0.8](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v6.0.8)|[v6.0.0-rc.1-fork.9](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v6.0.0-rc.1-fork.9)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) +13|validium|[v2.61.14-RC1-amd64](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.14-RC1-amd64)|[v9.0.0-RC3-fork.13](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v9.0.0-RC3)|[v8.1.0-rc.2-fork.13](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v8.1.0-rc.2-fork.13)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) +12|validium|[v2.61.14-RC1-amd64](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.14-RC1-amd64)|[v8.0.0-RC16-fork.12](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v8.0.0-RC16)|[v9.0.0-rc.6-pp-fork.12](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v9.0.0-rc.6-pp-fork.12)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) +12|sovereign|[v2.61.14-RC1-amd64](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.14-RC1-amd64)|[v8.0.0-RC16-fork.12](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v8.0.0-RC16)|[v9.0.0-rc.5-pp-fork.12](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v9.0.0-rc.5-pp-fork.12)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) +11|validium|[v2.61.14-RC1-amd64](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.14-RC1-amd64)|[v7.0.4-hotfix.2-fork.11](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v7.0.4-hotfix.2)|[v7.0.0-rc.2-fork.11](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v7.0.0-rc.2-fork.11)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) +9|validium|[v2.61.14-RC1-amd64](https://github.com/0xPolygonHermez/cdk-erigon/releases/tag/v2.61.14-RC1-amd64)|[v6.0.8](https://github.com/0xPolygonHermez/zkevm-prover/releases/tag/v6.0.8)|[v6.0.0-rc.1-fork.9](https://github.com/0xPolygonHermez/zkevm-contracts/releases/tag/v6.0.0-rc.1-fork.9)|[0.0.11](https://github.com/0xPolygon/cdk-data-availability/releases/tag/v0.0.11)|[v0.6.0-RC9](https://github.com/0xPolygonHermez/zkevm-bridge-service/releases/tag/v0.6.0-RC9) diff --git a/input_parser.star b/input_parser.star index 72df33b1..2a5f6f8b 100644 --- a/input_parser.star +++ b/input_parser.star @@ -37,20 +37,20 @@ DEFAULT_DEPLOYMENT_STAGES = { DEFAULT_IMAGES = { "aggkit_image": "ghcr.io/agglayer/aggkit:0.0.2", # https://github.com/agglayer/aggkit/pkgs/container/aggkit "agglayer_image": "ghcr.io/agglayer/agglayer:main", # https://github.com/agglayer/agglayer/tags - "cdk_erigon_node_image": "hermeznetwork/cdk-erigon:v2.61.9-RC1", # https://hub.docker.com/r/hermeznetwork/cdk-erigon/tags + "cdk_erigon_node_image": "hermeznetwork/cdk-erigon:v2.61.14-RC1-amd64", # https://hub.docker.com/r/hermeznetwork/cdk-erigon/tags "cdk_node_image": "ghcr.io/0xpolygon/cdk:0.5.1", # https://github.com/0xpolygon/cdk/pkgs/container/cdk "cdk_validium_node_image": "0xpolygon/cdk-validium-node:0.7.0-cdk", # https://hub.docker.com/r/0xpolygon/cdk-validium-node/tags "zkevm_bridge_proxy_image": "haproxy:3.1-bookworm", # https://hub.docker.com/_/haproxy/tags "zkevm_bridge_service_image": "hermeznetwork/zkevm-bridge-service:v0.6.0-RC9", # https://hub.docker.com/r/hermeznetwork/zkevm-bridge-service/tags "zkevm_bridge_ui_image": "leovct/zkevm-bridge-ui:multi-network", # https://hub.docker.com/r/leovct/zkevm-bridge-ui/tags - "zkevm_contracts_image": "leovct/zkevm-contracts:v9.0.0-rc.5-pp-fork.12", # https://hub.docker.com/repository/docker/leovct/zkevm-contracts/tags + "zkevm_contracts_image": "leovct/zkevm-contracts:v9.0.0-rc.6-pp-fork.12", # https://hub.docker.com/repository/docker/leovct/zkevm-contracts/tags "zkevm_da_image": "0xpolygon/cdk-data-availability:0.0.11", # https://hub.docker.com/r/0xpolygon/cdk-data-availability/tags "zkevm_node_image": "hermeznetwork/zkevm-node:v0.7.3", # https://hub.docker.com/r/hermeznetwork/zkevm-node/tags "zkevm_pool_manager_image": "hermeznetwork/zkevm-pool-manager:v0.1.2", # https://hub.docker.com/r/hermeznetwork/zkevm-pool-manager/tags - "zkevm_prover_image": "hermeznetwork/zkevm-prover:v8.0.0-RC14-fork.12", # https://hub.docker.com/r/hermeznetwork/zkevm-prover/tags + "zkevm_prover_image": "hermeznetwork/zkevm-prover:v8.0.0-RC16-fork.12", # https://hub.docker.com/r/hermeznetwork/zkevm-prover/tags "zkevm_sequence_sender_image": "hermeznetwork/zkevm-sequence-sender:v0.2.4", # https://hub.docker.com/r/hermeznetwork/zkevm-sequence-sender/tags - "anvil_image": "ghcr.io/foundry-rs/foundry:v1.0.0-rc", # https://github.com/foundry-rs/foundry/pkgs/container/foundry/versions?filters%5Bversion_type%5D=tagged - "mitm_image": "mitmproxy/mitmproxy:11.1.2", # https://hub.docker.com/r/mitmproxy/mitmproxy/tags + "anvil_image": "ghcr.io/foundry-rs/foundry:v1.0.0", # https://github.com/foundry-rs/foundry/pkgs/container/foundry/versions?filters%5Bversion_type%5D=tagged + "mitm_image": "mitmproxy/mitmproxy:11.1.3", # https://hub.docker.com/r/mitmproxy/mitmproxy/tags } DEFAULT_PORTS = { From 7659fc055172ef5059037d5375f4f7c35ba3f6d5 Mon Sep 17 00:00:00 2001 From: Ji Hwan Date: Wed, 19 Feb 2025 20:01:21 +0900 Subject: [PATCH 28/28] chore: cleanup Signed-off-by: Ji Hwan --- input_parser.star | 2 -- 1 file changed, 2 deletions(-) diff --git a/input_parser.star b/input_parser.star index a2124471..a68c5e1b 100644 --- a/input_parser.star +++ b/input_parser.star @@ -337,8 +337,6 @@ DEFAULT_OP_STACK_ARGS = { # "batcher_params": { # "image": "us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher", # }, - # The OP package does not run the op-proposer for now. - # https://github.com/ethpandaops/optimism-package/blob/0d60a9d3997f83ecee6f7f6695027f819d776309/src/participant_network.star#L87 # "proposer_params": { # "image": "us-docker.pkg.dev/oplabs-tools-artifacts/images/op-proposer", # },