# Ignite CLI
Before diving into the details of how Ignite CLI helps you scaffold the basics for your application blockchain make sure to understand the main concepts presented in the following sections:
In this section, you will:
- Install the Ignite CLI.
- Scaffold a blockchain.
- Use the CLI.
- Start the Ignite UI server.
- Send your first message.
You can follow a hands-on exercise for Ignite CLI in the sections that follow this introduction.
The Cosmos SDK provides the building blocks for a complete CometBFT blockchain, which implements the Inter-Blockchain Communication Protocol (IBC). The BaseApp of the Cosmos SDK assembles these building blocks and provides a fully-running blockchain. All there is left to do for the specific blockchain application is to create specific modules and integrate them with BaseApp to make the application your own.
Ignite CLI assists with scaffolding modules and integrating them with BaseApp. Ignite CLI is a command-line tool that writes code files and updates them when instructed to do so. If you come from an on Rails world, the concept will look familiar to you.
Ignite CLI also handles some compilation, runs a local blockchain node, and helps you with other tasks.
# Install
Want to dedicate some time to dive deeper into installing Ignite CLI? Learn how to install Ignite CLI in the Ignite CLI Developer Guide (opens new window).
If you do not want to install Go and Ignite on your computer, look at the section about Docker below to facilitate your handling of specific versions and platforms.
This entire exercise was built using the Ignite CLI version 0.22.1. To install it at the command line:
Or if you install it in a Linux VM:
You can verify the version of Ignite CLI you have once it is installed:
This prints its version:
This entire exercise was built using the Ignite CLI version noted above. Using a newer version could work, but you might run into compatibility issues if you clone any code made with this version of Ignite CLI and then try to continue the project with your version of Ignite CLI.
If you need to install the latest version of Ignite CLI, use:
When you then run ignite version
, it prints its version:
If you'd like to upgrade an existing project to the latest version of Ignite CLI, you can follow the Ignite CLI migration documentation (opens new window).
You can also just type ignite
to see the offered commands:
# Prepare Docker
If you want to allow for portability and avoid version issues, it is advisable to use Docker (opens new window). If you are new to Docker, have a look at this tutorial.
First, you need to create a Dockerfile
that details the same preparation steps. Save this as Dockerfile-ubuntu
:
Note that the linked code contains more lines than shown above. Because you do not yet have a go.mod
file, stick to the lines in the quoted code above for now.
Next you need to create the Docker image:
You can confirm the installed version of Ignite:
It should return, among other things:
That is the bare minimum required to be able to run the commands that come on this page. If at a later stage you want to create a persistent container named checkers
, you can do:
# Your chain
Start by scaffolding a basic chain called checkers
that you will place under the GitHub path alice
:
github.com/alice/checkers
is the name of the Golang module by which this project will be known. If you own the github.com/alice
path, you can even eventually host it there and have other people use your project as a module.
Your choice of module name (github.com/alice/checkers
, or any other name) deserves careful consideration. You will create a Cosmos SDK module, Protobuf messages, and CosmJS files which all reference this choice in their own ways. In particular:
- Your module name should be unique, meaning unique in the world, to avoid confusion.
- Your Protobuf messages will be identified by their packages, such as
alice.checkers.checkers
andalice.checkers.leaderboard
. - If you start your project with
alice/checkers
but later use the linked solutions, which useb9lab/checkers
(opens new window), you will encounter unexpected (though fixable) surprises.
For the sake of good support, the versions of all software used are communicated as encountered throughout this course. It is natural that after the writing of the course material some version changes will appear, and it may occur that something breaks. Instead of using different versions of the software from the ones in the course, please look at the following list, which might fix problems you are running into. Otherwise, use Docker as explained on this page.
If all else fails, please post the issue you face on Discord.Apple M1
If you work with a machine using M1 architecture, the Docker image should allow you to run with your specific CPU architecture. However, if you encounter too many problems you can try the following:
- Follow this course in a Rosetta (opens new window) terminal.
- Install Homebrew (opens new window).
- Install Golang with
brew install go
.
Building Errors during scaffold
If you work with Go 1.18, you may need to install the following:
The scaffolding takes some time as it generates the source code for a fully functional, ready-to-use blockchain. Ignite CLI creates a folder named checkers
and scaffolds the chain inside it.
The checkers
folder contains several generated files and directories that make up the structure of a Cosmos SDK blockchain. It contains the following folders:
app
(opens new window): a folder for the application.cmd
(opens new window): a folder for the command-line interface commands.proto
(opens new window): a folder for the Protobuf objects definitions.vue
(opens new window): a folder for the auto-generated UI.x
(opens new window): a folder for all your modules, in particularcheckers
.
If Vue.js is something new to you, check out the Vue.js website (opens new window) for more on this JavaScript framework.
If you look at the code that Ignite CLI generates, for instance in ./x/checkers/module.go
, you will often see comments like the following:
Do not remove or replace any lines like these in your code as they provide markers for Ignite CLI on where to add further code when instructed to do so. For the same reason, do not rename or move any file that contains such a line.
Go to the checkers
folder and run:
The ignite chain serve
command downloads (a lot of) dependencies and compiles the source code into a binary called checkersd
. This command:
- Installs all dependencies.
- Builds Protobuf files.
- Compiles the application.
- Initializes the node with a single validator.
- Adds accounts.
If you use Docker with throwaway containers (run --rm
) you will notice that it downloads the Go dependencies every time. To increase your productivity, you can have the dependencies be downloaded in the Docker image itself:
- Move your
Dockerfile-ubuntu
file into your checkers project, next to thego.mod
file. - Add the following lines to
Dockerfile-ubuntu
:
- Recreate the image:
After the chain serve
command completes, you have a local testnet with a running node. What about the added accounts? Take a look:
In this file you can set the accounts, the accounts' starting balances, and the validator. You can also let Ignite CLI generate a client and a faucet. The faucet gives away five token
and 100,000 stake
tokens belonging to Bob each time it is called.
You can observe the endpoints of the blockchain in the output of the ignite chain serve
command:
Ignite CLI can detect any change to the source code. When it does, it immediately rebuilds the binaries before restarting the blockchain and keeping the state.
# Interact via the CLI
You can already interact with your running chain. With the chain running in its shell, open another shell and try:
This prints:
In there you can see a hint of liveness: "latest_block_height":"13"
. You can use this one-liner to better see the information:
You can learn a lot by going through the possibilities with:
And so on.
# Your GUI
Ignite CLI also scaffolded a frontend. Boot it up by using the commands provided in the README.md
file of the vue
folder. Let the chain run in its own process and open a new terminal window in your checkers
folder. In this terminal, execute:
Note the --host
flag, which is forwarded to the underlying vite
command thanks to the --
separator. This is necessary if you run the frontend within Docker.
Navigate to localhost:3000 (opens new window), or to whichever address was listed when running dev
. The first load may take a few seconds. On the client-side, from the top right you can connect to the page via Keplr if you are on the Chrome browser. You should see something like this:
If you want Keplr to separate your mainnet keys and tokens from those you use for tests, have a look at Google Chrome's profiles (opens new window).
Your account is connected but has no balance. This is a good opportunity to use the faucet:
- Head to http://localhost:4500 (opens new window)
- Expand the POST / Send tokens to receiver account box.
- Click the Try it out button.
- Paste your address in the JSON at
"address"
. - Click the big blue Execute button.
When you return to the main page, you should see your new assets:
From here, you can send tokens around. You can also ask for "10stake"
from the faucet, if you recall the name of the tokens from config.yml
.
There is not much else to do. After all, this is the Cosmos BaseApp. Ignite will continue scaffolding this GUI as your checkers project advances.
Keplr is also able to import Alice and Bob (i.e. the accounts that Ignite created). Use Keplr's +Add account feature. This is a convenient way to bypass having to use the faucet. You will need to use Alice's mnemonic, which you can find in the output of the ignite chain serve
command.
If you do not see the mnemonic, that is because the mnemonic was shown to you the first time you ran the command and you did not copy it. If so, reset with ignite chain serve --reset-once
.
Now you should see the balance of Alice's account and can act on her behalf.
Make a Git commit before you create a new message
. In fact, it is generally recommended to make a Git commit before running any ignite scaffold
command. A Git commit protects the work you have done so far and makes it easier to see what the scaffold
command added. It also makes it easy to just revert all changes if you are unsatisfied and want to run a different scaffold
command.
# Your first message
After your Git commit, and having stopped running Ignite, create a simple message
with:
The ignite scaffold message
command accepts a message name (here createPost
) as the first argument, and a list of fields for the message (here title
and body
), which are string
fields unless mentioned otherwise.
A message is scaffolded in a module with a name that matches the name of the project by default. It is named checkers
in this case. Alternatively you could have used --module checkers
. Learn more about your options with:
You can see a list of files that were created or modified by the scaffold message
command in the Terminal output:
The modify
was made possible thanks to the lines like // this line is used by starport scaffolding # 1
that you did not remove.
So where is everything? You can find the root definition of your new message in:
Ignite CLI also wired a new command into your chain's CLI in:
Ignite CLI scaffolded GUI elements relating to your message with a Vue.js frontend framework. You can, for instance, start with this function in:
When you are done with this exercise you can stop Ignite's chain serve.
Want another demonstration? In the following video Denis Fadeev, creator of and core contributor to Ignite CLI, explains how to create and interact with a Cosmos SDK blockchain using just a few basic commands, then provides a real-time demonstration of Ignite CLI in action.
To summarize, this section has explored:
- How to install Ignite CLI, a command-line tool that writes code files and updates them when instructed, handles some compilation, runs a local blockchain node, and assists with other tasks.
- How to scaffold a basic blockchain, with the suggested best practice not to replace lines with code markers indicating where to add further code on later instruction, nor to rename or move any file containing such a line.
- How to interact via the CLI to demonstrate that your chain is live when running in its shell.
- How to boot up the frontend that Ignite CLI has created by using a terminal window and navigating to the localhost on your browser.
- How to test the base functionality of your chain by creating a simple message.
You can remove the MsgCreatePost
message as it is not part of the guided exercise in the next sections. You can clean it all by running: