Run a split validator node
Running split validators for Arbitrum chains
Split validators separate the validation work to a stateless worker, which provides several key benefits:
- Resource management: Easier to scale and manage compute resources independently
- Fault isolation: Prevents database corruption if the validation worker crashes (e.g., due to OOM errors)
- Flexibility: Allows running multiple validation workers for horizontal scalability
This guide explains how to set up a split validator configuration for Arbitrum chains by running a Nitro node (staker) and a validation node separately.
Before you read this doc, please ensure you have already walked through run a validator docs to understand the basics of a validator node.
Prerequisites
- Docker or Kubernetes with Helm installed
- Staker private key
- Chain information JSON for your Arbitrum chain
Docker deployment guide
Step 1: Set up the validation node
First, generate a JWT secret for secure communication:
xxd -l 32 -ps -c 40 /dev/urandom > /tmp/nitro-val.jwt
Start the validation node with the JWT secret:
docker run --rm -it \
--entrypoint nitro-val \
-p 0.0.0.0:5200:5200 \
offchainlabs/nitro-node:v3.6.4-28199cd \
--auth.addr 127.0.0.1 \
--auth.origins 0.0.0.0 \
--auth.jwtsecret /tmp/nitro-val.jwt \
--auth.port 5200
The validation node will listen on port 5200.
Step 2: Set up the staker node
Copy the JWT secret to your mount directory:
cp /tmp/nitro-val.jwt /some/local/dir/arbitrum
Start the staker node with the following command, connecting it to your validation node:
docker run --rm -it \
-v /some/local/dir/arbitrum:/home/user/.arbitrum \
offchainlabs/nitro-node:v3.6.4-28199cd \
--parent-chain.connection.url=<parent-chain-endpoint> \
--node.staker.enable=true \
--node.staker.strategy=MakeNodes \
--node.staker.parent-chain-wallet.private-key=<staker_private_key> \
--chain.info-json=<Your_chain_info> \
--execution.forwarding-target=<forwarding_target> \
--node.block-validator.validation-server-configs-list="[{\"jwtsecret\":\"/home/user/.arbitrum/nitro-val.jwt\",\"url\":\"ws://Your_validation_address\"}]"
Replace the placeholders with your specific values:
<parent-chain-endpoint>
: Your parent chain RPC endpoint<staker_private_key>
: Your staker's private key<Your_chain_info>
: Chain information JSON<forwarding_target>
: Your forwarding node URL (usually is the sequencer endpoint)Your_validation_address
: Address of your validation node (including port)
Kubernetes deployment with Helm
Arbitrum provides a community Helm chart for Kubernetes deployment.
Step 1: Create validation node configuration
Create a file named validation_values.yaml
:
configmap:
data:
parent-chain:
id: 1 # Use appropriate parent chain ID
connection:
url: 'https://your-parent-chain-rpc'
execution:
forwarding-target: 'https://your-forwarding-node'
node:
staker:
enable: true
strategy: 'MakeNodes'
parent-chain-wallet:
private-key: 'your-staker-private-key'
chain:
name: 'Your Chain Name'
id: 42161 # Your chain ID
info-json: '[Your chain info JSON]'
jwtSecret:
enabled: true
value: 'Your 32 bytes hex jwt'
validator:
enabled: true
splitvalidator:
deployments:
- name: 'current'
Step 2: Deploy the validation node
helm install nitro-validator offchainlabs/nitro --values validation_values.yaml
Monitoring and maintenance
-
Monitor your validator and staker logs regularly:
# For Docker
docker logs -f <container_id>
# For Kubernetes
kubectl logs -f <POD> -
Check validator and staker status through the Arbitrum dashboard or API
Additional configurations for validation nodes
To get a full list of parameters for the validation node, you can run the following command:
docker run --rm -it --entrypoint nitro-val offchainlabs/nitro-node:v3.6.4-28199cd --help
Additional configurations for helm charts
For more advanced helm chart configurations, please refer to the Arbitrum community Helm Chart README