zkApp programmability is not yet available on the Mina Mainnet, but zkApps can now be deployed on the Mina Devnet.
zkApps Getting Started
You can start writing zkApps with just a few steps. The focus of this Getting Started Guide is a high-level workflow to build and deploy quickly.
High-Level Workflow
- Install or update the zkApp CLI
- Create a project
- Add testing code
- Add functionality
- Create an integration test
- Test locally
- Test with Lightnet
- Test with a live network
1. Install or update the zkApp CLI
npm install -g zkapp-cli
The zkApp CLI provides project scaffolding, including dependencies such as o1js, a test framework, code auto-formatting, linting, and more.
2. Create a project
$ zk project <project-name>
o1js is automatically installed when you generate a project using the zkApp CLI.
A zkApp consists of a smart contract and a UI to interact with it.
To proceed without an accompanying UI project, select
none
when prompted.To create a UI, select a framework and follow the prompts.
3. Add testing code
When you use the zkApp CLI to create a project, tests and examples are included.
See the
import
statements in the Add.test.ts example file.A simulated
LocalBlockchain
instance you can interact with is included in the Add.test.ts example file.In o1js, an array of 10 test accounts to pay fees and sign transactions are provided for the simulated
LocalBlockchain
instance. These can be accessed withLocal.testAccounts
as shown in the Add.test.ts example file. The example uses the public/private key pairs of two of these accounts. The example uses these names, but the names can be anything:deployerAccount
deploys the smart contractsenderAccount
pays transaction fees
Deploy the smart contract to the simulated
LocalBlockchain
instance that simulates a network for testing purposes.See the
localDeploy
function in the Add.test.ts example file.
4. Add functionality
Add the logic for your smart contract.
Start experimenting with iterative development to build and test one method at a time. Add functionality to the smart contract by implementing a
@method
.See
@method async update()
in the Add.ts example file.Build the smart contract:
npm run build
Invoke the
@method
you added or use new functionality in the test file.See the transaction code that invokes the
update()
method in the Add.test.ts file.- If it works as expected with no errors, add more functionality.
- If there are errors, look through the stack traces to find the source of the errors and update the contract to resolve them.
5. Create integration test
Create a Node.js script to run the smart contract and test it's functionality, similar to step 3. Add testing code.
For an example, see the Node.js script that runs the Tic Tac Toe smart contract in the run.ts file.
6. Test locally
- Test zkApps locally with a simulated local blockchain.
7. Test with Lightnet
- Use Lightnet to test your zkApp with an accurate representation of Mina blockchain.
Start Lightnet:
zk lightnet start
The default settings start a single node that successfully serves the majority of testing requirements.
Verify the status of the local blockchain:
zk lightnet status
Communicate with the Mina Accounts-Manager service to fetch account details.
- Mina Accounts-Manager is deployed to http://localhost:8181/
- Use HTTP endpoints to acquire, release, list, lock, and unlock accounts
Configure your zkApp for Lightnet blockchain. Use the endpoints provided by the
zk lightnet status
command.- Deploy name
- Set the Mina GraphQL API URL to deploy to: http://localhost:8080/graphql
- Set transaction fee to use when deploying (in MINA): 0.1
Deploy your zkApp to Lightnet:
zk deploy
8. Test with a live network
To deploy the smart contract to the Testnet, run the zk
commands from the directory that contains your smart contract.
Configure your zkApp.
zk config
Follow the prompts to specify a deploy alias name (can be anything), URL to deploy to, fee (in MINA) to be used when sending your deploy transaction, and the fee payer account.
For the Devnet, use:
Deploy alias name:
devnet
Mina GraphQL API URL:
https://api.minascan.io/node/devnet/v1/graphql
Transaction fee to use when deploying:
0.1
Account to pay transaction fees: Create a new fee payer pair
See Add a deploy alias to config.json.
For other Testnets, use the details provided.
Choose a fee payer alias. A fee payer account is a developer account that is funded and can always pay fees immediately. When you configure a zkApp, you can choose to use a stored account or create a new fee payer account.
When prompted to choose an account to pay transaction fees, select to use a different account:
Use a different account (select to see options)
If this is the first time you are running the
zk config
command, you see these options:> Recover fee payer account from an existing base58 private key
Create a new fee payer key pairThe option to choose another account is shown only if you have a cached fee payer account.
Next, select Create a new fee payer key pair:
Create a new fee payer key pair
NOTE: the private key will be stored in plain text on this computer.When prompted, give an alias to your new fee payer key pair.
Fund your fee payer account.
Follow the prompts to request tMina.
Deploy to the Testnet.
zk deploy
Follow the prompts.
Create a script to interact with a live network.
See the example files:
Run your script.
For example:
node build/src/interact.js
Keep building and experimenting! After you add features to your contract, repeat 7. Test with a live network to test with a live network.
Learn more
To learn more about developing zkApps, see how zkApps work, how to write a zkApp, and zkApps for Ethereum Developers.
Try the zkApp Developer Tutorials for use cases that guide you to achieve a defined goal.
Get help and join the community
Join the #zkapps-developers channel on Mina Protocol Discord.