Skip to main content

How to run a normal sequencer node for an Orbit chain

caution

The following instructions are meant for Arbitrum Orbit chains only. This article only applies to test environments. If you need support spinning up a production Orbit chain, we recommend contacting a provider.

We also provide a guide for running a high-availability sequencer node for an Orbit chain. You can find it here.

This how-to provides step-by-step instructions for running a sequencer node on your local machine.

Minimum hardware configuration

The following are the minimum hardware configurations required to set up a Nitro full node (not archival):

ResourceRecommended
RAM16 GB
CPU4 core CPU (for AWS, a t3 xLarge instance)
Storage typeNVMe SSD drives are recommended
Storage sizeDepends on the chain and its traffic overtime

Please note that:

  • These minimum requirements for RAM and CPU are recommended for nodes that process a small amount of RPC requests. For nodes that require processing multiple simultaneous requests, both RAM and the number of CPU cores will need to scale with the amount of traffic served.
  • Single core performance is important. If the node is falling behind and a single core is 100% busy, it is recommended to update to a faster processor
  • The minimum storage requirements will change over time as the chain grows. Using more than the minimum requirements to run a robust full node is recommended.
caution

Even though there are alpha and beta versions of the Arbitrum Nitro software, only use release versions when running your node. Running alpha or beta versions is unsupported and might lead to unexpected behaviors.

Latest Docker image: offchainlabs/nitro-node:v3.5.5-90ee45c

Required parameters

1. Sequencer node parameters

The following parameters are required to run a sequencer node:

1. Enable sequencer

Enable the sequencer mode:

--node.sequencer=true

2. Make the node act as a sequencer and post to L1

Enable the sequencer execution:

--execution.sequencer.enable=true
--execution.sequencer.max-tx-data-size=85000

3. Enable delayed sequencer

Enable your node to read and include transactions from the parent chain delayed inbox.

--node.delayed-sequencer.enable=true
--node.delayed-sequencer.use-merge-finality=false
--node.delayed-sequencer.finalize-distance=1

4. Enable batch poster

Enable your node to send batches to the parent chain:

--node.batch-poster.enable=true
--node.batch-poster.max-size=90000
--node.batch-poster.parent-chain-wallet.private-key=<Your Parent Chain Wallet Private Key>

4. Disable transaction forwarding

Disable your sequencer's forwarding transactions, as the node will queue the transaction directly:

--execution.forwarding-target=""

5. Enable feed-out queued transactions

Enable your node to feed out transactions so full node can receive queued transactions:

--node.feed.output.enable=true
--node.feed.output.addr=0.0.0.0
--node.feed.output.port=<Sequencer feed port>

5. Connect the node to data availability servers

note

This step is only required in Anytrust mode.

Enable your node to send batches to DAS and get DACerts from them.

--node.data-availability.enable=true
--node.data-availability.sequencer-inbox-address=<Sequencer Inbox Address>
--node.data-availability.parent-chain-node-url=<Parent Chain Node URL>
--node.data-availability.rest-aggregator.enable=true
--node.data-availability.rest-aggregator.urls=<A list of DAS REST endpoints, can be only one URL>
--node.data-availability.rpc-aggregator.enable=true
--node.data-availability.rpc-aggregator.assumed-honest=1
--node.data-availability.rpc-aggregator.backends=<A list of RPC backends>

2. Putting it all together

  • When running a Docker image, an external volume should be mounted to persist the database across restarts. The mount point inside the Docker image should be /home/user/.arbitrum

  • Example:

    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.5.5-90ee45c --node.sequencer=true --node.delayed-sequencer.enable=true --node.delayed-sequencer.use-merge-finality=false --node.delayed-sequencer.finalize-distance=1 --node.batch-poster.enable=true --node.batch-poster.max-size=90000 --node.batch-poster.parent-chain-wallet.private-key=<Your Parent Chain Wallet Private Key> --node.staker.enable=true --node.staker.strategy=MakeNodes --node.staker.parent-chain-wallet.private-key=<Your Parent Chain Wallet Private Key> --node.data-availability.enable=true --node.data-availability.sequencer-inbox-address=<Sequencer Inbox Address> --node.data-availability.parent-chain-node-url=<Parent Chain Node URL> --node.data-availability.rest-aggregator.enable=true --node.data-availability.rest-aggregator.urls=<A list of DAS REST endpoints, can be only one URL> --node.data-availability.rpc-aggregator.enable=true --node.data-availability.rpc-aggregator.assumed-honest=1 --node.data-availability.rpc-aggregator.backends=<A list of RPC backends> --execution.sequencer.enable=true --execution.sequencer.max-tx-data-size=85000
    • Ensure that /some/local/dir/arbitrum already exists; otherwise, the directory might be created with root as owner, and the Docker container won't be able to write to it.
  • Json Example:

    {
    "node": {
    "sequencer": true,
    "delayed-sequencer": {
    "enable": true,
    "use-merge-finality": false,
    "finalize-distance": 1
    },
    "batch-poster": {
    "max-size": 90000,
    "enable": true,
    "parent-chain-wallet": {
    "private-key": "<batch post key>"
    }
    },
    "feed": {
    "output": {
    "enable": true,
    "addr": "0.0.0.0",
    "port": "<Sequencer feed port>"
    }
    },
    "data-availability": {
    "enable": true,
    "sequencer-inbox-address": "<Sequencer inbox address>",
    "parent-chain-node-url": "https://sepolia-rollup.arbitrum.io/rpc",
    "rest-aggregator": {
    "enable": true,
    "urls": ["http://das-server:9877"]
    },
    "rpc-aggregator": {
    "enable": true,
    "assumed-honest": 1,
    "backends": "[{\"url\":\"http://das-server:9876\",\"pubkey\":\"YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\"signermask\":1}]"
    }
    }
    },
    "execution": {
    "forwarding-target": "",
    "sequencer": {
    "enable": true,
    "max-tx-data-size": 85000
    }
    }
    }

Note on permissions

  • The Docker image is configured to run as non-root UID 1000. If you are running Linux or macOS and you are getting permission errors when trying to run the Docker image, run this command to allow all users to update the persistent folders:
mkdir /data/arbitrum
chmod -fR 777 /data/arbitrum

## Optional parameters

Here's a list of the parameters that are most commonly used when running your Orbit sequencer node. You can also use the flag `--help` for a comprehensive list of available parameters.

import OptionalOrbitSequencerCompatibleCLIFlagsPartial from '../partials/run-full-node/_optional-orbit-sequencer-compatible-cli-partial.mdx';

<OptionalOrbitSequencerCompatibleCLIFlagsPartial />