How to run an archive node
An Arbitrum archive node is a full node that maintains an archive of historical chain states. This how-to walks you through the process of configuring an archive node on your local machine so that you can query both pre-Nitro and post-Nitro state data.
Most users won't need to configure an archive node. This node type is great for a small number of use cases - for example if you need to process historical data.
Before we begin
Before the Nitro upgrade, Arbitrum One ran on the Classic stack for about one year (before block height 22207817). Although the Nitro chain uses the latest snapshot of the Classic chain's state as its genesis state, the Nitro stack can't serve archive requests for pre-Nitro blocks.
Running an Arbitrum One full node in archive mode lets you access both pre-Nitro and post-Nitro blocks, but it requires you to run both Classic and Nitro nodes together. You may not need to do this, depending on your use case:
Use case | Required node type(s) | Docs |
---|---|---|
Access the Arbitrum network without running your own node | Fully managed by third-parties, exposed via RPC endpoints | RPC endpoints and providers |
Run an archive node for Arbitrum Sepolia (testnet) or Arbitrum Nova | Full node (Nitro) | How to run a full node (Nitro) |
Send post-Nitro archive requests | Full node (Nitro) | How to run a full node (Nitro) |
Send pre-Nitro archive requests | Full node (Classic) | How to run a full node (Classic, pre-Nitro) |
Send post-Nitro and pre-Nitro archive requests | Full node (Nitro) and full node (Classic) | That's what this how-to is for; you're in the right place. |
System requirements
As of May 2024, archive node snapshots for Arbitrum One, Arbitrum Nova, and Arbitrum Sepolia are no longer being updated on https://snapshot-explorer.arbitrum.io/ due to accelerated database and state growth. Teams who use these publicly available archive snapshots will need to wait longer than usual for their nodes to sync up.
The Offchain Labs team is actively exploring and working on solutions to address this and will provide an update as soon as possible. In the meantime, the Offchain Labs team continues to recommend that teams periodically create their own snapshots by stopping one of their archive nodes and backing up their database.
The minimum storage requirements will change as the Nitro chains grow (growing rates are specified below). We recommend exceeding the minimum requirements as much as you can to minimize risk and maintenance overhead.
- RAM: 16GB+ for Nitro and 32GB+ for Classic
- CPU: 4+ core CPU
- Storage (last updated on April 2024):
- Arbitrum One: 9.7TB SSD, currently growing at a rate of about 850GB per month
- Arbitrum Nova: 4.3TB SSD, currently growing at a rate of about 1.8TB GB per month
- Docker images: We'll specify these in the below commands; you don't need to download them manually.
- Latest Docker image for Arbitrum One Nitro:
offchainlabs/nitro-node:v3.2.1-d81324d
- Latest Docker image for Arbitrum One Classic:
offchainlabs/arb-node:v1.4.5-e97c1a4
- Latest Docker image for Arbitrum One Nitro:
- Database snapshots:
- Nitro database snapshot
- Use the parameter
--init.url=
on the first startup to initialize the Nitro database (you can find a list of snapshots here). Example:--init.url="https://snapshot.arbitrum.foundation/arb1/nitro-archive.tar"
- Use the parameter
- Arbitrum One Classic database snapshot
- Download the latest Arbitrum One Classic database snapshot at https://snapshot.arbitrum.foundation/arb1/classic-archive.tar and place it in the mounted point directory
- Note that other chains don't have Classic blocks and thus don't require an initial genesis database.
- Snapshot Explorer
- You can find more snapshots on our snapshot explorer
- Nitro database snapshot
Review and configure ports
- RPC:
8547
- Sequencer Feed:
9642
- WebSocket:
8548
Review and configure parameters
Arbitrum Nitro | Arbitrum Classic | Description |
---|---|---|
--parent-chain.connection.url=<Layer 1 Ethereum RPC URL> | --l1.url=<Layer 1 Ethereum RPC URL> | Provide an standard L1 node RPC endpoint that you run yourself or from a third-party node provider (see RPC endpoints and providers) |
--chain.id=<L2 chain ID> | --l2.chain-id=<L2 Chain ID> | See RPC endpoints and providers for a list of Arbitrum chains and the respective L2 chain IDs |
--execution.caching.archive | --node.caching.archive | Required for running an Arbitrum One Nitro archival node and retains past block state |
- | --node.cache.allow-slow-lookup | Required for running an Arbitrum One Classic archival node. When this option is present, it will load old blocks from disk if not in memory cache. |
- | --core.checkpoint-gas-frequency=156250000 | Required for running an Arbitrum One Classic archival node. |
Arbitrum Nitro | Arbitrum Classic | Description |
---|---|---|
--parent-chain.connection.url=<Layer 1 Ethereum RPC URL> | --l1.url=<Layer 1 Ethereum RPC URL> | Provide an standard L1 node RPC endpoint that you run yourself or from a third-party node provider (see RPC endpoints and providers) |
--chain.id=<L2 chain ID> | --l2.chain-id=<L2 Chain ID> | See RPC endpoints and providers for a list of Arbitrum chains and the respective L2 chain IDs |
--execution.caching.archive | --node.caching.archive | Required for running an Arbitrum One Nitro archival node and retains past block state |
- | --node.cache.allow-slow-lookup | Required for running an Arbitrum One Classic archival node. When this option is present, it will load old blocks from disk if not in memory cache. |
- | --core.checkpoint-gas-frequency=156250000 | Required for running an Arbitrum One Classic archival node. |
Run the Docker image(s)
When running a Docker image, an external volume should be mounted to persist the database across restarts. The mount point should be /home/user/.arbitrum/mainnet
.
To run both Arbitrum Nitro and/or Arbitrum Classic in archive mode, follow one or more of the below examples:
- Arbitrum One Nitro archive node:
docker run --rm -it -v /some/local/dir/arbitrum:/home/user/.arbitrum -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 offchainlabs/nitro-node:v3.2.1-d81324d --parent-chain.connection.url https://l1-node:8545 --chain.id=42161 --http.api=net,web3,eth --http.corsdomain=* --http.addr=0.0.0.0 --http.vhosts=* --execution.caching.archive
- Arbitrum One Classic archive node:
docker run --rm -it -v /some/local/dir/arbitrum-mainnet/:/home/user/.arbitrum/mainnet -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 offchainlabs/arb-node:v1.4.5-e97c1a4 --l1.url=https://l1-node:8545/ --node.chain-id=42161 --l2.disable-upstream --node.cache.allow-slow-lookup --core.checkpoint-gas-frequency=156250000 --core.lazy-load-core-machine
- Arbitrum One Nitro archive node with forwarding classic execution support:
docker run --rm -it -v /some/local/dir/arbitrum:/home/user/.arbitrum -p 0.0.0.0:8547:8547 -p 0.0.0.0:8548:8548 offchainlabs/nitro-node:v3.2.1-d81324d --parent-chain.connection.url https://l1-node:8545 --chain.id=42161 --execution.rpc.classic-redirect=<classic node RPC> --http.api=net,web3,eth --http.corsdomain=* --http.addr=0.0.0.0 --http.vhosts=* --execution.caching.archive
Note that the above commands both map to port 8547
on their hosts. To run both on the same host, you should edit those mapping to different ports and specify your Classic node RPC URL as <classic node RPC>
in your Nitro start command. To verify the connection health of your node(s), see Docker network between containers - Docker Networking Example.
A note on permissions
The Docker image is configured to run as non-root UID 1000
. If you're running in Linux and you're getting permission errors when trying to run the Docker image, run this command to allow all users to update the persistent folders, replacing arbitrum-mainnet
as needed:
mkdir /some/local/dir/arbitrum-mainnet
chmod -fR 777 /some/local/dir/arbitrum-mainnet
Optional parameters
Both Nitro and Classic have multiple other parameters that can be used to configure your node. For a full comprehensive list of the available parameters, use the flag --help
.
Troubleshooting
If you run into any issues, visit the node-running troubleshooting guide.