Running a Validator

Running a Frame Validator

In a Layer 2 network like Frame, a validator's job is to make sure claims about the chain state to the validating bridge are correct. Without at least one honest validator, a malicious actor could post an invalid state root to the validating bridge on the L1 and withdraw funds that they don't actually have. An honest validator has the ability to challenge an invalid state root, prove that it's wrong, and have the right state proposed instead.

For Arbitrum Nitro specifically, staked validators (those that can challenge invalid proposals) are currently permissioned. In the future, BOLD (opens in a new tab) will allow for staked validators to join the protocol permissionlessly. Until then, anyone can still run a validator in watchtower mode (opens in a new tab) which will alert the validator when an invalid state root is proposed.


For now, the only way to run a Frame testnet validator is to download and run a pre-built docker image. In the future, we will open source our Nitro repository (with Frame modifications) and allow developers to build the image from source.

We recommend having at least 8GB of RAM and 20GB of storage space on your machine.

In addition to software and hardware requirements above, you will also need a Sepolia RPC url.


To start, make sure you have Docker installed and running on your system. You can find instructions for install Docker here (opens in a new tab).

Once you have Docker installed, you should create a local directory where the validator config and node data will live. Here's a suggestion:

create directory
mkdir frame-validator
cd frame-validator
mkdir data 

You will then need to download the frame validator config that we've provided here (opens in a new tab).

clone reposiory
git clone

After cloning the repo, open the testnet.config file and replace <SEPOLIA_RPC_HERE> with your Sepolia RPC url.

Running the Validator

  • Make sure you are in the frame-validator directory.
  • Then start the validator by running:
docker run \
--name frame \
--rm \
-it \
-v $(pwd)/node-data:/home/user/.frame \
-v $(pwd)/node-config/testnet.json:/home/user/testnet.json \
--conf.file testnet.json

Check the logs

docker logs -f frame

Or add --since to view shorter logs

Example, see the logs starting from 1 minute ago

docker logs -f frame --since 1m

If everything is working you should see Running Arbitrum nitro node and Chain ID: 68840142 (unknown) in your logs. It will take some time for your validator to catch up and validator up to the latest state of the chain. You'll see validator catching up to last valid in the logs while it updates to the latest state. Once the validator is caught up, you'll see created block in the logs when a new block is created.


For more information on the various configurations for running a Frame node, you can look at the Arbitrum Nitro docs (opens in a new tab). The full list of configurations can be found here (opens in a new tab), these command line flags translate 1:1 with the config file you cloned earlier.

Please reach out on Discord if you run into any issues.