This page is the operator runbook. It covers what happens after installation: registration, steady-state checks, upgrades, key rotation, and incident response.Documentation Index
Fetch the complete documentation index at: https://docs.superform.xyz/llms.txt
Use this file to discover all available pages before exploring further.
First production checklist
Once the node is locally healthy, complete these steps in order.1. Export your public keys
- onchain public key
- derived Ethereum address
- offchain public key
- config encryption public key
- peer ID
- public P2P endpoint
keys export is converting your local key material into the values Superform inserts into the live validator config: validatorPublicKeys[], validators[], and the ABI-encoded OracleIdentity[] entries inside offchainConfig.
2. Self-validate the bundle
Before sending anything to Superform, verify:onchain_public_keyis 65 bytes / 130 hex chars and starts with04offchain_public_keyis 32 bytes / 64 hex charsconfig_encryption_public_keyis 32 bytes / 64 hex chars- the exported Ethereum address matches the onchain public key
peer_idis a valid libp2p base58 string, typically starting with12D3Koop2p_endpointresolves publicly to the host that is actually serving your node on TCP6690- your node is reachable on the endpoint you plan to advertise
- if you are behind NAT or a load balancer,
announce_addressesis set to the same publichost:portyou plan to submit
3. Submit the public key bundle
Send the bundle to your Superform onboarding contact. Never send private keys.onchain_public_key→validatorPublicKeys[]ethereum_address→validators[]peer_id→OracleIdentity.peerIDoffchain_public_key→OracleIdentity.offchainPublicKeyconfig_encryption_public_key→OracleIdentity.configEncryptionPublicKey
4. Wait for onchain registration
During Phase 1, Superform callsSuperGovernor.setValidatorConfig() on your behalf. That payload has five parts:
version— must be strictly newer than the previous configvalidators[]— one Ethereum address per validatorvalidatorPublicKeys[]— the matching 65-byte uncompressed ECDSA public keysquorum— the report threshold for the validator set sizeoffchainConfig— the ABI-encodedOracleIdentity[]entries for the same validators
validators[i], validatorPublicKeys[i], and OracleIdentity[i] all have to describe the same operator identity. In practice, the config only loads cleanly when:
- all three arrays have the same length
validators[i]is the Ethereum address derived fromvalidatorPublicKeys[i]OracleIdentity.validatorPublicKeybyte-matches the samevalidatorPublicKeys[i]- the offchain and config encryption keys are both 32 bytes
offchainConfig bytes. If your node sees the event but refuses to load the config, reason about the failure in that order first.
Once the transaction confirms, your node should pick up the new validator set automatically.
5. Confirm the node joined the active config
Look for logs like:Steady-state health checks
These are the minimum checks worth automating.Local endpoints
Metrics that matter most
ocr2_upocr2_strategy_last_update_secondsocr2_strategy_update_staleocr2_transmit_total{status}ocr2_plugin_observations_total{result}ocr2_config_versionocr2_config_signers
ocr2_strategy_last_update_seconds stops advancing or ocr2_strategy_update_stale flips to 1, treat it as a real incident.
Key rotation
Rotate keys when compromise is suspected, your custody model changes, or Superform asks you to re-register.Submit the new public bundle to Superform
Superform must publish a new validator config onchain before the rotation is active.
Update local runtime config
Replace the relevant private key values in
config.toml, or update your KMS key reference.Upgrades
Source deployment
Docker deployment
Pull the target image tag, then restart the container or compose stack.- the process starts cleanly
/healthzand/metricsworkocr2_config_versionis unchanged unless the network intentionally rotated config- observations and transmissions resume
Common failure modes
Database connection failure
[database].url value.
Keys not found
Bootstrap peers unreachable
If the node never participates, verify:- outbound TCP
6690is open bootstrap_peersmatches the current values from Superformannounce_addressesis set correctly if you are behind NAT- debug logs do not show repeated ragep2p dial failures
Config digest mismatch
If yourconfigDigest differs from the rest of the network, check:
config_versioninconfig.toml- whether you observed the same
ValidatorConfigSetevent as the rest of the network - whether Superform submitted aligned
validators[],validatorPublicKeys[], andOracleIdentity[]arrays - whether
validators[i]still derives from the pairedvalidatorPublicKeys[i]and byte-matches the pairedOracleIdentity.validatorPublicKey - whether your local binary matches the expected network release
Observations succeed but no onchain transmissions land
Check:ocr2_transmit_total{status="failure"}and{status="error"}- whether the registered transmitter address matches your onchain key
- RPC health on the transmit chain
- debug logs for revert or nonce mismatch details
Error reference
| Error | Cause | Action |
|---|---|---|
validator N (pubkey ...) not found in offchainConfig | Onchain/offchain identity mismatch | Re-export keys and ask Superform to republish the config |
derived F=N from quorum=N is invalid: F*3=N must be < N | Invalid quorum for the validator count | Superform must adjust the config |
failed to unpack offchain config | Malformed offchainConfig bytes | Superform must republish the config |
no ValidatorConfigSet events found | Registration has not happened yet | Wait for Superform confirmation |
could not import github.com/smartcontractkit/libocr | Dependencies missing in source build | Run make deps |
Configuration + Monitoring
Full config, metrics, health endpoint, and alerting reference.