Node Management
This guide covers Atlantic testnet and Pacific mainnet.
Minimum stake required for activation
100,000 PROS
1,000,000 PROS
Ops activation example
--stake 100000 (override required)
--stake 1000000 (ops default)
Node Initialization
Complete the Docker Compose setup for your network using the deployment guide linked below. To create and start the container for the first time, run this from the workspace containing docker-compose.yml:
docker compose up -dUse docker-compose up -d if your installation uses the standalone Compose command.
If the container already exists but is stopped, use the matching docker start command below.
Atlantic testnet
Follow Using Docker (Atlantic Testnet), which uses container_name: atlantic-testnet.
docker start atlantic-testnetPacific mainnet
Follow Using Docker and select the For Mainnet downloads (mainnet.genesis and mainnet.version). Its Compose example uses container_name: pharos-node.
docker start pharos-nodeIf you customized container_name in docker-compose.yml, use your container name in the docker start and docker exec commands.
Keys and ops
On first start, the Docker image automatically generates the node's cryptographic keys in keys/ under the mounted data directory, including domain.pub, stabilizing.pub, and their private-key files. The image also copies ops to the data directory on each start; see the Docker directory structure. No manual ./ops generate-keys step is needed for Docker deployment.
⚠️ Protect the private keys in keys/ and keep secure backups.
Entering the container
With the container running, open a shell for your network:
Atlantic testnet
Pacific mainnet
Working directory
Run node and ./ops commands from the mounted data directory (/data inside the container), where ops and keys/ are available. Commands in the container can access the node's local keys and local RPC. Continue with Join validator sets to generate an unsigned registration transaction using ./ops.
Join validator sets
Prerequisites
⚠️ The registration sender becomes the permanent validator owner (the Safe address when using a Safe). Changing the owner is not supported. A hardware wallet or Safe multisig is mandatory.
Use the latest ops tool and your initialized node's existing public-key files.
⚠️ The domain public key must be the real node key from keys/domain.pub, never empty or a placeholder. An empty _publicKey produces poolId = sha256("") and collides with other empty-key registrations.
The required flags are --domain-label (validator name) and --domain-endpoint (public endpoint). The endpoint must be reachable by other nodes and use TCP with the consensus port (default: 19000): tcp://YOUR_PUBLIC_IP:19000 or tcp://yourdomain:19000. Do not use 127.0.0.1 or localhost as the validator endpoint.
Generate unsigned registration
Replace the validator name and public endpoint below with your own. The examples use the node's existing ./keys/domain.pub and ./keys/stabilizing.pub files; these are also the defaults when the key-path flags are omitted. If your files are elsewhere, supply their actual paths.
Use the Atlantic RPC. Explicitly set --stake 100000 to meet Atlantic's 100,000 PROS activation threshold and override the ops default of 1,000,000 PROS.
Use the Pacific mainnet RPC. --stake 1000000 meets mainnet's 1,000,000 PROS activation threshold and matches the ops default.
Understand the unsigned output
--unsigned prints the staking contract address, value in wei, method, calldata, and function ABI without signing or broadcasting. VALIDATOR_PRIVATE_KEY is not required in this mode.
Contract / To: staking contract
0x4100000000000000000000000000000000000000on both networks.Method:
registerValidator, a payable function that registers the node and locks the supplied stake.Calldata / Data: the encoded function call, including the description, public keys, proofs of possession, and endpoint. Copy the complete hex string without line breaks.
Value: the stake sent with the transaction as
msg.value, expressed in wei. The stake is not a separate function parameter.Function ABI: the function definition used to decode calldata or enter parameters individually in a wallet.
Stake amount and units
--stake is in PROS tokens. Ops converts it to wei: 1 PROS = 10^18 wei. Use the amounts for your network's example:
Ops --stake
100000 PROS
Safe value / browser wallet amount
100000 PROS
Ops value / Cast --value
100000000000000000000000 wei
Ops --stake
1000000 PROS
Safe value / browser wallet amount
1000000 PROS
Ops value / Cast --value
1000000000000000000000000 wei
⚠️ Safe's value field uses PROS, not wei. If you change --stake, regenerate the unsigned output and match the wallet amount or Cast value to it. Keep enough PROS available for transaction fees in addition to the stake.
Choose one submission method below. Submit from your intended owner wallet on the same network as your node and RPC.
Submit via Safe
Atlantic testnet
Use an Atlantic testnet Safe UI and a Safe wallet on Atlantic (chain ID 688689). Set Value to 100000 PROS for the Atlantic example. Verify the network against the Atlantic network information.
Pacific mainnet
Use Pharos Safe for Pacific mainnet (chain ID 1672). Set Value to 1000000 PROS for the mainnet example. Verify the network against the Pacific network information.
Build and execute the transaction
Open the intended owner Safe's transaction builder and set To to
0x4100000000000000000000000000000000000000.Set Value in PROS to match the unsigned registration for your network, using the amounts above.
Enable custom data (recommended) and paste the generated calldata into Data, with no newlines or line breaks.
Review the network, Safe address, destination, value, and calldata. Collect the required Safe signer approvals and execute the transaction.
Alternatively, disable custom data, load the function ABI printed by ops, and select registerValidator. Enter its six string parameters individually: description, public key, public-key proof of possession, BLS public key, BLS proof of possession, and endpoint, in ABI order. Use the exact values decoded from the generated calldata, and keep the same PROS value.
To obtain those values with Cast (included in Foundry):
Replace the data placeholder with the complete generated calldata. Enter each decoded string's contents without the surrounding display quotes.
Submit via hardware wallet and browser extension
Using MetaMask as an example:
Connect your hardware wallet, select the intended owner account, and add or switch to your node's network using the Atlantic testnet or Pacific mainnet network information.
In Settings → Transactions, enable Show Hex Data.
Click Send, choose PROS, and set To to
0x4100000000000000000000000000000000000000.Set Amount in PROS to match your generated stake (
100000for the Atlantic example or1000000for the Pacific mainnet example). Paste the generated calldata into Hex data, with no newlines or line breaks.Click Continue, review the transaction details, then confirm and sign with your hardware wallet to send it.
Optional: submit via Cast and Ledger
Install Foundry to use cast, then connect and unlock your Ledger. Use your network's example and replace the data placeholder with the complete calldata printed by ops, on one line:
This uses the Atlantic RPC and the value for --stake 100000:
This uses the Pacific mainnet RPC and the value for --stake 1000000:
The unsuffixed Cast --value is in wei. If you generated a different stake, use its printed wei value. Check that the Ledger account is your intended permanent owner before approving the transaction on the device.
Stake requirements
Registration: minimum 100 PROS; accepted registration stake is 100–50,000,000 PROS.
Atlantic testnet staking/activation: total stake (self-stake + delegators) must reach 100,000 PROS.
Pacific mainnet activation: total stake (self-stake + delegators) must reach 1,000,000 PROS. Registering with at least this amount activates the validator at the next epoch.
Registration below the network's activation threshold leaves the validator in the bootstrapping state until sufficient total stake is reached. Registering with 100 PROS alone does not activate a validator on either network.
Check node health
After registration, check the node's health with the ops command:
Test network connectivity
Then test network connectivity to other validators:
Last updated
Was this helpful?
