An Arc node syncs blocks from the network and serves a local JSON-RPC endpoint
so you can independently verify every block and transaction. It runs two
processes: the Execution Layer (EL), which executes transactions and maintains
state, and the Consensus Layer (CL), which fetches finalized blocks from relay
endpoints (trusted HTTP servers that distribute signed block data), verifies
their signatures, and passes them to the EL. For a deeper explanation of how
these components fit together, see
Running a node.Choose the install path that fits your environment.Replace
Arc is currently in its testnet phase. During this period, the network may
experience instability or unplanned downtime. Throughout this page, all
references to Arc refer specifically to the Arc Testnet.
- arcup
- Build from source
- Docker
Install pre-built Arc binaries using the Step 1: Install with
The installer places Verify the installation:Each command prints a version string. To update the binaries later, run On macOS, replace the second command with This command fetches the latest snapshot URLs from
The EL starts and waits for blocks. Log output shows that the IPC sockets exist
at The Run it several times over a few seconds. The block number increases as the node
syncs.If the block number stays at
arcup script. This is the fastest
path and requires no Rust toolchain or build dependencies.Prerequisites
Before you begin, ensure that you’ve:- Reviewed the node requirements for hardware, software, and network endpoints
- Prepared a Linux or macOS machine that meets the minimum system requirements
- Installed Foundry
(optional, provides the
castcommand used to verify your node)
Step 1: Install with arcup
arcup installs the Arc binaries under $ARC_HOME (default ~/.arc). Export
ARC_HOME first if you want to install somewhere else; otherwise the default
applies for both the installer and the environment file:arc-node-execution, arc-node-consensus,
arc-snapshots, and arcup itself into $ARC_HOME/bin. Load the produced
environment file so the binaries are on your PATH:arcup.Step 2: Set environment variables
The remaining steps use a small set of variables to keep paths consistent. Write them to a file and source it:Step 3: Create data directories
Create the data directories for the EL and CL, plus the runtime directory used for IPC sockets:mkdir -p "$ARC_RUN" after
uncommenting the macOS line in ~/.arc_env.When running as a systemd service, the
RuntimeDirectory=arc directive creates
/run/arc automatically. You can skip the second command in that case.Step 4: Download blockchain snapshots
Download snapshots so the node starts syncing from a recent block height rather than from genesis:https://snapshots.arc.network, downloads the snapshots, and extracts them into
$ARC_EXECUTION and $ARC_CONSENSUS.Starting with v0.8.0, Circle provides snapshots in Reth V2 storage format. A
fresh install from these snapshots does not require the V1→V2 data migration
described in the Migrate to V2 storage section.
Step 5: Initialize the consensus layer
Generate the CL private key file used for network identity. This is a one-time setup step:Step 6: Start the execution layer
Start the Execution Layer. This creates the IPC sockets that the Consensus Layer connects to.$ARC_RUN/reth.ipc and $ARC_RUN/auth.ipc.On high-traffic public endpoints, raise
--rpc.max-connections (default 250)
and --rpc.max-subscriptions-per-connection (default 32) if clients see
MaxConnections or TooManySubscriptions errors. The defaults bound WebSocket
log-fanout memory growth and should only be raised, not lowered.The
--full flag is required on the first start when bootstrapping from a
pruned snapshot. It reconciles internal database tables that would otherwise
fail a consistency check. After the initial startup completes, restart without
--full if you prefer not to prune. When --full is used, EL pruning runs on a
128-block interval (changed from 5000 in v0.7.3); pass
--prune.block-interval=5000 explicitly to retain the previous schedule.
--chain arc-testnet uses the bundled genesis configuration; replace with
--chain /path/to/genesis.json if you have a custom genesis file. See
reth node for additional flags.Step 7: Start the consensus layer
Open a separate terminal and start the Consensus Layer. The CL connects to the EL through the IPC sockets and begins fetching blocks from the network.Step 8: Verify the node is syncing
After both layers start, wait roughly 30 seconds, then query the local JSON-RPC endpoint for the latest block height:result field is a hexadecimal block number that increases over time. If it
stays at 0x0, check the CL logs for errors.If you have Foundry
installed, you can run the same check with cast:0x0 or the node does not start as expected, check
these common causes:- IPC socket files missing. The EL writes sockets at
$ARC_RUN/reth.ipcand$ARC_RUN/auth.ipcon startup. If they are missing after 30 seconds, the EL did not start. Review its terminal output for a panic or configuration error. - CL cannot connect to the EL. Start the EL first. If the CL was launched before the EL was ready, restart the CL.
- Snapshot extraction incomplete.
arc-snapshots downloadruns silently during extraction. If it was interrupted,$ARC_EXECUTIONor$ARC_CONSENSUSmay be partially populated. Re-run the download to overwrite the existing files. If you clear the directories first, note that$ARC_CONSENSUSalso holds the CL private key written byarc-node-consensus init. Re-run that command after clearing, or your node loses its network identity. - Path mismatch between EL and CL.
$ARC_RUNmust resolve to the same directory in both shells. Re-source~/.arc_envin any terminal that lost its environment.
Run on separate hosts
The preceding tabs describe running the Execution Layer and Consensus Layer on the same host, communicating through IPC sockets. To run them on separate hosts, swap IPC for authenticated RPC. This section applies to the binary install paths (arcup and source build); the Docker path is single-host by default.Generate a JWT secret
The EL and CL authenticate to each other with a shared JWT secret. Generate it once, then securely copy it to both hosts:Execution layer flags for RPC mode
Remove the IPC flags (--ipcpath, --auth-ipc, --auth-ipc.path) from the EL
command and add:Consensus layer flags for RPC mode
Remove--eth-socket and --execution-socket from the CL command, and add:<EL_HOST> with the IP address or hostname of the EL host.IPC and RPC are mutually exclusive. Use one or the other, not both.
Tune backpressure
The preceding tabs start the Consensus Layer with backpressure enabled at the default threshold (16). Backpressure throttles execution to match the speed of
disk writes, bounding Execution Layer memory growth during startup or extended
sync when the node is far behind.If you observe sustained memory pressure on a host that meets the
node requirements, restart the Consensus
Layer with a lower threshold:Migrate to V2 storage
v0.8.0 upgrades Reth to v2.2.0, which introduces a V2 on-disk storage layout for the Execution Layer. Migration is not required for v0.8.0 but will be required for v0.9.0. Migrating now is recommended so the next upgrade does not require it.Fresh installs bootstrapped from the Circle-provided snapshots are already in V2 format. No migration is needed.Upgrading from v0.7.x requires either restoring from a V2 snapshot (the simplest path) or migrating the existingdatadir in place:- Restoring from a V2 snapshot: stop the node, clear
$ARC_EXECUTION, and re-run the snapshot download steps in this guide. - Migrating in place: use
arc-node-execution db migrate-v2as described in the following section.
Migrate in place
- Stop the CL first, then stop the EL. Note the current head block number.
-
Run the migration.
--datadirmust precedemigrate-v2:Pass--chain arc-mainnetif your node is on mainnet. A successful run exits withMigration complete. You should now restart the node and let it run the pipeline to rebuild the remaining data. -
Restart the EL alone (keep the CL stopped) with the pruning flag that matches
your
datadir(--full,--minimal, or omit for archive). Using the wrong flag causes a rebuild failure:The node rebuilds index tables cleared during migration. Wait until it returns to the head block number you noted in step 1. -
Verify the rebuilt node is at tip (
eth_syncingreturnsfalse) and that re-runningmigrate-v2is a no-op (Storage is already v2, nothing to do). - Start the CL and confirm live execution resumes.