Setting up a local Aztec development network
You can set up a local Aztec network for development purposes using docker compose scripts.
Steps
Install Docker
From here.
Start the network
Run the relevant docker compose file for your needs. Make sure you have at least 8 GB of RAM allocated to Docker--the more you can allocate, the better.
Mac M1s run this on an emulator so they will be slower.
Basic Network
For a simple, fresh Ethereum network + Aztec sequencer without any bridge contracts, run
curl -s https://raw.githubusercontent.com/AztecProtocol/dev-rel/main/docker-compose.dev.yml | docker-compose -f - up --force-recreate
This will be useful for testing basic functionality of the Aztec network like deposits, withdrawals, account registrations, account migrations, account recovery and asset transfers.
Mainnet fork with bridge contracts
Or for a an Ethereum fork of mainnet along with all of the mainnet Aztec bridge contracts deployed + Aztec sequencer, run
curl -s https://raw.githubusercontent.com/AztecProtocol/dev-rel/main/docker-compose.fork.yml | CHAIN_ID=3567 FORK_URL=https://mainnet.infura.io/v3/{infura_api_key} docker-compose -f - up --force-recreate
This network will be useful for testing functionality associated with bridge contracts and interacting with other contracts/protocols that are on Ethereum.
Note the CHAIN_ID=3567
and FORK_URL=https://mainnet.infura.io/v3/{infura_api_key}
when running the mainnet fork. Specifying chain id 3567 will run the contract deployment script so that all of the bridge contracts that are on mainnet will be deployed to this dev network.
This mainnet fork deployment takes considerably longer than the basic devnet.
These scripts will get the docker compose file from a github gist and run it.
You can download the docker-compose.dev.yml here or docker-compose.fork.yml here.
Check the sequencer
Check that the aztec sequencer (falafel) is running by visiting this url in your browser at http://localhost:8081/status.
Once it is up and running, you can use it to run testing scripts against or point your web application to it for testing.
Connect the SDK
For a web application, point Metamask to the locally running Ethereum network (details below).
Connect the Aztec SDK to http://localhost:8081
.
You can also interact with your local aztec network directly via the CLI or the frontend boilerplate.
Deploy custom bridges
You can deploy your own bridge contracts to the mainnet fork devnet.
Here is an example script that shows how you would deploy the ExampleBridge.sol contract in the aztec-connect-bridges repo.
Set these local environment variables before running the deployment script.
export NETWORK=None
export SIMULATE_ADMIN=false # to broadcast your deployment to the devnet
export LISTER_ADDRESS=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
Check the rollupProcessorContract
address on your local Aztec sequencer at http://localhost:8081/status and export it as an environment variable as well.
For example:
export ROLLUP_PROCESSOR_ADDRESS=0xDA437738D931677e83a480C9c397d2d0A473c209
Then run the deployment script.
forge script ExampleDeployment --sig "deployAndList()" --broadcast --fork-url http://localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
Run this from the aztec connect bridges repo containing the deployment script. The private key here is associated with the first anvil account. It has enough ETH and permission to deploy and list new bridges.
Make sure you run yarn setup
in the aztec-connect-bridges repo to set up forge for this repo.
See more example deployment scripts in the aztec-connect-bridges repo here.
Update runtime config
After your bridge contract is deployed to your local Ethereum network, you need to update the Aztec sequencer (falafel) with information about how to interact with the new bridge.
Do this by appending the appropriate info for your bridge to the "bridgeConfigs" array in config.json and sending it as a PATCH request to http://localhost:8081/runtime-config. You will need to set a couple of headers in the request for this to work: server-auth-token
: !changeme#
and Content-Type
: application/json
.
For the ExampleBridge, it might looks like
{
"bridgeConfigs": [
// ... other configs here
{
"numTxs": 1,
"gas": 250000,
"bridgeAddressId": 14,
"permittedAssets": [0]
}
],
"feePayingAssetIds": [0, 1]
}
where numTxs
is the number of transactions per batch for the bridge. gas
is the max gas that a bridge call requires. The rollup contract needs to know how much gas to send with a transaction. bridgeAddressId
will be the id
of the bridge that you deployed and permittedAssets
are the asset ids of the assets that can be sent to the bridge (you can check what assets are currently configured by checking the localhost:8081/status
endpoint).
To get you up and running, here is a postman collection that is plug and play. You learn how to import postman collections here.
Connect Metamask
Add anvil accounts and network information to Metamask.
These devnets start the local Ethereum network at http://localhost:8545
, so you will have to update the info associated with this network in Metamask.
Chain id is 31337
or 3567
(when running mainnet fork devnet).
Anvil private keys:
(0) 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
(1) 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
(2) 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a
(3) 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
(4) 0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a
(5) 0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba
(6) 0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e
(7) 0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356
(8) 0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97
(9) 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6
Mnemonic: test test test test test test test test test test test junk
Derivation path: m/44'/60'/0'/0/
If you have questions, please reach out on Discord.