Logo
New RPC users get 35% off their first monthView the offer
OnFinality Learn
Infrastructure & Operations10 min read

Mint Node: Running and Verifying a Mint Blockchain Rollup RPC Node

A practical, reproducible guide to running a Mint rollup node, from L1 RPC prerequisites and Docker Compose startup to verification, snapshot sync, and troubleshooting.

TL;DR

A Mint node is an OP Stack-style rollup node that pairs an execution client (op-geth) with a rollup consensus client (op-node) and derives its data from Ethereum L1. Running one requires a reliable L1 RPC plus beacon endpoint, adequate disk for archive state, and a verification step that confirms the node is following the chain. This guide explains the mental model, walks through a reproducible Docker Compose startup, shows how to verify health with JSON-RPC calls, and covers snapshot sync, troubleshooting, and tradeoffs. It separates documented repository behavior from operational recommendations and from measurements you should run on your own host.

What a Mint node actually is

In the Mint Blockchain ecosystem, a "mint node" refers to a rollup node that lets you run your own RPC endpoint for the Mint network. The public Mint-Blockchain/mint-node repository describes it as everything required to run your own RPC node, and its structure follows the OP Stack pattern: an execution client called op-geth and a rollup consensus client called op-node, orchestrated with Docker Compose.

This is different from installing Node.js on Linux Mint, which is a common source of confusion in search results. If your goal is a JavaScript runtime, you want a version manager such as NVM or a NodeSource repository. If your goal is a blockchain RPC node for Mint, continue here. The two topics share a word, not a workflow.

The important mental model is that a rollup node is not self-contained. It reads L1 data from Ethereum to derive the rollup chain, so its health depends on the quality and availability of the L1 RPC and beacon endpoints you configure.

  • Execution layer: op-geth, which serves JSON-RPC on port 8545 by default.
  • Consensus/rollup layer: op-node, which follows L1 and drives the execution client.
  • External dependency: an Ethereum L1 RPC and a beacon RPC, set through environment variables.
  • Storage mode: archive by default in the documented setup, which has significant disk implications.

Prerequisites and assumptions before you start

The Mint node repository documents a recommended minimal configuration of 2 CPU cores, 8 GB RAM, and an 800 GB SSD for an archive node. Treat that as a floor, not a target. Archive nodes grow, and snapshot sizes published by the project give you a sense of the data volume involved. Plan headroom for chain growth, Docker images, and logs.

You also need Docker and Docker Compose installed, outbound network access to your L1 RPC and beacon providers, and a decision about whether you will sync from genesis or from a snapshot. For production use, consider a dedicated host rather than a shared development machine; see the guidance on blockchain node hosting for sizing and operational considerations.

The commands below use placeholders such as RPC_URL and BEACON_URL. Replace them with endpoints you control or trust. Do not paste private keys into environment files for a read-only RPC node; this node does not need them.

  • Operating system: a modern Linux distribution with Docker Engine and the Compose plugin.
  • Disk: SSD-backed storage; archive mode needs substantially more than a pruned node.
  • Network: stable outbound access, ideally with low latency to your L1 provider.
  • Endpoints: an Ethereum L1 execution RPC and a beacon chain RPC.
  • Access control: firewall port 8545 so only trusted clients can reach the RPC.

How the op-geth and op-node pair derives the chain

op-node is the rollup driver. It watches Ethereum L1 for batch data and output roots, then instructs op-geth to import and execute the corresponding rollup blocks. op-geth stores state and exposes the familiar Ethereum JSON-RPC interface, which is what applications and indexers call.

Because derivation depends on L1, a lagging or unreliable L1 endpoint shows up as a stalled Mint node even when both containers are running. This is why the first troubleshooting question is rarely "is the container up?" but "is the L1 endpoint healthy and is op-node making progress?"

The repository's .env file wires the two layers together through OP_NODE_L1_ETH_RPC and OP_NODE_L1_BEACON. The beacon endpoint is required because the rollup derivation path needs beacon-chain data, not just execution-layer JSON-RPC.

Configuring environment variables for L1 access

Create a .env file in the repository root. The documented variables are the L1 execution RPC and the beacon RPC. Keep this file out of version control and restrict its permissions, because provider URLs often embed API keys.

If you are evaluating which L1 provider to use, the choice matters more than the formatting of the URL. Look for consistent latency, archive support if required, and rate limits that match your node's polling behavior. The RPC endpoints guide explains how to compare providers methodically rather than by marketing claims.

# .env — replace placeholders with your own endpoints
OP_NODE_L1_ETH_RPC=RPC_URL
OP_NODE_L1_BEACON=BEACON_URL

# Optional: adjust the data directory or storage mode in your compose override
# OP_GETH_DATADIR=/data/op-geth

Starting the node with Docker Compose

The repository documents a two-step startup: bring up op-geth first, then op-node. Starting the execution client first gives the rollup driver a reachable backend when it initializes. Run these commands from the repository root after your .env is in place.

The -d flag runs the containers in the background. If you prefer to watch logs during the first sync, omit -d for op-node in a separate terminal so you can see derivation progress in real time.

# Start the execution client
docker compose -f docker-compose.yml up -d op-geth

# Start the rollup consensus client
docker compose -f docker-compose.yml up -d op-node

# Confirm both containers are running
docker compose ps

Verifying that the node is following the chain

The repository's documented check calls eth_blockNumber against localhost:8545. A successful response returns a hexadecimal block height. That confirms the RPC is reachable, but it does not by itself prove the node is advancing. Call it twice with a delay and compare the values.

Record your observations in a simple table rather than relying on memory. The table below is a template; fill it with values from your own host. Do not treat any number here as a benchmark.

