Aptos Validator and Fullnode Install Guide

Artifact Staking
12 min readAug 26, 2022

First Published August 26th, 2022

This is a guide for setting up a validator and a full node for the Third Aptos Incentivized Testnet (AIT-3). This guide covers the installation and configuration methods needed for Docker. If you are interested in node monitoring please look at our Aptos Node Monitoring Guide.

A Testnet on any blockchain can be a very fluid situation and code, processes, and techniques can rapidly evolve. We will take steps to keep this guide updated with critical changes, however we can not promise that this will be up to date at all times. Furthermore, once AIT-3 is complete, this guide will likely be irrelevant. Please leave comments if you have questions!

The first step is to create a validator, then you can create a fullnode and attach the fullnode to your validator. It is highly recommended that you run the validator and fullnode on separate servers. If you try and run both on the same server you will need to adjust for port collisions and you may have severe performance degradation due to heavy resource loads.

A Note on Aptos Keys

Aptos has a truly unique key architecture which allows for very flexible configurations. There are three primary keys Owner, Voter, and Operator. A validator requires all three of these keys, however each key can be controlled by separate entities. This represents the simplest case of an independently operated validator that is staking its own tokens.

The purpose and scope of this guide is to get operators up and running in AIT3 as simply and quickly as possible, so we will only cover the simple case discussed above. We have provided two more complex key configurations for your reference:

A slightly more complex key configuration is that of an Investor and an Operator. In this case an Investor has hired a third party to operate a validator on their behalf. In this case, an investor would own their own Aptos coins and would generate and control the owner and voter keys, never sharing any private keys with their operator. The operator would then generate their own operator key, never sharing their private keys with their Investor client.

The most complex key configuration is that of an Investor, Voter, and Operator. In this case three independent parties each control one of the three keys and never share their private keys among the group.

For both complex cases, setup and configuration of a validator requires coordination between all parties and is more complex than the simple case.

Prerequisites

We strongly recommend that you run your node from a cloud provider or from a data center. Under no circumstances should you attempt to run a node from your home. The vast majority of homes do not have redundant power and internet connectivity, which means that it is likely that your node will be disconnected from the network at some point in time and you will not earn rewards.

A Quick Note on Cloud Providers

Generally speaking the major cloud providers such as AWS, Google (GCP), and Azure are heavily used by validators across the entire cryptoverse. Feel free to use a major provider, but in the interest of decentralization we ask you to consider a mid-tier cloud provider such as VULTR, OVH, Contabo, Digital Ocean, MEVSPACE, or Linode.

Hardware Requirements

As of the time of this writing, the hardware requirements for AIT-3 have noticeably increased from AIT-2. Please check the official documentation for the most up to date information.

  • CPU: 8 cores 2.8GHz or faster (Intel Xeon Skylake or newer).
  • Memory: 23GiB RAM.
  • At least 300GB SSD (2TB NVMe is preferred)

Operating System

This guide has been tested on Ubuntu 20.04.

User Permissions

This guide is designed to run from the root user. Generally speaking running any production processes from the root user is a bad idea. If you decide to run Aptos from a non-root user (which we recommend) then you will likely need to modify the directory structures in the docker-compose.yaml validator.yaml and fullnode.yaml files to point to the appropriate user directories.

Install the Petra Wallet Extension

Visit the Petra Wallet extension page and install the plugin. Then generate a new wallet and write down and save your mnemonic key.

Alternatively, you can follow the official install instructions:

Now that the wallet is created you can close it and move on to the next section. You will need to go back to your wallet later in this process.

Initial Setup for Validator

Start by launching a server for your validator.

Once you have logged into your Ubuntu 20.04 virtual server as root, the first step is to update your OS and install packages:

sudo apt-get update -y && sudo apt-get upgrade -y && sudo apt-get install libssl-dev -y && sudo apt-get install fail2ban -y && sudo apt-get install jq -y && sudo apt-get install zip unzip

You will see some purple screens pop up every now again. Just press the ENTER key.

Install Docker

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
apt-cache policy docker-ce
sudo apt install docker-ce -y

