How to Stake
This guide covers the process for node operators to stake and activate a validator node on Telcoin Network.
Overview
Becoming an active validator requires three on-chain transactions:
Governance Approval - Governance issues a ConsensusNFT to whitelist operator's validator address.
Stake - Operator submits uncompressed BLS public key, uncompressed proof of possession, and stake amount.
Activate - Once the node is synced, operator submits an activation transaction to become eligible for inclusion in future committees at the next epoch boundary.
Prerequisites
CPU
16 cores / 32 threads, x86/x64
32 cores, higher clock speed preferred
CPU Benchmark
4000+ Single Thread (PassMark)
-
Memory
128 GB DDR4/DDR5 ECC RDIMM
128 GB+ (highest MT/s possible)
Storage
4 TB TLC NVMe SSD
7.5 TB TLC NVMe SSD
Network Requirements
Static public IP address
Open UDP ports for P2P communication (default: primary and worker ports)
Reliable, low-latency internet connection
Software Requirements
telcoin-networkbinary built and installedAccess to an Ethereum wallet with sufficient TEL for staking
Step 1: Generate Validator Keys
Generate BLS keys and node identity information using the CLI.
Parameters:
--address- The validator's Ethereum-style address (receives block rewards). This does not need to be the same address that holds the validator NFT.--external-primary-addr- Public multiaddr for primary P2P network--external-worker-addrs- Public multiaddr(s) for worker P2P network--datadir- Directory to store node data and keys
BLS Key Passphrase:
Operators will be prompted to enter a passphrase to encrypt their BLS key on the local filesystem. Alternatively, set the passphrase via:
Environment variable:
TN_BLS_PASSPHRASEStdin: Use
--bls-passphrase-source stdinInteractive prompt: Use
--bls-passphrase-source ask
This command generates:
BLS keypair (encrypted with your passphrase)
Network keypairs for P2P communication
node-info.yamlcontaining your public keys and proof of possession
Step 2: Request Governance Approval
Before staking, your validator address must be whitelisted by governance.
Submit the validator's ECDSA address to governance for approval
Governance performs off-chain verification
Upon approval, governance calls
mint(validatorAddress)on the ConsensusRegistry contract
ConsensusRegistry Address: 0x07E17e17E17e17E17e17E17E17E17e17e17E17e1
Operators can verify their whitelist status by checking if they own a ConsensusNFT at the registry address.
Step 3: Stake
Once whitelisted, submit the stake transaction to the ConsensusRegistry.
Contract Function
Parameters:
blsPubkey- The compressed BLS public key (96 bytes)proofOfPossession- Struct containing:uncompressedPubkey- Your uncompressed BLS public key (192 bytes)uncompressedSignature- BLS signature proving ownership of the secret key
Value: Send the exact stake amount required by the current stake configuration. 1M TEL for initial mainnet launch.
Reading Your Keys
The node's BLS public key and proof of possession are stored in node-info.yaml after key generation:
Example Using Cast
After staking, the validator's status changes to Staked.
Step 4: Start and Sync The Node
Start the validator node and wait for it to sync with the network. This step can be started before staking is complete.
Passphrase options:
Environment:
TN_BLS_PASSPHRASE=<passphrase> telcoin-network node ...Stdin:
echo "<passphrase>" | telcoin-network --bls-passphrase-source stdin node ...Interactive:
telcoin-network --bls-passphrase-source ask node ...
Verify Sync Status
Use the tn_syncing RPC method to check if the node is synced:
Wait until the node reports it is fully synced with the current epoch before proceeding.
Step 5: Activate
Once synced, submit an activation transaction to signal readiness for committee participation. This does not guarantee immediate inclusion. It indicates the validator is ready to be included in future committee selection process starting at the next epoch boundary.
Contract Function
This function must be called from the validator address (the address that owns the ConsensusNFT and submitted the stake).
Example Using Cast
After activation:
Node status changes to
PendingActivationAt the next epoch boundary, node status changes to
ActiveNode becomes eligible for committee selection in subsequent epochs
Validator Lifecycle States
Undefined
Address has ConsensusNFT but has not staked
Staked
Validator has staked but not yet activated
PendingActivation
Validator called activate(), waiting for epoch boundary
Active
Validator is active and eligible for committee selection
PendingExit
Validator requested exit, waiting for committee obligations to complete
Exited
Validator has exited and can unstake after one epoch
Delegated Staking (Institutional Onboarding)
For institutional or white-glove onboarding scenarios, a delegator can stake on behalf of a validator.
Contract Function
Additional Parameters:
validatorAddress- The address that owns the ConsensusNFTvalidatorEIP712Signature- EIP-712 signature from the validator authorizing the delegation
Obtaining the Delegation Digest
The validator must sign an EIP-712 typed data message. Get the digest to sign:
The validator signs this digest, and the delegator includes the signature when calling delegateStake.
Note: Governance-initiated delegations (where msg.sender is the contract owner) do not require the validator's EIP-712 signature.
Exiting and Unstaking
Begin Exit
To leave the active validator set:
Your status changes to PendingExit. The protocol will automatically exit you once you're no longer needed for any committee assignments (current epoch + 2 future epochs).
Unstake
After exiting and waiting one full epoch, reclaim your stake and rewards:
This returns your initial stake plus any accrued rewards to either:
The validator address (if self-staked)
The delegator address (if delegated staking was used)
Claim Rewards Without Exiting
Active validators can claim accrued rewards without exiting:
Checking Validator Status
Query your validator information:
Query current epoch information:
Troubleshooting
Common Errors
RequiresConsensusNFT
Address not whitelisted
Request governance approval first
InvalidStatus
Wrong validator state for operation
Check current status with getValidator()
InvalidStakeAmount
Incorrect stake value sent
Query getCurrentStakeConfig() for required amount
InvalidProofOfPossession
BLS signature verification failed
Regenerate keys and ensure correct address
DuplicateBLSPubkey
BLS key already registered
Generate new keys with --force flag
Key Management
Lost passphrase: BLS keys cannot be recovered without the passphrase. Generate new keys.
Regenerating keys: Use
--forceflag to overwrite existing keys (old keys will be lost).Backing up keys: Securely backup the contents of your data directory, especially the encrypted key files.
Last updated