Getting Started
This guide will teach you how to install the Aztec sandbox, run it using the Aztec CLI, and interact with contracts using the wallet CLI.
The Sandbox is an Aztec network running fully on your machine, and interacting with a development Ethereum node. You can develop and deploy on it just like on a testnet or mainnet.
Prerequisites
You need two global dependencies on your machine:
- Node.js >= v18.xx.x and <= v20.17.x (lts/iron) (later versions, eg v22.9, gives an error around 'assert')
- Recommend installing with nvm
- Docker (visit this page of the Docker docs on how to install it)
Install and run the sandbox
Start Docker
Docker needs to be running in order to install the sandbox. Find instructions on the Docker website.
Install the sandbox
Run:
bash -i <(curl -s https://install.aztec.network)
This will install the following tools:
- aztec - launches various infrastructure subsystems (full sandbox, sequencer, prover, pxe, etc) and provides utility commands to interact with the network
- aztec-nargo - aztec's build of nargo, the noir compiler toolchain.
- aztec-up - a tool to upgrade the aztec toolchain to the latest, or specific versions.
- aztec-wallet - a tool for interacting with the aztec network
Start the sandbox
Once these have been installed, to start the sandbox, run:
aztec start --sandbox
Congratulations, you have just installed and run the Aztec Sandbox!
/\ | |
/ \ ___| |_ ___ ___
/ /\ \ |_ / __/ _ \/ __|
/ ____ \ / /| || __/ (__
/_/___ \_\/___|\__\___|\___|
In the terminal, you will see some logs:
- Sandbox version
- Contract addresses of rollup contracts
- PXE (private execution environment) setup logs
- Initial accounts that are shipped with the sandbox and can be used in tests
You'll know the sandbox is ready to go when you see something like this:
[INFO] Aztec Server listening on port 8080
Creating an account in the sandbox
Now you have the sandbox running, let's create an account. For the next steps, we will use the wallet CLI. Open a new terminal window and run:
aztec-wallet create-account -a my-wallet
This will create a new wallet with an account and give it the alias my-wallet
. This will let us reference it with accounts:my-wallet
. You will see logs telling you the address, public key, secret key, and more.
On successful depoyment of the account, you should see something like this:
New account:
Address: 0x066108a2398e3e2ff53ec4b502e4c2e778c6de91bb889de103d5b4567530d99c
Public key: 0x007343da506ea513e6c05ba4d5e92e3c682333d97447d45db357d05a28df0656181e47a6257e644c3277c0b11223b28f2b36c94f9b0a954523de61ac967b42662b60e402f55e3b7384ba61261335040fe4cd52cb0383f559a36eeea304daf67d1645b06c38ee6098f90858b21b90129e7e1fdc4666dd58d13ef8fab845b2211906656d11b257feee0e91a42cb28f46b80aabdc70baad50eaa6bb2c5a7acff4e30b5036e1eb8bdf96fad3c81e63836b8aa39759d11e1637bd71e3fc76e3119e500fbcc1a22e61df8f060004104c5a75b52a1b939d0f315ac29013e2f908ca6bc50529a5c4a2604c754d52c9e7e3dee158be21b7e8008e950991174e2765740f58
Secret key: 0x1c94f8b19e91d23fd3ab6e15f7891fde7ba7cae01d3fa94e4c6afb4006ec0cfb
Partial address: 0x2fd6b540a6bb129dd2c05ff91a9c981fb5aa2ac8beb4268f10b3aa5fb4a0fcd1
Salt: 0x0000000000000000000000000000000000000000000000000000000000000000
Init hash: 0x28df95b579a365e232e1c63316375c45a16f6a6191af86c5606c31a940262db2
Deployer: 0x0000000000000000000000000000000000000000000000000000000000000000
Waiting for account contract deployment...
Deploy tx hash: 0a632ded6269bda38ad6b54cd49bef033078218b4484b902e326c30ce9dc6a36
Deploy tx fee: 200013616
Account stored in database with aliases last & my-wallet
You can double check by running aztec-wallet get-alias accounts:my-wallet
.
With this new account, let's get some local test tokens!
Deploying a contract
The sandbox comes with some contracts that you can deploy and play with. One of these is an example token contract.
Deploy it with this:
aztec-wallet deploy TokenContractArtifact --from accounts:my-wallet --args accounts:my-wallet TestToken TST 18 -a testtoken
This takes
- the contract artifact as the argument, which is
TokenContractArtifact
- the deployer account, which we aliased as
my-wallet
- the args that the contract constructor takes, which is the
admin
(accounts:my-wallet
),name
(TestToken
),symbol
(TST
), anddecimals
(18
). - an alias
testtoken
(-a
) so we can easily reference it later withcontracts:testtoken
On successful deployment, you should see something like this:
aztec:wallet [INFO] Using wallet with address 0x066108a2398e3e2ff53ec4b502e4c2e778c6de91bb889de103d5b4567530d99c +0ms
Contract deployed at 0x15ce68d4be65819fe9c335132f10643b725a9ebc7d86fb22871f6eb8bdbc3abd
Contract partial address 0x25a91e546590d77108d7b184cb81b0a0999e8c0816da1a83a2fa6903480ea138
Contract init hash 0x0abbaf0570bf684da355bd9a9a4b175548be6999625b9c8e0e9775d140c78506
Deployment tx hash: 0a8ccd1f4e28092a8fa4d1cb85ef877f8533935c4e94b352a38af73eee17944f
Deployment salt: 0x266295eb5da322aba96fbb24f9de10b2ba01575dde846b806f884f749d416707
Deployment fee: 200943060
Contract stored in database with aliases last & testtoken
In the next step, let's mint some tokens!
Minting public tokens
Call the public mint function like this:
aztec-wallet send mint_public --from accounts:my-wallet --contract-address contracts:testtoken --args accounts:my-wallet 100
This takes
- the function name as the argument, which is
mint_public
- the
from
account (caller) which isaccounts:my-wallet
- the contract address, which is aliased as
contracts:testtoken
(or simplytesttoken
) - the args that the function takes, which is the account to mint the tokens into (
my-wallet
), andamount
(100
).
This only works because we are using the secret key of the admin who has permissions to mint.
A successful call should print something like this:
aztec:wallet [INFO] Using wallet with address 0x066108a2398e3e2ff53ec4b502e4c2e778c6de91bb889de103d5b4567530d99c +0ms
Maximum total tx fee: 1161660
Estimated total tx fee: 116166
Estimated gas usage: da=1127,l2=115039,teardownDA=0,teardownL2=0
Transaction hash: 2ac383e8e2b68216cda154b52e940207a905c1c38dadba7a103c81caacec403d
Transaction has been mined
Tx fee: 200106180
Status: success
Block number: 17
Block hash: 1e27d200600bc45ab94d467c230490808d1e7d64f5ee6cee5e94a08ee9580809
Transaction hash stored in database with aliases last & mint_public-9044
You can double-check by calling the function that checks your public account balance:
aztec-wallet simulate balance_of_public --from my-wallet --contract-address testtoken --args accounts:my-wallet
This should print
Simulation result: 100n
Playing with hybrid state and private functions
In the following steps, we'll shield a token (moving it from public to private state), and check our private and public balance.
First we need to generate a secret and secret hash with the alias shield
:
aztec-wallet create-secret -a shield
Call the shield
function like this:
aztec-wallet send shield --from accounts:my-wallet --contract-address testtoken --args accounts:my-wallet 25 secrets:shield:hash 0
This takes the same parameters as our previous send
call, with the arguments for shield
function which are:
- the number of tokens to shield (
25
) - a
secret_hash
(SECRET_HASH
which has been derived from a secret that you generated in the CLI) - a
nonce
(0
in this case).
A successful call should print something similar to what you've seen before.
Now when you call balance_of_public
again you will see 75!
aztec-wallet simulate balance_of_public --from my-wallet --contract-address testtoken --args accounts:my-wallet
This should print
Simulation result: 75n
Now we will need to add these shielded tokens into our account's environment so that we have the correct information to claim them.
aztec-wallet add-note TransparentNote pending_shields --contract-address testtoken --transaction-hash last --address accounts:my-wallet --body 25 secrets:shield:hash
This takes
- the type of note you are claiming (
TransparentNote
) - the name of the storage (
pending_shields
) - the contract address
- the transaction hash the note was created in (automatically aliased as
last
) - the address to claim the note into (
accounts:my-wallet
)
Don't worry if you don't understand what TransparentNote
or add-note
mean just yet. When you follow the tutorials, you'll learn more.
A successful result will not print anything.
Now you can redeem the shielded tokens:
aztec-wallet send redeem_shield --contract-address testtoken --args accounts:my-wallet 25 secrets:shield --from accounts:my-wallet
And then call balance_of_private
to check that you have your tokens!
aztec-wallet simulate balance_of_private --from my-wallet --contract-address testtoken --args accounts:my-wallet
This should print
Simulation result: 25n
Congratulations, you now know the fundamentals of working with the Aztec sandbox! You are ready to move onto the more fun stuff.
What's next?
Now you have a development network running, so you're ready to start coding your first app with Aztec.nr and Aztec.js!
If you want to start coding, head over to the Tutorials & Examples section and write & deploy your first smart contract.