This section explains how to get a full node running on the Mainnet Network, using a Docker image that was built for this purpose.
Full nodes play a special purpose in the Celo ecosystem, acting as a bridge between the mobile wallets (running as light clients) and the validator nodes. To make sure that full nodes are rewarded for this service, the Celo protocol includes full node incentives.
When a light client sends transactions, they may include a gateway fee to be paid to the node that gossips transactions to the other full nodes and validators.
For this reason, despite the fact that Celo uses a proof-of-stake protocol, users can earn cryptocurrency without first having to own any, simply by running a full node.
You have Docker installed. If you don’t have it already, follow the instructions here: Get Started with Docker. It will involve creating or signing in with a Docker account, downloading a desktop app, and then launching the app to be able to use the Docker CLI. If you are running on a Linux server, follow the instructions for your distro here. You may be required to run Docker with
sudo depending on your installation environment.
First we are going to setup the environment variables required for the
RC1 network. Run:
export CELO_IMAGE=us.gcr.io/celo-testnet/celo-node:rc1export NETWORK_ID=42220
We're going to use a Docker image containing the Celo node software in this tutorial.
If you are re-running these instructions, the Celo Docker image may have been updated, and it's important to get the latest version.
docker pull $CELO_IMAGE
First, create the directory that will store your node's configuration and its copy of the blockchain. This directory can be named anything you'd like, but here's a default you can use. The commands below create a directory and then navigate into it. The rest of the steps assume you are running the commands from inside this directory.
mkdir celo-data-dircd celo-data-dir
In this step, you'll create an account on the network. If you've already done this and have an account address, you can skip this and move on to configuring your node.
Run the command to create a new account:
docker run -v $PWD:/root/.celo --rm -it $CELO_IMAGE account new
It will prompt you for a passphrase, ask you to confirm it, and then will output your account address:
Public address of the key: <YOUR-ACCOUNT-ADDRESS>
Save this address to an environment variables, so that you can reference it below (don't include the braces):
The genesis block is the first block in the chain, and is specific to each network. This command gets the
genesis.json file for RC1 and uses it to initialize your nodes' data directory.
docker run --rm -it -v $PWD:/root/.celo $CELO_IMAGE init /celo/genesis.json
In order to allow the node to sync with the network, get the enode URLs of the bootnodes:
export BOOTNODE_ENODES=$(docker run --rm --entrypoint cat $CELO_IMAGE /celo/bootnodes)
This command specifies the settings needed to run the node, and gets it started.
docker run --name celo-fullnode -d --restart unless-stopped -p 127.0.0.1:8545:8545 -p 127.0.0.1:8546:8546 -p 30303:30303 -p 30303:30303/udp -v $PWD:/root/.celo $CELO_IMAGE --verbosity 3 --networkid $NETWORK_ID --syncmode full --rpc --rpcaddr 0.0.0.0 --rpcapi eth,net,web3,debug,admin,personal --light.serve 90 --light.maxpeers 1000 --maxpeers 1100 --etherbase $CELO_ACCOUNT_ADDRESS --bootnodes $BOOTNODE_ENODES --nousb
You'll start seeing some output. After a few minutes, you should see lines that look like this. This means your node has started syncing with the network and is receiving blocks.
INFO [07-16|14:04:24.924] Imported new chain segment blocks=139 txs=319 mgas=61.987 elapsed=8.085s mgasps=7.666 number=406 hash=9acf16…4fddc8 age=6h58m44s cache=1.51mBINFO [07-16|14:04:32.928] Imported new chain segment blocks=303 txs=179 mgas=21.837 elapsed=8.004s mgasps=2.728 number=709 hash=8de06a…77bb92 age=6h33m37s cache=1.77mBINFO [07-16|14:04:40.918] Imported new chain segment blocks=411 txs=0 mgas=0.000 elapsed=8.023s mgasps=0.000 number=1120 hash=3db22a…9fa95a age=5h59m30s cache=1.92mBINFO [07-16|14:04:48.941] Imported new chain segment blocks=335 txs=0 mgas=0.000 elapsed=8.023s mgasps=0.000 number=1455 hash=7eb3f8…32ebf0 age=5h31m43s cache=2.09mBINFO [07-16|14:04:56.944] Imported new chain segment blocks=472 txs=0 mgas=0.000 elapsed=8.003s mgasps=0.000 number=1927 hash=4f1010…1414c1 age=4h52m31s cache=2.34mB
Once the full node is running, it can serve the Command Line Interface tool
celocli. For example:
$ npm install -g @celo/celocli...$ celocli node:syncedtrue$ celocli account:new...
Light clients may connect to you as people run the Celo Mobile Wallet and you will start earning gateway fees for any transactions that these users initiate, which you can read more about in the Full Node Incentives document. The account that this node advertises for light clients to use for these fees is given by the
etherbase parameter. The
light.serve parameter defines the percentage of time this node should spend serving light clients. Valid values are 0-100. If this node is having trouble catching up to the current block, dropping this to a lower percentage may help. The
maxpeers parameters set limits on the number of light clients and full node peers that the node will accept.