Controlling validator lifecycle
This guide covers operational actions for managing a Tempo validator — from initial registration to deactivation.
Starting and stopping
Use SIGINT (Ctrl+C) or SIGTERM to gracefully stop the node:
# If running directly
kill -INT <pid>
# If running via systemd
sudo systemctl stop tempoThe node will finish processing the current block before shutting down. Avoid using SIGKILL as it may corrupt the database.
Resetting your validator's data
If you need to reset your validator's data, you must rotate to a new validator identity. This requires coordinating with the Tempo team to deactivate your old identity and register a new one. Don't hesitate to reach out — even with the Tempo team, this is a routine operation.
Managing your validator
The lifecycle commands below submit transactions to the validator contract. The transaction signer must control the validator operator address, but it does not need to be a plaintext EOA key. Use the CLI signer backend that matches your custody setup; see validator operator address custody.
Rotate validator identity
The ed25519 key can be changed while keeping your validator index stable. This is useful for key rotation or recovery without leaving and re-joining the committee. Generate a new signing key first.
:::
tempo consensus rotate-validator \
--validator-address <YOUR_VALIDATOR_ADDRESS> \
--public-key <NEW_PUBLIC_KEY> \
--ingress <NEW_IP:PORT> \
--egress <NEW_IP> \
--signing-key <NEW_PRIVATE_KEY_PATH> \
--rpc-url https://rpc.tempo.xyztempo consensus rotate-validator \
--validator-address <YOUR_VALIDATOR_ADDRESS> \
--public-key <NEW_PUBLIC_KEY> \
--ingress <NEW_IP:PORT> \
--egress <NEW_IP> \
--signing-key <NEW_PRIVATE_KEY_PATH> \
--rpc-url https://rpc.testnet.tempo.xyzIf self-service rotation is not yet enabled for your validator, use tempo consensus create-rotate-validator-signature to generate the signature and provide it to the Tempo team.
After rotation, your validator goes through the standard state transitions with the new identity.
Update IP addresses
If your node's network endpoints change, update them on-chain. The change takes effect at the next finalized block.
tempo consensus set-validator-ip-address <address/pubkey/index> \
--ingress <NEW_IP:NEW_PORT> \
--egress <NEW_IP> \
--rpc-url https://rpc.tempo.xyztempo consensus set-validator-ip-address <address/pubkey/index> \
--ingress <NEW_IP:NEW_PORT> \
--egress <NEW_IP> \
--rpc-url https://rpc.testnet.tempo.xyzUpdate the fee recipient
The fee recipient used by your validator when constructing block proposals is managed on-chain. This can be updated and takes effect on the next finalized block.
tempo consensus set-validator-fee-recipient <address/pubkey/index> \
--fee-recipient <ETHEREUM_ADDRESS> \
--rpc-url https://rpc.tempo.xyztempo consensus set-validator-fee-recipient <address/pubkey/index> \
--fee-recipient <ETHEREUM_ADDRESS> \
--rpc-url https://rpc.testnet.tempo.xyzTransfer validator ownership
Rebind your validator entry to a new control address:
tempo consensus transfer-validator-ownership <address/pubkey/index> \
--rpc-url https://rpc.tempo.xyz \
--new-private-key <PATH_TO_NEW_VALIDATOR_PRIVATE_KEY>tempo consensus transfer-validator-ownership <address/pubkey/index> \
--rpc-url https://rpc.testnet.tempo.xyz \
--new-private-key <PATH_TO_NEW_VALIDATOR_PRIVATE_KEY>The --new-private-key argument is used to derive the replacement operator address. That new address must not already be used by another active validator.
Deactivate your validator
Deactivate your validator when you want to leave the active set.
tempo consensus deactivate-validator <address/pubkey/index> \
--rpc-url https://rpc.tempo.xyztempo consensus deactivate-validator <address/pubkey/index> \
--rpc-url https://rpc.testnet.tempo.xyzExit timeline
Deactivation is not instant — your validator is phased out over two epochs:
| Epoch | State | is_dealer | is_player | in_committee |
|---|---|---|---|---|
| E (deactivation) | Active | true | true | true |
| E+1 | Exiting | true | false | true |
| E+2 | Exited | false | false | false |
Keep your node running until your validator shows in_committee: false. Use validator lookup to check — it is safe to shut down the node at that point.
Was this helpful?