Now check the status of the docker service to ensure that it installed correctly

sudo systemctl status docker

Install Docker Compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Check the version of Docker Compose to ensure that it installed correctly. As long as you do not get an error message, it worked.

docker-compose --version

Validator Setup

First, open your firewall so that the node can pass health checks. For this walkthrough we are using UFW (Uncomplicated FireWall). Press Ywhen prompted to restart the firewall.

sudo ufw allow proto tcp from any to any port 6180
sudo ufw allow proto tcp from any to any port 6181
sudo ufw allow proto tcp from any to any port 8080
sudo ufw enable

Then, decide what you will name your node. You will then replace <node name> with your node name and run the commands below.

export WORKSPACE=testnet
export USERNAME=<node name>
mkdir ~/$WORKSPACE
cd ~/$WORKSPACE

Here is an example of what the commands would be if you named your node “kingfisher”.

export WORKSPACE=testnet
export USERNAME=kingfisher
mkdir ~/$WORKSPACE
cd ~/$WORKSPACE

Download docker-compose and validator yaml files

wget -qO docker-compose.yaml https://raw.githubusercontent.com/aptos-labs/aptos-core/main/docker/compose/aptos-node/docker-compose.yamlwget -qO validator.yaml https://raw.githubusercontent.com/aptos-labs/aptos-core/main/docker/compose/aptos-node/validator.yaml

Edit the docker-compose.yaml and modify the docker image from testnet to testnet_88f936bf40a56768e2dac420e953a0307281c1ba

cd ~/$WORKSPACEnano docker-compose.yaml

Download and unzip the precompiled Aptos CLI tool

wget https://github.com/aptos-labs/aptos-core/releases/download/aptos-cli-v0.3.2/aptos-cli-0.3.2-Ubuntu-x86_64.zipunzip aptos-cli-0.3.2-Ubuntu-x86_64.zip

Generate your Aptos validator keys

./aptos genesis generate-keys --output-dir ~/$WORKSPACE/keys

Validator Config

Set the validator configuration. You will need to change the --validator-host and --full-node-host to be either the external IP of each server, or a domain name that is mapped to each server’s IP address.

If you are not running a full node, then remove the --full-node-host line in the set-validator-configuration command.

With Fullnode

./aptos genesis set-validator-configuration \
--local-repository-dir ~/$WORKSPACE \
--username $USERNAME \
--owner-public-identity-file ~/$WORKSPACE/keys/public-keys.yaml\
--validator-host <validator_external_IP_or_domain>:6180 \
--full-node-host <fullnode_external_IP_or_domain>:6182 \
--stake-amount 100000000000000

Without Fullnode

./aptos genesis set-validator-configuration \
--local-repository-dir ~/$WORKSPACE \
--username $USERNAME \
--owner-public-identity-file ~/$WORKSPACE/keys/public-keys.yaml\
--validator-host <validator_external_IP_or_domain>:6180 \
--stake-amount 100000000000000

Generate the layout template

./aptos genesis generate-layout-template --output-file ~/$WORKSPACE/layout.yaml

Edit the layout.yaml file

nano ~/$WORKSPACE/layout.yaml

Then change the root_key: to D04470F43AB6AEAA4EB616B72128881EEF77346F2075FFE68E14BA7DEBD8095E”

Now change the users: to [“<node-name”]. In the previous example we used kingfisher as our node name.

Then change the chain_id: parameter to 47

To exit nano: press CTL + X then press Y then press ENTER

Check your layout.yaml file one more time

cat ~/$WORKSPACE/layout.yaml

It should look like this:

Download the Move Smart Contract Framework:

wget https://github.com/aptos-labs/aptos-core/releases/download/aptos-framework-v0.3.0/framework.mrb -P ~/$WORKSPACE

Now, initialize your owner profile

./aptos init --profile ait3-owner --rest-url http://ait3.aptosdev.com

You will be prompted for a faucet address, type skip and press ENTER. Then you will be asked for your private wallet key.

Go to the Petra Wallet -> Settings -> Credentials

Then click on your private key. NEVER SHARE THIS KEY WITH ANYONE or they can hijack your wallet.

