Skip to content

Add Support for Nethermind on OP Docs #1551

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 44 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 35 commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
acc4f97
feat: update releases
stdevMac Mar 31, 2025
1d98577
feat: add config
stdevMac Mar 31, 2025
fa0489f
feat: add nethermind to json-rpc config
stdevMac Mar 31, 2025
b9c4f66
feat: add nethermind to no-from-docker tutorials
stdevMac Mar 31, 2025
6e583cb
Merge remote-tracking branch 'origin/main'
stdevMac Mar 31, 2025
cd5f5b4
fix: update link to json-rpc doc
stdevMac Apr 1, 2025
d990c61
Update pages/operators/node-operators/configuration/execution-config.mdx
AnkushinDaniil Apr 28, 2025
d4d562e
Update pages/operators/node-operators/configuration/execution-config.mdx
AnkushinDaniil Apr 28, 2025
e8a4a91
Update pages/operators/node-operators/configuration/execution-config.mdx
AnkushinDaniil Apr 28, 2025
7f9c440
Update pages/operators/node-operators/releases.mdx
AnkushinDaniil Apr 28, 2025
7ec7b6f
fix linter
AnkushinDaniil Apr 28, 2025
5c5c00f
fix linter
AnkushinDaniil Apr 28, 2025
cb7a3ae
fix: update words.txt
AnkushinDaniil Apr 28, 2025
b0e8acc
feat(docs): add Nethermind support for OP Stack nodes
AnkushinDaniil Apr 29, 2025
f08583b
fix: update img
AnkushinDaniil Apr 29, 2025
28dae1e
fix(docs): update Nethermind references and monitoring links
AnkushinDaniil Apr 29, 2025
271d070
fix: remove (op-geth)
AnkushinDaniil Apr 29, 2025
0a43915
fix: update img
AnkushinDaniil Apr 29, 2025
8f6b938
feat: update base config
AnkushinDaniil Apr 29, 2025
ff05338
feat: update base config
AnkushinDaniil Apr 29, 2025
96ba541
fix: fix linting issues
AnkushinDaniil Apr 29, 2025
9b44343
Merge branch 'main' into main
AnkushinDaniil Apr 30, 2025
c4ffefb
fix(build): resolve type issues and update configs
AnkushinDaniil Apr 30, 2025
102fd4c
Auto-fix: Update breadcrumbs, spelling dictionary and other automated…
AnkushinDaniil Apr 30, 2025
eac66f2
feat(docs): add Nethermind as execution client option
AnkushinDaniil Apr 30, 2025
3d2f68c
feat(docs): add Nethermind config for snap sync
AnkushinDaniil Apr 30, 2025
03f2e85
feat(docs): add Nethermind troubleshooting guidance
AnkushinDaniil Apr 30, 2025
98df61c
docs(rollup): make execution client references generic
AnkushinDaniil Apr 30, 2025
83fccf7
fix linter
AnkushinDaniil Apr 30, 2025
336798e
update nethermind configuration docs
AnkushinDaniil Apr 30, 2025
1b2024c
docs(config): add nethermind to execution client refs
AnkushinDaniil Apr 30, 2025
b17c783
Auto-fix: Update breadcrumbs, spelling dictionary and other automated…
AnkushinDaniil Apr 30, 2025
404ff24
fix linter
AnkushinDaniil Apr 30, 2025
75d4b8f
feat(docs): add Nethermind execution client support
AnkushinDaniil May 1, 2025
14c042b
docs(snap-sync): add Nethermind to supported clients
AnkushinDaniil May 1, 2025
f073bac
Auto-fix: Update breadcrumbs, spelling dictionary and other automated…
AnkushinDaniil May 1, 2025
fdf9a60
feat(docs): add Nethermind sync verification
AnkushinDaniil May 1, 2025
b874f67
Auto-fix: Update breadcrumbs, spelling dictionary and other automated…
AnkushinDaniil May 1, 2025
f791cd2
style(docs): wrap client names in backticks
AnkushinDaniil May 2, 2025
685ef66
Update pages/operators/node-operators/management/snap-sync.mdx
AnkushinDaniil May 6, 2025
e1967cc
Update pages/operators/node-operators/management/troubleshooting.mdx
AnkushinDaniil May 6, 2025
7c5b86a
Auto-fix: Update breadcrumbs, spelling dictionary and other automated…
AnkushinDaniil May 2, 2025
10e5181
docs(node-operators): improve documentation clarity & grammar
AnkushinDaniil May 6, 2025
a038a88
update .gitignore
AnkushinDaniil May 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ node_modules
public/robots.txt
public/sitemap-0.xml
public/sitemap.xml
chainspec
package-lock.json

