How to run a witness node on the hf25 testnet


Hi ! the testnet phase for HF25 is now in full swing, here's some info on it from @gtg @gtg/hf25-public-testnet-reloaded-rc2

One important thing to understand about the testnet is much more lightweight than the main net (because the chain is brand new) so you can actually get it running on a super small machine, to prove my point I'm going to write this tutorial using the 6$ a month doplet (1 core, 25gb storage) from digitalocean. I recommend ubuntu 18.04 LTS, 20.04 is also supported by hive but it can be more tricky depending on the versions of GCC+boost+cmake that are provided with it.

If you participated in the last testnet you will find this guide very similar to the previous one @howo/how-to-participate-in-the-tesntets-this-week-full-guide but I felt like making a new one was better than telling you "follow the outdated guide and at step 35 do this instead"

step 1: Build hive or download binaries

download binaries

If you're on a low end hardware compiling may take a while, so it's faster to let someone compile the binaries for you so you can just run them instead.

@gtg offers pre-built binaries at just download both hived and cli_wallet and you're good to go:

mkdir programs
cd programs
chmod +x *

This is a hassle-free solution but binaries may not always be available and it's generally better security-wise to compile it yourself.

build hive

If you are running on low end hardware like me, you will probably need to setup some swap to compile hive: I personally added 16GB of swap. I don't know how much is actually needed I just figured that it would be enough, feel free to tell me in the comments if you experiment with it.

Let's install the dependencies first:

apt-get install -y \
        autoconf \
        automake \
        autotools-dev \
        build-essential \
        cmake \
        doxygen \
        git \
        libboost-all-dev \
        libyajl-dev \
        libreadline-dev \
        libssl-dev \
        libtool \
        liblz4-tool \
        ncurses-dev \
        python3 \
        python3-dev \
        python3-jinja2 \
        python3-pip \
        libgflags-dev \
        libsnappy-dev \
        zlib1g-dev \
        libbz2-dev \
        liblz4-dev \

Then get hive and compile it, change v1.25.0rc2 to whatever is the current release tag, follow @gtg he is usually the one announcing the release notes, alternatively you can look on and look at the most recent tags.

git clone
cd hive
git checkout v1.25.0rc2
git submodule update --init --recursive
mkdir build
cd build


make -j$(nproc) hived cli_wallet

Compiling may take a while if you are on low end hardware it could take up to a few hours if not more, I forgot to measure it when I did it myself so 🤷‍. On high end hardware you can expect 3-5 minutes.

Run the node

I am using the directory structure and binary names that you get when you compile hive so straight copy paste may not work if you use binaries but everything else works the same you just have to use the right paths and right binary names.

Run the node a few seconds and then exit hived like so

./programs/hive/hived -d testnet/

this will create a testnet directory with the default config file.

open the config.ini file

nano testnet/config.ini

replace the config.ini with this one:

# tells the node which seeds he should listen to to get blocks
p2p-seed-node =

# Local http endpoint for webserver requests.
webserver-http-endpoint =

# Local websocket endpoint for webserver requests.
webserver-ws-endpoint =

log-appender = {"appender":"stderr","stream":"std_error"}
log-logger = {"name":"default","level":"info","appender":"stderr"}

backtrace = yes

plugin = webserver p2p json_rpc
plugin = database_api condenser_api

plugin = witness
plugin = rc

plugin = market_history
plugin = market_history_api

plugin = account_history_rocksdb
plugin = account_history_api

plugin = transaction_status
plugin = transaction_status_api

plugin = account_by_key
plugin = account_by_key_api

plugin = reputation
plugin = reputation_api

plugin = block_api network_broadcast_api rc_api

account-history-rocksdb-path = "blockchain/account-history-rocksdb-storage"

shared-file-size = 10G

shared-file-full-threshold = 9500
shared-file-scale-rate = 1000

flush-state-interval = 0

market-history-bucket-size = [15,60,300,3600,86400]
market-history-buckets-per-size = 5760

p2p-endpoint =

transaction-status-block-depth = 64000
transaction-status-track-after-block = 100000

webserver-thread-pool-size = 256