CheckCommand or sourceExpected observationYour value
RPC reachableeth_blockNumber curlJSON result with hex block number
Chain advancingRepeat eth_blockNumber after 60sHeight increases or matches network tip
Container healthdocker compose psBoth services running
Sync modeCompose config or flagsArchive or snap as intended
Disk usagedf -h on data volumeStable growth, headroom remaining

For a second, independent view, query a public Mint RPC endpoint through a provider and compare heights. If your node is far behind, it is syncing; if it is stuck at the same height while the network advances, move to troubleshooting.

curl -s -d '{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber","params":[]}' \
  -H 'Content-Type: application/json' \
  http://localhost:8545

# Example response shape (value will differ):
# {"jsonrpc":"2.0","id":0,"result":"0x1a2b3c"}

A JavaScript health probe you can schedule

A one-off curl is useful during setup, but ongoing operation benefits from a small probe that records height over time. The script below uses only the built-in fetch available in modern Node.js. It prints the current height and the delta since the previous sample, which makes stalls visible.

Run it with node probe.mjs and point MINT_RPC at your node. This is a measurement tool, not a benchmark; the numbers it produces describe your node's behavior on your host.

// probe.mjs
const url = process.env.MINT_RPC || 'http://localhost:8545';
let previous = null;

async function height() {
  const res = await fetch(url, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'eth_blockNumber', params: [] })
  });
  const json = await res.json();
  return Number.parseInt(json.result, 16);
}

setInterval(async () => {
  try {
    const h = await height();
    const delta = previous === null ? 'n/a' : h - previous;
    console.log(new Date().toISOString(), 'height', h, 'delta', delta);
    previous = h;
  } catch (err) {
    console.error('probe failed', err.message);
  }
}, 30000);

Snapshot sync versus syncing from genesis

The repository documents a default archive node type and publishes snapshot links, including an archive snapshot whose size is listed in the README. Snapshot sync is usually the faster path to a usable RPC endpoint because it skips replaying the entire chain from genesis. The tradeoff is trust: you are accepting a state image produced by someone else, so verify the source and checksum where available.

Syncing from genesis is slower but gives you a state you derived yourself from L1. For teams that need to audit derivation or run modified clients, that may be worth the time. For teams that need an RPC endpoint quickly, snapshot sync is the pragmatic choice.

The repository notes that the default node type is archive and that it can be changed via --gcmode. If you switch to a pruned mode, confirm that your applications do not depend on historical state queries. Many indexers and analytics jobs do.

  • Snapshot sync: faster startup, depends on the snapshot publisher, verify integrity.
  • Genesis sync: slower, self-derived state, useful for auditing and custom clients.
  • Archive mode: supports historical queries, larger disk footprint.
  • Pruned mode: smaller disk, may break historical eth_getBalance-style queries at old blocks.

Troubleshooting common Mint node failures

Most failures fall into three buckets: the L1 dependency is unhealthy, the containers cannot talk to each other, or storage is exhausted. Work through them in that order, because a healthy local stack can still appear broken when L1 is degraded.

If op-node logs show repeated L1 request errors, check the OP_NODE_L1_ETH_RPC and OP_NODE_L1_BEACON values and test them independently with curl. If op-geth is running but eth_blockNumber does not advance, confirm that op-node is connected to the expected op-geth endpoint and that the two containers share a network.

If the node stops advancing after a period of healthy operation, check disk space first. Archive nodes grow, and a full disk produces confusing downstream errors. The repository invites issues on GitHub for problems that are not resolved by configuration checks.

  • L1 RPC returns errors or times out: test the endpoint outside Docker.
  • Beacon endpoint misconfigured: derivation stalls even with a healthy execution RPC.
  • Containers on different networks: op-node cannot reach op-geth.
  • Disk full: writes fail, sync stalls, logs may be truncated.
  • Version drift: pull updated images and review repository upgrade notes.

Limitations, tradeoffs, and when to use a managed endpoint

Self-hosting a Mint node gives you control over data locality, query patterns, and uptime policy. It also makes you responsible for L1 provider costs, disk capacity planning, upgrades, and monitoring. For a single application with modest read traffic, a managed RPC endpoint is often cheaper in engineering time than a dedicated node.

A hybrid approach works well: run your own node for latency-sensitive or high-volume reads, and keep a managed provider as a fallback. The dedicated node option and the RPC pricing page help you compare the operational cost of self-hosting against a service. If you only need an endpoint and not the operational experience, the RPC Assistant can recommend a concrete provider; start with the API service overview.

Be explicit about what you are measuring. A node that answers eth_blockNumber in milliseconds on an idle host may behave differently under concurrent eth_getLogs queries. Build a small load test against your own workload before you commit to capacity numbers.

Next steps for a production-ready Mint node

Once the node is syncing and verified, harden it. Put the RPC behind a reverse proxy with authentication or IP allowlisting, add log rotation, and schedule the health probe from the previous section so stalls are detected before users notice. Document the exact image tags you run so upgrades are reproducible.

Then decide how the node fits your broader infrastructure. If you operate multiple chains, a consistent monitoring and upgrade process matters more than any single node. The multi-chain RPC endpoints guide covers patterns for managing several endpoints, and the networks directory helps you confirm which networks you actually need to serve.

Finally, keep the repository's upgrade notes in your release process. Rollup clients evolve, and a node that was correct at setup can drift out of compatibility. Treat upgrades as planned maintenance with a rollback path, not as ad hoc fixes.

  • Add authentication and rate limiting in front of port 8545.
  • Schedule the health probe and alert on stalled height.
  • Record image tags and environment variables for each deployment.
  • Review upgrade notes before pulling new images.
  • Compare self-hosted latency against a managed endpoint for your real queries.

Never Worry about Infrastructure Again

OnFinality takes away the heavy lifting of DevOps so you can build smarter and faster.

Get Started