Setup a witness and block producing node

After having setup a node, we can setup a witness and block producing node. We will need:

  • A compiled witness_node
  • A compiled cli_wallet
  • A registered account
  • The active private key to that account
  • Some little funds to pay for witness registration in your account

Lunching the cli_wallet

We first need to launch the cli_wallet and setup a local wallet with it::

./programs/cli_wallet/cli_wallet --server-rpc-endpoint wss://node-to-some-public-api-node

First thing to do is setting up a password for the newly created wallet prior to importing any private keys::

>>> set_password <password>
>>> unlock <password>

Basic Account Management

We can import your account with:

>>> import_key <accountname> <active wif key>
>>> list_my_accounts
"id": "1.2.15",
"name": <accountname>,
>>> list_account_balances <accountname>

Registering a Witness

To become a witness and be able to produce blocks, you first need to create a witness object that can be voted in.

We create a new witness by issuing::

>>> create_witness <accountname> "http://<url-to-proposal>" true
  "ref_block_num": 139,
  "ref_block_prefix": 3692461913,
  "relative_expiration": 3,
  "operations": [[
    "fee": {
      "amount": 0,
      "asset_id": "1.3.0"
    "witness_account": "1.2.16",
    "url": "url-to-proposal",
    "block_signing_key": "<PUBLIC KEY>",
    "initial_secret": "00000000000000000000000000000000000000000000000000000000"
  "signatures": [

The cli_wallet will create a new public key for signing <PUBLIC KEY>. We now need to obtain the private key for that::

get_private_key <PUBLIC KEY>

Configuration of the Witness Node

Get the witness object using:

get_witness <witness-account>

and take note of two things. The id is displayed in get_global_properties when the witness is voted in, and we will need it on the witness_node command line to produce blocks. We’ll also need the public signing_key so we can look up the correspoinding private key.

>>> get_witness <accountname>
  "id": "1.6.10",
  "signing_key": "GPH7vQ7GmRSJfDHxKdBmWMeDMFENpmHWKn99J457BNApiX1T5TNM8",

The id and the signing_key are the two important parameters, here. Let’s get the private key for that signing key with::

get_private_key <PUBLIC KEY>

Now we need to start the witness, so shut down the wallet (ctrl-d), and shut down the witness (ctrl-c). Re-launch the witness, now mentioning the new witness 1.6.10 and its keypair::

./witness_node --rpc-endpoint= \
               --witness-id '"1.6.10"' \
               --private-key '["GPH7vQ7GmRSJfDHxKdBmWMeDMFENpmHWKn99J457BNApiX1T5TNM8", "5JGi7DM7J8fSTizZ4D9roNgd8dUc5pirUe9taxYCUUsnvQ4zCaQ"]'

Alternatively, you can also add this line into yout config.ini::

witness-id = "1.6.10"
private-key = ["GPH7vQ7GmRSJfDHxKdBmWMeDMFENpmHWKn99J457BNApiX1T5TNM8","5JGi7DM7J8fSTizZ4D9roNgd8dUc5pirUe9taxYCUUsnvQ4zCaQ"]


Make sure to use YOUR public/private keys instead of the once given above!

Verifying Block Production

If you monitor the output of the witness_node, you should see it generate blocks signed by your witness::

Witness 1.6.10 production slot has arrived; generating a block now...
Generated block #367 with timestamp 2015-07-05T20:46:30 at time 2015-07-05T20:46:30