Skip to main content

Forger Node FAQ and Troubleshooting

Frequently Asked Questions

Stake Maturity

When a forger stake is created, it is not immediately ready to let the forger take part in the forgers' election. The stake will start to be accounted for in the slot leader lottery from the beginning of the second consensus epoch following the one where its creation happened.

For example: if the stake transaction was included in the middle of epoch 10, it will be accounted for from the beginning of epoch 12.

Each consensus epoch length is 15000 slots * 3 seconds per slot = 12h30minutes.

How to verify the stake creation?

To make sure the operation was successful, make a POST request to /transaction/allForgingStakes and verify the publicKey used to create the forger stake appears in the returned list.

When will I get a stake reward?

The consensus epoch is 12.5 hours long, or 15000 blocks x 3 second timeslots.

The chance a forger has to forger a block is the proportion of stake from the 2 previous consensus epochs. This could be up to 25 hours ago.

Regular payments are made to forgers every 100 mainchain blocks, or about every 250 minutes (4-5 hours). This is also known as the withdrawal epoch.

Once a week, the weekly payment is made in a single payment. It is based on the proportion of blocks the forger forged compared to all the blocks forged. This usually happens on Monday.

What is the EON fee redistribution system?

The probability that a forger will be elected as a slot leader will be proportional to the amount of stake he owns versus the total stake present on the chain.

If a forger wins the forger's lottery and is able to produce a new block, and the block is accepted by the other peers, it will earn a fee reward.

The transactions' fee mechanism in EON mimics the one defined in Ethereum. Every transaction has a fee computed with the following formula:

transaction fee = gasUsed * baseFeePerGas + gasUsed * maxPriorityFeePerGas
  • baseFeePerGas is a minimum rate a user has to pay to include their transaction in the next block. This value is generated with every block header by the protocol and may change block by block, based on how full the previous block was.
  • The other part of the fee is determined by maxPriorityFeePerGas and represents the so called "forger tip": it is an additional fee the transaction submitter is willing to pay to have its transaction included as soon as possible.
  • There is another user specified parameter in the transaction: maxFeePerGas - represents the maximum fee a user is willing to pay for a transaction. This parameter actually limits the maxPriorityFeePerGas with this rule: if ( baseFeePerGas + maxPriorityFeePerGas) > maxFeePerGas, then maxPriorityFeePerGas will be reduced in order to maintain the upper bound of the maxFeePerGas.
  • Finally, we can have also legacy (non EIP-1559) transactions, with only a gasPrice parameter that we use for both maxFeePerGas and maxPriorityFeePerGas values

The baseFee in EON is collected in a pool and redistributed at the end of each withdrawal epoch to all the forgers of the epoch, proportionally to the number of blocks they forged in the epoch. (this is a distinction from the Ethereum protocol, where the baseFee is burned).

Additionally, each forger earns all the forger tips of the transactions included in the blocks he forgerd. Also forger's tips are redistributed at the end of each withdrawal epoch.

Withdrawal epoch length is based on the number of mainchain blocks referenced by the sidechain: each epoch switch happens every 100 mainchain blocks. Given that in the mainchain a block is forged on average every 2 minutes and 30 seconds, it takes approximately 4 hours to switch a withdrawal epoch.

Fee payments are calculated automatically by every node and enforced at consensus level. They can also be checked here in the EON Explorer.

How to check epoch slot data?

Use the /block/forgingInfo http endpoint on the node to check the current epoch/slot. See here for documentation on the endpoint.

General Troubleshooting

All forger commands are listed here.

Check public keys

docker compose exec evmapp gosu user curl -sX POST 'http://127.0.0.1:9545/wallet/allPublicKeys' -H 'Content-Type: application/json' -H 'accept: application/json'

Check version of evmapp

docker exec evmapp gosu user curl -X POST "http://127.0.0.1:9545/node/info" -H  "accept: application/json" | grep nodeVersion

Check forger node public keys

docker compose exec evmapp gosu user bash -c 'curl -sXPOST "http://127.0.0.1:${SCNODE_REST_PORT}/wallet/allPublicKeys" -H "accept: application/json" -H "Content-Type: application/json"'

Check for peers

docker exec evmapp curl -sX POST "http://127.0.0.1:9545/node/connectedPeers" -H "accept: application/json"

Check block height

docker compose exec evmapp gosu user curl -sX POST "http://127.0.0.1:9545/block/best" -H "accept: application/json" | jq '.result.height'

Check for banned peers

docker exec evmapp gosu user bash -c 'curl -X POST "http://127.0.0.1:${SCNODE_REST_PORT}/node/blacklistedPeers" -H  "accept: application/json"'

Check forger staking status

docker exec evmapp gosu user curl -X POST "http://127.0.0.1:9545/block/forgingInfo" -H  "accept: application/json"

Check for errors

docker logs evmapp | grep -i "warn\|error"

Stop forging

docker exec evmapp gosu user curl -sX POST 'http://127.0.0.1:9545/block/stopForging' -H 'Content-Type: application/json' -H 'accept: application/json' 

Start forging

docker exec evmapp gosu user curl -sX POST 'http://127.0.0.1:9545/block/startForging' -H 'Content-Type: application/json' -H 'accept: application/json' 

What do I do if the blockchain is stuck?

If the blockchain is totally stuck, or corrupted, delete the existing blockchain on the forger and restart the syncing in compose-evm-simplified/deployments/forger/eon directory:

docker compose -f docker-compose.yml down evmapp
docker volume ls
docker volume rm evmapp-mainnet-eon_evmapp-data
docker volume ls
docker compose restart evmapp

