This is a full guide to setup an Aztec Sequencer on Public Testnet, using Docker Compose and your own Sepolia Ethereum node (same device)
Aztec is a zk-rollup allowing developers to build decentralised applications that preserve user privacy without compromising security or decentralisation.
Aztec team co-developed Plonk, a highly efficient and universal zk-SNARK proving system that has since become foundational across the ZK ecosystem. Plonk’s design drastically reduces proof size and verification time, making it one of the first ZK systems viable for real-world applications on Ethereum.
Unlike most Layer 2s today, where sequencer’s are centralised (often a single entity), Aztec is committed to launching with a fully decentralized, permissionless node operator set. This means solo stakers and independent operators can meaningfully participate in the network from day one—validating blocks, publishing encrypted state updates, and helping secure the rollup.
More information from Aztec official docs above, this guide is designed for Solo stakers with their own nodes and using Docker compose for easy deployment.
Ethereum Full Node - Sepolia Network: Reported Working clients (so far) are Geth + Nimbus, Geth + Lodestar
Hardware Requirements: Aztec Only + Eth Node
CPU: 8 Cores (Aztec) + 4 Cores (Eth)
RAM: 16 GB + 16 GB (Eth)
Storage: 1TB + 1TB (Eth Sepolia)
These are min requirements for Aztec Node for testnet, network connection of at least 25 Mbps up/down.
ETH Address: Recommend to create a fresh new Ethereum address (EOA) for this testnet, you need the “Private Key string” and “0x address”. Can easily create with Metamask and export the private key to get the correct format (not Seed words).
Ports: Open Aztec P2P port 40400 tcp/udp
on firewall and Port Forward on your router for discovery.
Install Dependencies
sudo apt update
sudo apt install git curl -y
Install Docker & Docker compose plugin
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
Remove the install script and add $USER to docker group, to allow use without sudo
sudo rm -r get-docker.sh
sudo usermod -aG docker $USER
Restart the device to take effect.
Ignore this Step if you already have your own full node, this guide is setup to run the node on the same device and allow docker to communicate with it.
Optional: (but not recommended) to use a public RPC, however the RPC requirements are high and can be very costly. Edit the appropriate variables with your endpoint API.
Easy Way- Eth Docker
Eth Docker is a great deployment tool to easily spin up Ethereum Nodes (especially for Testing)
Download eth docker
cd ~ && git clone https://github.com/eth-educators/eth-docker.git && cd eth-docker
Configure
./ethd config
For this deployment we only need the execution and consensus node, no validator is required, minimum configuration select: Sepolia Network > Ethereum RPC node >
Start Eth Node
./ethd up -d
Expose Ports
You must open 8545
and 5052
internally, if using eth-docker you can open in the .yml
files by editing like so;
Geth: geth.yml
Nimbus: nimbus-cl-only.yml
Allow to Sync: with a fast NVMe SSD Storage, Sepolia Testnet data can sync overnight.
To check sync: this will return false
when fully synced, or true
while still syncing
curl -X POST -H "Content-type: application/json" --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' http://localhost:8545
Create Working folder for Aztec
mkdir -p aztec/data
Set permissions
chmod 700 aztec/data
Create Environment file
cd aztec
nano .env
Copy to Environment file: fill in the parts in < >
DATA_DIRECTORY=./data
COINBASE=< ADDRESS HERE >
LOG_LEVEL=debug
YOUR_RPC_ENDPOINT="http://localhost:8545"
YOUR_CONSENSUS_ENDPOINT="http:localhost:5052"
YOUR_VALIDATOR_PRIVATE_KEY=< PRIVATE KEY STRING >
YOUR_IP_ADDRESS= < public IP address >
Save and close this file (once done), ctrl
+ o
then ctrl
+ x
Inside aztec
folder create file
nano docker-compose.yml
Paste the contents below
version: '3.8'
name: aztec-node
services:
node:
image: aztecprotocol/aztec:0.87.2
restart: unless-stopped
environment:
ETHEREUM_HOSTS: "${YOUR_RPC_ENDPOINT}"
L1_CONSENSUS_HOST_URLS: "${YOUR_CONSENSUS_ENDPOINT}"
DATA_DIRECTORY: /data
VALIDATOR_PRIVATE_KEY: "${YOUR_VALIDATOR_PRIVATE_KEY}"
P2P_IP: "${YOUR_IP_ADDRESS}"
LOG_LEVEL: "${LOG_LEVEL:-debug}"
entrypoint: >
sh -c 'node --no-warnings /usr/src/yarn-project/aztec/dest/bin/index.js start --network alpha-testnet start --node --archiver --sequencer'
ports:
- "40400:40400/tcp"
- "40400:40400/udp"
- "8080:8080"
volumes:
- ./data:/data
network_mode: "host"
Note: Version can change check docker hub & discord announcements to ensure the correct version.
Start Node from working directory aztec
like so
docker compose up -d
Check logs:
docker compose logs -f node
Check Node Sync
Check the Rollup contract to fetch the latest Block
docker run --rm --network host \
aztecprotocol/foundry:25f24e677a6a32a62512ad4f561995589ac2c7dc-amd64 \
cast call 0xee6d4e937f0493fb461f28a75cf591f1dba8704e \
"getPendingBlockNumber()(uint256)" \
--rpc-url http://localhost:8545
Check your own node for latest block
docker logs --tail 2000 aztec-node-node-1 2>&1 \
| grep -Eo 'Cannot propose block [0-9]+' \
| awk '{print $4}' \
| tail -n1
Compare the results, your own should be +1 block ahead of the contract result, this means its the block your sequencer is trying to propose.