Now paste the wallet private key into the command prompt and press ENTER.

Initialize Stake Owner

First you will need to locate your operator-address and your voter-address.

To find operator address:

cat ~/$WORKSPACE/$USERNAME/operator.yaml

Copy the address for operator_account_address:

To find voter address:

cat ~/$WORKSPACE/$USERNAME/owner.yaml

Copy the address for voter_account_address:

Now replace <operator-address> and <voter-address> with your addresses in the following command, then execute it. This will bind the operator address and the voter address to your private owner key.

./aptos stake initialize-stake-owner \
--initial-stake-amount 100000000000000 \
--operator-address <operator-address> \
--voter-address <voter-address> \
--profile ait3-owner

Create Operator Account

Find your operator_account_address (different than the account you used in the previous step).

cat ~/$WORKSPACE/$USERNAME/operator.yaml

Replace the <operator-account> with operator_account_addressin the following command and then execute it.

./aptos account create --account <operator-account> --profile ait3-owner

Now transfer some gas money into this account, do not forget to update the <operator-account> in this command

./aptos account transfer \
--account <operator-account> \
--amount 10000 \
--profile ait3-owner

Bootstrap the Validator

The next step is to download the waypoint.txt and genesis.blob.

cd ~/$WORKSPACEwget -qO genesis.blob https://raw.githubusercontent.com/aptos-labs/aptos-ait3/main/genesis.blobwget -qO waypoint.txt https://raw.githubusercontent.com/aptos-labs/aptos-ait3/main/waypoint.txt

Now you need to update your validator-identity.yaml file by replacing the account_address with your Petra wallet address. You can find the address at the top of the Home menu, or in Settings->Credentials.

cd ~/$WORKSPACE/keysnano validator-identity.yaml

Replace the account_address: in the yaml file with the wallet address of your Petra wallet.

To exit nano: press CTL + X then press Y then press ENTER

Join the Validator Set

Copy your account_private_key NEVER SHARE THIS KEY!!

cat ~/$WORKSPACE/keys/private-keys.yaml

Initialize your operator profile

./aptos init --profile ait3-operator --rest-url http://ait3.aptosdev.com

You will be prompted for a faucet address, type skip and press ENTER. Then you will be asked for your account_private_key

Now paste the account_private_key into the command prompt and press ENTER.

Check the balance of the operator account.

./aptos account list --profile ait3-operator

If you do not have funds, then send some from your owner account into your operator account.

You will need your Petra wallet address for the next few commands. You can find the address at the top of the Home menu, or in Settings->Credentials.

Replace <owner-address> in the command below with your Petra wallet address and then execute the command.

./aptos node update-validator-network-addresses  \
--pool-address <owner-address> \
--operator-config-file ~/$WORKSPACE/$USERNAME/operator.yaml \
--profile ait3-operator

Replace <owner-address> in the command below with your Petra wallet address and then execute the command.

./aptos node update-consensus-key  \
--pool-address <owner-address> \
--operator-config-file ~/$WORKSPACE/$USERNAME/operator.yaml \
--profile ait3-operator

Replace <owner-address> in the command below with your Petra wallet address and then execute the command.

./aptos node join-validator-set \
--pool-address <owner-address> \
--profile ait3-operator \
--max-gas 4000

Check the chain to see if your node has been added to the wait list to join the active set. Your validator will be added to the set at the beginning of the next epoch. This wait can take up to 2 hours.

To check only your validator, replace <account_address>

./aptos node show-validator-set --profile ait3-operator | jq -r '.Result.active_validators' | grep <account_address>

To see the entire queue

./aptos node show-validator-set --profile ait3-operator | jq -r '.Result.pending_active'

Launch your Validator

Launch your validator with the following commands

cd ~/$WORKSPACEsudo docker-compose up -d

Check Docker Logs

sudo docker logs -f testnet_validator_1 --tail 60

Setup Complete!

Now you can add node monitoring by following our Aptos Node Monitoring Guide.

Initial Setup for Fullnode

Start by launching a server for your fullnode.

