From 428e40a39c77fd02370fd288a72ccb7e53dd5353 Mon Sep 17 00:00:00 2001 From: Neeraj Date: Thu, 22 Aug 2024 19:20:16 +0530 Subject: [PATCH] Create seperate service to deploy l2 nitro contract --- nitro-bridge-demo.md | 55 ++++++++++++++++--- nitro-node-demo.md | 2 + .../compose/docker-compose-nitro-bridge.yml | 30 +++++++++- .../docker-compose-nitro-contracts.yml | 4 +- .../config/go-nitro/run-bridge.sh | 11 ++-- .../{deploy.sh => deploy-l1-contracts.sh} | 0 .../nitro-contracts/deploy-l2-contracts.sh | 50 +++++++++++++++++ stack-orchestrator/stacks/bridge/stack.yml | 1 - 8 files changed, 136 insertions(+), 17 deletions(-) rename stack-orchestrator/config/nitro-contracts/{deploy.sh => deploy-l1-contracts.sh} (100%) create mode 100755 stack-orchestrator/config/nitro-contracts/deploy-l2-contracts.sh diff --git a/nitro-bridge-demo.md b/nitro-bridge-demo.md index 35dd506..d5aaea2 100644 --- a/nitro-bridge-demo.md +++ b/nitro-bridge-demo.md @@ -296,11 +296,45 @@ # 100000000000000000 ``` +- Deploy L1 nitro contracts + + - Create a deployment spec-file for L1 nitro contract: + + ```bash + laconic-so --stack ~/cerc/nitro-stack/stack-orchestrator/stacks/nitro-contracts deploy init --output nitro-contracts-spec.yml --config "GETH_URL=http://host.docker.internal:8545,GETH_DEPLOYER_PK=888814df89c4358d7ddb3fa4b0213e7331239a80e1f013eaa7b2deca2a41a218,TOKEN_NAME=LaconicNetworkToken,TOKEN_SYMBOL=LNT,INITIAL_TOKEN_SUPPLY=129600" + ``` + + - Create a deployment `nitro-contracts` from the spec file + + ```bash + laconic-so --stack ~/cerc/nitro-stack/stack-orchestrator/stacks/nitro-contracts deploy create --spec-file nitro-contracts-spec.yml --deployment-dir nitro-contracts-deployment + ``` + + - Start `nitro-contracts` deployment: + + ``` + laconic-so deployment --dir nitro-contracts-deployment start + + # Check the l1 nitro contract deployments + laconic-so deployment --dir nitro-contracts-deployment logs nitro-contracts -f + ``` + - Run the bridge: + + - Get the deployed nitro contract addresses (run in the directory where the deployments were created): + + ```bash + # Nitro contract addresses + export NA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"1212\"[0].contracts.NitroAdjudicator.address' /app/deployment/nitro-addresses.json") + export CA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"1212\"[0].contracts.ConsensusApp.address' /app/deployment/nitro-addresses.json") + export VPA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"1212\"[0].contracts.VirtualPaymentApp.address' /app/deployment/nitro-addresses.json") + export L1_ASSET_ADDRESS="$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"1212\"[0].contracts.Token.address' /app/deployment/nitro-addresses.json")" + ``` + - Create a spec-file for the deployment, map container ports to host ports and set env variables: ```bash - laconic-so --stack ~/cerc/nitro-stack/stack-orchestrator/stacks/bridge deploy init --map-ports-to-host any-same --output bridge-nitro-spec.yml --config "NITRO_L1_CHAIN_URL=ws://host.docker.internal:8546,NITRO_L2_CHAIN_URL=ws://host.docker.internal:9546,NITRO_CHAIN_PK=888814df89c4358d7ddb3fa4b0213e7331239a80e1f013eaa7b2deca2a41a218,NITRO_SC_PK=0279651921cd800ac560c21ceea27aab0107b67daf436cdd25ce84cad30159b4,GETH_URL=http://host.docker.internal:8545,OPTIMISM_URL=http://host.docker.internal:9545,GETH_DEPLOYER_PK=$ACCOUNT_PK,OPTIMISM_DEPLOYER_PK=$ACCOUNT_PK,TOKEN_NAME=LaconicNetworkToken,TOKEN_SYMBOL=LNT,INITIAL_TOKEN_SUPPLY=129600" + laconic-so --stack ~/cerc/nitro-stack/stack-orchestrator/stacks/bridge deploy init --map-ports-to-host any-same --output bridge-nitro-spec.yml --config "NITRO_L1_CHAIN_URL=ws://host.docker.internal:8546,NITRO_L2_CHAIN_URL=ws://host.docker.internal:9546,NITRO_CHAIN_PK=888814df89c4358d7ddb3fa4b0213e7331239a80e1f013eaa7b2deca2a41a218,NITRO_SC_PK=0279651921cd800ac560c21ceea27aab0107b67daf436cdd25ce84cad30159b4,GETH_URL=http://host.docker.internal:8545,OPTIMISM_URL=http://host.docker.internal:9545,GETH_DEPLOYER_PK=$ACCOUNT_PK,OPTIMISM_DEPLOYER_PK=$ACCOUNT_PK,TOKEN_NAME=LaconicNetworkToken,TOKEN_SYMBOL=LNT,INITIAL_TOKEN_SUPPLY=129600,NA_ADDRESS=$NA_ADDRESS,VPA_ADDRESS=$VPA_ADDRESS,CA_ADDRESS=$CA_ADDRESS,L1_ASSET_ADDRESS=$L1_ASSET_ADDRESS" ``` - Create a deployment from the spec file: @@ -314,6 +348,9 @@ ```bash laconic-so deployment --dir bridge-deployment start + # Check the l2 nitro contract deployments + laconic-so deployment --dir bridge-deployment logs l2-nitro-contracts -f + # Check the logs, ensure that the node is running laconic-so deployment --dir bridge-deployment logs nitro-bridge -f ``` @@ -323,7 +360,7 @@ - Export variables for L1 token address ```bash - export L1_ASSET_ADDRESS="$(laconic-so deployment --dir bridge-deployment exec nitro-contracts "jq -r '.\"1212\"[0].contracts.Token.address' /app/deployment/nitro-addresses.json")" + export L1_ASSET_ADDRESS="$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"1212\"[0].contracts.Token.address' /app/deployment/nitro-addresses.json")" export A_CHAIN_ADDRESS="0xe22AD83A0dE117bA0d03d5E94Eb4E0d80a69C62a" export C_CHAIN_ADDRESS="0xf1ac8Dd1f6D6F5c0dA99097c57ebF50CD99Ce293" @@ -333,10 +370,10 @@ ```bash # Send tokens to Alice - laconic-so deployment --dir bridge-deployment exec nitro-contracts "cd packages/nitro-protocol && yarn hardhat transfer --contract $L1_ASSET_ADDRESS --to $A_CHAIN_ADDRESS --amount 1000 --network geth" + laconic-so deployment --dir bridge-deployment exec l2-nitro-contracts "cd packages/nitro-protocol && yarn hardhat transfer --contract $L1_ASSET_ADDRESS --to $A_CHAIN_ADDRESS --amount 1000 --network geth" #Send tokens to Charlie - laconic-so deployment --dir bridge-deployment exec nitro-contracts "cd packages/nitro-protocol && yarn hardhat transfer --contract $L1_ASSET_ADDRESS --to $C_CHAIN_ADDRESS --amount 1000 --network geth" + laconic-so deployment --dir bridge-deployment exec l2-nitro-contracts "cd packages/nitro-protocol && yarn hardhat transfer --contract $L1_ASSET_ADDRESS --to $C_CHAIN_ADDRESS --amount 1000 --network geth" ``` ## Demo @@ -344,9 +381,9 @@ ```bash # Nitro contract addresses - export NA_ADDRESS=$(laconic-so deployment --dir bridge-deployment exec nitro-bridge "jq -r '.\"1212\"[0].contracts.NitroAdjudicator.address' /app/deployment/nitro-addresses.json") - export CA_ADDRESS=$(laconic-so deployment --dir bridge-deployment exec nitro-bridge "jq -r '.\"1212\"[0].contracts.ConsensusApp.address' /app/deployment/nitro-addresses.json") - export VPA_ADDRESS=$(laconic-so deployment --dir bridge-deployment exec nitro-bridge "jq -r '.\"1212\"[0].contracts.VirtualPaymentApp.address' /app/deployment/nitro-addresses.json") + export NA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"1212\"[0].contracts.NitroAdjudicator.address' /app/deployment/nitro-addresses.json") + export CA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"1212\"[0].contracts.ConsensusApp.address' /app/deployment/nitro-addresses.json") + export VPA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"1212\"[0].contracts.VirtualPaymentApp.address' /app/deployment/nitro-addresses.json") # Contract address of bridge export BRIDGE_ADDRESS=$(laconic-so deployment --dir bridge-deployment exec nitro-bridge "jq -r '.\"42069\"[0].contracts.Bridge.address' /app/deployment/nitro-addresses.json") @@ -498,7 +535,7 @@ ```bash export BRIDGE_NITRO_ADDRESS=0xBBB676f9cFF8D242e9eaC39D063848807d3D1D94 - export L1_ASSET_ADDRESS="$(laconic-so deployment --dir bridge-deployment exec nitro-contracts "jq -r '.\"1212\"[0].contracts.Token.address' /app/deployment/nitro-addresses.json")" + export L1_ASSET_ADDRESS="$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"1212\"[0].contracts.Token.address' /app/deployment/nitro-addresses.json")" ``` - Create ledger channel between A and Bridge with custom token @@ -703,6 +740,7 @@ laconic-so deployment --dir l2alice-nitro-deployment stop --delete-volumes laconic-so deployment --dir l2charlie-nitro-deployment stop --delete-volumes laconic-so deployment --dir bridge-deployment stop --delete-volumes + laconic-so deployment --dir nitro-contracts-deployment stop --delete-volumes ``` - Clear nitro-node and bridge deployments: @@ -714,6 +752,7 @@ sudo rm -rf l2alice-nitro-deployment sudo rm -rf l2charlie-nitro-deployment sudo rm -rf bridge-deployment + sudo rm -rf nitro-contracts-deployment ``` - Clean up L1 and L2 deployments: diff --git a/nitro-node-demo.md b/nitro-node-demo.md index 3fcbba0..46f3f79 100644 --- a/nitro-node-demo.md +++ b/nitro-node-demo.md @@ -348,6 +348,7 @@ # Run where deployments are created laconic-so deployment --dir alice-nitro-deployment stop --delete-volumes laconic-so deployment --dir charlie-nitro-deployment stop --delete-volumes + laconic-so deployment --dir nitro-contracts-deployment stop --delete-volumes ``` - Clear nitro-node and bridge deployments: @@ -356,6 +357,7 @@ # Run where deployments are created sudo rm -rf alice-nitro-deployment sudo rm -rf charlie-nitro-deployment + sudo rm -rf nitro-contracts-deployment ``` - Clean up fixturenet-eth deployment: diff --git a/stack-orchestrator/compose/docker-compose-nitro-bridge.yml b/stack-orchestrator/compose/docker-compose-nitro-bridge.yml index db66e24..6f846ee 100644 --- a/stack-orchestrator/compose/docker-compose-nitro-bridge.yml +++ b/stack-orchestrator/compose/docker-compose-nitro-bridge.yml @@ -1,13 +1,36 @@ name: nitro-bridge services: + l2-nitro-contracts: + image: cerc/nitro-client:local + restart: on-failure + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + GETH_URL: ${GETH_URL} + OPTIMISM_DEPLOYER_PK: ${OPTIMISM_DEPLOYER_PK} + OPTIMISM_CHAIN_ID: ${OPTIMISM_CHAIN_ID:-42069} + GETH_CHAIN_ID: ${GETH_CHAIN_ID:-1212} + GETH_DEPLOYER_PK: ${OPTIMISM_DEPLOYER_PK} + OPTIMISM_URL: ${OPTIMISM_URL} + TOKEN_NAME: ${TOKEN_NAME} + TOKEN_SYMBOL: ${TOKEN_SYMBOL} + INITIAL_TOKEN_SUPPLY: ${INITIAL_TOKEN_SUPPLY} + DISABLE_DETERMINISTIC_DEPLOYMENT: ${DISABLE_DETERMINISTIC_DEPLOYMENT:-true} + L1_ASSET_ADDRESS: ${L1_ASSET_ADDRESS} + volumes: + - nitro_deployment:/app/deployment + - ../config/nitro-contracts/deploy-l2-contracts.sh:/app/deploy-l2-contracts.sh + command: ["bash", "-c", "/app/deploy-l2-contracts.sh"] + extra_hosts: + - "host.docker.internal:host-gateway" + nitro-bridge: image: cerc/go-nitro:local hostname: nitro-bridge restart: unless-stopped depends_on: - nitro-contracts: - condition: service_started + l2-nitro-contracts: + condition: service_started environment: CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} GETH_CHAIN_ID: ${GETH_CHAIN_ID:-1212} @@ -23,6 +46,9 @@ services: NITRO_L1_EXT_MULTIADDR: ${NITRO_L1_EXT_MULTIADDR} NITRO_L2_EXT_MULTIADDR: ${NITRO_L2_EXT_MULTIADDR} NITRO_PUBLIC_RPC_HOST: nitro-bridge + NA_ADDRESS: ${NA_ADDRESS} + CA_ADDRESS: ${CA_ADDRESS} + VPA_ADDRESS: ${VPA_ADDRESS} entrypoint: ["bash", "-c", "/app/run-bridge.sh"] volumes: - nitro_bridge_data:/app/data diff --git a/stack-orchestrator/compose/docker-compose-nitro-contracts.yml b/stack-orchestrator/compose/docker-compose-nitro-contracts.yml index 695b591..b2bd236 100644 --- a/stack-orchestrator/compose/docker-compose-nitro-contracts.yml +++ b/stack-orchestrator/compose/docker-compose-nitro-contracts.yml @@ -17,8 +17,8 @@ services: DISABLE_DETERMINISTIC_DEPLOYMENT: ${DISABLE_DETERMINISTIC_DEPLOYMENT:-true} volumes: - nitro_deployment:/app/deployment - - ../config/nitro-contracts/deploy.sh:/app/deploy.sh - command: ["bash", "-c", "/app/deploy.sh"] + - ../config/nitro-contracts/deploy-l1-contracts.sh:/app/deploy-l1-contracts.sh + command: ["bash", "-c", "/app/deploy-l1-contracts.sh"] extra_hosts: - "host.docker.internal:host-gateway" diff --git a/stack-orchestrator/config/go-nitro/run-bridge.sh b/stack-orchestrator/config/go-nitro/run-bridge.sh index 906d84a..5069233 100755 --- a/stack-orchestrator/config/go-nitro/run-bridge.sh +++ b/stack-orchestrator/config/go-nitro/run-bridge.sh @@ -20,6 +20,9 @@ echo "NITRO_RPC_PORT: ${NITRO_RPC_PORT}" echo "NITRO_PUBLIC_P2P_HOST: ${NITRO_PUBLIC_P2P_HOST}" echo "NITRO_L1_EXT_MULTIADDR: ${NITRO_L1_EXT_MULTIADDR}" echo "NITRO_L2_EXT_MULTIADDR: ${NITRO_L2_EXT_MULTIADDR}" +echo "NA_ADDRESS: ${NA_ADDRESS}" +echo "CA_ADDRESS: ${CA_ADDRESS}" +echo "VPA_ADDRESS: ${VPA_ADDRESS}" echo "Waiting for $bridge_assets_map_file to be ready" @@ -45,12 +48,12 @@ bridgepublicip = "$NITRO_PUBLIC_P2P_HOST" nodel1ExtMultiAddr = "$NITRO_L1_EXT_MULTIADDR" nodel2ExtMultiAddr = "$NITRO_L2_EXT_MULTIADDR" assetmapfilepath = "$bridge_assets_map_file" +naaddress = "${NA_ADDRESS}" +vpaaddress = "${VPA_ADDRESS}" +caaddress = "${CA_ADDRESS}" EOF -# Export contract addresses -export NA_ADDRESS=$(jq -r ".\"$GETH_CHAIN_ID\"[0].contracts.NitroAdjudicator.address" ${nitro_addresses_file}) -export CA_ADDRESS=$(jq -r ".\"$GETH_CHAIN_ID\"[0].contracts.ConsensusApp.address" ${nitro_addresses_file}) -export VPA_ADDRESS=$(jq -r ".\"$GETH_CHAIN_ID\"[0].contracts.VirtualPaymentApp.address" ${nitro_addresses_file}) +# Export bridge address export BRIDGE_ADDRESS=$(jq -r ".\"$OPTIMISM_CHAIN_ID\"[0].contracts.Bridge.address" ${nitro_addresses_file}) # Start bridge diff --git a/stack-orchestrator/config/nitro-contracts/deploy.sh b/stack-orchestrator/config/nitro-contracts/deploy-l1-contracts.sh similarity index 100% rename from stack-orchestrator/config/nitro-contracts/deploy.sh rename to stack-orchestrator/config/nitro-contracts/deploy-l1-contracts.sh diff --git a/stack-orchestrator/config/nitro-contracts/deploy-l2-contracts.sh b/stack-orchestrator/config/nitro-contracts/deploy-l2-contracts.sh new file mode 100755 index 0000000..39f2b13 --- /dev/null +++ b/stack-orchestrator/config/nitro-contracts/deploy-l2-contracts.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +addresses_deployment_file="packages/nitro-protocol/addresses.json" +nitro_addresses_file="/app/deployment/nitro-addresses.json" +bridge_assets_map_file="/app/deployment/bridge-assets-map.toml" + +echo "Using the following environment variables:" +echo "OPTIMISM_URL: ${OPTIMISM_URL}" +echo "OPTIMISM_CHAIN_ID: ${OPTIMISM_CHAIN_ID}" +echo "OPTIMISM_DEPLOYER_PK: ${OPTIMISM_DEPLOYER_PK}" +echo "GETH_URL: ${GETH_URL}" +echo "GETH_CHAIN_ID: ${GETH_CHAIN_ID}" +echo "GETH_DEPLOYER_PK: ${GETH_DEPLOYER_PK}" +echo "TOKEN_NAME: ${TOKEN_NAME}" +echo "TOKEN_SYMBOL: ${TOKEN_SYMBOL}" +echo "INITIAL_TOKEN_SUPPLY: ${INITIAL_TOKEN_SUPPLY}" +echo "DISABLE_DETERMINISTIC_DEPLOYMENT: ${DISABLE_DETERMINISTIC_DEPLOYMENT}" +echo "L1_ASSET_ADDRESS: ${L1_ASSET_ADDRESS}" + +# Check if L2 chain id key is present for L2 deployment +if [ -f "$nitro_addresses_file" ] && jq -e "has(\"$OPTIMISM_CHAIN_ID\")" ${nitro_addresses_file} > /dev/null; then + echo "L2 addresses found in ${nitro_addresses_file}, skipping deployment" +else + # Deploy Nitro contracts + yarn contracts:deploy-optimism + + # Deploy custom token + yarn contracts:deploy-token-optimism + + cp ${addresses_deployment_file} ${nitro_addresses_file} +fi + +L2_ASSET_ADDRESS=$(jq -r ".\"$OPTIMISM_CHAIN_ID\"[0].contracts.Token.address" ${nitro_addresses_file}) + +# Deploy custom tokens and create bridge-assets-map.toml +cat < "$bridge_assets_map_file" +[[assets]] +l1AssetAddress = "$L1_ASSET_ADDRESS" +l2AssetAddress = "$L2_ASSET_ADDRESS" +EOF + +echo "Done" + +# Keep the container running for future asset transfers +tail -f /dev/null diff --git a/stack-orchestrator/stacks/bridge/stack.yml b/stack-orchestrator/stacks/bridge/stack.yml index 63be604..a162378 100644 --- a/stack-orchestrator/stacks/bridge/stack.yml +++ b/stack-orchestrator/stacks/bridge/stack.yml @@ -7,6 +7,5 @@ containers: - cerc/nitro-client - cerc/go-nitro pods: - - nitro-contracts - nitro-bridge - nitro-rpc-client