Then in /compose-evm-simplified directory

./scripts/forger/generate_keys.sh 

Block forging in the evmapp logs

check the evmapp logs with

docker logs --tail 60 evmapp

if the forger does not forge a block (most of the time)

[INFO ] 2024-03-15 09:43:40:450 +0000 [        AbstractForger.scala:176 ] [scala-execution-context-global-72] io.horizen.account.forger.AccountForger - Slot is skipped with reason: No eligible forging stake found.

If you forge the block, the log will say this instead

[INFO ] [        AbstractForger.scala:170 ] [scala-execution-context-global-51657] io.horizen.account.forger.AccountForger - Got successfully forged block with id BLOCKHASH

check that the forger is forging blocks

docker logs evmapp | grep forged

or

cat logs/evmapp/debug.log | grep -e 'Successfully generated block'

Check forger node public keys

docker compose exec evmapp gosu user bash -c 'curl -sXPOST "<http://127.0.0.1>:${SCNODE_REST_PORT}/wallet/allPublicKeys" -H "accept: application/json" -H 
"Content-Type: application/json"'

Check for peers

docker exec evmapp curl -sX POST "<http://127.0.0.1:9545/node/connectedPeers>" -H "accept: application/json"

Check block height

docker compose exec evmapp gosu user curl -sX POST "<http://127.0.0.1:9545/block/best>" -H "accept: application/json" | jq '.result.height'

Check for banned peers

docker exec evmapp gosu user bash -c 'curl -X POST "<http://127.0.0.1>:${SCNODE_REST_PORT}/node/blacklistedPeers" -H "accept: application/json"'

Blockchain is stuck syncing

If the blockchain is totally stuck, or corrupted, delete the existing blockchain on the forger and restart the syncing: in compose-evm-simplified/deployments/forger/eon directory:

docker compose -f docker-compose.yml down evmapp
docker volume ls
docker volume rm evmapp-mainnet-eon_evmapp-data
docker volume ls
docker compose restart evmapp

Then, in /compose-evm-simplified directory:

./scripts/forger/generate_keys.sh

Check your node is available to connect by scanning it from another machine

nmap 4.16.58.254 -p 9084

Which should show a result of:

Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-14 09:36 EDT
Nmap scan report for 4.16.58.254
Host is up (0.016s latency).
PORT STATE SERVICE
9084/tcp open aurora

Scan your forger from an external machine ports 1-1000

nmap 4.16.58.254 -p 1-10000
Starting Nmap 7.60 ( https://nmap.org ) at 2024-03-14 09:39 EDT
Nmap scan report for 4.16.58.254
Host is up (0.00070s latency).
Not shown: 9996 closed ports
PORT STATE SERVICE
22/tcp open ssh
9033/tcp open unknown
9084/tcp open aurora
Nmap done: 1 IP address (1 host up) scanned in 0.31 seconds

Check your node is available to connect by scanning it from another machine

nmap 4.16.58.254 -p 9084

should show a result of:

Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-14 09:36 EDT
Nmap scan report for 4.16.58.254
Host is up (0.016s latency).

PORT STATE SERVICE
9084/tcp open aurora

Scan your forger from an external machine ports 1-1000

nmap 4.16.58.254 -p 1-10000

Starting Nmap 7.60 ( https://nmap.org ) at 2024-03-14 09:39 EDT
Nmap scan report for 4.16.58.254
Host is up (0.00070s latency).
Not shown: 9996 closed ports
PORT STATE SERVICE
22/tcp open ssh
9033/tcp open unknown
9084/tcp open aurora

Nmap done: 1 IP address (1 host up) scanned in 0.31 seconds

Logs

Check the evmapp logs

docker logs --tail 60 evmapp

If the forger does not forge a block (most of the time):

[INFO ] 2024-03-15 09:43:40:450 +0000 [ AbstractForger.scala:176 ][scala-execution-context-global-72] io.horizen.account.forger.AccountForger - Slot is skipped with reason: No eligible forging stake found.

If you forge the block, the log will say this instead:

[INFO ][ AbstractForger.scala:170 ] [scala-execution-context-global-51657] io.horizen.account.forger.AccountForger - Got successfully forged block with id BLOCKHASH

Check that the forger is forging blocks

docker logs evmapp | grep forged

Working with Zend

Check the zend logs

docker logs --tail 60 zend

Get shell on zend container

docker exec -it zend /bin/bash

Useful tags for the evmapp .env file

This is located in: compose-evm-simplified/deployments/forger/eon

Connections to enable good network communication

SCNODE_NET_MAX_IN_CONNECTIONS=100
SCNODE_NET_MAX_OUT_CONNECTIONS=25
SCNODE_FORGER_MAXCONNECTIONS=100

Legacy CPU

ZEND_TAG=v5.0.1-legacy-cpu

Using the EON Block Explorer

The name of your forger is the generated Ethereum (of course it means ZEN) address of your forger

The public key of a forger node maps to the name of the forger node by the address derivation:

Public key -> Address Start with the public key (128 characters / 64 bytes)

Take the Keccak-256 hash of the public key. You should now have a string that is 64 characters / 32 bytes. (note: SHA3-256 eventually became the standard, but Ethereum uses Keccak)

Take the last 40 characters / 20 bytes of this public key (Keccak-256). Or, in other words, drop the first 24 characters / 12 bytes. These 40 characters / 20 bytes are the address. When prefixed with 0x it becomes 42 characters long.