<!-- Canonical: https://docs.linea.build/network/how-to/run-a-node/erigon -->

> For the complete Linea documentation index, see [llms.txt](/llms.txt).
> Agents can fetch this page as Markdown at [https://docs.linea.build/network/how-to/run-a-node/erigon.md](https://docs.linea.build/network/how-to/run-a-node/erigon.md).

# Erigon

Erigon is a client implementation focused on performance and saving disk space, written in Go.

important

Install and run Erigon if you want to follow the Linea network by maintaining a local copy of the blockchain. However, if you want to interact with the network and use Linea-specific methods and features, you should [install Linea Besu](/network/how-to/run-a-node/linea-besu) instead.

Please note that you must run any execution layer client such as Erigon alongside Linea's consensus layer client, [Maru](/network/how-to/run-a-node/maru), for the node to function.

## Run using Docker

Current Erigon support

Stock Erigon does not sync current Linea from scratch. Tested against `erigontech/erigon:v3.5.0` with `--externalcl` + Maru, it hangs at block 0 ([erigontech/erigon#22081](https://github.com/erigontech/erigon/issues/22081)), and earlier versions hit `[EIP-7002] Syscall failure: Empty Code` at the Fusaka fork because Linea's genesis allocates no code at the withdrawal/consolidation contract addresses ([erigontech/erigon#18160](https://github.com/erigontech/erigon/issues/18160)).

The example Docker Compose file therefore references a patched Erigon image, `linea-erigon:v3.3.0-linea-patched`, which applies three fixes on top of Erigon `v3.3.0`:

-   `sentryMcDisableBlockDownload = false` (enables EL-driven bootstrap from genesis)
-   EIP-7002 empty-code syscall returns `nil` instead of erroring (Fusaka fix)
-   EIP-7251 empty-code syscall returns `nil` instead of erroring (Fusaka fix)

This image is not published to a registry — you build it locally from the Dockerfile shipped in the monorepo at [`docs/getting-started/linea-mainnet/erigon-linea/`](https://github.com/LFDT-Lineth/lineth-monorepo/tree/main/docs/getting-started/linea-mainnet/erigon-linea) (see Step 1 below).

### Prerequisites

-   [Docker](https://docker.com/products/docker-desktop/)

### Step 1. Build the patched Erigon image

Clone the Linea monorepo (if you haven't already) and build the patched Erigon image from the Dockerfile shipped in the repo:

```bash
git clone https://github.com/LFDT-Lineth/lineth-monorepo.git
cd lineth-monorepo/docs/getting-started/linea-mainnet/erigon-linea
make build
```

This builds `linea-erigon:v3.3.0-linea-patched` and loads it into your local Docker daemon. The getting-started compose file references this image name, so after building you can start the node directly.

On Apple Silicon (arm64), build for arm64 so the image runs natively:

```bash
make build PLATFORM=linux/arm64
```

### Step 2. Download the Linea node example config

Use the Linea monorepo's `docs/getting-started` directory as the example Docker Compose configuration. The same directory contains the Geth genesis file that Erigon should initialize from.

-   Mainnet
-   Linea Sepolia

Download or clone the [`docs/getting-started/linea-mainnet`](https://github.com/LFDT-Lineth/lineth-monorepo/tree/main/docs/getting-started/linea-mainnet) directory from the Linea monorepo. The Erigon services in the compose file already reference the patched image and mount the Geth genesis file directly, so no manual edits are required.

bootnodes

You can choose from a range of bootnodes for Linea Mainnet. The Docker Compose file uses all bootnodes by default.

The [bootnodes page](/network/how-to/run-a-node/bootnodes) contains a full list of available bootnodes.

Download or clone the [`docs/getting-started/linea-sepolia`](https://github.com/LFDT-Lineth/lineth-monorepo/tree/main/docs/getting-started/linea-sepolia) directory from the Linea monorepo. The Erigon services in the compose file already reference the patched image and mount the Geth genesis file directly, so no manual edits are required.

### Step 3. Start the Erigon node

In a terminal, navigate to the Linea monorepo directory for your network. Start the Erigon and Maru services from the compose file:

```bash
docker compose up erigon-init erigon-node maru-node
```

The compose file initializes Erigon from the Geth genesis JSON, then starts the Erigon execution client with `--externalcl` so [Maru](/network/how-to/run-a-node/maru) drives block delivery over the Engine API. Erigon also bootstraps its execution stage from genesis via its own block downloader, then meets the Maru-driven tip via backward download.

## Alternative: Run using the binary distribution

info

Stock Erigon does not sync current Linea from scratch (see the warning above). Build the binary from Erigon `v3.3.0` and apply the three patches below before running. Ensure you review [Erigon's software prerequisites](https://docs.erigon.tech/get-started/hardware-requirements) before building the Erigon client.

If you're not comfortable with installing the binary distribution, use [Docker](#run-using-docker) instead.

### Step 1. Build Erigon

Build Erigon from `v3.3.0` and apply the three Linea patches (the same patches used by the `linea-erigon:v3.3.0-linea-patched` Docker image):

```bash
git clone https://github.com/erigontech/erigon.git
cd erigon
git checkout v3.3.0

# Patch 1: enable EL-driven block download (bootstrap fix for #22081)
sed -i 's/const sentryMcDisableBlockDownload = true/const sentryMcDisableBlockDownload = false/' node/eth/backend.go

# Patch 2: EIP-7002 empty-code syscall returns nil (Fusaka fix for #18160)
sed -i 's/return nil, fmt.Errorf("\[EIP-7002\] Syscall failure: Empty Code at WithdrawalRequestAddress=%x", params.WithdrawalRequestAddress)/return nil, nil/' execution/protocol/rules/misc/eip7002.go

# Patch 3: EIP-7251 empty-code syscall returns nil (Fusaka fix for #18160)
sed -i 's/return nil, fmt.Errorf("\[EIP-7251\] Syscall failure: Empty Code at ConsolidationRequestAddress=%x", params.ConsolidationRequestAddress)/return nil, nil/' execution/protocol/rules/misc/eip7251.go

make erigon
```

Use the resulting `build/bin/erigon` binary in the commands below, or add it to your `PATH`.

### Step 2. Download the genesis file

Download the genesis file for the relevant network. In the example, we'll download the file to the directory specified by [`datadir` in Step 4](#step-4-bootstrap-your-node).

-   Mainnet
-   Linea Sepolia

Download the current Linea Mainnet [`geth-genesis.json`](https://github.com/LFDT-Lineth/lineth-monorepo/blob/main/docs/getting-started/linea-mainnet/geth/geth-genesis.json) file from the Linea monorepo. Save it in your Erigon data directory as `genesis.json`.

Download the current Linea Sepolia [`geth-genesis.json`](https://github.com/LFDT-Lineth/lineth-monorepo/blob/main/docs/getting-started/linea-sepolia/geth/geth-genesis.json) file from the Linea monorepo. Save it in your Erigon data directory as `genesis.json`.

### Step 3. Define disk space volume (optional)

Define a volume size appropriate to your expected usage. Erigon full nodes use over 200GB.

Use these figures as a basis to determine the extent to which you want to future-proof your node.

Ensure you mount the Erigon `datadir` to the custom volume.

If you run out of space, or need to actively maintain how much space is being used, consider [pruning](https://erigon.gitbook.io/erigon/advanced-usage/options).

note

Blockchain clients can take up a lot of disk space. By defining the amount of disk space you're willing to dedicate to your client (and the block data that it will be syncing), you can ensure that you still have enough room on your disk for whatever else you need.

Select the relevant operating system for the steps on how to create a custom volume.

Ubuntu

-   Open Terminal
-   Use the `df -h` command to check the available disk space
-   Choose a maximum size for the volume. We'll use 100GB for this example.
-   Use `fallocate` to create a file of the desired size, e.g. `fallocate -l 100G myfile.img`
-   Use `mkfs.ext4` to format the file as an ext4 filesystem. e.g. `mkfs.ext4 myfile.img`
-   Mount the file using `mount`, e.g. `mount -o loop myfile.img /mnt/myvolume`
-   The contents will now be available in `/mnt/myvolume`, up to a maximum of 100GB

MacOS

-   Open Terminal
-   Use the `df -h` command to check the available disk space
-   Choose a maximum size for the volume. We'll use 100GB for this example.
-   Use `hdiutil` to create a sparse image of the desired size, e.g. `hdiutil create -size 100g -type SPARSE -fs HFS+X myfile.dmg`
-   Mount the image using `hdiutil`, e.g. `hdiutil attach myfile.dmg`
-   The contents will now be available mounted under `/Volumes`, up to a maximum of 100GB

Windows

Without Windows Subsystem Linux

-   Open Command Prompt as Administrator
-   Use the `dir` command to check available disk space on the volume you want to create the disk image
-   Choose a maximum size for the volume. We'll use 100GB for this example.
-   Use the `fsutil` command to create a sparse file of the desired size, e.g. `fsutil file createnew myfile.img 107374182400` (for a 100GB file)
-   Initialize the disk image using `diskpart`:
    -   `diskpart`
    -   `select vdisk file="myfile.img"`
    -   `create vdisk maximum=100000`
    -   `attach vdisk`
    -   `exit`
-   Format the volume using `format`, e.g. `format F: /FS:NTFS /A:64K /Q`
-   The new volume will now be available as drive letter F:, up to the maximum 100GB size

To mount an existing disk image:

-   Open Command Prompt as Administrator
-   Use `diskpart`
    -   `select vdisk file="myfile.img"`
    -   `attach vdisk`
-   The disk image will be mounted and accessible under the assigned drive letter

With Windows Subsystem Linux

-   Open WSL
-   Use the `df -h` command to check the available disk space
-   Choose a maximum size for the volume. We'll use 100GB for this example.
-   Use `fallocate` to create a file of the desired size, e.g. `fallocate -l 100G myfile.img`
-   Use `mkfs.ext4` to format the file as an ext4 filesystem. e.g. `mkfs.ext4 myfile.img`
-   Mount the file using `mount`, e.g. `mount -o loop myfile.img /mnt/myvolume`
-   The contents will now be available in `/mnt/myvolume`, up to a maximum of 100GB

### Step 4. Bootstrap your node

Bootstrap the node using the following command:

-   Mainnet
-   Linea Sepolia

```bash
erigon --datadir $HOME/erigon-mainnet-data/ init $HOME/erigon-mainnet-data/genesis.json
```

```bash
erigon --datadir $HOME/erigon-sepolia-data/ init $HOME/erigon-sepolia-data/genesis.json
```

### Step 5. Start the Erigon client

Start the node using the following command:

-   Mainnet
-   Linea Sepolia

```bash
erigon \
--datadir $HOME/erigon-mainnet-data/ \
--networkid 59144 \
--rpc.allow-unprotected-txs \
--txpool.accountqueue 50000 \
--txpool.globalqueue 50000 \
--txpool.globalslots 50000 \
--txpool.pricelimit 1000000 \
--txpool.pricebump 1 \
--txpool.nolocals \
--http --http.addr '127.0.0.1' --http.port 8545 --http.corsdomain '*' --http.api 'web3,eth,txpool,net' --http.vhosts='*' \
--ws \
--bootnodes "enode://069800db9e6e0ec9cadca670994ef1aea2cfd3d88133e63ecadbc1cdbd1a5847b09838ee08d8b5f02a9c32ee13abeb4d4104bb5514e5322c9d7ee19f41ff3e51@3.132.73.210:31002,enode://a8e03a71eab12ec4b47bb6e19169d8e4dc7a58373a2476969bbe463f2dded6003037fa4dd5f71e15027f7fc8d7340956fbbefed67ddd116ac19a7f74da034b61@3.132.73.210:31003,enode://97706526cf79df9d930003644f9156805f6c8bd964fc79e083444f7014ce10c9bdd2c5049e63b58040dca1d4c82ebef970822198cf0714de830cff4111534ff1@18.223.198.165:31004,enode://24e1c654a801975a96b7f54ebd7452ab15777fc635c1db25bdbd4425fdb04e7f4768e9e838a87ab724320a765e41631d5d37758c933ad0e8668693558125c8aa@18.223.198.165:31000,enode://27010891d960f73d272a553f72b6336c6698db3ade98d631f09c764e57674a797be5ebc6829ddbb65ab564f439ebc75215d20aa98b6f351d12ea623e7d139ac3@3.132.73.210:31001,enode://228e1b8a4931e46f383e30721dac21fb8fb4e5e1b32c870e13b25478c82db3dc1cd9e7ceb93d302a766466b55638cc9c5cbfc43aa48fa41ced19baf365951f76@3.1.142.64:31002,enode://c22eb0d40fc3ad5ea710aeddea906567778166bfe18c157955e8c39b23a46c45db18a0fa2ba07f2b64c81178a8c796aec2a29151533920ead06fcdfc6d8d03c6@47.128.192.57:31004,enode://8ce733abe39fd7ae0a278b9893f85c1193c611a3886168690dd843435460f22cc4d61f9e8d0ace7f5905836a665319a31cccdaacdada2acc69972c382ecce7db@3.1.142.64:31003,enode://b7c1b2bed65a855f7a2104aac9a14674dfdf018fdac763415b373b29ce18cdb81d36328ba4e5c9f12629f3a50c3e8f9ee048f22dbdbe93a82813da89c6b81334@51.20.235.126:31004,enode://95270e0550848a72fb141cf27f1c4ea10714edde365b411dc0fa06c81c0f282ce155eb9fa472b6b8bb9ee98395eeaf4c5a7b02a01fe58b37ea98ba152eda4c37@13.50.94.193:31000,enode://72013391755f24f08567b932feeeec4c893c06e0b1fb480890c83bf87fd277ad86a5ab9cb586db9ae9970371a2f8cb0c96f6c9f69045abca0fb801db7f047138@51.20.235.126:31001" \
--prune hrtc \
--metrics \
--verbosity 3
```

bootnodes

You can choose from a range of bootnodes for Linea Mainnet. The above command uses all bootnodes by default.

The [bootnodes page](/network/how-to/run-a-node/bootnodes) contains a full list of available bootnodes.

```bash
erigon \
--datadir $HOME/erigon-sepolia-data \
--networkid 59141 \
--rpc.allow-unprotected-txs \
--txpool.accountqueue 50000 \
--txpool.globalqueue 50000 \
--txpool.globalslots 50000 \
--txpool.pricelimit 1000000 \
--txpool.pricebump 1 \
--txpool.nolocals \
--http --http.addr '127.0.0.1' --http.port 8545 --http.corsdomain '*' --http.api 'web3,eth,txpool,net' --http.vhosts='*' \
--ws \
--bootnodes "enode://6f20afbe4397e51b717a7c1ad3095e79aee48c835eebd9237a3e8a16951ade1fe0e66e981e30ea269849fcb6ba03d838da37f524fabd2a557474194a2e2604fa@18.221.100.27:31002,enode://ce1e0d8e0500cb5c0ac56bdcdafb2d6320c3a2c5125b5ccf12f5dfc9b47ee74acbcafc32559017613136c9c36a0ce74ba4f83b7fb8244f099f3b15708d9d3129@3.23.75.47:31000,enode://1b026a5eb0ae74300f58987d235ef0e3a550df963345cb3574be3b0b54378bd11f14dfd515a8976f2c2d2826090e9507b8ccc24f896a9ffffffcabcfd996a733@3.129.120.128:31001" \
--prune hrtc \
--metrics \
--verbosity 3
```

The Erigon node will attempt to find peers to begin synchronizing and to download the world state.

## Confirm the node is running

You can call the JSON-RPC API methods to confirm the node is running. For example, call `eth_syncing` to return the synchronization status. For example the starting, current, and highest block, or `false` if not synchronizing (or if the head of the chain has been reached).

```bash

curl localhost:8545 \
        -X POST \
        -H "Content-Type: application/json" \
        -d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'
```

You should get a result similar to:

```bash
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "startingBlock": "0x0",
    "currentBlock": "0x5d228",
    "highestBlock": "0x3cedec"
  }
}
```
