diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 38c6ffeac..ab89f70b1 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -28,36 +28,57 @@ jobs: # Deploy the CDK environment with cdk-erigon, serving as the sequencer. # Set up the cdk-node for the remaining components. # Additionally, deploy cdk-erigon and zkevm-node as permissionless nodes or RPCs. - - name: Deploy Kurtosis CDK package + - name: Deploy L1 chain and a first CDK L2 chain (erigon) run: | - kurtosis run \ - --enclave=${{ env.ENCLAVE_NAME }} \ - --show-enclave-inspect=false \ - --args-file=params.yml \ - . \ - '{ - "deploy_cdk_erigon_node": true, - "args": { - "sequencer_type": "erigon", - "l1_seconds_per_slot": 1, - "additional_services": [ - "pless_zkevm_node", - "tx_spammer" - ] - } - }' + yq -Y --in-place '.args.additional_services = ["pless_zkevm_node", "tx_spammer"]' params.yml + kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --show-enclave-inspect=false --args-file=params.yml . - name: Inspect enclave run: kurtosis enclave inspect ${{ env.ENCLAVE_NAME }} - - name: Monitor verified batches (CDK Erigon Permissionless RPC) + - name: Attach a second CDK L2 chain (erigon) + run: | + yq -Y --in-place '.args.additional_services = ["pless_zkevm_node", "tx_spammer"]' agglayer-attach-cdk-params.yml + kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --show-enclave-inspect=false --args-file=agglayer-attach-cdk-params.yml . + + - name: Inspect enclave + run: kurtosis enclave inspect ${{ env.ENCLAVE_NAME }} + + - 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 the second chain. + tomlq -Y --toml-output --in-place '.FullNodeRPCs += {"2": "http://cdk-erigon-node-002:8123"}' agglayer-config.toml + proof_signer_2="$(yq --raw-output .args.zkevm_l2_sequencer_address ../agglayer-attach-cdk-params.yml)" + tomlq -Y --toml-output --arg proofSigner2 "$proof_signer_2" --in-place '.ProofSigners += {"2": $proofSigner2}' agglayer-config.toml + + # Replace the agglayer config. + agglayer_container_id="$(docker ps --filter "name=zkevm-agglayer" --format "{{.ID}}")" + docker cp agglayer-config.toml "$agglayer_container_id:/etc/zkevm/agglayer-config.toml" + + # Restart the agglayer service. + kurtosis service stop ${{ env.ENCLAVE_NAME }} zkevm-agglayer-001 + kurtosis service start ${{ env.ENCLAVE_NAME }} zkevm-agglayer-001 + + - name: Monitor verified batches of the first L2 chain (CDK Erigon Permissionless RPC) working-directory: .github/scripts run: ./monitor-verified-batches.sh --rpc-url "$(kurtosis port print ${{ env.ENCLAVE_NAME }} cdk-erigon-node-001 http-rpc)" - - name: Monitor verified batches (zkEVM Node Permissionless RPC) + - name: Monitor verified batches of the first L2 chain (zkEVM Node Permissionless RPC) working-directory: .github/scripts run: ./monitor-verified-batches.sh --rpc-url "$(kurtosis port print ${{ env.ENCLAVE_NAME }} zkevm-node-rpc-pless-001 http-rpc)" + - name: Monitor verified batches of the second L2 chain (CDK Erigon Permissionless RPC) + working-directory: .github/scripts + run: ./monitor-verified-batches.sh --rpc-url "$(kurtosis port print ${{ env.ENCLAVE_NAME }} cdk-erigon-node-002 http-rpc)" + + - name: Monitor verified batches of the second L2 chain (zkEVM Node Permissionless RPC) + working-directory: .github/scripts + run: ./monitor-verified-batches.sh --rpc-url "$(kurtosis port print ${{ env.ENCLAVE_NAME }} zkevm-node-rpc-pless-002 http-rpc)" + zkevm: runs-on: ubuntu-latest timeout-minutes: 20 @@ -70,38 +91,63 @@ jobs: # Deploy the CDK environment with zkevm-node, serving as the sequencer. # Also set up the zkevm-node for the remaining components. # Additionally, deploy zkevm-node as permissionless node or RPC. - - name: Deploy Kurtosis CDK package + - name: Deploy L1 chain and a first CDK L2 chain (zkevm) + run: | + yq -Y --in-place '.deploy_cdk_erigon_node = false' params.yml + yq -Y --in-place '.args.sequencer_type = "zkevm"' params.yml + yq -Y --in-place '.args.additional_services = ["pless_zkevm_node", "tx_spammer"]' params.yml + kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --show-enclave-inspect=false --args-file=params.yml . + + - name: Inspect enclave + run: kurtosis enclave inspect ${{ env.ENCLAVE_NAME }} + + - name: Attach a second CDK L2 chain (erigon) run: | - kurtosis run \ - --enclave=${{ env.ENCLAVE_NAME }} \ - --show-enclave-inspect=false \ - --args-file=params.yml \ - . \ - '{ - "deploy_cdk_erigon_node": false, - "args": { - "sequencer_type": "zkevm", - "l1_seconds_per_slot": 1, - "additional_services": [ - "pless_zkevm_node", - "tx_spammer" - ] - } - }' + yq -Y --in-place '.args.additional_services = ["pless_zkevm_node", "tx_spammer"]' agglayer-attach-cdk-params.yml + kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --show-enclave-inspect=false --args-file=agglayer-attach-cdk-params.yml . - name: Inspect enclave run: kurtosis enclave inspect ${{ env.ENCLAVE_NAME }} - - name: Monitor verified batches (zkEVM Node Trusted RPC) + - 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 the second chain. + tomlq -Y --toml-output --in-place '.FullNodeRPCs += {"2": "http://cdk-erigon-node-002:8123"}' agglayer-config.toml + proof_signer_2="$(yq --raw-output .args.zkevm_l2_sequencer_address ../agglayer-attach-cdk-params.yml)" + tomlq -Y --toml-output --arg proofSigner2 "$proof_signer_2" --in-place '.ProofSigners += {"2": $proofSigner2}' agglayer-config.toml + + # Replace the agglayer config. + agglayer_container_id="$(docker ps --filter "name=zkevm-agglayer" --format "{{.ID}}")" + docker cp agglayer-config.toml "$agglayer_container_id:/etc/zkevm/agglayer-config.toml" + + # Restart the agglayer service. + kurtosis service stop ${{ env.ENCLAVE_NAME }} zkevm-agglayer-001 + kurtosis service start ${{ env.ENCLAVE_NAME }} zkevm-agglayer-001 + + - name: Monitor verified batches of the first L2 chain (zkEVM Node Trusted RPC) working-directory: .github/scripts run: ./monitor-verified-batches.sh --rpc-url "$(kurtosis port print ${{ env.ENCLAVE_NAME }} zkevm-node-rpc-001 http-rpc)" - - name: Monitor verified batches (zkEVM Node Permissionless RPC) + - name: Monitor verified batches of the first L2 chain (zkEVM Node Permissionless RPC) working-directory: .github/scripts run: ./monitor-verified-batches.sh --rpc-url "$(kurtosis port print ${{ env.ENCLAVE_NAME }} zkevm-node-rpc-pless-001 http-rpc)" # TODO(nit): Deploy a CDK Erigon Permissionless RPC and check that it can sync. + - name: Monitor verified batches of the second L2 chain (CDK Erigon Permissionless RPC) + working-directory: .github/scripts + run: ./monitor-verified-batches.sh --rpc-url "$(kurtosis port print ${{ env.ENCLAVE_NAME }} cdk-erigon-node-002 http-rpc)" + + - name: Monitor verified batches of the second L2 chain (zkEVM Node Permissionless RPC) + working-directory: .github/scripts + run: ./monitor-verified-batches.sh --rpc-url "$(kurtosis port print ${{ env.ENCLAVE_NAME }} zkevm-node-rpc-pless-002 http-rpc)" + + # TODO(nit): Deploy a CDK Erigon Permissionless RPC and check that it can sync. + additional_services: runs-on: ubuntu-latest timeout-minutes: 20 @@ -111,26 +157,10 @@ jobs: - name: Install Kurtosis CDK tools uses: ./.github/actions/setup-kurtosis-cdk - # Deploy the default CDK environment with all additional services enabled. - - name: Deploy Kurtosis CDK package + - name: Deploy Kurtosis CDK package with additional services run: | - kurtosis run \ - --enclave=${{ env.ENCLAVE_NAME }} \ - --show-enclave-inspect=false \ - --args-file=params.yml \ - . \ - '{ - "args": { - "l1_seconds_per_slot": 1, - "additional_services": [ - "blockscout", - "blutgang", - "panoptichain", - "pless_zkevm_node", - "prometheus_grafana", - ] - } - }' + yq -Y --in-place '.args.additional_services = ["blockscout", "blutgang", "pless_zkevm_node", "prometheus_grafana", "tx_spammer"]' params.yml + kurtosis run --enclave=${{ env.ENCLAVE_NAME }} --show-enclave-inspect=false --args-file=params.yml . - name: Inspect enclave run: kurtosis enclave inspect ${{ env.ENCLAVE_NAME }} diff --git a/README.md b/README.md index 79c90a890..c98b26df1 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,7 @@ Below is a list of services available for deployment using Kurtosis: | `blutgang` | Deploys [Blutgang](https://github.com/rainshowerLabs/blutgang), an Ethereum load balancer that distributes network traffic evenly across multiple nodes to ensure high availability. | | `pless_zkevm_node` | Deploys a permissionless [zkevm-node](https://github.com/0xPolygonHermez/zkevm-node). | | `prometheus_grafana` | Deploys [Prometheus](https://github.com/prometheus/prometheus) and [Grafana](https://github.com/grafana/grafana), two powerful monitoring tools that collect and visualize metrics for blockchain infrastructure health and performance. Additionally, it deploys [Panoptichain](https://github.com/0xPolygon/panoptichain), enhancing monitoring capabilities by allowing users to observe on-chain data and generate detailed Polygon CDK blockchain metrics. | +| `tx_spammer` | Deploys a transaction spammer. | Here is a simple example that deploys Blockscout, Prometheus, Grafana, and Panoptichain: diff --git a/agglayer-attach-cdk-params.yml b/agglayer-attach-cdk-params.yml new file mode 100644 index 000000000..a24814a9f --- /dev/null +++ b/agglayer-attach-cdk-params.yml @@ -0,0 +1,170 @@ +--- +# Deployment parameters. +# The deployment process is divided into various stages. + +# Deploy local L1. +deploy_l1: false + +# Deploy zkevm contracts on L1 (and also fund accounts). +deploy_zkevm_contracts_on_l1: true + +# Deploy zkevm node and cdk peripheral databases. +deploy_databases: true + +# Deploy cdk central/trusted environment. +deploy_cdk_central_environment: true + +# Deploy cdk/bridge infrastructure. +deploy_cdk_bridge_infra: true + +# Deploy cdk-erigon node. +deploy_cdk_erigon_node: true + +args: + # Suffix appended to service names. + # Note: It should be a string. + deployment_suffix: "-002" + + # The type of the sequencer to deploy. + # Options: + # - 'erigon': Use the new sequencer (https://github.com/0xPolygonHermez/cdk-erigon). + # - 'zkevm': Use the legacy sequencer (https://github.com/0xPolygonHermez/zkevm-node). + sequencer_type: erigon + + # Deploy agglayer. + deploy_agglayer: false + + # The type of data availability to use. + # Options: + # - 'rollup': Transaction data is stored on-chain on L1. + # - 'cdk-validium': Transaction data is stored off-chain using the CDK DA layer and a DAC. + # In the future, we would like to support external DA protocols such as Avail, Celestia and Near. + data_availability_mode: cdk-validium + + # Additional services to run alongside the network. + additional_services: [] + + # Docker images and repositories used to spin up services. + zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.3-RC20 + zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0 + cdk_validium_node_image: 0xpolygon/cdk-validium-node:0.7.0-cdk + cdk_node_image: ghcr.io/0xpolygon/cdk:0.0.9 + zkevm_da_image: 0xpolygon/cdk-data-availability:0.0.7 + zkevm_contracts_image: leovct/zkevm-contracts # the tag is automatically replaced by the value of /zkevm_rollup_fork_id/ + + # zkevm_agglayer_image: 0xpolygon/agglayer:0.1.3 + zkevm_agglayer_image: ghcr.io/agglayer/agglayer-rs:main + zkevm_bridge_service_image: hermeznetwork/zkevm-bridge-service:v0.5.0-RC9 + zkevm_bridge_ui_image: leovct/zkevm-bridge-ui:multi-network + zkevm_bridge_proxy_image: haproxy:2.9.9-bookworm + zkevm_sequence_sender_image: hermeznetwork/zkevm-sequence-sender:v0.2.0-RC4 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:2.0.0-beta15 + zkevm_pool_manager_image: hermeznetwork/zkevm-pool-manager:v0.1.0-RC1 + + # Port configuration. + zkevm_hash_db_port: 50061 + zkevm_executor_port: 50071 + zkevm_aggregator_port: 50081 + zkevm_pprof_port: 6060 + zkevm_prometheus_port: 9091 + zkevm_data_streamer_port: 6900 + zkevm_rpc_http_port: 8123 + zkevm_rpc_ws_port: 8133 + zkevm_bridge_rpc_port: 8080 + zkevm_bridge_grpc_port: 9090 + zkevm_bridge_ui_port: 80 + zkevm_agglayer_port: 4444 + zkevm_dac_port: 8484 + zkevm_pool_manager_port: 8545 + + # 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 9 | tee keys.txt | jq -r '.Addresses[] | [.ETHAddress, .HexPrivateKey] | @tsv' | awk 'BEGIN{split("sequencer,aggregator,claimtxmanager,timelock,admin,loadtest,agglayer,dac,proofsigner",roles,",")} {print "zkevm_l2_" roles[NR] "_address: \"" $1 "\""; print "zkevm_l2_" roles[NR] "_private_key: \"0x" $2 "\"\n"}' + zkevm_l2_sequencer_address: "0xF4ee37aAc3ccd6B71A4a795700b065d2CA479581" + zkevm_l2_sequencer_private_key: "39fa0e0993fdde70f16434fe5085cc7992bb82aa8acc765acc9f8c79d7751350" + + zkevm_l2_aggregator_address: "0x78DE6D4fD4848d7A79cBB5117FED025e2d482bED" + zkevm_l2_aggregator_private_key: "a624aee34e44e828a03bd8ecbeca5807d9187351e6772995b82c15f5610a4cf2" + + zkevm_l2_claimtxmanager_address: "0xf909b5F902D19CACB8B06c037bEf0a5345E99331" + zkevm_l2_claimtxmanager_private_key: "410affbfff4ba53a8784d3c71f983feeb410d3be0e4f7fec4dba1612bbcc4acf" + + zkevm_l2_timelock_address: "0x901b68102f6C695D62692499EB92e2B02E69A106" + zkevm_l2_timelock_private_key: "58397f0a1789f1d97cb9d9eb986fb05831d18b410b496d7baf66bac9baa7c952" + + zkevm_l2_admin_address: "0xE34aaF64b29273B7D567FCFc40544c014EEe9970" + zkevm_l2_admin_private_key: "0x12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625" + + zkevm_l2_loadtest_address: "0x2d1bd6e35fD386066fDebbf54eb75B436DFa93b4" + zkevm_l2_loadtest_private_key: "c63cd87974fc7742a5f92df58e365517e4ef134864cd8b1d600d1fdf3d3d5049" + + zkevm_l2_agglayer_address: "0x351e560852ee001d5D19b5912a269F849f59479a" + zkevm_l2_agglayer_private_key: "0x1d45f90c0a9814d8b8af968fa0677dab2a8ff0266f33b136e560fe420858a419" + + zkevm_l2_dac_address: "0xfA2542aca48930aae82C9291f1F029a189C6921b" + zkevm_l2_dac_private_key: "3d7ca1abd8651954b6d060e06c2d2cee72cb95252f2ec48c0034c3fb078eecf1" + + zkevm_l2_proofsigner_address: "0x101026E7dADbDd880Bef32884eb63A414C939bb6" + zkevm_l2_proofsigner_private_key: "f46b741e1571a2186b7f4f0a9c6dc25697b36eabbe7ea03da3a3f1b2d060b56c" + + # Keystore password. + zkevm_l2_keystore_password: pSnv6Dh5s9ahuzGzH9RoCDrKAMddaX3m + + ## L1 configuration. + l1_chain_id: 271828 + l1_preallocated_mnemonic: code code code code code code code code code code code quality + l1_funding_amount: 100ether + l1_rpc_url: http://el-1-geth-lighthouse:8545 + l1_ws_url: ws://el-1-geth-lighthouse:8546 + # https://github.com/ethpandaops/ethereum-package/tree/main?tab=readme-ov-file#configuration + l1_additional_services: [ + # blockscout, # block explorer + # dora, # beaconchain explorer + # el_forkmon, # fork monitor tool + ] + l1_preset: minimal + l1_seconds_per_slot: 1 + + ## Rollup configuration. + + # The chain id of the new rollup. + zkevm_rollup_chain_id: 20202 + + # The fork id of the new rollup. It indicates the prover (zkROM/executor) version. + zkevm_rollup_fork_id: 9 + + # If erigon is being used as the sequencer, this flag will enable a stateless executor to verify the execution of the batches. + erigon_strict_mode: true + + # The address of the rollup manager contract deployer on L1. + zkevm_rollup_manager_deployer: "0xE34aaF64b29273B7D567FCFc40544c014EEe9970" + zkevm_rollup_manager_deployer_private_key: "0x12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625" + rollup_manager_address: "0x2F50ef6b8e8Ee4E579B17619A92dE3E2ffbD8AD2" + # The address of the L2 gas token. + zkevm_gas_token_address: "0xEdE9cf798E0fE25D35469493f43E88FeA4a5da0E" + # The rollup type ID. + zkevm_rollup_type_id: "1" + # The rollup ID. This should increment by 1 with each additional CDKs being created using the rollup manager contract. + zkevm_rollup_id: 2 + + # The address of the rollup manager contract on L1. + # If specified, the rollup data will be retrieved from this contract instead of using the contracts service. + # zkevm_rollup_manager_address: "" + # # The block number at which the rollup manager contract was deployed. + # zkevm_rollup_manager_block_number: 0 + # # The address of the global exit root contract on L2. + # zkevm_global_exit_root_l2_address: "" + # # The address of the Polygon data committee contract on L1. + # polygon_data_committee_address: "" + + polygon_zkevm_explorer: https://explorer.private/ + l1_explorer_url: https://sepolia.etherscan.io/ + + # If this is true, we will automatically deploy an ERC20 contract on + # L1 to be used at the gasTokenAddress + zkevm_use_gas_token_contract: false + + ## Permissionless node configuration. + trusted_sequencer_node_uri: zkevm-node-sequencer-001:6900 + zkevm_aggregator_host: zkevm-node-aggregator-001 + genesis_file: templates/permissionless-node/genesis.json diff --git a/cdk_bridge_infra.star b/cdk_bridge_infra.star index 91356e9e9..ff9676780 100644 --- a/cdk_bridge_infra.star +++ b/cdk_bridge_infra.star @@ -22,29 +22,37 @@ def run(plan, args): ) # Create the agglayer service config. - agglayer_config_artifact = create_agglayer_config_artifact( - plan, args, contract_setup_addresses, db_configs - ) - agglayer_keystore_artifact = plan.store_service_files( - name="agglayer-keystore", - service_name="contracts" + args["deployment_suffix"], - src="/opt/zkevm/agglayer.keystore", - ) - agglayer_config = zkevm_agglayer_package.create_agglayer_service_config( - args, agglayer_config_artifact, agglayer_keystore_artifact - ) + if args["deploy_agglayer"]: + agglayer_config_artifact = create_agglayer_config_artifact( + plan, args, contract_setup_addresses, db_configs + ) + agglayer_keystore_artifact = plan.store_service_files( + name="agglayer-keystore", + service_name="contracts" + args["deployment_suffix"], + src="/opt/zkevm/agglayer.keystore", + ) + agglayer_config = zkevm_agglayer_package.create_agglayer_service_config( + args, agglayer_config_artifact, agglayer_keystore_artifact + ) # Start the bridge service and the agglayer. - bridge_infra_services = plan.add_services( - configs=bridge_config | agglayer_config, - description="Starting bridge infra", - ) + if args["deploy_agglayer"]: + bridge_infra_services = plan.add_services( + configs=bridge_config | agglayer_config, + description="Starting bridge infra", + ) + else: + bridge_infra_services = plan.add_services( + configs=bridge_config, + description="Starting bridge infra", + ) # Start the bridge UI. bridge_ui_config_artifact = create_bridge_ui_config_artifact( plan, args, contract_setup_addresses ) - zkevm_bridge_package.start_bridge_ui(plan, args, bridge_ui_config_artifact) + if args["deploy_agglayer"]: + zkevm_bridge_package.start_bridge_ui(plan, args, bridge_ui_config_artifact) # Start the bridge UI reverse proxy. This is only relevant / needed if we have a fake l1 if args["deploy_l1"]: @@ -70,6 +78,7 @@ def create_agglayer_config_artifact(plan, args, contract_setup_addresses, db_con "zkevm_l2_proofsigner_address": args[ "zkevm_l2_proofsigner_address" ], + "zkevm_l2_sequencer_address": args["zkevm_l2_sequencer_address"], # ports "zkevm_rpc_http_port": args["zkevm_rpc_http_port"], "zkevm_agglayer_port": args["zkevm_agglayer_port"], diff --git a/docs/attach-multiple-cdks.md b/docs/attach-multiple-cdks.md new file mode 100644 index 000000000..8e44d42e7 --- /dev/null +++ b/docs/attach-multiple-cdks.md @@ -0,0 +1,39 @@ +## Attach Multiple CDKs to the Agglayer + +By default, the Agglayer service will be deployed with the above deployment instructions. To create a devnet with multiple rollups attached to the agglayer: + +```bash +kurtosis run --enclave cdk-v1 --args-file agglayer-attach-cdk-params.yml . +``` + +The above command will use `agglayer-attach-cdk-params.yml` as the input params which have a few tweaked parameters to attach to the existing Agglayer service. +After running the above additional deployment command, the `agglayer-config.toml` needs to be edited to settle the signed transactions from the rollups. + +```bash +# Shell into the Agglayer service +kurtosis service shell cdk-v1 zkevm-agglayer-001 + +# Edit the agglayer-config.toml file +vim /etc/zkevm/agglayer-config.toml +``` + +The `agglayer-config.toml` file should be changed as follows: +```bash +[FullNodeRPCs] +# RPC of the first rollup node +1 = "http://cdk-erigon-node-001:8123" +# RPC of the second rollup node +2 = "http://cdk-erigon-node-002:8123" + +[ProofSigners] +# Sequencer address for first rollup +1 = "0x5b06837A43bdC3dD9F114558DAf4B26ed49842Ed" +# Sequencer address for second rollup +2 = "0xF4ee37aAc3ccd6B71A4a795700b065d2CA479581" +``` + +Then restart the Agglayer service +```bash +kurtosis service stop cdk-v1 zkevm-agglayer-001 +kurtosis service start cdk-v1 zkevm-agglayer-001 +``` diff --git a/input_parser.star b/input_parser.star index c4f6bb940..45227fe9f 100644 --- a/input_parser.star +++ b/input_parser.star @@ -1,5 +1,6 @@ DEFAULT_ARGS = { "deployment_suffix": "-001", + "deploy_agglayer": True, "sequencer_type": "erigon", "data_availability_mode": "cdk-validium", "additional_services": [], @@ -15,7 +16,6 @@ DEFAULT_ARGS = { "zkevm_bridge_proxy_image": "haproxy:2.9.9-bookworm", "zkevm_sequence_sender_image": "hermeznetwork/zkevm-sequence-sender:v0.2.0-RC4", "cdk_erigon_node_image": "hermeznetwork/cdk-erigon:2.0.0-beta15", - "toolbox_image": "leovct/toolbox:0.0.2", "zkevm_pool_manager_image": "hermeznetwork/zkevm-pool-manager:v0.1.0-RC1", "zkevm_hash_db_port": 50061, "zkevm_executor_port": 50071, @@ -59,6 +59,7 @@ DEFAULT_ARGS = { "l1_preset": "minimal", "l1_seconds_per_slot": 1, "zkevm_rollup_chain_id": 10101, + "zkevm_rollup_id": 1, "zkevm_rollup_fork_id": 9, "erigon_strict_mode": True, "polygon_zkevm_explorer": "https://explorer.private/", diff --git a/kurtosis.yml b/kurtosis.yml index fc2bfe894..e3cf651cf 100644 --- a/kurtosis.yml +++ b/kurtosis.yml @@ -30,6 +30,8 @@ description: |- sequencer_type: erigon + deploy_agglayer: true + # The type of data availability to use. # Options: # - 'rollup': Transaction data is stored on-chain on L1. @@ -61,7 +63,6 @@ description: |- zkevm_sequence_sender_image: hermeznetwork/zkevm-sequence-sender:v0.2.0-RC4 cdk_erigon_node_image: hermeznetwork/cdk-erigon:2.0.0-beta15 - toolbox_image: leovct/toolbox:0.0.2 zkevm_pool_manager_image: hermeznetwork/zkevm-pool-manager:v0.1.0-RC1 # Port configuration. @@ -133,6 +134,9 @@ description: |- # The chain id of the new rollup. zkevm_rollup_chain_id: 10101 + # The rollupID of the CDK. + zkevm_rollup_id: 1 + # The fork id of the new rollup. It indicates the prover (zkROM/executor) version. zkevm_rollup_fork_id: 9 diff --git a/lib/service.star b/lib/service.star index a0d35b1b1..7bb2d62f3 100644 --- a/lib/service.star +++ b/lib/service.star @@ -4,6 +4,9 @@ data_availability_package = import_module("./data_availability.star") def get_contract_setup_addresses(plan, args): extract = { "zkevm_bridge_address": "fromjson | .polygonZkEVMBridgeAddress", + "zkevm_l2_bridge_address": "fromjson | .polygonZkEVMBridgeAddress", + "zkevm_gen_block_number": "fromjson | .deploymentRollupManagerBlockNumber", + "polygon_data_committee_address": "fromjson | .polygonDataCommitteeAddress", "zkevm_rollup_address": "fromjson | .rollupAddress", "zkevm_rollup_manager_address": "fromjson | .polygonRollupManagerAddress", "zkevm_rollup_manager_block_number": "fromjson | .deploymentRollupManagerBlockNumber", @@ -22,8 +25,10 @@ def get_contract_setup_addresses(plan, args): extract=extract, ) service_name = "contracts" - if "zkevm_rollup_manager_address" in args: - service_name = "helper" + if args["deploy_agglayer"]: + plan.print("Changing querying service name to helper") + if "zkevm_rollup_manager_address" in args: + service_name = "helper" service_name += args["deployment_suffix"] result = plan.exec( description="Getting contract setup addresses from {} service".format( diff --git a/main.star b/main.star index 512d666a9..491b0401a 100644 --- a/main.star +++ b/main.star @@ -17,9 +17,13 @@ prometheus_package = "./src/additional_services/prometheus.star" tx_spammer_package = "./src/additional_services/tx_spammer.star" +TX_SPAMMER_IMG = "leovct/toolbox:0.0.2" + + def run( plan, deploy_l1=True, + deploy_agglayer=True, deploy_zkevm_contracts_on_l1=True, deploy_databases=True, deploy_cdk_bridge_infra=True, @@ -55,14 +59,15 @@ def run( plan.print("Skipping the deployment of zkevm contracts on L1") # Deploy helper service to retrieve rollup data from rollup manager contract. - if ( - "zkevm_rollup_manager_address" in args - and "zkevm_rollup_manager_block_number" in args - and "zkevm_global_exit_root_l2_address" in args - and "polygon_data_committee_address" in args - ): - plan.print("Deploying helper service to retrieve rollup data") - deploy_helper_service(plan, args) + if deploy_agglayer: + if ( + "zkevm_rollup_manager_address" in args + and "zkevm_rollup_manager_block_number" in args + and "zkevm_global_exit_root_l2_address" in args + and "polygon_data_committee_address" in args + ): + plan.print("Deploying helper service to retrieve rollup data") + deploy_helper_service(plan, args) else: plan.print("Skipping the deployment of helper service to retrieve rollup data") @@ -146,13 +151,12 @@ def run( for index, additional_service in enumerate(additional_services): if additional_service == "blockscout": deploy_additional_service(plan, "blockscout", blockscout_package, args) + elif additional_service == "blutgang": + deploy_additional_service(plan, "blutgang", blutgang_package, args) elif additional_service == "prometheus_grafana": deploy_additional_service(plan, "prometheus", prometheus_package, args) deploy_additional_service(plan, "grafana", grafana_package, args) - elif additional_service == "panoptichain": deploy_additional_service(plan, "panoptichain", panoptichain_package, args) - elif additional_service == "blutgang": - deploy_additional_service(plan, "blutgang", blutgang_package, args) elif additional_service == "tx_spammer": deploy_additional_service(plan, "tx_spammer", tx_spammer_package, args) else: @@ -180,7 +184,7 @@ def deploy_helper_service(plan, args): plan.add_service( name=helper_service_name, config=ServiceConfig( - image=args["toolbox_image"], + image=TX_SPAMMER_IMG, files={"/opt/zkevm": get_rollup_info_artifact}, # These two lines are only necessary to deploy to any Kubernetes environment (e.g. GKE). entrypoint=["bash", "-c"], diff --git a/params.yml b/params.yml index 42f4f6146..2aa5dd33a 100644 --- a/params.yml +++ b/params.yml @@ -31,6 +31,9 @@ args: # - 'zkevm': Use the legacy sequencer (https://github.com/0xPolygonHermez/zkevm-node). sequencer_type: erigon + # Deploy agglayer. + deploy_agglayer: true + # The type of data availability to use. # Options: # - 'rollup': Transaction data is stored on-chain on L1. @@ -42,26 +45,20 @@ args: additional_services: [] # Docker images and repositories used to spin up services. - # zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC5-fork.12 zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.3-RC20 - # zkevm_prover_image: hermeznetwork/zkevm-prover:v4.0.19 - zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0 cdk_validium_node_image: 0xpolygon/cdk-validium-node:0.7.0-cdk cdk_node_image: ghcr.io/0xpolygon/cdk:0.0.9 - zkevm_da_image: 0xpolygon/cdk-data-availability:0.0.7 - zkevm_contracts_image: leovct/zkevm-contracts # the tag is automatically replaced by the value of /zkevm_rollup_fork_id/ # zkevm_agglayer_image: 0xpolygon/agglayer:0.1.3 zkevm_agglayer_image: ghcr.io/agglayer/agglayer-rs:main - zkevm_bridge_service_image: hermeznetwork/zkevm-bridge-service:v0.4.2 + zkevm_bridge_service_image: hermeznetwork/zkevm-bridge-service:v0.5.0-RC9 zkevm_bridge_ui_image: leovct/zkevm-bridge-ui:multi-network zkevm_bridge_proxy_image: haproxy:2.9.9-bookworm zkevm_sequence_sender_image: hermeznetwork/zkevm-sequence-sender:v0.2.0-RC4 cdk_erigon_node_image: hermeznetwork/cdk-erigon:2.0.0-beta15 - toolbox_image: leovct/toolbox:0.0.2 zkevm_pool_manager_image: hermeznetwork/zkevm-pool-manager:v0.1.0-RC1 # Port configuration. @@ -119,7 +116,7 @@ args: l1_funding_amount: 100ether l1_rpc_url: http://el-1-geth-lighthouse:8545 l1_ws_url: ws://el-1-geth-lighthouse:8546 - # https://github.com/kurtosis-tech/ethereum-package/tree/main?tab=readme-ov-file#configuration + # https://github.com/ethpandaops/ethereum-package/tree/main?tab=readme-ov-file#configuration l1_additional_services: [ # blockscout, # block explorer # dora, # beaconchain explorer @@ -133,6 +130,9 @@ args: # The chain id of the new rollup. zkevm_rollup_chain_id: 10101 + # The rollupID of the CDK. + zkevm_rollup_id: 1 + # The fork id of the new rollup. It indicates the prover (zkROM/executor) version. zkevm_rollup_fork_id: 9 diff --git a/src/additional_services/tx_spammer.star b/src/additional_services/tx_spammer.star index dc1dda2d5..e954a818a 100644 --- a/src/additional_services/tx_spammer.star +++ b/src/additional_services/tx_spammer.star @@ -1,12 +1,14 @@ service_package = import_module("../../lib/service.star") +TX_SPAMMER_IMG = "leovct/toolbox:0.0.2" + def run(plan, args): tx_spammer_config_artifacts = get_tx_spammer_config(plan, args) plan.add_service( name="tx-spammer" + args["deployment_suffix"], config=ServiceConfig( - image=args["toolbox_image"], + image=TX_SPAMMER_IMG, files={ "/usr/local/bin": Directory( artifact_names=[tx_spammer_config_artifacts] diff --git a/templates/bridge-infra/.env b/templates/bridge-infra/.env index 5147ea51d..97b16af73 100644 --- a/templates/bridge-infra/.env +++ b/templates/bridge-infra/.env @@ -9,7 +9,7 @@ ETHEREUM_ROLLUP_MANAGER_ADDRESS={{.zkevm_rollup_manager_address}} # POLYGON ZK EVM POLYGON_ZK_EVM_RPC_URL=/l2rpc POLYGON_ZK_EVM_EXPLORER_URL={{.zkevm_explorer_url}} -POLYGON_ZK_EVM_BRIDGE_CONTRACT_ADDRESS={{.zkevm_bridge_address}} +POLYGON_ZK_EVM_BRIDGE_CONTRACT_ADDRESS={{.zkevm_l2_bridge_address}} POLYGON_ZK_EVM_NETWORK_ID=1 # BRIDGE API diff --git a/templates/bridge-infra/agglayer-config.toml b/templates/bridge-infra/agglayer-config.toml index 6d43303b5..4a03305fd 100644 --- a/templates/bridge-infra/agglayer-config.toml +++ b/templates/bridge-infra/agglayer-config.toml @@ -3,7 +3,7 @@ 1 = "http://{{.l2_rpc_name}}{{.deployment_suffix}}:{{.zkevm_rpc_http_port}}" [ProofSigners] -# 1 = "{{.zkevm_l2_proofsigner_address}}" +1 = "{{.zkevm_l2_sequencer_address}}" [RPC] Host = "0.0.0.0" diff --git a/templates/bridge-infra/bridge-config.toml b/templates/bridge-infra/bridge-config.toml index e3b04c41d..e174e3c57 100644 --- a/templates/bridge-infra/bridge-config.toml +++ b/templates/bridge-infra/bridge-config.toml @@ -41,12 +41,12 @@ BridgeVersion = "v1" MaxConns = 20 [NetworkConfig] -GenBlockNumber = "{{.zkevm_rollup_manager_block_number}}" +GenBlockNumber = 0 PolygonBridgeAddress = "{{.zkevm_bridge_address}}" PolygonZkEVMGlobalExitRootAddress = "{{.zkevm_global_exit_root_address}}" PolygonRollupManagerAddress = "{{.zkevm_rollup_manager_address}}" PolygonZkEVMAddress = "{{.zkevm_rollup_address}}" -L2PolygonBridgeAddresses = ["{{.zkevm_bridge_address}}"] +L2PolygonBridgeAddresses = ["{{.zkevm_l2_bridge_address}}"] [ClaimTxManager] FrequencyToMonitorTxs = "5s" diff --git a/templates/cdk-erigon/config.yml b/templates/cdk-erigon/config.yml index 86d6bca18..fe5f7c6b5 100644 --- a/templates/cdk-erigon/config.yml +++ b/templates/cdk-erigon/config.yml @@ -45,7 +45,7 @@ zkevm.pool-manager-url: "http://zkevm-pool-manager{{.deployment_suffix}}:{{.zkev zkevm.l1-chain-id: {{.l1_chain_id}} zkevm.l1-first-block: 1 zkevm.l1-matic-contract-address: "{{.pol_token_address}}" -zkevm.l1-rollup-id: 1 +zkevm.l1-rollup-id: {{.zkevm_rollup_id}} zkevm.l1-rpc-url: {{.l1_rpc_url}} zkevm.l2-chain-id: {{.zkevm_rollup_chain_id}} diff --git a/templates/contract-deploy/run-contract-setup.sh b/templates/contract-deploy/run-contract-setup.sh index 4c7cd66c6..15dd4255d 100755 --- a/templates/contract-deploy/run-contract-setup.sh +++ b/templates/contract-deploy/run-contract-setup.sh @@ -1,6 +1,7 @@ #!/bin/bash # This script is responsible for deploying the contracts for zkEVM/CDK. set -x + echo_ts() { timestamp=$(date +"[%Y-%m-%d %H:%M:%S]") echo "$timestamp $1" @@ -46,12 +47,56 @@ fund_account_on_l1() { "$address" } +mint_gas_token_on_l1() { + address="$1" + echo_ts "Minting POL to $address" + cast send \ + --rpc-url "{{.l1_rpc_url}}" \ + --private-key "{{.zkevm_l2_admin_private_key}}" \ + "{{.zkevm_gas_token_address}}" 'mint(address,uint256)' "$address" 10000000000000000000000 +} + # We want to avoid running this script twice. # In the future it might make more sense to exit with an error code. +# We want to run this script again when deploying a second CDK. +# shellcheck disable=SC1054,SC1083 +{{if .deploy_agglayer}} if [[ -e "/opt/zkevm/.init-complete.lock" ]]; then 2>&1 echo "This script has already been executed" exit 1 fi +# If there is already a successful deployment with an Agglayer service +# then we want to deploy the rollup onchain to attach it. +{{else}} +if [[ -e "/opt/zkevm/.init-complete.lock" ]]; then +fund_account_on_l1 "admin-002" "{{.zkevm_l2_admin_address}}" + +echo_ts "Deploying rollup onchain using the L1 rollup manager contract" +rpc_url="{{.l1_rpc_url}}" +rollup_manager_address="{{.rollup_manager_address}}" +zkevm_rollup_manager_deployer="{{.zkevm_rollup_manager_deployer}}" +zkevm_rollup_manager_deployer_private_key="{{.zkevm_rollup_manager_deployer_private_key}}" +zkevm_rollup_type_id="{{.zkevm_rollup_type_id}}" +zkevm_rollup_chain_id="{{.zkevm_rollup_chain_id}}" +zkevm_l2_admin_address="{{.zkevm_l2_admin_address}}" +zkevm_l2_sequencer_address="{{.zkevm_l2_sequencer_address}}" +zkevm_gas_token_address="{{.zkevm_gas_token_address}}" +zkevm_l2_sequencer_url="http://zkevm-node-sequencer{{.deployment_suffix}}:8123" +zkevm_network_name="Kurtosis CDK" +tx_input=$(cast calldata 'createNewRollup(uint32,uint64,address,address,address,string,string)' "$zkevm_rollup_type_id" "$zkevm_rollup_chain_id" "$zkevm_l2_admin_address" "$zkevm_l2_sequencer_address" "$zkevm_gas_token_address" "$zkevm_l2_sequencer_url" "$zkevm_network_name") +cast send --private-key $zkevm_rollup_manager_deployer_private_key --rpc-url $rpc_url $rollup_manager_address $tx_input --legacy +echo_ts "Onchain rollup has been created" + +echo_ts "Retrieve rollup data" +pushd /opt/zkevm-contracts || exit 1 +jq '.polygonRollupManagerAddress = "{{.rollup_manager_address}}"' /opt/zkevm-contracts/tools/getRollupData/rollupDataParams.json.example > /opt/zkevm-contracts/tools/getRollupData/tmp && mv /opt/zkevm-contracts/tools/getRollupData/tmp /opt/zkevm-contracts/tools/getRollupData/rollupDataParams.json +jq '.rollupID = {{.zkevm_rollup_id}}' /opt/zkevm-contracts/tools/getRollupData/rollupDataParams.json > /opt/zkevm-contracts/tools/getRollupData/tmp && mv /opt/zkevm-contracts/tools/getRollupData/tmp /opt/zkevm-contracts/tools/getRollupData/rollupDataParams.json +awk '!/upgradeToULxLyBlockNumber/' /opt/zkevm-contracts/tools/getRollupData/getRollupData.ts > /opt/zkevm-contracts/tools/getRollupData/tmp && mv /opt/zkevm-contracts/tools/getRollupData/tmp /opt/zkevm-contracts/tools/getRollupData/getRollupData.ts +sed -i 's#http://127.0.0.1:8545#{{.l1_rpc_url}}#' /opt/zkevm-contracts/hardhat.config.ts +npx hardhat run --network localhost /opt/zkevm-contracts/tools/getRollupData/getRollupData.ts +sed -i 's#{{.l1_rpc_url}}#http://127.0.0.1:8545#' /opt/zkevm-contracts/hardhat.config.ts +fi +{{end}} # Wait for the L1 RPC to be available. echo_ts "Waiting for the L1 RPC to be available" @@ -74,6 +119,20 @@ fund_account_on_l1 "aggregator" "{{.zkevm_l2_aggregator_address}}" fund_account_on_l1 "agglayer" "{{.zkevm_l2_agglayer_address}}" fund_account_on_l1 "claimtxmanager" "{{.zkevm_l2_claimtxmanager_address}}" +# Only fund POL for attaching CDK. +# shellcheck disable=SC1054,SC1083 +{{if not .deploy_agglayer}} +mint_gas_token_on_l1 "{{.zkevm_l2_admin_address}}" +mint_gas_token_on_l1 "{{.zkevm_l2_sequencer_address}}" +mint_gas_token_on_l1 "{{.zkevm_l2_aggregator_address}}" +mint_gas_token_on_l1 "{{.zkevm_l2_agglayer_address}}" +mint_gas_token_on_l1 "{{.zkevm_l2_claimtxmanager_address}}" +mint_gas_token_on_l1 "{{.zkevm_l2_timelock_address}}" +mint_gas_token_on_l1 "{{.zkevm_l2_loadtest_address}}" +mint_gas_token_on_l1 "{{.zkevm_l2_dac_address}}" +mint_gas_token_on_l1 "{{.zkevm_l2_proofsigner_address}}" +{{end}} + # Configure zkevm contract deploy parameters. pushd /opt/zkevm-contracts || exit 1 cp /opt/contract-deploy/deploy_parameters.json /opt/zkevm-contracts/deployment/v2/deploy_parameters.json @@ -97,6 +156,23 @@ jq --slurpfile c gasToken-erc20.json '.gasTokenAddress = $c[0].deployedTo' /opt/ # shellcheck disable=SC1056,SC1072,SC1073,SC1009 {{end}} +# Deploy the DAC contracts if deploying an attaching CDK. +# Then transfer ownership, and activate the DAC. +# shellcheck disable=SC1054,SC1083 +{{if not .deploy_agglayer}} +pushd /opt/zkevm-contracts || exit 1 +echo_ts "Deploying DAC for attaching CDK" +jq '.admin = "{{.zkevm_l2_admin_address}}"' /opt/zkevm-contracts/tools/deployPolygonDataCommittee/deploy_dataCommittee_parameters.example > /opt/zkevm-contracts/tools/deployPolygonDataCommittee/tmp && mv /opt/zkevm-contracts/tools/deployPolygonDataCommittee/tmp /opt/zkevm-contracts/tools/deployPolygonDataCommittee/deploy_dataCommittee_parameters.json +jq '.deployerPvtKey = "{{.zkevm_rollup_manager_deployer_private_key}}"' /opt/zkevm-contracts/tools/deployPolygonDataCommittee/deploy_dataCommittee_parameters.json > /opt/zkevm-contracts/tools/deployPolygonDataCommittee/tmp && mv /opt/zkevm-contracts/tools/deployPolygonDataCommittee/tmp /opt/zkevm-contracts/tools/deployPolygonDataCommittee/deploy_dataCommittee_parameters.json +npx hardhat run /opt/zkevm-contracts/tools/deployPolygonDataCommittee/deployPolygonDataCommittee.ts --network localhost > /opt/zkevm-contracts/tools/deployPolygonDataCommittee/output.json + +# Transfer ownership of the deployed DAC. +echo_ts "Transferring ownership of the DAC" +dac_address=$(grep "PolygonDataCommittee deployed to:" /opt/zkevm-contracts/tools/deployPolygonDataCommittee/output.json | awk '{print $NF}') +cast call --rpc-url "{{.l1_rpc_url}}" $dac_address 'owner()(address)' +cast send --private-key "{{.zkevm_rollup_manager_deployer_private_key}}" --rpc-url "{{.l1_rpc_url}}" $dac_address 'transferOwnership(address)' "{{.zkevm_l2_admin_address}}" +{{end}} + # Deploy contracts. echo_ts "Deploying zkevm contracts to L1" @@ -131,6 +207,9 @@ pushd /opt/zkevm/ || exit 1 echo_ts "Creating combined.json" cp genesis.json genesis.original.json jq --slurpfile rollup create_rollup_output.json '. + $rollup[0]' deploy_output.json > combined.json +# Extract L2 Bridge contract address. +polygonZkEVML2BridgeAddress=$(grep "PolygonZkEVMBridge deployed to:" /opt/zkevm-contracts/04_deploy_contracts.out | awk '{print $NF}') +jq --arg polygonZkEVML2BridgeAddress "$polygonZkEVML2BridgeAddress" '.polygonZkEVML2BridgeAddress = $polygonZkEVML2BridgeAddress' combined.json > c.json; mv c.json combined.json # Add the L2 GER Proxy address in combined.json (for panoptichain). zkevm_global_exit_root_l2_address=$(jq -r '.genesis[] | select(.contractName == "PolygonZkEVMGlobalExitRootL2 proxy") | .address' /opt/zkevm/genesis.json) @@ -150,6 +229,8 @@ if [[ fork_id -lt 8 ]]; then fi # NOTE there is a disconnect in the necessary configurations here between the validium node and the zkevm node +# shellcheck disable=SC1054,SC1083 +{{if .deploy_agglayer}} jq --slurpfile c combined.json '.rollupCreationBlockNumber = $c[0].createRollupBlockNumber' genesis.json > g.json; mv g.json genesis.json jq --slurpfile c combined.json '.rollupManagerCreationBlockNumber = $c[0].upgradeToULxLyBlockNumber' genesis.json > g.json; mv g.json genesis.json jq --slurpfile c combined.json '.genesisBlockNumber = $c[0].createRollupBlockNumber' genesis.json > g.json; mv g.json genesis.json @@ -159,6 +240,34 @@ jq --slurpfile c combined.json '.L1Config.polygonRollupManagerAddress = $c[0].po jq --slurpfile c combined.json '.L1Config.polTokenAddress = $c[0].polTokenAddress' genesis.json > g.json; mv g.json genesis.json jq --slurpfile c combined.json '.L1Config.polygonZkEVMAddress = $c[0].rollupAddress' genesis.json > g.json; mv g.json genesis.json +jq --slurpfile c combined.json '.bridgeGenBlockNumber = $c[0].createRollupBlockNumber' combined.json > c.json; mv c.json combined.json + +{{else}} +rollupCreationBlockNumber=$(jq -r '.createRollupBlockNumber' /opt/zkevm-contracts/tools/getRollupData/create_rollup_output.json) +rollupManagerCreationBlockNumber=$(jq -r '.deploymentRollupManagerBlockNumber' /opt/zkevm-contracts/tools/getRollupData/deploy_output.json) +genesisBlockNumber=$(jq -r '.createRollupBlockNumber' /opt/zkevm-contracts/tools/getRollupData/create_rollup_output.json) +polygonZkEVMGlobalExitRootAddress=$(jq -r '.polygonZkEVMGlobalExitRootAddress' /opt/zkevm-contracts/tools/getRollupData/deploy_output.json) +polygonRollupManagerAddress=$(jq -r '.polygonRollupManagerAddress' /opt/zkevm-contracts/tools/getRollupData/deploy_output.json) +polTokenAddress=$(jq -r '.polTokenAddress' /opt/zkevm-contracts/tools/getRollupData/deploy_output.json) +polygonZkEVMAddress=$(jq -r '.rollupAddress' /opt/zkevm-contracts/tools/getRollupData/create_rollup_output.json) +polygonZkEVMBridgeAddress=$(cast call --rpc-url "{{.l1_rpc_url}}" "$polygonRollupManagerAddress" "bridgeAddress()(address)") + +jq --argjson rollupCreationBlockNumber "$rollupCreationBlockNumber" '.rollupCreationBlockNumber = $rollupCreationBlockNumber' genesis.json > g.json; mv g.json genesis.json +jq --argjson rollupManagerCreationBlockNumber "$rollupManagerCreationBlockNumber" '.rollupManagerCreationBlockNumber = $rollupManagerCreationBlockNumber' genesis.json > g.json; mv g.json genesis.json +jq --argjson genesisBlockNumber "$genesisBlockNumber" '.genesisBlockNumber = $genesisBlockNumber' genesis.json > g.json; mv g.json genesis.json +jq '.L1Config = {chainId:{{.l1_chain_id}}}' genesis.json > g.json; mv g.json genesis.json +jq --arg polygonZkEVMGlobalExitRootAddress "$polygonZkEVMGlobalExitRootAddress" '.L1Config.polygonZkEVMGlobalExitRootAddress = $polygonZkEVMGlobalExitRootAddress' genesis.json > g.json; mv g.json genesis.json +jq --arg polygonRollupManagerAddress "$polygonRollupManagerAddress" '.L1Config.polygonRollupManagerAddress = $polygonRollupManagerAddress' genesis.json > g.json; mv g.json genesis.json +jq --arg polTokenAddress "$polTokenAddress" '.L1Config.polTokenAddress = $polTokenAddress' genesis.json > g.json; mv g.json genesis.json +jq --arg polygonZkEVMAddress "$polygonZkEVMAddress" '.L1Config.polygonZkEVMAddress = $polygonZkEVMAddress' genesis.json > g.json; mv g.json genesis.json + +# Extract newly deployed DAC address and genesisBlockNumber +polygonDataCommitteeAddress=$(grep "PolygonDataCommittee deployed to:" /opt/zkevm-contracts/tools/deployPolygonDataCommittee/output.json | awk '{print $NF}') +jq --arg polygonDataCommitteeAddress "$polygonDataCommitteeAddress" '.polygonDataCommitteeAddress = $polygonDataCommitteeAddress' combined.json > c.json; mv c.json combined.json +jq --arg polygonZkEVMAddress "$polygonZkEVMAddress" '.rollupAddress = $polygonZkEVMAddress' combined.json > c.json; mv c.json combined.json +jq --arg genesisBlockNumber "$genesisBlockNumber" '.bridgeGenBlockNumber = $genesisBlockNumber' combined.json > c.json; mv c.json combined.json +{{end}} + # Create cdk-erigon node configs jq_script=' .genesis | map({ @@ -213,7 +322,7 @@ cast send \ 'approve(address,uint256)(bool)' \ "$(jq -r '.rollupAddress' combined.json)" 1000000000000000000000000000 -{{if .is_cdk_validium}} +{{if and .is_cdk_validium .deploy_agglayer}} # The DAC needs to be configured with a required number of signatures. # Right now the number of DAC nodes is not configurable. # If we add more nodes, we'll need to make sure the urls and keys are sorted. @@ -233,8 +342,24 @@ cast send \ "$(jq -r '.rollupAddress' combined.json)" \ 'setDataAvailabilityProtocol(address)' \ "$(jq -r '.polygonDataCommitteeAddress' combined.json)" +{{else}} +echo_ts "Setting the data availability committee" +dac_address=$(grep "PolygonDataCommittee deployed to:" /opt/zkevm-contracts/tools/deployPolygonDataCommittee/output.json | awk '{print $NF}') +cast send \ + --private-key "{{.zkevm_l2_admin_private_key}}" \ + --rpc-url "{{.l1_rpc_url}}" \ + $dac_address \ + 'function setupCommittee(uint256 _requiredAmountOfSignatures, string[] urls, bytes addrsBytes) returns()' \ + 1 ["http://zkevm-dac{{.deployment_suffix}}:{{.zkevm_dac_port}}"] "{{.zkevm_l2_dac_address}}" + +echo_ts "Activate the DAC" +rollup_address=$(jq -r '.rollupAddress' /opt/zkevm-contracts/tools/getRollupData/create_rollup_output.json) +dac_address=$(grep "PolygonDataCommittee deployed to:" /opt/zkevm-contracts/tools/deployPolygonDataCommittee/output.json | awk '{print $NF}') +cast call --rpc-url "{{.l1_rpc_url}}" $rollup_address 'dataAvailabilityProtocol()' +cast send --private-key "{{.zkevm_l2_admin_private_key}}" --rpc-url "{{.l1_rpc_url}}" $rollup_address 'setDataAvailabilityProtocol(address)' $dac_address {{end}} +{{if .deploy_agglayer}} # Grant the aggregator role to the agglayer so that it can also verify batches. # cast keccak "TRUSTED_AGGREGATOR_ROLE" echo_ts "Granting the aggregator role to the agglayer so that it can also verify batches" @@ -244,6 +369,17 @@ cast send \ "$(jq -r '.polygonRollupManagerAddress' combined.json)" \ 'grantRole(bytes32,address)' \ "0x084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4" "{{.zkevm_l2_agglayer_address}}" +{{else}} +echo_ts "Granting the aggregator role to the agglayer so that it can also verify batches" +polygonRollupManagerAddress=$(jq -r '.polygonRollupManagerAddress' /opt/zkevm-contracts/tools/getRollupData/deploy_output.json) +cast send \ + --private-key "{{.zkevm_l2_admin_private_key}}" \ + --rpc-url "{{.l1_rpc_url}}" \ + $polygonRollupManagerAddress \ + 'grantRole(bytes32,address)' \ + "0x084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4" "{{.zkevm_l2_agglayer_address}}" +{{end}} + # If we've configured the l1 network with the minimal preset, we # should probably wait for the first finalized block. This isn't diff --git a/templates/permissionless-node/node-config.toml b/templates/permissionless-node/node-config.toml index 17ea87c7c..8caa89bd7 100644 --- a/templates/permissionless-node/node-config.toml +++ b/templates/permissionless-node/node-config.toml @@ -3,7 +3,7 @@ IsTrustedSequencer = false [Log] Environment = "production" # "production" or "development" -Level = "debug" +Level = "info" Outputs = ["stderr"] [State] diff --git a/templates/pool-manager/pool-manager-config.toml b/templates/pool-manager/pool-manager-config.toml index 015117ba1..e2537c672 100644 --- a/templates/pool-manager/pool-manager-config.toml +++ b/templates/pool-manager/pool-manager-config.toml @@ -1,6 +1,6 @@ [Log] Environment = "development" # "production" or "development" -Level = "debug" +Level = "info" Outputs = ["stderr"] [Server] diff --git a/templates/trusted-node/cdk-node-config.toml b/templates/trusted-node/cdk-node-config.toml index dfee685e2..fafebfd88 100644 --- a/templates/trusted-node/cdk-node-config.toml +++ b/templates/trusted-node/cdk-node-config.toml @@ -7,7 +7,7 @@ ContractVersions = "elderberry" [Log] Environment = "development" # "production" or "development" -Level = "debug" +Level = "info" Outputs = ["stderr"] [SequenceSender] @@ -60,8 +60,12 @@ MaxPendingTx = 1 SenderAddress = "{{.zkevm_l2_agglayer_address}}" SettlementBackend = "agglayer" AggLayerTxTimeout = "600s" + {{if .deploy_agglayer}} AggLayerURL = "http://zkevm-agglayer{{.deployment_suffix}}:{{.zkevm_agglayer_port}}" {{else}} + AggLayerURL = "http://zkevm-agglayer-001:{{.zkevm_agglayer_port}}" + {{end}} + {{else}} SenderAddress = "{{.zkevm_l2_aggregator_address}}" {{end}} @@ -80,7 +84,7 @@ MaxPendingTx = 1 MaxConns = 200 [Aggregator.Log] Environment = "development" # "production" or "development" - Level = "debug" + Level = "info" Outputs = ["stderr"] [Aggregator.StreamClient] Server = "{{.sequencer_name}}{{.deployment_suffix}}:{{.zkevm_data_streamer_port}}" diff --git a/templates/trusted-node/node-config.toml b/templates/trusted-node/node-config.toml index 6b591b01c..5e92f9319 100644 --- a/templates/trusted-node/node-config.toml +++ b/templates/trusted-node/node-config.toml @@ -1272,8 +1272,16 @@ AggLayerTxTimeout = "600s" # ------------------------------------------------------------------------------ # AggLayerURL is the RPC URL of the agglayer itself +# In the case of attaching multiple CDKs, the AgglayerURL +# should always follow the first deployment_suffix "-001" +# by default. # ------------------------------------------------------------------------------ +{{if .deploy_agglayer}} AggLayerURL = "http://zkevm-agglayer{{.deployment_suffix}}:{{.zkevm_agglayer_port}}" +{{else}} +AggLayerURL = "http://zkevm-agglayer-001:{{.zkevm_agglayer_port}}" +{{end}} + {{else}} # ------------------------------------------------------------------------------ diff --git a/templates/trusted-node/sequence-sender-config.toml b/templates/trusted-node/sequence-sender-config.toml index 88eab73d0..1034b1196 100644 --- a/templates/trusted-node/sequence-sender-config.toml +++ b/templates/trusted-node/sequence-sender-config.toml @@ -1,6 +1,6 @@ [Log] Environment = "development" -Level = "debug" +Level = "info" Outputs = ["stdout"] [SequenceSender]