Nimbus

Overview

Nimbus is a research project and a client implementation for Ethereum designed to perform well on embedded systems and personal mobile devices, including older smartphones with resource-restricted hardware. The Nimbus team are from Status the company best known for their messaging app/wallet/Web3 browser by the same name. Nimbus (Apache 2) is written in Nim, a language with Python-like syntax that compiles to C.

Note: Nimbus is configured to run both validator client and beacon chain client in one process.

1. Initial configuration

Create a service user for the consensus service, create data directory and assign ownership.

sudo adduser --system --no-create-home --group consensus
sudo mkdir -p /var/lib/nimbus
sudo chown -R consensus:consensus /var/lib/nimbus

Install dependencies.

sudo apt install curl libsnappy-dev libc6-dev jq libc6 unzip ccze -y

2. Install Binaries

  • Downloading binaries is often faster and more convenient.

  • Building from source code can offer better compatibility and is more aligned with the spirit of FOSS (free open source software).

Option 1 - Download binaries

Run the following to automatically download the latest linux release, un-tar and cleanup.

RELEASE_URL="https://api.github.com/repos/status-im/nimbus-eth2/releases/latest"
BINARIES_URL="$(curl -s $RELEASE_URL | jq -r ".assets[] | select(.name) | .browser_download_url" | grep _Linux_amd64.*.tar.gz$)"

echo Downloading URL: $BINARIES_URL

cd $HOME
# Download
wget -O nimbus.tar.gz $BINARIES_URL
# Untar
tar -xzvf nimbus.tar.gz -C $HOME
# Rename folder
mv nimbus-eth2_Linux_amd64_* nimbus
# Cleanup
rm nimbus.tar.gz

Install the binaries, display version and cleanup.

sudo mv nimbus/build/nimbus_beacon_node /usr/local/bin
sudo mv nimbus/build/nimbus_validator_client /usr/local/bin
nimbus_beacon_node --version
rm -r nimbus
Option 2 - Build from source code

Install dependencies.

sudo apt-get update
sudo apt-get install curl build-essential git -y

Build the binary.

mkdir -p ~/git
cd ~/git
git clone -b stable https://github.com/status-im/nimbus-eth2
cd nimbus-eth2
make -j$(nproc) update
make -j$(nproc) nimbus_beacon_node
make -j$(nproc) nimbus_validator_client

Verify Nimbus was built properly by displaying the version.

cd $HOME/git/nimbus-eth2/build
./nimbus_beacon_node --version

Install the binary.

sudo cp $HOME/git/nimbus-eth2/build/nimbus_beacon_node /usr/local/bin
sudo cp $HOME/git/nimbus-eth2/build/nimbus_validator_client /usr/local/bin

3. Setup and configure systemd

Create a systemd unit file to define your consensus.service configuration.

sudo nano /etc/systemd/system/consensus.service

Paste the following configuration into the file.

  • Replace <0x_CHANGE_THIS_TO_MY_ETH_FEE_RECIPIENT_ADDRESS> with your own Ethereum address that you control. Tips are sent to this address and are immediately spendable.

  • Not staking? If you only want a full node, use the Standalone Beacon Node configuration and delete the whole line beginning with

--suggested-fee-recipient

To exit and save, press Ctrl + X, then Y, then Enter.

Run the following to quickly sync with Checkpoint Sync.

Checkpoint sync allows you to start your consensus layer within minutes instead of days.

sudo -u consensus /usr/local/bin/nimbus_beacon_node trustedNodeSync \
--network=mainnet \
--trusted-node-url=https://beaconstate.info \
--data-dir=/var/lib/nimbus \
--backfill=false

When the checkpoint sync is complete, you'll see the following message:

Done, your beacon node is ready to serve you! Don't forget to check that you're on the canonical chain by comparing the checkpoint root with other online sources. See https://nimbus.guide/trusted-node-sync.html for more information.

Run the following to enable auto-start at boot time.

sudo systemctl daemon-reload
sudo systemctl enable consensus

Finally, start your consensus layer client and check it's status.

sudo systemctl start consensus
sudo systemctl status consensus

Press Ctrl + C to exit the status.

Check your logs to confirm that the consensus clients are up and syncing.

sudo journalctl -fu consensus | ccze

Example of Synced Consensus Client Logs

nimbus_beacon_node[292966]: INF 2023-02-05 01:20:00.000+00:00 Slot start       topics="beacnde" slot=31205 epoch=903 sync=synced peers=80 head=13a131:31204 finalized=1111:cdba33411 delay=69us850ns
nimbus_beacon_node[292966]: INF 2023-02-05 01:20:08.000+00:00 Slot end         topics="beacnde" slot=31205 nextActionWait=7m27s985ms126us530ns nextAttestationSlot=31235 nextProposalSlot=-1 syncCommitteeDuties=none head=13a131:31204

4. Helpful consensus client commands

sudo journalctl -fu consensus | ccze

Example of Synced Nimbus Consensus Client Logs

nimbus_beacon_node[292966]: INF 2023-02-05 01:20:00.000+00:00 Slot start       topics="beacnde" slot=31205 epoch=903 sync=synced peers=80 head=13a131:31204 finalized=1111:cdba33411 delay=69us850ns
nimbus_beacon_node[292966]: INF 2023-02-05 01:20:08.000+00:00 Slot end         topics="beacnde" slot=31205 nextActionWait=7m27s985ms126us530ns nextAttestationSlot=31235 nextProposalSlot=-1 syncCommitteeDuties=none head=13a131:31204

Now that your consensus client is configured and started, you have a full node.

Proceed to the next step on setting up your validator client, which turns a full node into a staking node.

If you wanted to setup a full node, not a staking node, stop here! Congrats on running your own full node! 🎉