diff --git a/.github/workflows/devnet-deploy.yml b/.github/workflows/devnet-deploy.yml index 83496bc3be0..b1074a4550d 100644 --- a/.github/workflows/devnet-deploy.yml +++ b/.github/workflows/devnet-deploy.yml @@ -22,6 +22,11 @@ on: description: Whether to respect the Terraform lock required: false default: "true" + sepolia_deployment: + description: "Whether to deploy on Sepolia network (default: false)" + required: false + type: boolean + default: false concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -46,6 +51,7 @@ jobs: deployment_mnemonic_secret_name: ${{ github.event.inputs.deployment_mnemonic_secret_name }} deployment_salt: ${{ github.event.inputs.deployment_salt }} respect_tf_lock: ${{ github.event.inputs.respect_tf_lock }} + sepolia_deployment: ${{ github.event.inputs.sepolia_deployment }} secrets: GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }} @@ -127,11 +133,20 @@ jobs: # wait for port-forwards to establish sleep 5 - docker run --rm --network host $AZTEC_DOCKER_IMAGE bootstrap-network \ - --rpc-url http://127.0.0.1:$PXE_PORT \ - --l1-rpc-url http://127.0.0.1:$ETHEREUM_PORT \ - --l1-chain-id "$L1_CHAIN_ID" \ - --mnemonic "$MNEMONIC" \ - --json | tee ./basic_contracts.json + if ${{ inputs.sepolia_deployment }}; then + docker run --rm --network host $AZTEC_DOCKER_IMAGE bootstrap-network \ + --rpc-url http://127.0.0.1:$PXE_PORT \ + --l1-rpc-url ${{ secrets.SEPOLIA_EXTERNAL_HOST }} \ + --l1-chain-id "$L1_CHAIN_ID" \ + --l1-private-key ${{ secrets.SEPOLIA_L1_DEPLOYMENT_PRIVATE_KEY }} \ + --json | tee ./basic_contracts.json + else + docker run --rm --network host $AZTEC_DOCKER_IMAGE bootstrap-network \ + --rpc-url http://127.0.0.1:$PXE_PORT \ + --l1-rpc-url http://127.0.0.1:$ETHEREUM_PORT \ + --l1-chain-id "$L1_CHAIN_ID" \ + --mnemonic "$MNEMONIC" \ + --json | tee ./basic_contracts.json + fi aws s3 cp ./basic_contracts.json ${{ env.CONTRACT_S3_BUCKET }}/devnet/basic_contracts.json diff --git a/.github/workflows/network-deploy.yml b/.github/workflows/network-deploy.yml index 5677fdea1ca..5a7e655da50 100644 --- a/.github/workflows/network-deploy.yml +++ b/.github/workflows/network-deploy.yml @@ -17,7 +17,7 @@ on: type: string deployment_mnemonic_secret_name: description: The name of the secret which holds the boot node's contract deployment mnemonic - required: true + required: false type: string default: testnet-deployment-mnemonic deployment_salt: @@ -40,6 +40,11 @@ on: required: false type: string default: "master" + sepolia_deployment: + description: "Whether to deploy on Sepolia network (default: false)" + required: false + type: boolean + default: false secrets: GCP_SA_KEY: required: true @@ -56,7 +61,7 @@ on: required: true deployment_mnemonic_secret_name: description: The name of the secret which holds the boot node's contract deployment mnemonic - required: true + required: false default: testnet-deployment-mnemonic deployment_salt: description: The salt to use for this deployment. Defaults to random @@ -76,6 +81,11 @@ on: required: false type: string default: "master" + sepolia_deployment: + description: "Whether to deploy on Sepolia network (default: false)" + required: false + type: boolean + default: false jobs: network_deployment: @@ -154,26 +164,56 @@ jobs: # Destroy fails if the resources are already destroyed, so we continue on error continue-on-error: true run: | - terraform destroy -auto-approve \ - -var="RELEASE_NAME=${{ env.NAMESPACE }}" \ - -var="VALUES_FILE=${{ env.VALUES_FILE }}" \ - -var="GKE_CLUSTER_CONTEXT=${{ env.GKE_CLUSTER_CONTEXT }}" \ - -var="AZTEC_DOCKER_IMAGE=${{ env.AZTEC_DOCKER_IMAGE }}" \ - -var="L1_DEPLOYMENT_MNEMONIC=${{ steps.get-mnemonic.outputs.mnemonic }}" + if ${{ inputs.sepolia_deployment }}; then + terraform destroy -auto-approve \ + -var="RELEASE_NAME=${{ env.NAMESPACE }}" \ + -var="VALUES_FILE=${{ env.VALUES_FILE }}" \ + -var="GKE_CLUSTER_CONTEXT=${{ env.GKE_CLUSTER_CONTEXT }}" \ + -var="AZTEC_DOCKER_IMAGE=${{ env.AZTEC_DOCKER_IMAGE }}" \ + -var="L1_DEPLOYMENT_PRIVATE_KEY=${{ secrets.SEPOLIA_L1_DEPLOYMENT_PRIVATE_KEY }}" \ + -var="VALIDATOR_KEYS=${{ secrets.VALIDATOR_KEYS }}" \ + -var="BOOT_NODE_SEQ_PUBLISHER_PRIVATE_KEY=${{ secrets.BOOT_NODE_SEQ_PUBLISHER_PRIVATE_KEY }}" \ + -var="PROVER_PUBLISHER_PRIVATE_KEY=${{ secrets.PROVER_PUBLISHER_PRIVATE_KEY }}" \ + -var="ETHEREUM_EXTERNAL_HOST=${{ secrets.SEPOLIA_EXTERNAL_HOST }}" \ -lock=${{ inputs.respect_tf_lock }} + else + terraform destroy -auto-approve \ + -var="RELEASE_NAME=${{ env.NAMESPACE }}" \ + -var="VALUES_FILE=${{ env.VALUES_FILE }}" \ + -var="GKE_CLUSTER_CONTEXT=${{ env.GKE_CLUSTER_CONTEXT }}" \ + -var="AZTEC_DOCKER_IMAGE=${{ env.AZTEC_DOCKER_IMAGE }}" \ + -var="L1_DEPLOYMENT_MNEMONIC=${{ steps.get-mnemonic.outputs.mnemonic }}" + -lock=${{ inputs.respect_tf_lock }} + fi - name: Terraform Plan working-directory: ./spartan/terraform/deploy-release run: | - terraform plan \ - -var="RELEASE_NAME=${{ env.NAMESPACE }}" \ - -var="VALUES_FILE=${{ env.VALUES_FILE }}" \ - -var="GKE_CLUSTER_CONTEXT=${{ env.GKE_CLUSTER_CONTEXT }}" \ - -var="AZTEC_DOCKER_IMAGE=${{ env.AZTEC_DOCKER_IMAGE }}" \ - -var="L1_DEPLOYMENT_MNEMONIC=${{ steps.get-mnemonic.outputs.mnemonic }}" \ - -var="L1_DEPLOYMENT_SALT=${DEPLOYMENT_SALT:-$RANDOM}" \ - -out=tfplan \ - -lock=${{ inputs.respect_tf_lock }} + if ${{ inputs.sepolia_deployment }}; then + terraform plan \ + -var="RELEASE_NAME=${{ env.NAMESPACE }}" \ + -var="VALUES_FILE=${{ env.VALUES_FILE }}" \ + -var="GKE_CLUSTER_CONTEXT=${{ env.GKE_CLUSTER_CONTEXT }}" \ + -var="AZTEC_DOCKER_IMAGE=${{ env.AZTEC_DOCKER_IMAGE }}" \ + -var="L1_DEPLOYMENT_PRIVATE_KEY=${{ secrets.SEPOLIA_L1_DEPLOYMENT_PRIVATE_KEY }}" \ + -var="L1_DEPLOYMENT_SALT=${DEPLOYMENT_SALT:-$RANDOM}" \ + -var="VALIDATOR_KEYS=${{ secrets.VALIDATOR_KEYS }}" \ + -var="BOOT_NODE_SEQ_PUBLISHER_PRIVATE_KEY=${{ secrets.BOOT_NODE_SEQ_PUBLISHER_PRIVATE_KEY }}" \ + -var="PROVER_PUBLISHER_PRIVATE_KEY=${{ secrets.PROVER_PUBLISHER_PRIVATE_KEY }}" \ + -var="ETHEREUM_EXTERNAL_HOST=${{ secrets.SEPOLIA_EXTERNAL_HOST }}" \ + -out=tfplan \ + -lock=${{ inputs.respect_tf_lock }} + else + terraform plan \ + -var="RELEASE_NAME=${{ env.NAMESPACE }}" \ + -var="VALUES_FILE=${{ env.VALUES_FILE }}" \ + -var="GKE_CLUSTER_CONTEXT=${{ env.GKE_CLUSTER_CONTEXT }}" \ + -var="AZTEC_DOCKER_IMAGE=${{ env.AZTEC_DOCKER_IMAGE }}" \ + -var="L1_DEPLOYMENT_MNEMONIC=${{ steps.get-mnemonic.outputs.mnemonic }}" \ + -var="L1_DEPLOYMENT_SALT=${DEPLOYMENT_SALT:-$RANDOM}" \ + -out=tfplan \ + -lock=${{ inputs.respect_tf_lock }} + fi - name: Terraform Apply working-directory: ./spartan/terraform/deploy-release diff --git a/scripts/run_interleaved.sh b/scripts/run_interleaved.sh index 0e03e9a9030..d5db1dcf002 100755 --- a/scripts/run_interleaved.sh +++ b/scripts/run_interleaved.sh @@ -3,13 +3,24 @@ set -eu # propagate errors inside while loop pipe set -o pipefail -# Usage: run_interleaved.sh
... +# Usage: run_interleaved.sh [-w "condition command"]
... # Runs commands in parallel, with interleaved output. See ci3/tmux_split for another approach. # Finishes when the main command exits. +# -w: Optional wait condition command that must succeed before starting next command + +# Parse options +WAIT_CMD="" +while getopts "w:" opt; do + case $opt in + w) WAIT_CMD="$OPTARG";; + \?) echo "Invalid option -$OPTARG" >&2; exit 1;; + esac +done +shift $((OPTIND-1)) # Check if at least two commands are provided (otherwise what is the point) if [ "$#" -lt 2 ]; then - echo "Usage: $0 ..." + echo "Usage: $0 [-w 'condition command'] ..." exit 1 fi @@ -51,6 +62,13 @@ function run_command() { # Run background commands without logging output i=0 for cmd in "$@"; do + if [ $i -gt 0 ] && [ -n "$WAIT_CMD" ]; then + echo "Waiting for condition before starting next command..." + until eval "$WAIT_CMD"; do + sleep 1 + done + fi + (run_command "$cmd" "${colors[$((i % ${#colors[@]}))]}" || [ $FINISHED = true ] || (echo "$cmd causing terminate" && kill 0) ) & ((i++)) || true # annoyingly considered a failure based on result done diff --git a/spartan/aztec-network/files/config/config-validator-env.sh b/spartan/aztec-network/files/config/config-validator-env.sh index b2848f8e069..78b6b319f36 100644 --- a/spartan/aztec-network/files/config/config-validator-env.sh +++ b/spartan/aztec-network/files/config/config-validator-env.sh @@ -3,7 +3,7 @@ set -eu # Pass a PXE url as an argument # Ask the PXE's node for l1 contract addresses -output=$(node --no-warnings /usr/src/yarn-project/aztec/dest/bin/index.js get-node-info -u $1 --node-url '') +output=$(node --no-warnings /usr/src/yarn-project/aztec/dest/bin/index.js get-node-info -u $1) echo "$output" diff --git a/spartan/aztec-network/files/config/deploy-l1-contracts.sh b/spartan/aztec-network/files/config/deploy-l1-contracts.sh old mode 100644 new mode 100755 index 1f4c56599f7..855372ca77c --- a/spartan/aztec-network/files/config/deploy-l1-contracts.sh +++ b/spartan/aztec-network/files/config/deploy-l1-contracts.sh @@ -8,19 +8,31 @@ CHAIN_ID=$2 output="" MAX_RETRIES=5 RETRY_DELAY=60 -export LOG_LEVEL=debug for attempt in $(seq 1 $MAX_RETRIES); do - # if INIT_VALIDATORS is true, then we need to pass the validators flag to the deploy-l1-contracts command + # Construct base command + base_cmd="node --no-warnings /usr/src/yarn-project/aztec/dest/bin/index.js deploy-l1-contracts" + + # Add account - use private key if set, otherwise use mnemonic + if [ -n "${L1_DEPLOYMENT_PRIVATE_KEY:-}" ]; then + base_cmd="$base_cmd --private-key $L1_DEPLOYMENT_PRIVATE_KEY" + else + base_cmd="$base_cmd --mnemonic '$MNEMONIC'" + fi + + # Add validators if INIT_VALIDATORS is true if [ "${INIT_VALIDATORS:-false}" = "true" ]; then - output=$(node --no-warnings /usr/src/yarn-project/aztec/dest/bin/index.js deploy-l1-contracts --mnemonic "$MNEMONIC" --validators $3 --l1-chain-id $CHAIN_ID --salt $SALT) && break + output=$(eval $base_cmd --validators $3 --l1-chain-id $CHAIN_ID --salt $SALT) && break else - output=$(node --no-warnings /usr/src/yarn-project/aztec/dest/bin/index.js deploy-l1-contracts --mnemonic "$MNEMONIC" --l1-chain-id $CHAIN_ID --salt $SALT) && break + output=$(eval $base_cmd --l1-chain-id $CHAIN_ID --salt $SALT) && break fi + echo "Attempt $attempt failed. Retrying in $RETRY_DELAY seconds..." sleep "$RETRY_DELAY" -done || { echo "All l1 contract deploy attempts failed."; exit 1; } - +done || { + echo "All l1 contract deploy attempts failed." + exit 1 +} echo "$output" @@ -38,7 +50,7 @@ governance_proposer_address=$(echo "$output" | grep -oP 'GovernanceProposer Addr governance_address=$(echo "$output" | grep -oP 'Governance Address: \K0x[a-fA-F0-9]{40}') # Write the addresses to a file in the shared volume -cat < /shared/contracts/contracts.env +cat </shared/contracts/contracts.env export ROLLUP_CONTRACT_ADDRESS=$rollup_address export REGISTRY_CONTRACT_ADDRESS=$registry_address export INBOX_CONTRACT_ADDRESS=$inbox_address diff --git a/spartan/aztec-network/files/config/setup-service-addresses.sh b/spartan/aztec-network/files/config/setup-service-addresses.sh index 063c84a16e5..5b01449150a 100644 --- a/spartan/aztec-network/files/config/setup-service-addresses.sh +++ b/spartan/aztec-network/files/config/setup-service-addresses.sh @@ -53,8 +53,8 @@ get_service_address() { } # Configure Ethereum address -if [ "${ETHEREUM_EXTERNAL_HOST}" != "" ]; then - ETHEREUM_ADDR="${ETHEREUM_EXTERNAL_HOST}" +if [ "${EXTERNAL_ETHEREUM_HOST}" != "" ]; then + ETHEREUM_ADDR="${EXTERNAL_ETHEREUM_HOST}" elif [ "${NETWORK_PUBLIC}" = "true" ]; then ETHEREUM_ADDR=$(get_service_address "ethereum" "${ETHEREUM_PORT}") else diff --git a/spartan/aztec-network/templates/boot-node.yaml b/spartan/aztec-network/templates/boot-node.yaml index f6f52b4b9b2..98a907624e6 100644 --- a/spartan/aztec-network/templates/boot-node.yaml +++ b/spartan/aztec-network/templates/boot-node.yaml @@ -44,8 +44,8 @@ spec: cat /shared/config/service-addresses echo "Awaiting ethereum node at ${ETHEREUM_HOST}" until curl -s -X POST -H 'Content-Type: application/json' \ - -d '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' \ - ${ETHEREUM_HOST} | grep -q reth; do + -d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}' \ + ${ETHEREUM_HOST} | grep 0x; do echo "Waiting for Ethereum node ${ETHEREUM_HOST}..." sleep 5 done @@ -97,6 +97,8 @@ spec: value: "true" - name: MNEMONIC value: "{{ .Values.aztec.l1DeploymentMnemonic }}" + - name: L1_DEPLOYMENT_PRIVATE_KEY + value: "{{ .Values.ethereum.deployL1ContractsPrivateKey }}" - name: ETHEREUM_SLOT_DURATION value: "{{ .Values.ethereum.blockTime }}" - name: AZTEC_SLOT_DURATION @@ -189,6 +191,8 @@ spec: value: "{{ .Values.bootNode.sequencer.minTxsPerBlock }}" - name: VALIDATOR_PRIVATE_KEY value: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + - name: SEQ_PUBLISHER_PRIVATE_KEY + value: "{{ .Values.bootNode.seqPublisherPrivateKey }}" - name: OTEL_RESOURCE_ATTRIBUTES value: service.name={{ .Release.Name }},service.namespace={{ .Release.Namespace }},service.version={{ .Chart.AppVersion }},environment={{ .Values.environment | default "production" }} - name: PROVER_REAL_PROOFS @@ -203,6 +207,14 @@ spec: value: "{{ .Values.aztec.epochDuration }}" - name: AZTEC_EPOCH_PROOF_CLAIM_WINDOW_IN_L2_SLOTS value: "{{ .Values.aztec.epochProofClaimWindow }}" + - name: ARCHIVER_POLLING_INTERVAL_MS + value: {{ .Values.bootNode.archiverPollingInterval | quote }} + - name: ARCHIVER_VIEM_POLLING_INTERVAL_MS + value: {{ .Values.bootNode.archiverViemPollingInterval | quote }} + - name: L1_READER_VIEM_POLLING_INTERVAL_MS + value: {{ .Values.bootNode.archiverViemPollingInterval | quote }} + - name: SEQ_VIEM_POLLING_INTERVAL_MS + value: {{ .Values.bootNode.viemPollingInterval | quote }} - name: PEER_ID_PRIVATE_KEY value: "{{ .Values.bootNode.peerIdPrivateKey }}" ports: diff --git a/spartan/aztec-network/templates/prover-node.yaml b/spartan/aztec-network/templates/prover-node.yaml index 908c30902bd..f28ea686b17 100644 --- a/spartan/aztec-network/templates/prover-node.yaml +++ b/spartan/aztec-network/templates/prover-node.yaml @@ -34,8 +34,8 @@ spec: - | source /shared/config/service-addresses until curl -s -X POST -H 'Content-Type: application/json' \ - -d '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' \ - ${ETHEREUM_HOST} | grep -q reth; do + -d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}' \ + ${ETHEREUM_HOST} | grep 0x; do echo "Waiting for Ethereum node ${ETHEREUM_HOST}..." sleep 5 done @@ -144,7 +144,7 @@ spec: - name: PROVER_BROKER_DATA_DIRECTORY value: "{{ .Values.proverNode.proverBroker.dataDirectory }}" - name: PROVER_PUBLISHER_PRIVATE_KEY - value: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + value: "{{ .Values.proverNode.proverPublisherPrivateKey }}" - name: OTEL_RESOURCE_ATTRIBUTES value: service.name={{ .Release.Name }},service.namespace={{ .Release.Namespace }},service.version={{ .Chart.AppVersion }},environment={{ .Values.environment | default "production" }} - name: L1_CHAIN_ID @@ -163,6 +163,8 @@ spec: value: "{{ .Values.aztec.epochDuration }}" - name: AZTEC_EPOCH_PROOF_CLAIM_WINDOW_IN_L2_SLOTS value: "{{ .Values.aztec.epochProofClaimWindow }}" + - name: PROVER_VIEM_POLLING_INTERVAL_MS + value: {{ .Values.proverNode.viemPollingInterval | quote }} ports: - containerPort: {{ .Values.proverNode.service.nodePort }} - containerPort: {{ .Values.proverNode.service.p2pTcpPort }} diff --git a/spartan/aztec-network/templates/reth.yaml b/spartan/aztec-network/templates/reth.yaml index 938d48b649a..69bd6037e29 100644 --- a/spartan/aztec-network/templates/reth.yaml +++ b/spartan/aztec-network/templates/reth.yaml @@ -1,3 +1,4 @@ +{{- if not .Values.ethereum.externalHost }} apiVersion: apps/v1 kind: Deployment metadata: @@ -144,4 +145,5 @@ spec: requests: storage: {{ .Values.ethereum.storage }} {{- end }} ---- \ No newline at end of file +--- +{{ end }} \ No newline at end of file diff --git a/spartan/aztec-network/templates/validator.yaml b/spartan/aztec-network/templates/validator.yaml index b866f154ef7..8ff7cf7735f 100644 --- a/spartan/aztec-network/templates/validator.yaml +++ b/spartan/aztec-network/templates/validator.yaml @@ -45,8 +45,8 @@ spec: cat /shared/config/service-addresses # First check ethereum node until curl -s -X POST -H 'Content-Type: application/json' \ - -d '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' \ - $ETHEREUM_HOST | grep -q reth; do + -d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}' \ + $ETHEREUM_HOST | grep 0x; do echo "Waiting for Ethereum node ${ETHEREUM_HOST}..." sleep 5 done @@ -190,6 +190,16 @@ spec: value: "{{ .Values.aztec.epochDuration }}" - name: AZTEC_EPOCH_PROOF_CLAIM_WINDOW_IN_L2_SLOTS value: "{{ .Values.aztec.epochProofClaimWindow }}" + - name: VALIDATOR_ATTESTATIONS_POLLING_INTERVAL_MS + value: {{ .Values.validator.attestationPollingInterval | quote }} + - name: ARCHIVER_POLLING_INTERVAL_MS + value: {{ .Values.validator.archiverPollingInterval | quote }} + - name: ARCHIVER_VIEM_POLLING_INTERVAL_MS + value: {{ .Values.validator.viemPollingInterval | quote }} + - name: L1_READER_VIEM_POLLING_INTERVAL_MS + value: {{ .Values.validator.viemPollingInterval | quote }} + - name: SEQ_VIEM_POLLING_INTERVAL_MS + value: {{ .Values.validator.viemPollingInterval | quote }} ports: - containerPort: {{ .Values.validator.service.nodePort }} - containerPort: {{ .Values.validator.service.p2pTcpPort }} diff --git a/spartan/aztec-network/values.yaml b/spartan/aztec-network/values.yaml index 8c58606c7cd..120851580c7 100644 --- a/spartan/aztec-network/values.yaml +++ b/spartan/aztec-network/values.yaml @@ -38,6 +38,7 @@ aztec: l1Salt: "" # leave empty for random salt bootNode: + seqPublisherPrivateKey: "" peerIdPrivateKey: "" externalHost: "" replicas: 1 @@ -71,7 +72,11 @@ bootNode: outboxAddress: "" feeJuiceAddress: "" feeJuicePortalAddress: "" - stakingAssetAddress: "" + storage: "8Gi" + archiverPollingInterval: 1000 + archiverViemPollingInterval: 1000 + viemPollingInterval: 1000 + stakingAssetAddress: "" storageSize: "1Gi" dataDir: "/data" @@ -110,10 +115,15 @@ validator: requests: memory: "2Gi" cpu: "200m" + archiverPollingInterval: 1000 + archiverViemPollingInterval: 1000 + attestationPollingInterval: 1000 + viemPollingInterval: 1000 storageSize: "1Gi" dataDir: "/data" proverNode: + proverPublisherPrivateKey: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" externalHost: "" replicas: 1 p2pEnabled: true @@ -137,6 +147,10 @@ proverNode: memory: "2Gi" cpu: "200m" storage: "8Gi" + archiverPollingInterval: 1000 + archiverViemPollingInterval: 1000 + pollInterval: 1000 + viemPollingInterval: 1000 pxe: logLevel: "debug; info: aztec:simulator, json-rpc" @@ -208,6 +222,7 @@ ethereum: memory: "2Gi" cpu: "200m" storage: "80Gi" + deployL1ContractsPrivateKey: proverAgent: service: @@ -223,6 +238,7 @@ proverAgent: hardwareConcurrency: "" nodeSelector: {} resources: {} + pollInterval: 200 proverBroker: service: diff --git a/spartan/aztec-network/values/exp-2.yaml b/spartan/aztec-network/values/exp-2.yaml new file mode 100644 index 00000000000..a2601a184ad --- /dev/null +++ b/spartan/aztec-network/values/exp-2.yaml @@ -0,0 +1,32 @@ +telemetry: + enabled: true + otelCollectorEndpoint: http://metrics-opentelemetry-collector.metrics:4318 + +network: + setupL2Contracts: false + public: false + +ethereum: + externalHost: + chainId: "11155111" + +validator: + replicas: 3 + validatorKeys: + validatorAddresses: + - 0xB5221f3FA03acDEA5A68e355CcDed3f76847F375 + - 0x226E9D4c69525884b0A52C1E9E4C11054729223e + - 0xA33Fa6E2890C37C42CFC0875B86462E73885e02b + validator: + disabled: false + +bootNode: + seqPublisherPrivateKey: + validator: + disabled: true + +proverNode: + proverPublisherPrivateKey: + +bot: + txIntervalSeconds: 20 \ No newline at end of file diff --git a/spartan/aztec-network/values/sepolia-3-validators-with-metrics.yaml b/spartan/aztec-network/values/sepolia-3-validators-with-metrics.yaml new file mode 100644 index 00000000000..a2601a184ad --- /dev/null +++ b/spartan/aztec-network/values/sepolia-3-validators-with-metrics.yaml @@ -0,0 +1,32 @@ +telemetry: + enabled: true + otelCollectorEndpoint: http://metrics-opentelemetry-collector.metrics:4318 + +network: + setupL2Contracts: false + public: false + +ethereum: + externalHost: + chainId: "11155111" + +validator: + replicas: 3 + validatorKeys: + validatorAddresses: + - 0xB5221f3FA03acDEA5A68e355CcDed3f76847F375 + - 0x226E9D4c69525884b0A52C1E9E4C11054729223e + - 0xA33Fa6E2890C37C42CFC0875B86462E73885e02b + validator: + disabled: false + +bootNode: + seqPublisherPrivateKey: + validator: + disabled: true + +proverNode: + proverPublisherPrivateKey: + +bot: + txIntervalSeconds: 20 \ No newline at end of file diff --git a/spartan/terraform/deploy-release/main.tf b/spartan/terraform/deploy-release/main.tf index 84d44bae93e..3972a690489 100644 --- a/spartan/terraform/deploy-release/main.tf +++ b/spartan/terraform/deploy-release/main.tf @@ -47,9 +47,52 @@ resource "helm_release" "aztec-gke-cluster" { value = var.AZTEC_DOCKER_IMAGE } - set { - name = "aztec.l1DeploymentMnemonic" - value = var.L1_DEPLOYMENT_MNEMONIC + dynamic "set" { + for_each = var.L1_DEPLOYMENT_MNEMONIC != "" ? toset(["iterate"]) : toset([]) + content { + name = "aztec.l1DeploymentMnemonic" + value = var.L1_DEPLOYMENT_MNEMONIC + } + } + + dynamic "set" { + for_each = var.L1_DEPLOYMENT_PRIVATE_KEY != "" ? toset(["iterate"]) : toset([]) + content { + name = "ethereum.deployL1ContractsPrivateKey" + value = var.L1_DEPLOYMENT_PRIVATE_KEY + } + } + + dynamic "set" { + for_each = var.BOOT_NODE_SEQ_PUBLISHER_PRIVATE_KEY != "" ? toset(["iterate"]) : toset([]) + content { + name = "bootNode.seqPublisherPrivateKey" + value = var.BOOT_NODE_SEQ_PUBLISHER_PRIVATE_KEY + } + } + + dynamic "set" { + for_each = var.PROVER_PUBLISHER_PRIVATE_KEY != "" ? toset(["iterate"]) : toset([]) + content { + name = "proverNode.proverPublisherPrivateKey" + value = var.PROVER_PUBLISHER_PRIVATE_KEY + } + } + + dynamic "set_list" { + for_each = length(try(var.VALIDATOR_KEYS, [])) > 0 ? toset(["iterate"]) : toset([]) + content { + name = "validator.validatorKeys" + value = var.VALIDATOR_KEYS + } + } + + dynamic "set" { + for_each = var.ETHEREUM_EXTERNAL_HOST != "" ? toset(["iterate"]) : toset([]) + content { + name = "ethereum.externalHost" + value = var.ETHEREUM_EXTERNAL_HOST + } } set { diff --git a/spartan/terraform/deploy-release/variables.tf b/spartan/terraform/deploy-release/variables.tf index 7a5fbc364aa..2658851316d 100644 --- a/spartan/terraform/deploy-release/variables.tf +++ b/spartan/terraform/deploy-release/variables.tf @@ -1,7 +1,7 @@ variable "GKE_CLUSTER_CONTEXT" { description = "GKE cluster context" type = string - default = "gke_testnet-440309_us-east4-a_spartan-gke" + default = "gke_testnet-440309_us-west1-a_aztec-gke" } variable "RELEASE_NAME" { @@ -23,8 +23,42 @@ variable "L1_DEPLOYMENT_MNEMONIC" { description = "Mnemonic to use for the L1 contract deployments" type = string sensitive = true + default = "" +} + +variable "L1_DEPLOYMENT_PRIVATE_KEY" { + description = "Private key to use for the L1 contract deployments" + type = string + sensitive = true + default = "" +} + +variable "VALIDATOR_KEYS" { + description = "List of private keys to use for the validators" + type = list(string) + sensitive = true + default = [] +} + +variable "BOOT_NODE_SEQ_PUBLISHER_PRIVATE_KEY" { + description = "Private key to use for the boot node" + type = string + sensitive = true + default = "" } +variable "PROVER_PUBLISHER_PRIVATE_KEY" { + description = "Private key to use for the prover" + type = string + sensitive = true + default = "" +} + +variable "ETHEREUM_EXTERNAL_HOST" { + description = "External host to use for the ethereum node" + type = string + default = "" +} variable "L1_DEPLOYMENT_SALT" { description = "Salt to use for the L1 contract deployments" type = string diff --git a/yarn-project/end-to-end/scripts/native-network/validators.sh b/yarn-project/end-to-end/scripts/native-network/validators.sh index b3a75886368..0fbece3cb03 100755 --- a/yarn-project/end-to-end/scripts/native-network/validators.sh +++ b/yarn-project/end-to-end/scripts/native-network/validators.sh @@ -37,6 +37,7 @@ if [ "$NUM_VALIDATORS" -eq 1 ]; then eval "${CMD[0]}" else echo "Running $NUM_VALIDATORS validators interleaved" + # Execute the run_interleaved.sh script with the commands "$(git rev-parse --show-toplevel)/scripts/run_interleaved.sh" "${CMD[@]}" fi diff --git a/yarn-project/end-to-end/scripts/network_test.sh b/yarn-project/end-to-end/scripts/network_test.sh index 4fc0dc5c46f..99c2d4b7b0b 100755 --- a/yarn-project/end-to-end/scripts/network_test.sh +++ b/yarn-project/end-to-end/scripts/network_test.sh @@ -15,7 +15,7 @@ set -eux SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Main positional parameter -TEST="$1" +TEST=${1:-} REPO=$(git rev-parse --show-toplevel) if [ "$(uname)" = "Linux" ] && [ "$(uname -m)" = "x86_64" ]; then @@ -39,9 +39,15 @@ if [ -z "${NAMESPACE:-}" ]; then exit 1 fi -if ! docker image ls --format '{{.Repository}}:{{.Tag}}' | grep -q "aztecprotocol/aztec:$AZTEC_DOCKER_TAG" || \ - ! docker image ls --format '{{.Repository}}:{{.Tag}}' | grep -q "aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG"; then - echo "Docker images not found." +# Always check for the aztec image +if ! docker image ls --format '{{.Repository}}:{{.Tag}}' | grep -q "aztecprotocol/aztec:$AZTEC_DOCKER_TAG"; then + echo "Aztec Docker image not found. It needs to be built with 'earthly ./yarn-project/+export-e2e-test-images' or otherwise tagged with aztecprotocol/aztec:$AZTEC_DOCKER_TAG." + exit 1 +fi + +# Only check for end-to-end image if a test is specified +if [ -n "$TEST" ] && ! docker image ls --format '{{.Repository}}:{{.Tag}}' | grep -q "aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG"; then + echo "End-to-end Docker image not found. It needs to be built with 'earthly ./yarn-project/+export-e2e-test-images' or otherwise tagged with aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG." exit 1 fi @@ -56,16 +62,16 @@ fi STERN_PID="" function copy_stern_to_log() { ulimit -n 4096 - stern spartan -n $NAMESPACE > $SCRIPT_DIR/network-test.log & - echo "disabled until less resource intensive solution than stern implemented" > $SCRIPT_DIR/network-test.log & + stern spartan -n $NAMESPACE >$SCRIPT_DIR/network-test.log & + echo "disabled until less resource intensive solution than stern implemented" >$SCRIPT_DIR/network-test.log & STERN_PID=$! } function show_status_until_pxe_ready() { - set +x # don't spam with our commands + set +x # don't spam with our commands sleep 15 # let helm upgrade start - for i in {1..100} ; do - if kubectl wait pod -l app==pxe --for=condition=Ready -n "$NAMESPACE" --timeout=20s >/dev/null 2>/dev/null ; then + for i in {1..100}; do + if kubectl wait pod -l app==pxe --for=condition=Ready -n "$NAMESPACE" --timeout=20s >/dev/null 2>/dev/null; then break # we are up, stop showing status fi # show startup status @@ -73,42 +79,40 @@ function show_status_until_pxe_ready() { done } -# Handle and check chaos mesh setup handle_network_shaping() { - if [ -n "${CHAOS_VALUES:-}" ]; then - echo "Checking chaos-mesh setup..." - - if ! kubectl get service chaos-daemon -n chaos-mesh &>/dev/null; then - # If chaos mesh is not installed, we check the INSTALL_CHAOS_MESH flag - # to determine if we should install it. - if [ "$INSTALL_CHAOS_MESH" ]; then - echo "Installing chaos-mesh..." - cd "$REPO/spartan/chaos-mesh" && ./install.sh - else - echo "Error: chaos-mesh namespace not found!" - echo "Please set up chaos-mesh first. You can do this by running:" - echo "cd $REPO/spartan/chaos-mesh && ./install.sh" - exit 1 - fi - fi - - echo "Deploying Aztec Chaos Scenarios..." - if ! helm upgrade --install aztec-chaos-scenarios "$REPO/spartan/aztec-chaos-scenarios/" \ - --namespace chaos-mesh \ - --values "$REPO/spartan/aztec-chaos-scenarios/values/$CHAOS_VALUES" \ - --set global.targetNamespace="$NAMESPACE" \ - --wait \ - --timeout=5m; then - echo "Error: failed to deploy Aztec Chaos Scenarios!" - return 1 - fi - - echo "Aztec Chaos Scenarios applied successfully" - return 0 + if [ -n "${CHAOS_VALUES:-}" ]; then + echo "Checking chaos-mesh setup..." + + if ! kubectl get service chaos-daemon -n chaos-mesh &>/dev/null; then + # If chaos mesh is not installed, we check the INSTALL_CHAOS_MESH flag + # to determine if we should install it. + if [ "$INSTALL_CHAOS_MESH" ]; then + echo "Installing chaos-mesh..." + cd "$REPO/spartan/chaos-mesh" && ./install.sh + else + echo "Error: chaos-mesh namespace not found!" + echo "Please set up chaos-mesh first. You can do this by running:" + echo "cd $REPO/spartan/chaos-mesh && ./install.sh" + exit 1 + fi + fi + + echo "Deploying Aztec Chaos Scenarios..." + if ! helm upgrade --install aztec-chaos-scenarios "$REPO/spartan/aztec-chaos-scenarios/" \ + --namespace chaos-mesh \ + --values "$REPO/spartan/aztec-chaos-scenarios/values/$CHAOS_VALUES" \ + --set global.targetNamespace="$NAMESPACE" \ + --wait \ + --timeout=5m; then + echo "Error: failed to deploy Aztec Chaos Scenarios!" + return 1 fi + + echo "Aztec Chaos Scenarios applied successfully" return 0 + fi + return 0 } - copy_stern_to_log show_status_until_pxe_ready & @@ -132,13 +136,13 @@ VALUES_PATH="$REPO/spartan/aztec-network/values/$VALUES_FILE" # Install the Helm chart helm upgrade --install spartan "$REPO/spartan/aztec-network/" \ - --namespace "$NAMESPACE" \ - --create-namespace \ - --values "$VALUES_PATH" \ - --set images.aztec.image="aztecprotocol/aztec:$AZTEC_DOCKER_TAG" \ - --wait \ - --wait-for-jobs=true \ - --timeout="$INSTALL_TIMEOUT" + --namespace "$NAMESPACE" \ + --create-namespace \ + --values "$VALUES_PATH" \ + --set images.aztec.image="aztecprotocol/aztec:$AZTEC_DOCKER_TAG" \ + --wait \ + --wait-for-jobs=true \ + --timeout="$INSTALL_TIMEOUT" kubectl wait pod -l app==pxe --for=condition=Ready -n "$NAMESPACE" --timeout=10m @@ -168,30 +172,33 @@ fi # Get the values from the values file VALUES=$(cat "$VALUES_PATH") -ETHEREUM_SLOT_DURATION=$(yq -r '.ethereum.blockTime' <<< "$VALUES") -AZTEC_SLOT_DURATION=$(yq -r '.aztec.slotDuration' <<< "$VALUES") -AZTEC_EPOCH_DURATION=$(yq -r '.aztec.epochDuration' <<< "$VALUES") -AZTEC_EPOCH_PROOF_CLAIM_WINDOW_IN_L2_SLOTS=$(yq -r '.aztec.epochProofClaimWindow' <<< "$VALUES") - - -docker run --rm --network=host \ - -v ~/.kube:/root/.kube \ - -e K8S=local \ - -e INSTANCE_NAME="spartan" \ - -e SPARTAN_DIR="/usr/src/spartan" \ - -e NAMESPACE="$NAMESPACE" \ - -e HOST_PXE_PORT=$PXE_PORT \ - -e CONTAINER_PXE_PORT=8081 \ - -e HOST_ETHEREUM_PORT=$ANVIL_PORT \ - -e CONTAINER_ETHEREUM_PORT=8545 \ - -e HOST_METRICS_PORT=$METRICS_PORT \ - -e CONTAINER_METRICS_PORT=80 \ - -e GRAFANA_PASSWORD=$GRAFANA_PASSWORD \ - -e DEBUG=${DEBUG:-""} \ - -e LOG_JSON=1 \ - -e LOG_LEVEL=${LOG_LEVEL:-"debug; info: aztec:simulator, json-rpc"} \ - -e ETHEREUM_SLOT_DURATION=$ETHEREUM_SLOT_DURATION \ - -e AZTEC_SLOT_DURATION=$AZTEC_SLOT_DURATION \ - -e AZTEC_EPOCH_DURATION=$AZTEC_EPOCH_DURATION \ - -e AZTEC_EPOCH_PROOF_CLAIM_WINDOW_IN_L2_SLOTS=$AZTEC_EPOCH_PROOF_CLAIM_WINDOW_IN_L2_SLOTS \ - aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG $TEST +ETHEREUM_SLOT_DURATION=$(yq -r '.ethereum.blockTime' <<<"$VALUES") +AZTEC_SLOT_DURATION=$(yq -r '.aztec.slotDuration' <<<"$VALUES") +AZTEC_EPOCH_DURATION=$(yq -r '.aztec.epochDuration' <<<"$VALUES") +AZTEC_EPOCH_PROOF_CLAIM_WINDOW_IN_L2_SLOTS=$(yq -r '.aztec.epochProofClaimWindow' <<<"$VALUES") + +# Run the test if $TEST is not empty +if [ -n "$TEST" ]; then + echo "RUNNING TEST: $TEST" + docker run --rm --network=host \ + -v ~/.kube:/root/.kube \ + -e K8S=local \ + -e INSTANCE_NAME="spartan" \ + -e SPARTAN_DIR="/usr/src/spartan" \ + -e NAMESPACE="$NAMESPACE" \ + -e HOST_PXE_PORT=$PXE_PORT \ + -e CONTAINER_PXE_PORT=8081 \ + -e HOST_ETHEREUM_PORT=$ANVIL_PORT \ + -e CONTAINER_ETHEREUM_PORT=8545 \ + -e HOST_METRICS_PORT=$METRICS_PORT \ + -e CONTAINER_METRICS_PORT=80 \ + -e GRAFANA_PASSWORD=$GRAFANA_PASSWORD \ + -e DEBUG=${DEBUG:-""} \ + -e LOG_JSON=1 \ + -e LOG_LEVEL=${LOG_LEVEL:-"debug; info: aztec:simulator, json-rpc"} \ + -e ETHEREUM_SLOT_DURATION=$ETHEREUM_SLOT_DURATION \ + -e AZTEC_SLOT_DURATION=$AZTEC_SLOT_DURATION \ + -e AZTEC_EPOCH_DURATION=$AZTEC_EPOCH_DURATION \ + -e AZTEC_EPOCH_PROOF_CLAIM_WINDOW_IN_L2_SLOTS=$AZTEC_EPOCH_PROOF_CLAIM_WINDOW_IN_L2_SLOTS \ + aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG $TEST +fi diff --git a/yarn-project/l1-artifacts/scripts/generate-artifacts.sh b/yarn-project/l1-artifacts/scripts/generate-artifacts.sh index 896467dfd05..04bb74e264d 100755 --- a/yarn-project/l1-artifacts/scripts/generate-artifacts.sh +++ b/yarn-project/l1-artifacts/scripts/generate-artifacts.sh @@ -71,4 +71,4 @@ for E in "${CONTRACTS[@]}"; do echo -ne "export * from './${CONTRACT_NAME}Abi.js';\nexport * from './${CONTRACT_NAME}Bytecode.js';\n" >> "$target_dir/index.ts"; done; -echo "Successfully generated TS artifacts!"; +echo "Successfully generated TS artifacts!"; \ No newline at end of file