Once you have logged into your Ubuntu 20.04 virtual server as root, the first step is to update your OS and install packages:

sudo apt-get update -y && sudo apt-get upgrade -y && sudo apt-get install fail2ban -y && sudo apt-get install jq -y && sudo apt-get install zip unzip

You will see some purple screens pop up every now again. Just press the ENTER key.

Install Docker

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"apt-cache policy docker-ce
sudo apt install docker-ce -y

Now check the status of the docker service to ensure that it installed correctly

sudo systemctl status docker

Install Docker Compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Check the version of Docker Compose to ensure that it installed correctly. As long as you do not get an error message, it worked.

docker-compose --version

Fullnode Setup

You will need to run through the Initial Setup for Validator and Fullnode at the top of this walkthrough. After initial setup is complete, then come back to this section.

Firewall Config

Open your firewall so that the node can pass health checks. For this walkthrough we are using UFW (Uncomplicated FireWall). Press Ywhen prompted to restart the firewall.

sudo ufw allow proto tcp from any to any port 6181
sudo ufw allow proto tcp from any to any port 6182
sudo ufw allow proto tcp from any to any port 8080
sudo ufw enable

Set up your workspace directory

export FULLNODENAME=<fullnode name>
export WORKSPACE=testnet
mkdir ~/$WORKSPACE
cd ~/$WORKSPACE

Download and unzip the precompiled Aptos CLI tool

wget https://github.com/aptos-labs/aptos-core/releases/download/aptos-cli-v0.3.2/aptos-cli-0.3.2-Ubuntu-x86_64.zipunzip aptos-cli-0.3.2-Ubuntu-x86_64.zip

Download Fullnode config files

wget -qO docker-compose-fullnode.yaml https://raw.githubusercontent.com/aptos-labs/aptos-core/main/docker/compose/aptos-node/docker-compose-fullnode.yamlwget -qO fullnode.yaml https://raw.githubusercontent.com/aptos-labs/aptos-core/main/docker/compose/aptos-node/fullnode.yaml

Edit the docker-compose-fullnode.yaml and modify the docker image from testnet to testnet_88f936bf40a56768e2dac420e953a0307281c1ba

cd ~/$WORKSPACEnano docker-compose.yaml

Update the fullnode.yaml file and replace <Validator IP Address> with your validator’s IP address (do not use a domain name if you have one).

sudo nano fullnode.yaml

To exit nano: press CTL + X then press Y then press ENTER

Generate your Aptos Fullnode keys

./aptos genesis generate-keys --output-dir ~/$WORKSPACE/keys

Download the waypoint.txt and genesis.blob.

cd ~/$WORKSPACEwget -qO genesis.blob https://raw.githubusercontent.com/aptos-labs/aptos-ait3/main/genesis.blobwget -qO waypoint.txt https://raw.githubusercontent.com/aptos-labs/aptos-ait3/main/waypoint.txt

The next step is to copy validator-full-node-identity.yaml from your validator over to your fullnode. You want to overwrite this file on your Fullnode.

From Validator

~/$WORKSPACE/keys/validator-full-node-identity.yaml

To Fullnode

~/$WORKSPACE/keys/validator-full-node-identity.yaml

Connect your Fullnode to your Validator

Replace the Validator IP and Fullnode IP with the appropriate IPs and then execute the following command.

./aptos genesis set-validator-configuration \
--local-repository-dir ~/$WORKSPACE \
--username $FULLNODENAME \
--owner-public-identity-file ~/$WORKSPACE/keys/public-keys.yaml\
--validator-host <YOUR_VALIDATOR_IP>:6180 \
--stake-amount 100000000000000 \
--full-node-host <YOUR_FULLNODE_IP>:6182

Launch your Fullnode

Launch your Fullnode with the following commands

cd ~/$WORKSPACEcp docker-compose-fullnode.yaml docker-compose.yamlsudo docker-compose up -d

Check Docker Logs

sudo docker logs -f testnet_fullnode_1 --tail 60

--

--

Artifact Staking

Artifact Staking is a cutting edge, forward leaning blockchain infrastructure provider.