# log files
*.log
Expand All @@ -20,3 +22,6 @@ public/sitemap.xml
.algolia
# Local Netlify folder
.netlify

chainspec
keystore
41 changes: 26 additions & 15 deletions components/calculator/ChainParametersForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,30 @@ type DataAvailabilityType = "Ethereum" | "AltDA Plasma Mode";
export function ChainParametersForm(): ReactElement {
const [transactionsPerDay, setTransactionsPerDay] = useState(500000);
const [comparableTransactionType, setComparableTransactionType] =
useState<ComparableTransactionType>("General OP Mainnet");
useState<ComparableTransactionType>("General OP Mainnet" as ComparableTransactionType);
const [dataAvailabilityType, setDataAvailabilityType] = useState<DataAvailabilityType>("Ethereum");
const [isFaultProofEnabled, setIsFaultProofEnabled] = useState("yes");
const [isFaultProofEnabled, setIsFaultProofEnabled] = useState(true);
const [targetDataFeeMargin, setTargetDataFeeMargin] = useState(5);
const [maxBlobsPerL1Transaction, setMaxBlobsPerL1Transaction] = useState(5);
const [maxChannelDuration, setMaxChannelDuration] = useState(5);
const [outputRootPostFrequency, setOutputRootPostFrequency] = useState(1 );
const [isIncludeOutputRootCosts, setIsIncludeOutputRootCosts] = useState("yes");
const [resultsParams, setResultsParams] = useState<ResultsParams>({});
const [outputRootPostFrequency, setOutputRootPostFrequency] = useState(1);
const [isIncludeOutputRootCosts, setIsIncludeOutputRootCosts] = useState(true);
const [resultsParams, setResultsParams] = useState<ResultsParams>({
data: {
dataAvailabilityType: "Ethereum",
l1BlobBaseFeeScalar: 0,
l1BaseFeeScalar: 0,
overallL1DataAndStateCostsMargin: 0,
totalL1StateProposalCostsInETH: 0,
modeledDAPlusStateRevenueOnL2: 0,
dataAvailabilityInUse: "",
impliedDataGasFeePerTxUsingBlobs: 0,
impliedDataGasFeePerTxUsingL1Calldata: 0,
impliedDataGasFeePerTxUsingAltDAPlasmaMode: 0,
assumedFeeScalarMessage: "",
impliedDataGasFeeMessage: "",
}
});
const [isLoading, setIsLoading] = useState(false);
const [showResult, setShowResult] = useState(false);

Expand All @@ -52,8 +67,8 @@ export function ChainParametersForm(): ReactElement {

//e37
const l1BlobBaseFeeScalar = await displayL1BlobBaseFeeScalar(
stringToBoolean(isIncludeOutputRootCosts),
stringToBoolean(isFaultProofEnabled),
isIncludeOutputRootCosts,
isFaultProofEnabled,
outputRootPostFrequency,
transactionsPerDay,
maxChannelDuration,
Expand Down Expand Up @@ -115,7 +130,7 @@ export function ChainParametersForm(): ReactElement {
dataAvailabilityType,
targetDataFeeMargin
);

// e67
const impliedDataGasFeePerTxUsingL1Calldata =
await calculateImpliedDataGasFeePerTxUsingL1Calldata(
Expand Down Expand Up @@ -143,7 +158,7 @@ export function ChainParametersForm(): ReactElement {
);

const dataAvailabilityInUse = determineDAInUse(dataAvailabilityType);

const assumedFeeScalarMessage = resultsFeeScalarsAssumed(
comparableTransactionType, // e15
transactionsPerDay, // e14
Expand All @@ -168,15 +183,11 @@ export function ChainParametersForm(): ReactElement {
assumedFeeScalarMessage,
impliedDataGasFeeMessage,
};
setResultsParams(data);
setResultsParams({ data });
setIsLoading(false);
setShowResult(true)
};

const stringToBoolean = (value: string): boolean => {
return value === "yes" || value === "Yes" ? true : false;
}

return (
<div>
<form className="calculator-form" onSubmit={handleSubmit}>
Expand Down Expand Up @@ -273,7 +284,7 @@ export function ChainParametersForm(): ReactElement {
</button>
</form>
{isLoading && <Loader />}
{!isLoading && showResult && <ResultsTable data={resultsParams} />}
{!isLoading && showResult && <ResultsTable data={resultsParams.data} />}
</div>
);
}
1 change: 1 addition & 0 deletions jwt.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
b3e59c3388416d034d24441e260d85bc16f9a61d31646fb23e5a9523beb61068
2 changes: 1 addition & 1 deletion next-sitemap.config.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/** @type {import('next-sitemap').IConfig} */
module.exports = {
export default {
siteUrl: process.env.SITE_URL || 'https://docs.optimism.io/',
generateRobotsTxt: true, // (optional)
generateIndexSitemap: true,
Expand Down
16 changes: 13 additions & 3 deletions pages/operators/node-operators/architecture.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ is_imported_content: 'false'

# Node architecture

This page reviews node architecture for all nodes running on the Superchain network. All OP Mainnet nodes are composed of two core software services, the Rollup Node and the Execution Client.
This page reviews node architecture for all nodes running on the Superchain network. All OP Mainnet nodes are composed of two core software services, the Rollup Node and the Execution Client.
OP Mainnet also optionally supports a third component, Legacy Geth, that can serve stateful queries for blocks and transactions created before the [Bedrock Upgrade](https://web.archive.org/web/20230608050602/https://blog.oplabs.co/introducing-optimism-bedrock/).

## Node flow diagram
The following diagram shows how the Rollup Node, Execution Client, and Legacy Geth components work together to form a complete node running on the Superchain network.
This diagram uses the `op-node` and `op-geth` implementations of the Rollup Node and Execution Client respectively, but the same architecture generally applies to other implementations as well.
This diagram uses the `op-node` implementation of the Rollup Node and shows the general architecture that applies to all execution client implementations.

![OP Mainnet node architecture diagram.](/img/guides/node-operators/node-arch.svg)

Expand All @@ -39,6 +39,16 @@ The Execution Client is responsible for executing the block payloads it receives
The Execution Client exposes the standard JSON-RPC API that Ethereum developers are familiar with, and can be used to query blockchain data and submit transactions to the network.
The Execution Client is largely analogous to an [execution client](https://ethereum.org/en/developers/docs/nodes-and-clients/#what-are-nodes-and-clients) in Ethereum.

The OP Stack supports multiple execution client implementations:

### op-geth

`op-geth` is the original execution client for the OP Stack, based on the Go Ethereum (Geth) implementation. It has been modified to support the specific requirements of OP Stack chains.

### Nethermind

Nethermind is a high-performance execution client implementation written in C#. The Nethermind client has been adapted to support OP Stack chains, providing an alternative execution client option for node operators.

## Legacy Geth

OP Mainnet underwent a large database migration as part of the [Bedrock Upgrade](https://web.archive.org/web/20230608050602/https://blog.oplabs.co/introducing-optimism-bedrock/) in 2023.
Expand All @@ -51,6 +61,6 @@ Legacy Geth is **not** required and is typically only necessary if you want to m

## Next steps

* To get your node up and running, start with the [run a node from docker](/operators/node-operators/tutorials/node-from-docker) or [build a node from source](/operators/node-operators/tutorials/node-from-source) tutorial.
* To get your node up and running, start with the [run a node from docker](/operators/node-operators/tutorials/node-from-docker) or [build a node from source](/operators/node-operators/tutorials/node-from-source) tutorial. These guides include instructions for both op-geth and Nethermind execution clients.
* If you've already got your node up and running, check out the [Node Metrics and Monitoring Guide](./management/metrics) to learn how to keep tabs on your node and make sure it keeps running smoothly.
* If you run into any problems, please visit the [Node Troubleshooting Guide](./management/troubleshooting) for help.
2 changes: 1 addition & 1 deletion pages/operators/node-operators/configuration.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@ This section provides information on node base configuration, consensus layer co

<Card title="Consensus layer configuration options (op Node)" href="/operators/node-operators/configuration/consensus-config" />

<Card title="Execution layer configuration options (op Geth)" href="/operators/node-operators/configuration/execution-config" />
<Card title="Execution layer configuration options" href="/operators/node-operators/configuration/execution-config" />
</Cards>
51 changes: 44 additions & 7 deletions pages/operators/node-operators/configuration/base-config.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,26 @@ categories:
is_imported_content: 'false'
---

import { Callout } from 'nextra/components'
import { Callout, Tabs } from 'nextra/components'

# Node base configuration

<Callout type="warning">
Always run `op-node` and `op-geth` in a one-to-one configuration. Don't run multiple `op-geth` instances behind one `op-node`, or vice versa.
Always run `op-node` and your execution client (`op-geth` or `nethermind`) in a one-to-one configuration. Don't run multiple execution client instances behind one `op-node`, or vice versa.
</Callout>

To configure your node, you will need to do the following:

1. Configure `op-node` to point to the correct L1, `op-geth`, and L2 network.
2. Initialize `op-geth` with the correct network parameters.
3. Configure `op-geth` to properly communicate with the Rollup Node.
1. Configure `op-node` to point to the correct L1, execution client, and L2 network.
2. Initialize your execution client (`op-geth` or `nethermind`) with the correct network parameters.
3. Configure your execution client to properly communicate with the Rollup Node.
4. Optionally, configure Legacy Geth.

## Configuring `op-geth`
## Configuring Your Execution Client

You can choose between two execution clients for your OP Stack rollup node: `op-geth` or `nethermind`. Each has its own configuration requirements and recommended settings.

### Configuring `op-geth`

<Callout type="info">
Although the Docker image for the Execution Engine is called `op-geth`, the actual binary is still called `geth` in order to minimize differences between `op-geth` and `go-ethereum`. You can see the difference [here](https://op-geth.optimism.io/?utm_source=op-docs&utm_medium=docs).
Expand Down Expand Up @@ -146,6 +150,22 @@ geth \

Consult [Geth's documentation](https://geth.ethereum.org/docs/) for more information on customizing `op-geth`'s behavior.

### Configuring `nethermind`

Nethermind is an alternative execution client for OP Stack rollup nodes. It provides high performance and reliability while maintaining compatibility with the OP Stack protocol.

#### Working base configuration for Nethermind

To run Nethermind on the OP Mainnet, use the following command:

```bash
nethermind \
-c op-mainnet \
--data-dir path/to/data/dir \
--jsonrpc-jwtsecretfile path/to/jwt.hex
```
Consult [Nethermind's documentation](https://docs.nethermind.io/fundamentals/configuration) for more detailed configuration options.

## Configuring `op-node`

`op-node` is a standalone, statically linked binary. It stores no state, and requires no initialization. It consumes configuration parameters either via the command line or environment variables. For some networks, the Rollup Node also requires a configuration file (called `rollup.json` or the "rollup config") that configures network-specific genesis parameters. For official networks like OP Sepolia and OP Mainnet, the genesis config is hardcoded in the `op-node` software and can be specified via a `--network` flag.
Expand All @@ -163,6 +183,8 @@ from a Beacon node.

A minimal valid configuration that runs `op-node` looks like:

<Tabs items={['op-geth', 'Nethermind']}>
<Tabs.Tab>
```bash
op-node --l1=<ethereum mainnet RPC url> \
--l2=<op-geth authenticated RPC url> \
Expand All @@ -174,6 +196,21 @@ op-node --l1=<ethereum mainnet RPC url> \
--syncmode=execution-layer \
--l2.enginekind=geth
```
</Tabs.Tab>
<Tabs.Tab>
```bash
op-node --l1=<ethereum mainnet RPC url> \
--l2=<nethermind authenticated RPC url> \
--network=op-mainnet \
--rpc.addr=127.0.0.1 \
--rpc.port=9545 \
--l2.jwt-secret=<path to JWT secret> \
--l1.beacon=<http endpoint address of L1 Beacon-node> \
--syncmode=execution-layer \
--l2.enginekind=nethermind
```
</Tabs.Tab>
</Tabs>

You can manually specify a path to a rollup config with the `--rollup.config` flag. This is used for testnets or internal deployments that are not migrated from a legacy network.

Expand Down Expand Up @@ -230,5 +267,5 @@ If you do not need these RPC methods for historical data, then you do not need t

## Next steps
* See the [op-node configuration](/operators/node-operators/configuration/consensus-config) guide for additional configuration options for `op-node` and the Consensus-Layer.
* Similarly, visit the [op-geth configuration](/operators/node-operators/configuration/execution-config) guide for additional configuration options for `op-geth` and Execution-Layer.
* For execution client configuration, visit [execution client configuration](/operators/node-operators/configuration/execution-config) for additional options when using `op-geth` or `nethermind`
* If you run into any problems, please reach out to our [developer support forum](https://github.com/ethereum-optimism/developers/discussions) for help.
Loading