Then run hived again, this time we want it to stay up so setup a way for it to persist even if you log out, like screen. I personally use pm2 for the testnets just because it's convenient. This is not optimal for a production setup but it's fine for those testnets. (see

for the testnet I run hived like this with pm2:

pm2 start --name testnet ./programs/hived/hived -- -d testnet

It will take some time (a few minutes to a few hours) before you get your blocks.
You can look at to see what is the head block to get a sense of how far you are.
When you are synched with the testnet and you should see messages like this:

3|hf23     | 1526617ms p2p_plugin.cpp:212            handle_block         ] Got 0 transactions on block 4415 by howo -- Block Time Offset: -382 ms
3|hf23     | 1532618ms p2p_plugin.cpp:212            handle_block         ] Got 0 transactions on block 4416 by howo -- Block Time Offset: -381 ms
3|hf23     | 1538612ms p2p_plugin.cpp:212            handle_block         ] Got 0 transactions on block 4417 by howo -- Block Time Offset: -387 ms
3|hf23     | 1544620ms p2p_plugin.cpp:212            handle_block         ] Got 0 transactions on block 4418 by howo -- Block Time Offset: -379 ms
3|hf23     | 1550615ms p2p_plugin.cpp:212            handle_block         ] Got 0 transactions on block 4419 by howo -- Block Time Offset: -384 ms

now your node is running ! So that's great, but it's not producing.

So you need to setup your witness.

Setting up your witness


Open up the cli wallet:

./programs/cli_wallet/cli_wallet --server-rpc-endpoint="ws://"

it'll ask for a password, so execute:

set_password yourpassword

then unlock it using:

unlock yourpassword

Now execute those commands:

import your active key to do various actions, note that the keys on the testnet are the same than the keys on main net (they have been ported) so you can just use your account
import_key 5JNHfZYKGaomSFvd4NUdQ9qMcEAC43kujbfjueTHpVapX1Kzq2n

then generate keys for your witness:

it'll be something like this:

  "wif_priv_key": "5KJUxvUSdAV6H7LiutRJMVwEVptmoaDhM73Cg1itzYjG8zs7tWF",
  "pub_key": "TST71oeHrdBZEKDG1GaC75VKDaRGcXk2R8htD8J6wkP6p1zDRPzFZ"

Save these for later !

Then set yourself as a witness (notice how I used the pub_key generated above)

update_witness "yourusername" "" "TST71oeHrdBZEKDG1GaC75VKDaRGcXk2R8htD8J6wkP6p1zDRPzFZ" {"account_creation_fee":"0.000 TESTS","maximum_block_size":65536,"hbd_interest_rate":300} true

then request some test hive via

and power it up, this is important to do even if you already have hp. Because of the power up delay introduced in hf24, your initial HP don't have any effect:

transfer_to_vesting "yourusername" "yourusername" "10.000 TESTS" true

and finally vote for yourself so you get scheduled for blocks. If you don't have stake feel free to request some via

vote_for_witness "yourusername" "yourusername" true true

and we are done with cli_wallet ! but not with the setup.

final config

Open the config one final time to set yourself as a witness by adding these fields:

I use the private key that you generated with the cli above not the one that I put here. I put one here to show that you don't put quotes around the private key.

witness = "yourusername"

# WIF PRIVATE KEY to be used by one or more witnesses or miners
private-key = 5KJUxvUSdAV6H7LiutRJMVwEVptmoaDhM73Cg1itzYjG8zs7tWF

restart the node and you should be producing blocks, the logs should look something like this:

3|hf23     | 2687621ms p2p_plugin.cpp:212            handle_block         ] Got 0 transactions on block 4595 by howo -- Block Time Offset: -378 ms
3|hf23     | 2690613ms witness_plugin.cpp:343        block_production_loo ] Generated block #4596 with timestamp 2020-08-25T19:44:51 at time 2020-08-25T19:44:51

Seed node

Go the extra mile and setup a seed node ! this is quite important as the testnet have very few seed nodes, so it helps a lot if you make one.

Your node is already configured to be a seed node so you just need to open the corresponding port:
(note that this command may vary depending on the firewall setup of your computer)

sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 2001 -j ACCEPT

And now you can communicate the new seed node to everyone. Please post your ip as a comment of that post so that I can update this link to use your seed as well :).

Thank you for reading.

If you liked this writeup, please consider voting for @steempress it's the witness that I co-manage with @fredrikaa:

You can vote for our witness directly using Hivesigner here.

3 columns
2 columns
1 column