This guide provides an overview of verifying stake addresses for Horizen Super Nodes along with links to specific instructions and resources.

About Stake Verification

The Horizen Stake Verification Tool is an application used to verify ownership of a transparent address used to stake ZEN for Super Nodes. This feature is known as Single Address Staking (SAS) and provides multiple benefits:

How The Ownership Verification Works

A stake address is verified by sending a deterministically derived amount of ZEN from the stake address back to the same address and submitting the resulting transaction id and the information used to derive the amount back to the node tracking server.

In simple terms, a small predetermined amount of ZEN is sent from a stake address and the results are sent to the tracking system to be verified.  Once the address is verified it can be populated with one or more stake amounts (e.g. at least 1500 ZEN for three Super Nodes). Holding more than the required stake for the number of nodes you’re running does not result in any additional rewards.

Overview Of The Verification Process

The Stake Verification Tool has three general steps and supports multiple methods to complete the verification process:

  1. Create a stake verification request. This generates the amount needed to send from the stake address either from a wallet or optionally creates a raw transaction to sign.

  2. Send the verification amount from your wallet and obtain the transaction id or sign the raw transaction with your private key using signtxtool (signtxtool can do this offline).

  3. Send the verification request to the desired Node Tracking Servers (include the transaction id if sent from a wallet)

The tracking servers validate the verification request and check the transaction on the blockchain.


Detailed instructions to perform the steps can be found in the following places:

Linking Nodes To A Verified Stake Address

Once a stake address is verified it can be used by one or more nodes (within the same tracking system). 

Each node must be linked to the stake address in the following manner:

Setting up API keys for Super Nodes API

Maintaining The Balance

The balance in the stake address must be kept at or above the total needed for all nodes using the stake address. If the balance falls below the total of all the nodes, then the newest (by node creation date) node that is up at the time will receive a low stake balance Exception. As the balance falls below each threshold amount (a multiple of the stake required) the next newest node will receive an Exception. Sending funds to the stake address to increase the amount above the total needed will close the Exceptions.

Changing An Existing Node To A Verified Stake Address

A node is changed to a verified stake address using the usual process with the additional step of ensuring that the category of the node matches the category associated with the API subkey used to create the verification request, see Change Stake instructions.


Note: if funds need to be transferred from multiple existing addresses to a new verified stake address the optimum time to do the transfer is right before the end of the earning period. The estimated time and block height is sent to the node tracker when the stake address is changed. The time and block height are also available on the bottom of the home page of each of the tracking servers.

Before You Start

There are a number of things you need to know before starting the verification process.

What You Will Need

The following items should be addressed before using the Stake Tool to process a verification request:

About the Stake Tool Application

The tool consists of two command line applications:

Stand alone binaries (executables) for multiple platforms can be downloaded under releases.

If you prefer to run the CLI apps under nodejs (>=14) you can do so by cloning the repository and running npm ci. After that you can run the tools by using ‘node staketool.js’ and ‘node signtxtool.js’. 


Help is available for general or specific commands when using the command line tool.

Examples:

Help is also available for the ./signtxtool in the same way.

Additional help to get started using the stake tool can be found under Staketool Intro & Setup

Stake Tool Verification Requests 

The Stake Tool tracks the information about a verification request in local files in the same folder as the application or in files specified on the command line. Verification progress for each system and testnet are saved in different folders under the main ‘verificationfiles’ folder (subfolders are: super, and testnet). If any issues arise, the files can be viewed and status checked. No private keys are ever saved to the files.

The overall process expects one stake address at a time to be completed from start to finish (request status is verified or active). Verifying multiple stake addresses simultaneously can be accomplished by using the input file parameter on the command line to point to the corresponding verification file in ‘verificationfiles’ folder. Please see the command line help.

Creating A Request

A verification request is generated automatically by the data entered on the command line. Validation checks are performed on the command line arguments and any errors are reported to the user. Once the verification request is created instructions are displayed about how to create and send the transaction to the blockchain.

There are three main methods that may be used (set using the -m= argument) depending on how you would like to send a transaction:

Please see USAGE.md for full the command line reference.

Signing A Verification Transaction

The simplest way to create and send a verification transaction is to use the information displayed by the stake tool to send the amount indicated from the wallet that contains the stake address. The amount is sent from the stake address back to the same address. The only cost is the transaction fee needed to send the transaction. The resulting transaction id is used in the next step to complete the verification request and send it to the tracking servers for validation and verification. 

If a wallet cannot be used then one of the other methods using the private key of the stake address may be used to sign the transaction.

Submitting A Verification Request

Once a request has been created it must be submitted to the appropriate tracking server (designated on the command line).

The staketool sendtxandstakeverification method sends the request to the server and returns a status from the server. Your API subkey will be needed to complete submitting the request.

A verification request will take 6 block confirmations before it is accepted. Until then the status is returned as waiting for confirmation.

Verification Request Status

The status may be checked using one of the following methods:


The My Stakes page also provides a list of nodes assigned to the stake address along with the minimum balance needed to cover all the nodes.

Super Nodes: My Stakes

A verification request may have one of the following statuses:

Cancelling A Request

A request that is confirming or verified may be cancelled if you no longer want to have the request processed.  

Use the command staketool cancelstakeverification with the appropriate arguments to cancel the request.

Note: along with the API subkey, the stake id of the request to change must be supplied. This can be found by using the staketool liststakes command.

Changing Payout Addresses Or Percentages

The payout addresses can be changed at any time by creating another verification request using the same stake address but different payto addresses or changes to the percent allocated to the same set of addresses.

The tracking servers recognize the changes and create an internal stake change request after successful verification of the new/changed 'payto' addresses.  The changes take effect starting from the next payment period. 

Additional Features

The staketool may also be used to:

The signtxtool may be used to:

Complete Command-line Instructions

Please see USAGE.md for full the command line reference.