Skip to content

Block production

Koinos uses the novel consensus algorithm, Proof-of-Burn (PoB). To participate in block production you will need to configure your node as well as perform some simple actions on the blockchain.


Proof-of-Burn basics

Proof-of-Burn has similarities to both Proof-of-Work (PoW) and Proof-of-Stake (PoS) with some notable differences. Like Proof-of-Stake, no mining occurs to produce blocks; this places all physical nodes on an equal playing field. Hashing is simulated in Proof-of-Burn by burning KOIN in order to gain Virtual Hash Power (VHP). Aside from using VHP rather than physical machines performing hashes, the algorithm works similarly to Proof-of-Work.


Prerequisites

Please follow our guide on running a node. Be sure to set your COMPOSE_PROFILES to either block_producer or all in your .env file. Alternatively, you can start the node with the --profile all or --profile block_producer to start the optional block producer microservice.


Retrieving your address and key

Upon starting a new node, a private block production key will be automatically generated for you. This key will be at $KOINOS_BASEDIR/block_producer/private.key ($KOINOS_BASEDIR is ~/.koinos on macOS/Linux and C:\koinos for Windows if following our guide). There is a corresponding public.key file that is written out when the block producer runs and is always the public key corresponding to the private key that the block producer is configured to use (private.key by default). Upon starting the block producer the public key is also printed to the logs.

You will want to copy the contents of public.key and save this for later use. This is our "hot" key.

cat $KOINOS_BASEDIR/block_producer/public.key
Aq4Ps_Ch-f8OZDnpQOov2SiMvdYyA5tn0oWa36QWnTeH

Next, you will want your main account to hold VHP and KOIN for block production. Let us use the Koinos CLI to register the PoB contract and open the wallet for our main account.

koinos-cli -r http://localhost:8080/

If you are not using the .koinosrc file as mentioned in the Koinos CLI documentation, you may need to register the Proof-of-Burn contract manually.

🔐 > register pob 159myq5YUhhoVWu3wsHKHiJYKPKGUrGiyv

Finally, open the wallet.

🔐 > open <wallet_file> <password>

Let us grab our main account address so that we can register it within the Proof-of-Burn contract.

🔓 > address
Wallet address: 1P4msR22FXKHZragcLk2dCNweTEi9JWgxn

Registering your key and burning

Using the address from our main account and the public key from our block producer we will now create the association in the Proof-of-Burn contract.

🔓 > pob.register_public_key 1P4msR22FXKHZragcLk2dCNweTEi9JWgxn Aq4Ps_Ch-f8OZDnpQOov2SiMvdYyA5tn0oWa36QWnTeH

Next, we must burn some KOIN in order to receive VHP. Let us burn 1,000 KOIN in exchange for 1,000 VHP. The pob.burn call is requesting that 1,000 KOIN be burned from the first address and place 1,000 VHP in to the second address. In our case, we want the address to burn KOIN from to be the same that receives VHP.

🔓 > pob.burn 100000000000 1P4msR22FXKHZragcLk2dCNweTEi9JWgxn 1P4msR22FXKHZragcLk2dCNweTEi9JWgxn

Note

You may repeat this process to top off your VHP as you run your block producer over time. Do not burn your entire KOIN balance as you will need liquid KOIN and its associated mana in order to produce blocks.


Configuring the block producer

At this point, the chain has all the information required in order for us to produce blocks. Let us update our block producer configuration file to reflect the information we provided the chain. We should uncomment or add the producer line to let the block producer know which account holds our VHP. Below is an example configuration using the address and key from this guide.

block_producer:
  algorithm: pob
  producer: 1P4msR22FXKHZragcLk2dCNweTEi9JWgxn

Producing blocks

Now that our configuration file is prepared we may restart our block producer in order to use the new settings. From the directory containing your docker-compose.yml execute:

docker compose restart block_producer

If everything is working as expected your block production logs should look like this:

koinos-block_producer-1       | 2022-08-18 17:56:08.489496 (block_producer.Koinos) [block_producer.cpp:296] <info>: Produced block - Height: 220753, ID: 0x1220003c080793c08de2bb3a7d94986b85cbe4f0c8c3c9ad3b6dd036379bc048f421
koinos-block_producer-1       | 2022-08-18 17:56:08.495517 (block_producer.Koinos) [block_producer.cpp:219] <info>: Created block containing 0 transactions utilizing approximately 0/204800 disk, 0/1048576 network, 0/287500000 compute
koinos-block_producer-1       | 2022-08-18 17:56:08.501338 (block_producer.Koinos) [pob_producer.cpp:347] <info>: Difficulty target: 0x00000000000002c7bf812846eacfa2a3
koinos-block_producer-1       | 2022-08-18 17:56:08.502196 (block_producer.Koinos) [pob_producer.cpp:349] <info>: Estimated total VHP producing: 863917.30411773 VHP
koinos-block_producer-1       | 2022-08-18 17:56:08.502890 (block_producer.Koinos) [pob_producer.cpp:352] <info>: Producing with 10000.00000000 VHP
koinos-block_producer-1       | 2022-08-18 17:56:10.539163 (block_producer.Koinos) [pob_producer.cpp:98] <info>: Burn difficulty met at quantum 1660845375530

Congratulations, you are now producing blocks using Proof-of-Burn!