From 8db89cd472836a64b5f233ff727c570dccd8363a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Jul 2025 16:45:28 +0100 Subject: [PATCH 01/92] Update L2 rollup tutorial for OP Stack deployment, enhancing clarity and structure. Revise descriptions, add prerequisites, and streamline steps for deploying components like op-geth, op-node, and op-batcher. Include detailed instructions for configuration and testing, ensuring a comprehensive guide for users. --- .../tutorials/create-l2-rollup.mdx | 760 ++++++------------ 1 file changed, 227 insertions(+), 533 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index 0f7d88d13..e3487bd63 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -1,571 +1,263 @@ --- title: Creating your own L2 rollup testnet -description: This tutorial walks you through spinning up an OP Stack testnet chain. +description: A complete guide to deploying an OP Stack testnet using op-deployer and running all required components. lang: en-US content_type: tutorial topic: creating-your-own-l2-rollup-testnet personas: - chain-operator categories: - - mainnet - testnet - chain-deployment - - chain-configuration - - chain-operation - - node-management - op-deployer + - sequencer + - batcher + - proposer + - challenger is_imported_content: 'false' --- -import { Callout, Steps } from 'nextra/components' -import { WipCallout } from '@/components/WipCallout' +import { Callout, Card, Steps } from 'nextra/components' - # Creating your own L2 rollup testnet +This tutorial walks you through deploying a complete OP Stack testnet chain using the modern **op-deployer** approach. You'll deploy L1 smart contracts, generate chain artifacts, and run all required off-chain components. + -Please **be prepared to set aside approximately one hour** to get everything running properly and **make sure to read through the guide carefully**. -You don't want to miss any important steps that might cause issues down the line. + **Time Required:** Approximately 1-2 hours\ + **Skill Level:** Intermediate to Advanced\ + **Prerequisites:** Familiarity with command line, Ethereum concepts, and node management -This tutorial is **designed for developers** who want to learn about the OP Stack by spinning up an OP Stack testnet chain. -You'll walk through the full deployment process and teach you all of the components that make up the OP Stack, and **you'll end up with your very own OP Stack testnet**. +## What you'll deploy -It's useful to understand what each of these components does before -you start deploying your chain. To learn about the different components please -read the [deployment overview page](/operators/chain-operators/deploy/overview). +This tutorial will guide you through setting up: -You can use this testnet to experiment and perform tests, or you can choose to modify the chain to adapt it to your own needs. -**The OP Stack is free and open source software licensed entirely under the MIT license**. -You don't need permission from anyone to modify or deploy the stack in any configuration you want. +1. **L1 Smart Contracts** - The core contracts on Sepolia testnet +2. **Execution Client** (op-geth) - Processes transactions and maintains state +3. **Consensus Client** (op-node) - Manages rollup consensus and L1 synchronization +4. **Batcher** (op-batcher) - Publishes transaction data to L1 +5. **Proposer** (op-proposer) - Submits state root proposals to L1 +6. **Challenger** (op-challenger) - Monitors and disputes invalid state roots -Modifications to the OP Stack may prevent a chain from being able to benefit from aspects of the [Optimism Superchain](/superchain/superchain-explainer). -Make sure to check out the [Superchain Explainer](/superchain/superchain-explainer) to learn more. - - -## Software dependencies - -| Dependency | Version | Version Check Command | -| ------------------------------------------------------------- | -------- | --------------------- | -| [git](https://git-scm.com/) | `^2` | `git --version` | -| [go](https://go.dev/) | `^1.21` | `go version` | -| [node](https://nodejs.org/en/) | `^20` | `node --version` | -| [pnpm](https://pnpm.io/installation) | `^8` | `pnpm --version` | -| [foundry](https://github.com/foundry-rs/foundry#installation) | `^0.2.0` | `forge --version` | -| [make](https://linux.die.net/man/1/make) | `^3` | `make --version` | -| [jq](https://github.com/jqlang/jq) | `^1.6` | `jq --version` | -| [direnv](https://direnv.net) | `^2` | `direnv --version` | - -### Notes on specific dependencies - -#### `node` - -We recommend using the latest LTS version of Node.js (currently v20). -[`nvm`](https://github.com/nvm-sh/nvm) is a useful tool that can help you manage multiple versions of Node.js on your machine. -You may experience unexpected errors on older versions of Node.js. - -#### `foundry` - -It's recommended to use the scripts in the monorepo's `package.json` for managing `foundry` to ensure you're always working with the correct version. This approach simplifies the installation, update, and version checking process. Make sure to clone the monorepo locally before proceeding. -#### `direnv` - -Parts of this tutorial use [`direnv`](https://direnv.net) as a way of loading environment variables from `.envrc` files into your shell. -This means you won't have to manually export environment variables every time you want to use them. -`direnv` only ever has access to files that you explicitly allow it to see. - -After [installing `direnv`](https://direnv.net/docs/installation.html), you will need to **make sure that [`direnv` is hooked into your shell](https://direnv.net/docs/hook.html)**. -Make sure you've followed [the guide on the `direnv` website](https://direnv.net/docs/hook.html), then **close your terminal and reopen it** so that the changes take effect (or `source` your config file if you know how to do that). - - -Make sure that you have correctly hooked `direnv` into your shell by modifying your shell configuration file (like `~/.bashrc` or `~/.zshrc`). -If you haven't edited a config file then you probably haven't configured `direnv` properly (and things might not work later). - - -## Get access to a sepolia node - -You'll be deploying a OP Stack Rollup chain that uses a Layer 1 blockchain to host and order transaction data. -The OP Stack Rollups were designed to use EVM Equivalent blockchains like Ethereum, OP Mainnet, or standard Ethereum testnets as their L1 chains. - -**This guide uses the Sepolia testnet as an L1 chain**. -We recommend that you also use Sepolia. -You can also use other EVM-compatible blockchains, but you may run into unexpected errors. -If you want to use an alternative network, make sure to carefully review each command and replace any Sepolia-specific values with the values for your network. - -Since you're deploying your OP Stack chain to Sepolia, you'll need to have access to a Sepolia node. -You can either use a node provider like [Alchemy](https://www.alchemy.com/) (easier) or run your own Sepolia node (harder). - -## Build the source code - -You're going to be spinning up your OP Stack chain directly from source code instead of using a container system like [Docker](https://www.docker.com/). -Although this adds a few extra steps, it means you'll have an easier time modifying the behavior of the stack if you'd like to do so. -If you want a summary of the various components you'll be using, take another look at the [What You're Going to Deploy](#what-youre-going-to-deploy) section above. - - -You're using the home directory `~/` as the work directory for this tutorial for simplicity. -You can use any directory you'd like but using the home directory will allow you to copy/paste the commands in this guide. -If you choose to use a different directory, make sure you're using the correct directory in the commands throughout this tutorial. +This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. -### Build the Optimism monorepo - - - -{

Clone the Optimism Monorepo

} +## Prerequisites -```bash -cd ~ -git clone https://github.com/ethereum-optimism/optimism.git -``` - -{

Enter the Optimism Monorepo

} - -```bash -cd optimism -``` +### Required Software -{

Check out the correct branch

} +| Tool | Version | Installation Guide | +| ------------------------------------------ | ------- | --------------------------------------------------------------- | +| [Git](https://git-scm.com/) | ^2.0 | System package manager | +| [Go](https://golang.org/) | ^1.21 | [Go Installation](https://golang.org/doc/install) | +| [Make](https://www.gnu.org/software/make/) | ^3.0 | System package manager | +| [jq](https://stedolan.github.io/jq/) | ^1.6 | System package manager | +| [Just](https://just.systems/) | Latest | [Just Installation](https://just.systems/man/en/chapter_4.html) | - -You will be using the `tutorials/chain` branch of the Optimism Monorepo to deploy an OP Stack testnet chain during this tutorial. -This is a non-production branch that lags behind the `develop` branch. -You should **NEVER** use the `develop` or `tutorials/chain` branches in production. - +### Sepolia testnet access -```bash -git checkout tutorials/chain -``` +You'll need: -{

Check your dependencies

} +* **Sepolia RPC URL** - Get from [Alchemy](https://www.alchemy.com/), [Infura](https://infura.io/), or [QuickNode](https://www.quicknode.com/) +* **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) +* **Private Keys** - For deployer, admin, batcher, proposer, and sequencer roles - -Don't skip this step! Make sure you have all of the required dependencies installed before continuing. + +We recommend using Sepolia testnet as it's well-supported and has reliable faucets. You can adapt this guide for other EVM-compatible testnets. -Run the following script and double check that you have all of the required versions installed. -If you don't have the correct versions installed, you may run into unexpected errors. - -```bash -./packages/contracts-bedrock/scripts/getting-started/versions.sh -``` - -{

Install dependencies

} - -```bash -pnpm install -``` - -{

Build the various packages inside of the Optimism Monorepo

} - -```bash -make op-node op-batcher op-proposer -pnpm build -``` - -
+## Step 1: Install op-deployer -### Build `op-geth` +The op-deployer tool simplifies OP Stack deployments and is required for standard chains. -{

Clone op-geth

} +### Download op-deployer ```bash cd ~ -git clone https://github.com/ethereum-optimism/op-geth.git +# Download the appropriate version for your OS from the releases page +# Linux example shown below - adjust for macOS or Windows as needed +wget https://github.com/ethereum-optimism/optimism/releases/latest/download/op-deployer-linux-amd64.tar.gz +tar -xzf op-deployer-linux-amd64.tar.gz +mv op-deployer-* op-deployer +cd op-deployer ``` -{

Enter op-geth

} +### Verify installation ```bash -cd op-geth -``` - -{

Build op-geth

} - -```bash -make geth +./op-deployer --version ```
-## Fill out environment variables +For detailed installation instructions, see the [op-deployer installation guide](/operators/chain-operators/tools/op-deployer#installation). -You'll need to fill out a few environment variables before you can start deploying your chain. +## Step 2: Initialize deployment configuration -{

Enter the Optimism Monorepo

} +### Set network parameters ```bash -cd ~/optimism +# Sepolia L1 chain ID +export L1_CHAIN_ID=11155111 +# Your custom L2 chain ID (choose any unique number) +export L2_CHAIN_ID=42069 ``` -{

Duplicate the sample environment variable file

} +### Initialize deployment workspace ```bash -cp .envrc.example .envrc +./op-deployer init --l1-chain-id $L1_CHAIN_ID --l2-chain-ids $L2_CHAIN_ID --workdir .deployer ``` -{

Fill out the environment variable file

} - -Open up the environment variable file and fill out the following variables: - -| Variable Name | Description | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `L1_RPC_URL` | URL for your L1 node (a Sepolia node in this case). | -| `L1_RPC_KIND` | Kind of L1 RPC you're connecting to, used to inform optimal transactions receipts fetching. Valid options: `alchemy`, `quicknode`, `infura`, `parity`, `nethermind`, `debug_geth`, `erigon`, `basic`, `any`. | - -
- -## Generate addresses +This creates a `.deployer` directory with initial configuration files. -You'll need four addresses and their private keys when setting up the chain: +### Configure deployment intent -* The `Admin` address has the ability to upgrade contracts. -* The `Batcher` address publishes Sequencer transaction data to L1. -* The `Proposer` address publishes L2 transaction results (state roots) to L1. -* The `Sequencer` address signs blocks on the p2p network. - - - -{

Enter the Optimism Monorepo

} +Edit the generated intent file to specify your deployment parameters: ```bash -cd ~/optimism +# Edit the intent file with your preferred text editor +# For example: nano, vim, code, or any text editor +nano .deployer/intent.toml ``` -{

Generate new addresses

} - - -You should **not** use the `wallets.sh` tool for production deployments. -If you are deploying an OP Stack based chain into production, you should likely be using a combination of hardware security modules and hardware wallets. - - -```bash -./packages/contracts-bedrock/scripts/getting-started/wallets.sh -``` - -{

Check the output

} - -Make sure that you see output that looks something like the following: - -```text -Copy the following into your .envrc file: - -# Admin address -export GS_ADMIN_ADDRESS=0x9625B9aF7C42b4Ab7f2C437dbc4ee749d52E19FC -export GS_ADMIN_PRIVATE_KEY=0xbb93a75f64c57c6f464fd259ea37c2d4694110df57b2e293db8226a502b30a34 - -# Batcher address -export GS_BATCHER_ADDRESS=0xa1AEF4C07AB21E39c37F05466b872094edcf9cB1 -export GS_BATCHER_PRIVATE_KEY=0xe4d9cd91a3e53853b7ea0dad275efdb5173666720b1100866fb2d89757ca9c5a - -# Proposer address -export GS_PROPOSER_ADDRESS=0x40E805e252D0Ee3D587b68736544dEfB419F351b -export GS_PROPOSER_PRIVATE_KEY=0x2d1f265683ebe37d960c67df03a378f79a7859038c6d634a61e40776d561f8a2 - -# Sequencer address -export GS_SEQUENCER_ADDRESS=0xC06566E8Ec6cF81B4B26376880dB620d83d50Dfb -export GS_SEQUENCER_PRIVATE_KEY=0x2a0290473f3838dbd083a5e17783e3cc33c905539c0121f9c76614dda8a38dca -``` - -{

Save the addresses

} - -Copy the output from the previous step and paste it into your `.envrc` file as directed. - -{

Fund the addresses

} - -**You will need to send ETH to the `Admin`, `Proposer`, and `Batcher` addresses.** -The exact amount of ETH required depends on the L1 network being used. -**You do not need to send any ETH to the `Sequencer` address as it does not send transactions.** - -It's recommended to fund the addresses with the following amounts when using Sepolia: - -* `Admin` — 0.5 Sepolia ETH -* `Batcher` — 0.1 Sepolia ETH -* `Proposer` — 0.2 Sepolia ETH - -**To get the required Sepolia ETH to fund the addresses, we recommend using the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=op-docs&utm_medium=docs)** together with [Coinbase verification](https://help.coinbase.com/en/coinbase/getting-started/getting-started-with-coinbase/id-doc-verification). +Update the `[[chains]]` section with your wallet addresses and preferences. For detailed configuration options, see the [op-deployer configuration guide](/operators/chain-operators/tools/op-deployer#configuration).
-## Load environment variables - -Now that you've filled out the environment variable file, you need to load those variables into your terminal. +## Step 3: Deploy L1 smart contracts -{

Enter the Optimism Monorepo

} +### Set deployment credentials ```bash -cd ~/optimism +# Your Sepolia RPC URL +export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" +# Private key for deployment (ensure this account has Sepolia ETH) +export DEPLOYER_PRIVATE_KEY="0xYOUR_PRIVATE_KEY" ``` -{

Load the variables with direnv

} - - -You're about to use `direnv` to load environment variables from the `.envrc` file into your terminal. -Make sure that you've [installed `direnv`](https://direnv.net/docs/installation.html) and that you've properly [hooked `direnv` into your shell](#configuring-direnv). - - -Next you'll need to allow `direnv` to read this file and load the variables into your terminal using the following command. +### Deploy contracts to L1 ```bash -direnv allow +./op-deployer apply --workdir .deployer \ + --l1-rpc-url $L1_RPC_URL \ + --private-key $DEPLOYER_PRIVATE_KEY ``` - -WARNING: `direnv` will unload itself whenever your `.envrc` file changes. -**You *must* rerun the following command every time you change the `.envrc` file.** - - -{

Confirm that the variables were loaded

} +This deploys all necessary L1 contracts and updates the local state file. -After running `direnv allow` you should see output that looks something like the following (the exact output will vary depending on the variables you've set, don't worry if it doesn't look exactly like this): +### Generate chain artifacts ```bash -direnv: loading ~/optimism/.envrc -direnv: export +DEPLOYMENT_CONTEXT +ETHERSCAN_API_KEY +GS_ADMIN_ADDRESS +GS_ADMIN_PRIVATE_KEY +GS_BATCHER_ADDRESS +GS_BATCHER_PRIVATE_KEY +GS_PROPOSER_ADDRESS +GS_PROPOSER_PRIVATE_KEY +GS_SEQUENCER_ADDRESS +GS_SEQUENCER_PRIVATE_KEY +IMPL_SALT +L1_RPC_KIND +L1_RPC_URL +PRIVATE_KEY +TENDERLY_PROJECT +TENDERLY_USERNAME -``` - -**If you don't see this output, you likely haven't [properly configured `direnv`](#configuring-direnv).** -Make sure you've configured `direnv` properly and run `direnv allow` again so that you see the desired output. - -
+# Generate genesis file for op-geth +./op-deployer inspect genesis --workdir .deployer $L2_CHAIN_ID > .deployer/genesis.json -## Configure your network - -Once you've built both repositories, you'll need to head back to the Optimism Monorepo to set up the configuration file for your chain. -Currently, chain configuration lives inside of the [`contracts-bedrock`](https://github.com/ethereum-optimism/optimism/tree/v1.1.4/packages/contracts-bedrock) package in the form of a JSON file. - - +# Generate rollup config for op-node +./op-deployer inspect rollup --workdir .deployer $L2_CHAIN_ID > .deployer/rollup.json -{

Enter the Optimism Monorepo

} - -```bash -cd ~/optimism -``` - -{

Move into the contracts-bedrock package

} - -```bash -cd packages/contracts-bedrock -``` - -{

Install Foundry dependencies

} - -```bash -forge install -``` - -{

Generate the configuration file

} - -Run the following script to generate the `getting-started.json` configuration file inside of the `deploy-config` directory. - -```bash -./scripts/getting-started/config.sh +# Export contract addresses for other components +./op-deployer inspect l1 --workdir .deployer $L2_CHAIN_ID > .deployer/l1-contracts.json ``` -{

Review the configuration file (Optional)

} - -If you'd like, you can review the configuration file that was just generated by opening up `deploy-config/getting-started.json` in your favorite text editor. -It's recommended to keep this file as-is for now so you don't run into any unexpected errors. -
-## Deploy the Create2 factory (optional) +For comprehensive deployment details, see the [L1 smart contracts deployment guide](/operators/chain-operators/deploy/smart-contracts). -If you're deploying an OP Stack chain to a network other than Sepolia, you may need to deploy a Create2 factory contract to the L1 chain. -This factory contract is used to deploy OP Stack smart contracts in a deterministic fashion. - - -This step is typically only necessary if you are deploying your OP Stack chain to custom L1 chain. -If you are deploying your OP Stack chain to Sepolia, you can safely skip this step. - +## Step 4: Build required components -{

Check if the factory exists

} - -The Create2 factory contract will be deployed at the address `0x4e59b44847b379578588920cA78FbF26c0B4956C`. -You can check if this contract has already been deployed to your L1 network with a block explorer or by running the following command: +### Download and build op-geth ```bash -cast codesize 0x4e59b44847b379578588920cA78FbF26c0B4956C --rpc-url $L1_RPC_URL +cd ~ +# Download and extract op-geth +wget https://github.com/ethereum-optimism/op-geth/archive/refs/tags/v1.101503.1.tar.gz +tar -xzf v1.101503.1.tar.gz +mv op-geth-* op-geth +cd op-geth +# Build the binary (requires make and Go) +make geth ``` -If the command returns `0` then the contract has not been deployed yet. -If the command returns `69` then the contract has been deployed and you can safely skip this section. - -{

Fund the factory deployer

} - -You will need to send some ETH to the address that will be used to deploy the factory contract, `0x3fAB184622Dc19b6109349B94811493BF2a45362`. -This address can only be used to deploy the factory contract and will not be used for anything else. -Send at least 1 ETH to this address on your L1 chain. - -{

Deploy the factory

} - -Using `cast`, deploy the factory contract to your L1 chain: +### Clone and build Optimism components ```bash -cast publish --rpc-url $L1_RPC_URL 0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222 -``` - -{

Wait for the transaction to be mined

} +cd ~ +# Clone the Optimism monorepo +git clone https://github.com/ethereum-optimism/optimism.git +cd optimism -Make sure that the transaction is included in a block on your L1 chain before continuing. +# Build op-node +git checkout op-node/v1.12.2 +cd op-node +just build # Uses the 'just' command runner +cd .. -{

Verify that the factory was deployed

} +# Build op-batcher +git checkout op-batcher/v1.11.5 +cd op-batcher +just build +cd .. -Run the code size check again to make sure that the factory was properly deployed: +# Build op-proposer +git checkout op-proposer/v1.10.0 +cd op-proposer +just build +cd .. -```bash -cast codesize 0x4e59b44847b379578588920cA78FbF26c0B4956C --rpc-url $L1_RPC_URL +# Build op-challenger +git checkout op-challenger/v1.3.3 +cd op-challenger +just build +cd .. ``` -
- -## Deploy the L1 contracts - -Once you've configured your network, it's time to deploy the L1 contracts necessary for the functionality of the chain. - -## Using `op-deployer` - -The `op-deployer` tool simplifies the creation of genesis and rollup configuration files (`genesis.json` and `rollup.json`). -These files are crucial for initializing the execution client (`op-geth`) and consensus client (`op-node`) for your network. - -The recommended flow for creating a genesis file and rollup configuration file on the OP Stack is as follows: - - -1. **Deploy the L1 contracts** using [op-deployer](/operators/chain-operators/tools/op-deployer). -2. **Generate** both the L2 genesis file (`genesis.json`) and the rollup configuration file (`rollup.json`) using op-deployer's `inspect` commands. -3. **Initialize** your off-chain components (e.g., execution client, consensus client). - - -Using op-deployer for chain initialization is a requirement for all chains intending to be for chains who intend to be standard and join the superchain. -This ensures standardization and compatibility across the OP Stack ecosystem. - - -### Prerequisites - -1. You have installed the `op-deployer` binary following the instructions in [deployer docs](/operators/chain-operators/tools/op-deployer#installation). - After installation, extract the `op-deployer` into your `PATH` and `cd op-deployer`. - -2. You have created and customized an intent file in a `.deployer` directory, typically by running: - - ```bash - ./bin/op-deployer init --l1-chain-id --l2-chain-ids --workdir .deployer - ``` - - Replace `` and `` with their respective values, see a list of [`chainIds`](https://chainid.network/). - -3. You have edited that intent file to your liking (roles, addresses, etc.). - -### Step 1: Deploy the L1 contracts - -To deploy your chain to L1, run: +### Generate JWT secret ```bash -./bin/op-deployer apply --workdir .deployer \ - --l1-rpc-url \ - --private-key +cd ~/optimism/op-node +# Generate a random JWT secret for authentication between op-geth and op-node +openssl rand -hex 32 > jwt.txt +# Copy the JWT secret to op-geth directory +cp jwt.txt ~/op-geth/ ``` -* Replace `` with the L1 RPC URL. -* Replace `` with the private key of the account used for deployment. - -This command: - -* Reads your intent file in `.deployer/.` -* Deploys the OP Stack contracts to the specified L1. -* Updates a local `state.json` file with the results of the deployment. - -### Step 2: Generate your L2 genesis file and rollup file - -After your L1 contracts have been deployed, generate the L2 genesis and rollup configuration files by inspecting the deployer's `state.json.` +### Copy configuration files ```bash -./bin/op-deployer inspect genesis --workdir .deployer > .deployer/genesis.json -./bin/op-deployer inspect rollup --workdir .deployer > .deployer/rollup.json +cd ~/op-deployer/.deployer +# Copy configuration files to the appropriate directories +cp genesis.json ~/op-geth/ +cp rollup.json ~/optimism/op-node/ ``` -* genesis.json is the file you will provide to your execution client (e.g. op-geth). -* rollup.json is the file you will provide to your consensus client (e.g. op-node). - -### Step 3: Initialize your off-chain components - -Once you have `genesis.json` and `rollup.json`: - -1. Initialize op-geth using genesis.json. -2. Configure op-node with rollup.json. -3. Set up additional off-chain infrastructure as needed (block explorer, indexers, etc.). For more on architecture, see [Architecture overview](/operators/chain-operators/architecture). - -## Initialize `op-geth` + -You're almost ready to run your chain! -Now you just need to run a few commands to initialize `op-geth`. -You're going to be running a Sequencer node, so you'll need to import the `Sequencer` private key that you generated earlier. -This private key is what your Sequencer will use to sign new blocks. +## Step 5: Initialize and start op-geth -{

Navigate to the op-geth directory

} +### Initialize op-geth datadir ```bash cd ~/op-geth -``` - -{

Create a data directory folder

} - -```bash mkdir datadir +./build/bin/geth init --state.scheme=hash --datadir=datadir genesis.json ``` -{

Build the op-geth binary

} - -```bash -make geth -``` - -{

Initialize op-geth

} - -```bash -build/bin/geth init --state.scheme=hash --datadir=datadir genesis.json -``` - -
- -## Start `op-geth` - -Now you'll start `op-geth`, your Execution Client. -Note that you won't start seeing any transactions until you start the Consensus Client in the next step. - - - -{

Open up a new terminal

} - -You'll need a terminal window to run `op-geth` in. - -{

Navigate to the op-geth directory

} +### Start op-geth (in new terminal window) ```bash cd ~/op-geth -``` - -{

Run op-geth

} - - -You're using `--gcmode=archive` to run `op-geth` here because this node will act as your Sequencer. -It's useful to run the Sequencer in archive mode because the `op-proposer` requires access to the full state. -Feel free to run other (non-Sequencer) nodes in full mode if you'd like to save disk space. Just make sure at least one other archive node exists and the `op-proposer` points to it. - - - -It's important that you've already initialized the geth node at this point as per the previous section. Failure to do this will cause startup issues between `op-geth` and `op-node`. - - -```bash ./build/bin/geth \ --datadir ./datadir \ --http \ @@ -582,7 +274,7 @@ It's important that you've already initialized the geth node at this point as pe --gcmode=archive \ --nodiscover \ --maxpeers=0 \ - --networkid=42069 \ + --networkid=$L2_CHAIN_ID \ --authrpc.vhosts="*" \ --authrpc.addr=0.0.0.0 \ --authrpc.port=8551 \ @@ -592,27 +284,25 @@ It's important that you've already initialized the geth node at this point as pe
-## Start `op-node` +For detailed op-geth configuration, see the [op-geth deployment guide](/operators/chain-operators/deploy/sequencer-node#2-clone-and-build-op-geth). -Once you've got `op-geth` running you'll need to run `op-node`. -Like Ethereum, the OP Stack has a Consensus Client (`op-node`) and an Execution Client (`op-geth`). -The Consensus Client "drives" the Execution Client over the Engine API. +## Step 6: Start op-node -{

Open up a new terminal

} - -You'll need a terminal window to run the `op-node` in. - -{

Navigate to the op-node directory

} +### Configure environment variables ```bash -cd ~/optimism/op-node +export GS_SEQUENCER_PRIVATE_KEY="0xYOUR_SEQUENCER_PRIVATE_KEY" +export L1_RPC_KIND="alchemy" # or your RPC provider +export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" +export L1_BEACON_URL="https://ethereum-sepolia-beacon-api.publicnode.com" ``` -{

Run op-node

} +### Start op-node (in new terminal window) ```bash +cd ~/optimism/op-node ./bin/op-node \ --l2=http://localhost:8551 \ --l2.jwt-secret=./jwt.txt \ @@ -625,58 +315,25 @@ cd ~/optimism/op-node --rpc.enable-admin \ --p2p.sequencer.key=$GS_SEQUENCER_PRIVATE_KEY \ --l1=$L1_RPC_URL \ - --l1.rpckind=$L1_RPC_KIND -``` - -Once you run this command, you should start seeing the `op-node` begin to sync L2 blocks from the L1 chain. -Once the `op-node` has caught up to the tip of the L1 chain, it'll begin to send blocks to `op-geth` for execution. -At that point, you'll start to see blocks being created inside of `op-geth`. - - -**By default, your `op-node` will try to use a peer-to-peer to speed up the synchronization process.** -If you're using a chain ID that is also being used by others, like the default chain ID for this tutorial (42069), your `op-node` will receive blocks signed by other sequencers. -These requests will fail and waste time and network resources. -**To avoid this, this tutorial starts with peer-to-peer synchronization disabled (`--p2p.disable`).** - -Once you have multiple nodes, you may want to enable peer-to-peer synchronization. -You can add the following options to the `op-node` command to enable peer-to-peer synchronization with specific nodes: - -``` - --p2p.static= \ - --p2p.listen.ip=0.0.0.0 \ - --p2p.listen.tcp=9003 \ - --p2p.listen.udp=9003 \ + --l1.rpckind=$L1_RPC_KIND \ + --l1.beacon=$L1_BEACON_URL ``` -You can alternatively also remove the [--p2p.static](/operators/node-operators/configuration/consensus-config#p2pstatic) option, but you may see failed requests from other chains using the same chain ID. - -
-## Start `op-batcher` +For advanced op-node configuration, see the [op-node deployment guide](/operators/chain-operators/deploy/sequencer-node#1-clone-and-build-op-node). -The `op-batcher` takes transactions from the Sequencer and publishes those transactions to L1. -Once these Sequencer transactions are included in a finalized L1 block, they're officially part of the canonical chain. -The `op-batcher` is critical! - -It's best to give the `Batcher` address at least 1 Sepolia ETH to ensure that it can continue operating without running out of ETH for gas. -Keep an eye on the balance of the `Batcher` address because it can expend ETH quickly if there are a lot of transactions to publish. +## Step 7: Start op-batcher -{

Open up a new terminal

} - -You'll need a terminal window to run the `op-batcher` in. - -{

Navigate to the op-batcher directory

} +### Start op-batcher (in new terminal window) ```bash cd ~/optimism/op-batcher -``` +export GS_BATCHER_PRIVATE_KEY="0xYOUR_BATCHER_PRIVATE_KEY" +export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" -{

Run op-batcher

} - -```bash ./bin/op-batcher \ --l2-eth-rpc=http://localhost:8545 \ --rollup-rpc=http://localhost:9545 \ @@ -693,84 +350,121 @@ cd ~/optimism/op-batcher --private-key=$GS_BATCHER_PRIVATE_KEY ``` - -The [`--max-channel-duration=n`](/operators/chain-operators/configuration/batcher#set-your--op_batcher_max_channel_duration) setting tells the batcher to write all the data to L1 every `n` L1 blocks. -When it is low, transactions are written to L1 frequently and other nodes can synchronize from L1 quickly. -When it is high, transactions are written to L1 less frequently and the batcher spends less ETH. -If you want to reduce costs, either set this value to 0 to disable it or increase it to a higher value. - -
-## Start `op-proposer` +For detailed batcher configuration, see the [op-batcher deployment guide](/operators/chain-operators/deploy/spin-batcher). -Now start `op-proposer`, which proposes new state roots. +## Step 8: Start op-proposer -{

Open up a new terminal

} - -You'll need a terminal window to run the `op-proposer` in. - -{

Navigate to the op-proposer directory

} +### Configure proposer environment ```bash -cd ~/optimism/op-proposer +export OP_PROPOSER_WAIT_NODE_SYNC=true +export OP_PROPOSER_GAME_FACTORY_ADDRESS=$(cat ~/op-deployer/.deployer/l1-contracts.json | jq -r .opChainDeployment.disputeGameFactoryProxyAddress) +export OP_PROPOSER_PROPOSAL_INTERVAL=4m +export OP_PROPOSER_GAME_TYPE=1 +export GS_PROPOSER_PRIVATE_KEY="0xYOUR_PROPOSER_PRIVATE_KEY" +export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" ``` -{

Run op-proposer

} +### Start op-proposer (in new terminal window) ```bash +cd ~/optimism/op-proposer ./bin/op-proposer \ --poll-interval=12s \ --rpc.port=8560 \ --rollup-rpc=http://localhost:9545 \ - --l2oo-address=$(cat ../packages/contracts-bedrock/deployments/getting-started/.deploy | jq -r .L2OutputOracleProxy) \ --private-key=$GS_PROPOSER_PRIVATE_KEY \ --l1-eth-rpc=$L1_RPC_URL ```
-## Connect your wallet to your chain +For comprehensive proposer setup, see the [op-proposer deployment guide](/operators/chain-operators/deploy/proposer-setup-guide). -You now have a fully functioning OP Stack Rollup with a Sequencer node running on `http://localhost:8545`. -You can connect your wallet to this chain the same way you'd connect your wallet to any other EVM chain. -If you need an easy way to connect to your chain, just [click here](https://chainid.link?network=opstack-getting-started). - -## Get ETH on your chain - -Once you've connected your wallet, you'll probably notice that you don't have any ETH to pay for gas on your chain. -The easiest way to deposit Sepolia ETH into your chain is to send ETH directly to the `L1StandardBridge` contract. +## Step 9: Start op-challenger -{

Navigate to the contracts-bedrock directory

} +### Start op-challenger (in new terminal window) ```bash -cd ~/optimism/packages/contracts-bedrock +cd ~/optimism/op-challenger +export GS_CHALLENGER_PRIVATE_KEY="0xYOUR_CHALLENGER_PRIVATE_KEY" +export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" + +./bin/op-challenger \ + --trace-type=permissioned,cannon \ + --l1-eth-rpc=$L1_RPC_URL \ + --l2-eth-rpc=http://localhost:8545 \ + --rollup-rpc=http://localhost:9545 \ + --private-key=$GS_CHALLENGER_PRIVATE_KEY \ + --network=op-sepolia \ + --datadir=./challenger-data ``` -{

Get the address of the L1StandardBridgeProxy contract

} +
+ +For detailed challenger configuration, see the [op-challenger deployment guide](/operators/chain-operators/deploy/sequencer-node). + +## Step 10: Configure dispute resolution (Optional) + +To enable proper dispute resolution, configure the initial bond for dispute games: + + + +### Update dispute game factory + +Visit the Game Factory contract on Etherscan: +`https://sepolia.etherscan.io/address/#writeProxyContract` + +Call `setInitBond` with: + +* `_gameType`: 1 +* `_initBond`: 800000000000000 (0.0008 ETH) + + + +## Testing your rollup + + + +### Connect wallet + +Your rollup is now running at `http://localhost:8545`. You can connect MetaMask or any other wallet using: + +* **RPC URL**: `http://localhost:8545` +* **Chain ID**: Your L2_CHAIN_ID (e.g., 42069) +* **Currency**: ETH + +### Bridge ETH to L2 + +Get the L1StandardBridge address: ```bash -cat deployments/getting-started/.deploy | jq -r .L1StandardBridgeProxy +cd ~/op-deployer/.deployer +cat l1-contracts.json | jq -r .opChainDeployment.l1StandardBridgeProxyAddress ``` -{

Send some Sepolia ETH to the L1StandardBridgeProxy contract

} +Send Sepolia ETH to this address to bridge funds to your L2. -Grab the L1 bridge proxy contract address and, using the wallet that you want to have ETH on your Rollup, send that address a small amount of ETH on Sepolia (0.1 or less is fine). -This will trigger a deposit that will mint ETH into your wallet on L2. -It may take up to 5 minutes for that ETH to appear in your wallet on L2. +### Send test transactions -
+Once you have ETH on L2, try: + +* Sending ETH between accounts +* Deploying simple contracts +* Interacting with dApps -## See your rollup in action + -You can interact with your Rollup the same way you'd interact with any other EVM chain. -Send some transactions, deploy some contracts, and see what happens! ## Next steps -* Check out the [protocol specs](https://specs.optimism.io/?utm_source=op-docs&utm_medium=docs) for more detail about the rollup protocol. -* If you run into any problems, please visit the [Chain Operators Troubleshooting Guide](/operators/chain-operators/management/troubleshooting) for help. +* **Join the Superchain**: Learn about [Superchain compatibility](/superchain/superchain-explainer) +* **Deploy to mainnet**: Follow the [mainnet deployment guide](/operators/chain-operators/deploy/overview) +* **Add features**: Explore [OP Stack features](/stack/features) you can enable +* **Community support**: Join the [Optimism Discord](https://discord.gg/optimism) for help From 0f6a009f1bd1e5c94400138823b670cdb32c018f Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Jul 2025 21:40:27 +0100 Subject: [PATCH 02/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- words.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/words.txt b/words.txt index 05708699c..4f9c650ae 100644 --- a/words.txt +++ b/words.txt @@ -98,7 +98,6 @@ devnet Devnets devnets devs -direnv DISABLETXPOOLGOSSIP disabletxpoolgossip Discv From bcad15dc1e622d2c3ff4669cf5236350c9ec3e91 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 1 Aug 2025 08:51:39 +0100 Subject: [PATCH 03/92] Refactor L2 rollup tutorial to improve clarity and structure. Remove outdated callout, streamline installation steps for op-deployer and op-geth, and enhance navigation instructions for various components. Update references to deployment artifacts for consistency. --- .../tutorials/create-l2-rollup.mdx | 89 ++++++++++--------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index e3487bd63..200184300 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -23,12 +23,6 @@ import { Callout, Card, Steps } from 'nextra/components' This tutorial walks you through deploying a complete OP Stack testnet chain using the modern **op-deployer** approach. You'll deploy L1 smart contracts, generate chain artifacts, and run all required off-chain components. - - **Time Required:** Approximately 1-2 hours\ - **Skill Level:** Intermediate to Advanced\ - **Prerequisites:** Familiarity with command line, Ethereum concepts, and node management - - ## What you'll deploy This tutorial will guide you through setting up: @@ -76,15 +70,13 @@ The op-deployer tool simplifies OP Stack deployments and is required for standar ### Download op-deployer -```bash -cd ~ -# Download the appropriate version for your OS from the releases page -# Linux example shown below - adjust for macOS or Windows as needed -wget https://github.com/ethereum-optimism/optimism/releases/latest/download/op-deployer-linux-amd64.tar.gz -tar -xzf op-deployer-linux-amd64.tar.gz -mv op-deployer-* op-deployer -cd op-deployer -``` +1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) +2. Find the latest release that includes op-deployer +3. Under **assets**, download the binary that matches your operating system: + * `op-deployer-linux-amd64` for Linux + * `op-deployer-darwin-amd64` or `op-deployer-darwin-arm64` for macOS + * `op-deployer-windows-amd64.exe` for Windows +4. Extract the binary to a location on your system PATH ### Verify installation @@ -177,24 +169,24 @@ For comprehensive deployment details, see the [L1 smart contracts deployment gui ### Download and build op-geth +1. Go to [https://github.com/ethereum-optimism/op-geth/releases](https://github.com/ethereum-optimism/op-geth/releases) +2. Download the latest source code archive for your platform +3. Extract the downloaded archive +4. Navigate to the extracted directory +5. Build the binary (requires make and Go): + ```bash -cd ~ -# Download and extract op-geth -wget https://github.com/ethereum-optimism/op-geth/archive/refs/tags/v1.101503.1.tar.gz -tar -xzf v1.101503.1.tar.gz -mv op-geth-* op-geth -cd op-geth -# Build the binary (requires make and Go) make geth ``` ### Clone and build Optimism components +1. Clone the Optimism monorepo: + ```bash -cd ~ -# Clone the Optimism monorepo git clone https://github.com/ethereum-optimism/optimism.git cd optimism +``` # Build op-node git checkout op-node/v1.12.2 @@ -223,22 +215,21 @@ cd .. ### Generate JWT secret +Navigate to your op-node directory and generate a JWT secret for authentication: + ```bash -cd ~/optimism/op-node +cd optimism/op-node # Generate a random JWT secret for authentication between op-geth and op-node openssl rand -hex 32 > jwt.txt -# Copy the JWT secret to op-geth directory -cp jwt.txt ~/op-geth/ ``` ### Copy configuration files -```bash -cd ~/op-deployer/.deployer -# Copy configuration files to the appropriate directories -cp genesis.json ~/op-geth/ -cp rollup.json ~/optimism/op-node/ -``` +Copy the JWT secret and deployment artifacts to the appropriate directories: + +1. Copy the JWT secret to your op-geth directory +2. Copy `genesis.json` from your `.deployer` directory to your op-geth directory +3. Copy `rollup.json` from your `.deployer` directory to your op-node directory @@ -248,16 +239,20 @@ cp rollup.json ~/optimism/op-node/ ### Initialize op-geth datadir +Navigate to your op-geth directory and initialize the data directory: + ```bash -cd ~/op-geth +cd op-geth mkdir datadir ./build/bin/geth init --state.scheme=hash --datadir=datadir genesis.json ``` ### Start op-geth (in new terminal window) +Navigate to your op-geth directory and start the node: + ```bash -cd ~/op-geth +cd op-geth ./build/bin/geth \ --datadir ./datadir \ --http \ @@ -301,8 +296,10 @@ export L1_BEACON_URL="https://ethereum-sepolia-beacon-api.publicnode.com" ### Start op-node (in new terminal window) +Navigate to your op-node directory and start the consensus client: + ```bash -cd ~/optimism/op-node +cd optimism/op-node ./bin/op-node \ --l2=http://localhost:8551 \ --l2.jwt-secret=./jwt.txt \ @@ -329,8 +326,10 @@ For advanced op-node configuration, see the [op-node deployment guide](/operator ### Start op-batcher (in new terminal window) +Navigate to your op-batcher directory and start the batcher: + ```bash -cd ~/optimism/op-batcher +cd optimism/op-batcher export GS_BATCHER_PRIVATE_KEY="0xYOUR_BATCHER_PRIVATE_KEY" export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" @@ -362,7 +361,7 @@ For detailed batcher configuration, see the [op-batcher deployment guide](/opera ```bash export OP_PROPOSER_WAIT_NODE_SYNC=true -export OP_PROPOSER_GAME_FACTORY_ADDRESS=$(cat ~/op-deployer/.deployer/l1-contracts.json | jq -r .opChainDeployment.disputeGameFactoryProxyAddress) +export OP_PROPOSER_GAME_FACTORY_ADDRESS=$(cat .deployer/l1-contracts.json | jq -r .opChainDeployment.disputeGameFactoryProxyAddress) export OP_PROPOSER_PROPOSAL_INTERVAL=4m export OP_PROPOSER_GAME_TYPE=1 export GS_PROPOSER_PRIVATE_KEY="0xYOUR_PROPOSER_PRIVATE_KEY" @@ -371,8 +370,10 @@ export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" ### Start op-proposer (in new terminal window) +Navigate to your op-proposer directory and start the proposer: + ```bash -cd ~/optimism/op-proposer +cd optimism/op-proposer ./bin/op-proposer \ --poll-interval=12s \ --rpc.port=8560 \ @@ -391,8 +392,10 @@ For comprehensive proposer setup, see the [op-proposer deployment guide](/operat ### Start op-challenger (in new terminal window) +Navigate to your op-challenger directory and start the challenger: + ```bash -cd ~/optimism/op-challenger +cd optimism/op-challenger export GS_CHALLENGER_PRIVATE_KEY="0xYOUR_CHALLENGER_PRIVATE_KEY" export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" @@ -423,7 +426,7 @@ Visit the Game Factory contract on Etherscan: Call `setInitBond` with: -* `_gameType`: 1 +* `_gameType`: 0 * `_initBond`: 800000000000000 (0.0008 ETH) @@ -442,10 +445,10 @@ Your rollup is now running at `http://localhost:8545`. You can connect MetaMask ### Bridge ETH to L2 -Get the L1StandardBridge address: +Get the L1StandardBridge address from your deployment artifacts: ```bash -cd ~/op-deployer/.deployer +cd .deployer cat l1-contracts.json | jq -r .opChainDeployment.l1StandardBridgeProxyAddress ``` From 8e6da7a693c6cffe005c1bab21f5db3f54a859d2 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 1 Aug 2025 13:58:17 +0100 Subject: [PATCH 04/92] Update L2 rollup tutorial to enhance clarity and integration of OP Stack components. Revise descriptions, improve installation steps, and ensure consistent references to deployment artifacts. Add verification steps for each component and clarify prerequisites for a seamless deployment experience. --- .../chain-operators/tools/op-deployer.mdx | 2 +- .../tutorials/create-l2-rollup.mdx | 441 +++++++++--------- 2 files changed, 217 insertions(+), 226 deletions(-) diff --git a/pages/operators/chain-operators/tools/op-deployer.mdx b/pages/operators/chain-operators/tools/op-deployer.mdx index 0c450d04c..e062e93c9 100644 --- a/pages/operators/chain-operators/tools/op-deployer.mdx +++ b/pages/operators/chain-operators/tools/op-deployer.mdx @@ -363,7 +363,7 @@ Unlike the `bootstrap` or `apply` commands, the `upgrade` command doesn't direct Chains that are several versions behind the latest can be upgraded by running multiple upgrade commands in sequence, with each command handling one version increment. The upgrade process requires you to be using the standard OP Contracts Manager and the standard shared SuperchainConfig contract for compatibility. -For detailed instructions on using the upgrade command, including configuration examples and step-by-step procedures, see the [upgrade documentation](https://docs.optimism.io/stack/smart-contracts/op-deployer-upgrade#using-upgrade). +For detailed instructions on using the upgrade command, including configuration examples and step-by-step procedures, see the [upgrade documentation](/stack/smart-contracts/op-deployer-upgrade#using-upgrade). ## Bootstrap usage diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index 200184300..b6bd64ef5 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -1,6 +1,6 @@ --- title: Creating your own L2 rollup testnet -description: A complete guide to deploying an OP Stack testnet using op-deployer and running all required components. +description: Learn how to orchestrate and integrate all OP Stack components for a complete testnet deployment. lang: en-US content_type: tutorial topic: creating-your-own-l2-rollup-testnet @@ -14,6 +14,7 @@ categories: - batcher - proposer - challenger + - integration is_imported_content: 'false' --- @@ -21,7 +22,7 @@ import { Callout, Card, Steps } from 'nextra/components' # Creating your own L2 rollup testnet -This tutorial walks you through deploying a complete OP Stack testnet chain using the modern **op-deployer** approach. You'll deploy L1 smart contracts, generate chain artifacts, and run all required off-chain components. +This tutorial focuses on **orchestrating and integrating** all OP Stack components for a complete testnet deployment. Rather than repeating component-specific installation details, this guide emphasizes the unique challenges of getting all components working together seamlessly. ## What you'll deploy @@ -40,54 +41,62 @@ This guide is for **testnet deployment only**. Never use the generated keys or c ## Prerequisites -### Required Software +### Component Installation -| Tool | Version | Installation Guide | -| ------------------------------------------ | ------- | --------------------------------------------------------------- | -| [Git](https://git-scm.com/) | ^2.0 | System package manager | -| [Go](https://golang.org/) | ^1.21 | [Go Installation](https://golang.org/doc/install) | -| [Make](https://www.gnu.org/software/make/) | ^3.0 | System package manager | -| [jq](https://stedolan.github.io/jq/) | ^1.6 | System package manager | -| [Just](https://just.systems/) | Latest | [Just Installation](https://just.systems/man/en/chapter_4.html) | +This tutorial requires several OP Stack components. Install them using the specialized guides: -### Sepolia testnet access +| Component | Installation Guide | Purpose | +|-----------|-------------------|---------| +| **op-deployer** | [Installation Guide](/operators/chain-operators/tools/op-deployer#installation) | Smart contract deployment | +| **op-geth** | [Build Guide](/operators/chain-operators/deploy/sequencer-node#building-op-geth) | Execution client | +| **op-node** | [Build Guide](/operators/chain-operators/deploy/sequencer-node#building-optimism-components) | Consensus client | +| **op-batcher** | [Build Guide](/operators/chain-operators/deploy/spin-batcher#build-the-software) | Transaction batching | +| **op-proposer** | [Build Guide](/operators/chain-operators/deploy/proposer-setup-guide#building-the-proposer) | State root proposals | +| **op-challenger** | [Build Guide](/operators/chain-operators/tools/op-challenger#build-the-executable) | Dispute monitoring | -You'll need: +### Testnet Requirements + +For this tutorial, you'll need: * **Sepolia RPC URL** - Get from [Alchemy](https://www.alchemy.com/), [Infura](https://infura.io/), or [QuickNode](https://www.quicknode.com/) -* **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) -* **Private Keys** - For deployer, admin, batcher, proposer, and sequencer roles +* **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) (~2-3 ETH recommended) +* **Private Keys** - For deployer, admin, batcher, proposer, and sequencer roles (5 separate keys) - -We recommend using Sepolia testnet as it's well-supported and has reliable faucets. You can adapt this guide for other EVM-compatible testnets. + +**Security Note**: Never use testnet private keys in production. Generate fresh keys for mainnet deployments. -## Step 1: Install op-deployer +## Step 1: Verify Component Installation -The op-deployer tool simplifies OP Stack deployments and is required for standard chains. +Before starting the deployment, verify all required components are properly installed: -### Download op-deployer +### Verify installations -1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) -2. Find the latest release that includes op-deployer -3. Under **assets**, download the binary that matches your operating system: - * `op-deployer-linux-amd64` for Linux - * `op-deployer-darwin-amd64` or `op-deployer-darwin-arm64` for macOS - * `op-deployer-windows-amd64.exe` for Windows -4. Extract the binary to a location on your system PATH +```bash +# Verify all components are available +op-deployer --version +op-geth version +op-node --version +op-batcher --version +op-proposer --version +op-challenger --version +``` -### Verify installation +If any component is missing, install it using the links in the [Prerequisites](#prerequisites) section. + +### Set up workspace + +Create and organize your deployment workspace: ```bash -./op-deployer --version +mkdir testnet-rollup && cd testnet-rollup +mkdir -p .deployer logs data components ``` -For detailed installation instructions, see the [op-deployer installation guide](/operators/chain-operators/tools/op-deployer#installation). - ## Step 2: Initialize deployment configuration @@ -123,191 +132,163 @@ Update the `[[chains]]` section with your wallet addresses and preferences. For -## Step 3: Deploy L1 smart contracts +## Step 3: Deploy L1 Smart Contracts + +Deploy the L1 smart contracts and generate chain artifacts: -### Set deployment credentials +### Quick deployment ```bash -# Your Sepolia RPC URL -export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" -# Private key for deployment (ensure this account has Sepolia ETH) +# Set deployment parameters +export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" export DEPLOYER_PRIVATE_KEY="0xYOUR_PRIVATE_KEY" -``` -### Deploy contracts to L1 - -```bash -./op-deployer apply --workdir .deployer \ - --l1-rpc-url $L1_RPC_URL \ - --private-key $DEPLOYER_PRIVATE_KEY +# Deploy contracts and generate artifacts +op-deployer apply --workdir .deployer --l1-rpc-url $L1_RPC_URL --private-key $DEPLOYER_PRIVATE_KEY +op-deployer inspect genesis --workdir .deployer $L2_CHAIN_ID > .deployer/genesis.json +op-deployer inspect rollup --workdir .deployer $L2_CHAIN_ID > .deployer/rollup.json +op-deployer inspect l1 --workdir .deployer $L2_CHAIN_ID > .deployer/l1-contracts.json ``` -This deploys all necessary L1 contracts and updates the local state file. - -### Generate chain artifacts +### Verify deployment ```bash -# Generate genesis file for op-geth -./op-deployer inspect genesis --workdir .deployer $L2_CHAIN_ID > .deployer/genesis.json - -# Generate rollup config for op-node -./op-deployer inspect rollup --workdir .deployer $L2_CHAIN_ID > .deployer/rollup.json - -# Export contract addresses for other components -./op-deployer inspect l1 --workdir .deployer $L2_CHAIN_ID > .deployer/l1-contracts.json +# Check that all artifacts were generated +ls -la .deployer/ +# Should show: genesis.json, rollup.json, l1-contracts.json, state.json ``` -For comprehensive deployment details, see the [L1 smart contracts deployment guide](/operators/chain-operators/deploy/smart-contracts). +**For detailed contract deployment and configuration**: [Smart Contract Deployment Guide](/operators/chain-operators/deploy/smart-contracts) -## Step 4: Build required components +## Step 4: Environment Setup and Configuration + +Set up the runtime environment and configuration files for component integration: -### Download and build op-geth +### Generate JWT secret -1. Go to [https://github.com/ethereum-optimism/op-geth/releases](https://github.com/ethereum-optimism/op-geth/releases) -2. Download the latest source code archive for your platform -3. Extract the downloaded archive -4. Navigate to the extracted directory -5. Build the binary (requires make and Go): +Create a shared JWT secret for op-geth and op-node authentication: ```bash -make geth +# Generate JWT secret +openssl rand -hex 32 > jwt.txt +echo "JWT secret generated: jwt.txt" ``` -### Clone and build Optimism components +### Set up environment variables -1. Clone the Optimism monorepo: +Configure environment variables for all components: ```bash -git clone https://github.com/ethereum-optimism/optimism.git -cd optimism -``` +# L1 and L2 configuration +export L1_CHAIN_ID=11155111 +export L2_CHAIN_ID=42069 +export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" +export L1_BEACON_URL="https://ethereum-sepolia-beacon-api.publicnode.com" +export L1_RPC_KIND="alchemy" -# Build op-node -git checkout op-node/v1.12.2 -cd op-node -just build # Uses the 'just' command runner -cd .. - -# Build op-batcher -git checkout op-batcher/v1.11.5 -cd op-batcher -just build -cd .. - -# Build op-proposer -git checkout op-proposer/v1.10.0 -cd op-proposer -just build -cd .. - -# Build op-challenger -git checkout op-challenger/v1.3.3 -cd op-challenger -just build -cd .. -``` +# Component private keys (use different keys for each role) +export GS_SEQUENCER_PRIVATE_KEY="0xYOUR_SEQUENCER_PRIVATE_KEY" +export GS_BATCHER_PRIVATE_KEY="0xYOUR_BATCHER_PRIVATE_KEY" +export GS_PROPOSER_PRIVATE_KEY="0xYOUR_PROPOSER_PRIVATE_KEY" +export GS_CHALLENGER_PRIVATE_KEY="0xYOUR_CHALLENGER_PRIVATE_KEY" -### Generate JWT secret +# Extract contract addresses from deployment +export OP_PROPOSER_GAME_FACTORY_ADDRESS=$(cat .deployer/l1-contracts.json | jq -r .opChainDeployment.disputeGameFactoryProxyAddress) +``` -Navigate to your op-node directory and generate a JWT secret for authentication: +### Organize configuration files ```bash -cd optimism/op-node -# Generate a random JWT secret for authentication between op-geth and op-node -openssl rand -hex 32 > jwt.txt +# Copy configuration files to accessible locations +cp .deployer/genesis.json ./genesis.json +cp .deployer/rollup.json ./rollup.json +cp jwt.txt ./jwt.txt ``` -### Copy configuration files + -Copy the JWT secret and deployment artifacts to the appropriate directories: +**For detailed component building**: See individual component guides in [Prerequisites](#prerequisites) -1. Copy the JWT secret to your op-geth directory -2. Copy `genesis.json` from your `.deployer` directory to your op-geth directory -3. Copy `rollup.json` from your `.deployer` directory to your op-node directory +## Step 5: Start op-geth (Execution Layer) - - -## Step 5: Initialize and start op-geth +**Start components in order**: op-geth must be running before starting op-node. -### Initialize op-geth datadir - -Navigate to your op-geth directory and initialize the data directory: +### Initialize op-geth ```bash -cd op-geth -mkdir datadir -./build/bin/geth init --state.scheme=hash --datadir=datadir genesis.json +# Initialize the data directory +mkdir -p data/geth +op-geth init --state.scheme=hash --datadir=data/geth genesis.json ``` -### Start op-geth (in new terminal window) - -Navigate to your op-geth directory and start the node: +### Start op-geth ```bash -cd op-geth -./build/bin/geth \ - --datadir ./datadir \ +# Start in a new terminal window +op-geth \ + --datadir=./op-geth-data \ --http \ - --http.corsdomain="*" \ - --http.vhosts="*" \ --http.addr=0.0.0.0 \ - --http.api=web3,debug,eth,txpool,net,engine \ + --http.port=$OP_GETH_HTTP_PORT \ + --http.vhosts="*" \ + --http.corsdomain="*" \ + --http.api=eth,net,web3,debug,txpool,admin \ --ws \ --ws.addr=0.0.0.0 \ - --ws.port=8546 \ + --ws.port=$OP_GETH_WS_PORT \ --ws.origins="*" \ - --ws.api=debug,eth,txpool,net,engine \ + --ws.api=eth,net,web3,debug,txpool,admin \ + --authrpc.addr=0.0.0.0 \ + --authrpc.port=$OP_GETH_AUTH_PORT \ + --authrpc.vhosts="*" \ + --authrpc.jwtsecret=$JWT_SECRET \ --syncmode=full \ --gcmode=archive \ - --nodiscover \ - --maxpeers=0 \ - --networkid=$L2_CHAIN_ID \ - --authrpc.vhosts="*" \ - --authrpc.addr=0.0.0.0 \ - --authrpc.port=8551 \ - --authrpc.jwtsecret=./jwt.txt \ - --rollup.disabletxpoolgossip=true + --rollup.disabletxpoolgossip=true \ + --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT ``` - +### Verify op-geth is running -For detailed op-geth configuration, see the [op-geth deployment guide](/operators/chain-operators/deploy/sequencer-node#2-clone-and-build-op-geth). +```bash +# Check if op-geth is responding (wait ~30 seconds after startup) +curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + http://localhost:8545 -## Step 6: Start op-node +# Should return: {"jsonrpc":"2.0","id":1,"result":"0x0"} +``` - + -### Configure environment variables +**For detailed op-geth configuration**: [Sequencer Node Setup](/operators/chain-operators/deploy/sequencer-node) -```bash -export GS_SEQUENCER_PRIVATE_KEY="0xYOUR_SEQUENCER_PRIVATE_KEY" -export L1_RPC_KIND="alchemy" # or your RPC provider -export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" -export L1_BEACON_URL="https://ethereum-sepolia-beacon-api.publicnode.com" -``` +## Step 6: Start op-node (Consensus Layer) -### Start op-node (in new terminal window) +**Prerequisite**: op-geth must be running and verified before starting op-node. + + -Navigate to your op-node directory and start the consensus client: +### Start op-node ```bash -cd optimism/op-node -./bin/op-node \ +# Start in a new terminal window (ensure op-geth is running first) +op-node \ --l2=http://localhost:8551 \ --l2.jwt-secret=./jwt.txt \ --sequencer.enabled \ --sequencer.l1-confs=5 \ --verifier.l1-confs=4 \ --rollup.config=./rollup.json \ - --rpc.addr=0.0.0.0 \ + --rpc.addr=0.0.0.0 --rpc.port=9545 \ --p2p.disable \ --rpc.enable-admin \ --p2p.sequencer.key=$GS_SEQUENCER_PRIVATE_KEY \ @@ -316,24 +297,35 @@ cd optimism/op-node --l1.beacon=$L1_BEACON_URL ``` +### Verify op-node sync + +```bash +# Check op-node status (wait ~1 minute after startup) +curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' \ + http://localhost:9545 + +# Verify L2 block production +curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + http://localhost:8545 +``` + -For advanced op-node configuration, see the [op-node deployment guide](/operators/chain-operators/deploy/sequencer-node#1-clone-and-build-op-node). +**For detailed op-node configuration**: [Sequencer Node Setup](/operators/chain-operators/deploy/sequencer-node) -## Step 7: Start op-batcher +## Step 7: Start op-batcher (Data Publishing) - +**Prerequisite**: Both op-geth and op-node must be running and synced. -### Start op-batcher (in new terminal window) + -Navigate to your op-batcher directory and start the batcher: +### Start op-batcher ```bash -cd optimism/op-batcher -export GS_BATCHER_PRIVATE_KEY="0xYOUR_BATCHER_PRIVATE_KEY" -export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" - -./bin/op-batcher \ +# Start in a new terminal window +op-batcher \ --l2-eth-rpc=http://localhost:8545 \ --rollup-rpc=http://localhost:9545 \ --poll-interval=1s \ @@ -341,129 +333,128 @@ export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" --num-confirmations=1 \ --safe-abort-nonce-too-low-count=3 \ --resubmission-timeout=30s \ - --rpc.addr=0.0.0.0 \ - --rpc.port=8548 \ + --rpc.addr=0.0.0.0 --rpc.port=8548 \ --rpc.enable-admin \ --max-channel-duration=25 \ --l1-eth-rpc=$L1_RPC_URL \ --private-key=$GS_BATCHER_PRIVATE_KEY ``` - +### Verify op-batcher -For detailed batcher configuration, see the [op-batcher deployment guide](/operators/chain-operators/deploy/spin-batcher). +```bash +# Check batcher health (wait ~2 minutes after startup) +curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' \ + http://localhost:8548 -## Step 8: Start op-proposer +# Monitor for batch submissions in batcher logs +# Look for: "batch submitted successfully" or "published transaction" +``` - + -### Configure proposer environment +**For detailed batcher configuration**: [op-batcher Deployment Guide](/operators/chain-operators/deploy/spin-batcher) -```bash -export OP_PROPOSER_WAIT_NODE_SYNC=true -export OP_PROPOSER_GAME_FACTORY_ADDRESS=$(cat .deployer/l1-contracts.json | jq -r .opChainDeployment.disputeGameFactoryProxyAddress) -export OP_PROPOSER_PROPOSAL_INTERVAL=4m -export OP_PROPOSER_GAME_TYPE=1 -export GS_PROPOSER_PRIVATE_KEY="0xYOUR_PROPOSER_PRIVATE_KEY" -export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" -``` +## Step 8: Start op-proposer (State Root Proposals) + +**Prerequisite**: All previous components must be running and healthy. -### Start op-proposer (in new terminal window) + -Navigate to your op-proposer directory and start the proposer: +### Start op-proposer ```bash -cd optimism/op-proposer -./bin/op-proposer \ +# Start in a new terminal window +op-proposer \ --poll-interval=12s \ --rpc.port=8560 \ --rollup-rpc=http://localhost:9545 \ + --game-factory-address=$OP_PROPOSER_GAME_FACTORY_ADDRESS \ + --proposal-interval=4m \ + --game-type=1 \ --private-key=$GS_PROPOSER_PRIVATE_KEY \ --l1-eth-rpc=$L1_RPC_URL ``` +### Verify op-proposer + +```bash +# Check proposer health (wait ~1 minute after startup) +curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' \ + http://localhost:8560 + +# Monitor for state root proposals in proposer logs +# Look for: "state update proposal confirmed" or "proposal submitted" +``` + -For comprehensive proposer setup, see the [op-proposer deployment guide](/operators/chain-operators/deploy/proposer-setup-guide). +**For detailed proposer configuration**: [op-proposer Deployment Guide](/operators/chain-operators/deploy/proposer-setup-guide) -## Step 9: Start op-challenger +## Step 9: Start op-challenger (Dispute Monitoring) - +**Prerequisite**: All other components must be running and proposing state roots. -### Start op-challenger (in new terminal window) + -Navigate to your op-challenger directory and start the challenger: +### Start op-challenger ```bash -cd optimism/op-challenger -export GS_CHALLENGER_PRIVATE_KEY="0xYOUR_CHALLENGER_PRIVATE_KEY" -export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" - -./bin/op-challenger \ +# Start in a new terminal window +mkdir -p data/challenger +op-challenger \ --trace-type=permissioned,cannon \ --l1-eth-rpc=$L1_RPC_URL \ --l2-eth-rpc=http://localhost:8545 \ --rollup-rpc=http://localhost:9545 \ --private-key=$GS_CHALLENGER_PRIVATE_KEY \ --network=op-sepolia \ - --datadir=./challenger-data + --datadir=./data/challenger ``` - - -For detailed challenger configuration, see the [op-challenger deployment guide](/operators/chain-operators/deploy/sequencer-node). - -## Step 10: Configure dispute resolution (Optional) - -To enable proper dispute resolution, configure the initial bond for dispute games: - - - -### Update dispute game factory +### Verify op-challenger -Visit the Game Factory contract on Etherscan: -`https://sepolia.etherscan.io/address/#writeProxyContract` - -Call `setInitBond` with: +```bash +# Check challenger health (wait ~1 minute after startup) +# Challenger doesn't have an RPC endpoint, monitor logs for: +# "monitoring dispute games" or "challenger started successfully" -* `_gameType`: 0 -* `_initBond`: 800000000000000 (0.0008 ETH) +# Verify challenger is monitoring the game factory +echo "Monitor challenger logs for dispute game monitoring messages" +``` -## Testing your rollup - - +**For detailed challenger configuration**: [op-challenger Configuration Guide](/operators/chain-operators/tools/op-challenger) -### Connect wallet - -Your rollup is now running at `http://localhost:8545`. You can connect MetaMask or any other wallet using: - -* **RPC URL**: `http://localhost:8545` -* **Chain ID**: Your L2_CHAIN_ID (e.g., 42069) -* **Currency**: ETH - -### Bridge ETH to L2 - -Get the L1StandardBridge address from your deployment artifacts: +### Configure dispute resolution (Optional) ```bash -cd .deployer -cat l1-contracts.json | jq -r .opChainDeployment.l1StandardBridgeProxyAddress +# Get the Game Factory address for manual configuration +echo "Game Factory Address: $OP_PROPOSER_GAME_FACTORY_ADDRESS" +echo "Visit: https://sepolia.etherscan.io/address/$OP_PROPOSER_GAME_FACTORY_ADDRESS#writeProxyContract" +echo "Call setInitBond with _gameType: 1, _initBond: 800000000000000" ``` -Send Sepolia ETH to this address to bridge funds to your L2. -### Send test transactions +## Troubleshooting -Once you have ETH on L2, try: +Common integration issues and solutions: -* Sending ETH between accounts -* Deploying simple contracts -* Interacting with dApps + +**Component Dependencies**: Always start components in order: op-geth → op-node → op-batcher → op-proposer → op-challenger + - +### Common Issues +| Problem | Symptom | Solution | +|---------|---------|----------| +| **op-node won't sync** | "connection refused" errors | Verify op-geth is running and JWT secret matches | +| **Batcher not submitting** | No batch submissions in logs | Check L1 RPC connection and batcher private key has ETH | +| **Proposer not proposing** | No state root proposals | Verify rollup-rpc connection and proposal interval | +| **Challenger not monitoring** | No dispute monitoring logs | Check network parameter and L1/L2 RPC connections | ## Next steps From feae15611e06876f1ad1aec982a7bbe11b0b3938 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 1 Aug 2025 13:58:47 +0100 Subject: [PATCH 05/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../tutorials/create-l2-rollup.mdx | 569 +++++++++--------- 1 file changed, 275 insertions(+), 294 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index b6bd64ef5..0b2493f8d 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -36,7 +36,7 @@ This tutorial will guide you through setting up: 6. **Challenger** (op-challenger) - Monitors and disputes invalid state roots -This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. + This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. ## Prerequisites @@ -45,25 +45,25 @@ This guide is for **testnet deployment only**. Never use the generated keys or c This tutorial requires several OP Stack components. Install them using the specialized guides: -| Component | Installation Guide | Purpose | -|-----------|-------------------|---------| -| **op-deployer** | [Installation Guide](/operators/chain-operators/tools/op-deployer#installation) | Smart contract deployment | -| **op-geth** | [Build Guide](/operators/chain-operators/deploy/sequencer-node#building-op-geth) | Execution client | -| **op-node** | [Build Guide](/operators/chain-operators/deploy/sequencer-node#building-optimism-components) | Consensus client | -| **op-batcher** | [Build Guide](/operators/chain-operators/deploy/spin-batcher#build-the-software) | Transaction batching | -| **op-proposer** | [Build Guide](/operators/chain-operators/deploy/proposer-setup-guide#building-the-proposer) | State root proposals | -| **op-challenger** | [Build Guide](/operators/chain-operators/tools/op-challenger#build-the-executable) | Dispute monitoring | +| Component | Installation Guide | Purpose | +| ----------------- | -------------------------------------------------------------------------------------------- | ------------------------- | +| **op-deployer** | [Installation Guide](/operators/chain-operators/tools/op-deployer#installation) | Smart contract deployment | +| **op-geth** | [Build Guide](/operators/chain-operators/deploy/sequencer-node#building-op-geth) | Execution client | +| **op-node** | [Build Guide](/operators/chain-operators/deploy/sequencer-node#building-optimism-components) | Consensus client | +| **op-batcher** | [Build Guide](/operators/chain-operators/deploy/spin-batcher#build-the-software) | Transaction batching | +| **op-proposer** | [Build Guide](/operators/chain-operators/deploy/proposer-setup-guide#building-the-proposer) | State root proposals | +| **op-challenger** | [Build Guide](/operators/chain-operators/tools/op-challenger#build-the-executable) | Dispute monitoring | ### Testnet Requirements For this tutorial, you'll need: * **Sepolia RPC URL** - Get from [Alchemy](https://www.alchemy.com/), [Infura](https://infura.io/), or [QuickNode](https://www.quicknode.com/) -* **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) (~2-3 ETH recommended) +* **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) (\~2-3 ETH recommended) * **Private Keys** - For deployer, admin, batcher, proposer, and sequencer roles (5 separate keys) -**Security Note**: Never use testnet private keys in production. Generate fresh keys for mainnet deployments. + **Security Note**: Never use testnet private keys in production. Generate fresh keys for mainnet deployments. ## Step 1: Verify Component Installation @@ -71,65 +71,61 @@ For this tutorial, you'll need: Before starting the deployment, verify all required components are properly installed: + ### Verify installations -### Verify installations + ```bash + # Verify all components are available + op-deployer --version + op-geth version + op-node --version + op-batcher --version + op-proposer --version + op-challenger --version + ``` -```bash -# Verify all components are available -op-deployer --version -op-geth version -op-node --version -op-batcher --version -op-proposer --version -op-challenger --version -``` - -If any component is missing, install it using the links in the [Prerequisites](#prerequisites) section. + If any component is missing, install it using the links in the [Prerequisites](#prerequisites) section. -### Set up workspace + ### Set up workspace -Create and organize your deployment workspace: - -```bash -mkdir testnet-rollup && cd testnet-rollup -mkdir -p .deployer logs data components -``` + Create and organize your deployment workspace: + ```bash + mkdir testnet-rollup && cd testnet-rollup + mkdir -p .deployer logs data components + ``` ## Step 2: Initialize deployment configuration + ### Set network parameters -### Set network parameters + ```bash + # Sepolia L1 chain ID + export L1_CHAIN_ID=11155111 + # Your custom L2 chain ID (choose any unique number) + export L2_CHAIN_ID=42069 + ``` -```bash -# Sepolia L1 chain ID -export L1_CHAIN_ID=11155111 -# Your custom L2 chain ID (choose any unique number) -export L2_CHAIN_ID=42069 -``` + ### Initialize deployment workspace -### Initialize deployment workspace + ```bash + ./op-deployer init --l1-chain-id $L1_CHAIN_ID --l2-chain-ids $L2_CHAIN_ID --workdir .deployer + ``` -```bash -./op-deployer init --l1-chain-id $L1_CHAIN_ID --l2-chain-ids $L2_CHAIN_ID --workdir .deployer -``` + This creates a `.deployer` directory with initial configuration files. -This creates a `.deployer` directory with initial configuration files. + ### Configure deployment intent -### Configure deployment intent + Edit the generated intent file to specify your deployment parameters: -Edit the generated intent file to specify your deployment parameters: - -```bash -# Edit the intent file with your preferred text editor -# For example: nano, vim, code, or any text editor -nano .deployer/intent.toml -``` - -Update the `[[chains]]` section with your wallet addresses and preferences. For detailed configuration options, see the [op-deployer configuration guide](/operators/chain-operators/tools/op-deployer#configuration). + ```bash + # Edit the intent file with your preferred text editor + # For example: nano, vim, code, or any text editor + nano .deployer/intent.toml + ``` + Update the `[[chains]]` section with your wallet addresses and preferences. For detailed configuration options, see the [op-deployer configuration guide](/operators/chain-operators/tools/op-deployer#configuration). ## Step 3: Deploy L1 Smart Contracts @@ -137,29 +133,27 @@ Update the `[[chains]]` section with your wallet addresses and preferences. For Deploy the L1 smart contracts and generate chain artifacts: - -### Quick deployment - -```bash -# Set deployment parameters -export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" -export DEPLOYER_PRIVATE_KEY="0xYOUR_PRIVATE_KEY" - -# Deploy contracts and generate artifacts -op-deployer apply --workdir .deployer --l1-rpc-url $L1_RPC_URL --private-key $DEPLOYER_PRIVATE_KEY -op-deployer inspect genesis --workdir .deployer $L2_CHAIN_ID > .deployer/genesis.json -op-deployer inspect rollup --workdir .deployer $L2_CHAIN_ID > .deployer/rollup.json -op-deployer inspect l1 --workdir .deployer $L2_CHAIN_ID > .deployer/l1-contracts.json -``` - -### Verify deployment - -```bash -# Check that all artifacts were generated -ls -la .deployer/ -# Should show: genesis.json, rollup.json, l1-contracts.json, state.json -``` - + ### Quick deployment + + ```bash + # Set deployment parameters + export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" + export DEPLOYER_PRIVATE_KEY="0xYOUR_PRIVATE_KEY" + + # Deploy contracts and generate artifacts + op-deployer apply --workdir .deployer --l1-rpc-url $L1_RPC_URL --private-key $DEPLOYER_PRIVATE_KEY + op-deployer inspect genesis --workdir .deployer $L2_CHAIN_ID > .deployer/genesis.json + op-deployer inspect rollup --workdir .deployer $L2_CHAIN_ID > .deployer/rollup.json + op-deployer inspect l1 --workdir .deployer $L2_CHAIN_ID > .deployer/l1-contracts.json + ``` + + ### Verify deployment + + ```bash + # Check that all artifacts were generated + ls -la .deployer/ + # Should show: genesis.json, rollup.json, l1-contracts.json, state.json + ``` **For detailed contract deployment and configuration**: [Smart Contract Deployment Guide](/operators/chain-operators/deploy/smart-contracts) @@ -169,48 +163,46 @@ ls -la .deployer/ Set up the runtime environment and configuration files for component integration: - -### Generate JWT secret - -Create a shared JWT secret for op-geth and op-node authentication: - -```bash -# Generate JWT secret -openssl rand -hex 32 > jwt.txt -echo "JWT secret generated: jwt.txt" -``` - -### Set up environment variables - -Configure environment variables for all components: - -```bash -# L1 and L2 configuration -export L1_CHAIN_ID=11155111 -export L2_CHAIN_ID=42069 -export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" -export L1_BEACON_URL="https://ethereum-sepolia-beacon-api.publicnode.com" -export L1_RPC_KIND="alchemy" - -# Component private keys (use different keys for each role) -export GS_SEQUENCER_PRIVATE_KEY="0xYOUR_SEQUENCER_PRIVATE_KEY" -export GS_BATCHER_PRIVATE_KEY="0xYOUR_BATCHER_PRIVATE_KEY" -export GS_PROPOSER_PRIVATE_KEY="0xYOUR_PROPOSER_PRIVATE_KEY" -export GS_CHALLENGER_PRIVATE_KEY="0xYOUR_CHALLENGER_PRIVATE_KEY" - -# Extract contract addresses from deployment -export OP_PROPOSER_GAME_FACTORY_ADDRESS=$(cat .deployer/l1-contracts.json | jq -r .opChainDeployment.disputeGameFactoryProxyAddress) -``` - -### Organize configuration files - -```bash -# Copy configuration files to accessible locations -cp .deployer/genesis.json ./genesis.json -cp .deployer/rollup.json ./rollup.json -cp jwt.txt ./jwt.txt -``` - + ### Generate JWT secret + + Create a shared JWT secret for op-geth and op-node authentication: + + ```bash + # Generate JWT secret + openssl rand -hex 32 > jwt.txt + echo "JWT secret generated: jwt.txt" + ``` + + ### Set up environment variables + + Configure environment variables for all components: + + ```bash + # L1 and L2 configuration + export L1_CHAIN_ID=11155111 + export L2_CHAIN_ID=42069 + export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" + export L1_BEACON_URL="https://ethereum-sepolia-beacon-api.publicnode.com" + export L1_RPC_KIND="alchemy" + + # Component private keys (use different keys for each role) + export GS_SEQUENCER_PRIVATE_KEY="0xYOUR_SEQUENCER_PRIVATE_KEY" + export GS_BATCHER_PRIVATE_KEY="0xYOUR_BATCHER_PRIVATE_KEY" + export GS_PROPOSER_PRIVATE_KEY="0xYOUR_PROPOSER_PRIVATE_KEY" + export GS_CHALLENGER_PRIVATE_KEY="0xYOUR_CHALLENGER_PRIVATE_KEY" + + # Extract contract addresses from deployment + export OP_PROPOSER_GAME_FACTORY_ADDRESS=$(cat .deployer/l1-contracts.json | jq -r .opChainDeployment.disputeGameFactoryProxyAddress) + ``` + + ### Organize configuration files + + ```bash + # Copy configuration files to accessible locations + cp .deployer/genesis.json ./genesis.json + cp .deployer/rollup.json ./rollup.json + cp jwt.txt ./jwt.txt + ``` **For detailed component building**: See individual component guides in [Prerequisites](#prerequisites) @@ -220,53 +212,51 @@ cp jwt.txt ./jwt.txt **Start components in order**: op-geth must be running before starting op-node. - -### Initialize op-geth - -```bash -# Initialize the data directory -mkdir -p data/geth -op-geth init --state.scheme=hash --datadir=data/geth genesis.json -``` - -### Start op-geth - -```bash -# Start in a new terminal window -op-geth \ - --datadir=./op-geth-data \ - --http \ - --http.addr=0.0.0.0 \ - --http.port=$OP_GETH_HTTP_PORT \ - --http.vhosts="*" \ - --http.corsdomain="*" \ - --http.api=eth,net,web3,debug,txpool,admin \ - --ws \ - --ws.addr=0.0.0.0 \ - --ws.port=$OP_GETH_WS_PORT \ - --ws.origins="*" \ - --ws.api=eth,net,web3,debug,txpool,admin \ - --authrpc.addr=0.0.0.0 \ - --authrpc.port=$OP_GETH_AUTH_PORT \ - --authrpc.vhosts="*" \ - --authrpc.jwtsecret=$JWT_SECRET \ - --syncmode=full \ - --gcmode=archive \ - --rollup.disabletxpoolgossip=true \ - --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT -``` - -### Verify op-geth is running - -```bash -# Check if op-geth is responding (wait ~30 seconds after startup) -curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - http://localhost:8545 - -# Should return: {"jsonrpc":"2.0","id":1,"result":"0x0"} -``` - + ### Initialize op-geth + + ```bash + # Initialize the data directory + mkdir -p data/geth + op-geth init --state.scheme=hash --datadir=data/geth genesis.json + ``` + + ### Start op-geth + + ```bash + # Start in a new terminal window + op-geth \ + --datadir=./op-geth-data \ + --http \ + --http.addr=0.0.0.0 \ + --http.port=$OP_GETH_HTTP_PORT \ + --http.vhosts="*" \ + --http.corsdomain="*" \ + --http.api=eth,net,web3,debug,txpool,admin \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port=$OP_GETH_WS_PORT \ + --ws.origins="*" \ + --ws.api=eth,net,web3,debug,txpool,admin \ + --authrpc.addr=0.0.0.0 \ + --authrpc.port=$OP_GETH_AUTH_PORT \ + --authrpc.vhosts="*" \ + --authrpc.jwtsecret=$JWT_SECRET \ + --syncmode=full \ + --gcmode=archive \ + --rollup.disabletxpoolgossip=true \ + --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT + ``` + + ### Verify op-geth is running + + ```bash + # Check if op-geth is responding (wait ~30 seconds after startup) + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + http://localhost:8545 + + # Should return: {"jsonrpc":"2.0","id":1,"result":"0x0"} + ``` **For detailed op-geth configuration**: [Sequencer Node Setup](/operators/chain-operators/deploy/sequencer-node) @@ -276,41 +266,39 @@ curl -X POST -H "Content-Type: application/json" \ **Prerequisite**: op-geth must be running and verified before starting op-node. - -### Start op-node - -```bash -# Start in a new terminal window (ensure op-geth is running first) -op-node \ - --l2=http://localhost:8551 \ - --l2.jwt-secret=./jwt.txt \ - --sequencer.enabled \ - --sequencer.l1-confs=5 \ - --verifier.l1-confs=4 \ - --rollup.config=./rollup.json \ - --rpc.addr=0.0.0.0 --rpc.port=9545 \ - --p2p.disable \ - --rpc.enable-admin \ - --p2p.sequencer.key=$GS_SEQUENCER_PRIVATE_KEY \ - --l1=$L1_RPC_URL \ - --l1.rpckind=$L1_RPC_KIND \ - --l1.beacon=$L1_BEACON_URL -``` - -### Verify op-node sync - -```bash -# Check op-node status (wait ~1 minute after startup) -curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' \ - http://localhost:9545 - -# Verify L2 block production -curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - http://localhost:8545 -``` - + ### Start op-node + + ```bash + # Start in a new terminal window (ensure op-geth is running first) + op-node \ + --l2=http://localhost:8551 \ + --l2.jwt-secret=./jwt.txt \ + --sequencer.enabled \ + --sequencer.l1-confs=5 \ + --verifier.l1-confs=4 \ + --rollup.config=./rollup.json \ + --rpc.addr=0.0.0.0 --rpc.port=9545 \ + --p2p.disable \ + --rpc.enable-admin \ + --p2p.sequencer.key=$GS_SEQUENCER_PRIVATE_KEY \ + --l1=$L1_RPC_URL \ + --l1.rpckind=$L1_RPC_KIND \ + --l1.beacon=$L1_BEACON_URL + ``` + + ### Verify op-node sync + + ```bash + # Check op-node status (wait ~1 minute after startup) + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' \ + http://localhost:9545 + + # Verify L2 block production + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + http://localhost:8545 + ``` **For detailed op-node configuration**: [Sequencer Node Setup](/operators/chain-operators/deploy/sequencer-node) @@ -320,38 +308,36 @@ curl -X POST -H "Content-Type: application/json" \ **Prerequisite**: Both op-geth and op-node must be running and synced. - -### Start op-batcher - -```bash -# Start in a new terminal window -op-batcher \ - --l2-eth-rpc=http://localhost:8545 \ - --rollup-rpc=http://localhost:9545 \ - --poll-interval=1s \ - --sub-safety-margin=6 \ - --num-confirmations=1 \ - --safe-abort-nonce-too-low-count=3 \ - --resubmission-timeout=30s \ - --rpc.addr=0.0.0.0 --rpc.port=8548 \ - --rpc.enable-admin \ - --max-channel-duration=25 \ - --l1-eth-rpc=$L1_RPC_URL \ - --private-key=$GS_BATCHER_PRIVATE_KEY -``` - -### Verify op-batcher - -```bash -# Check batcher health (wait ~2 minutes after startup) -curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' \ - http://localhost:8548 - -# Monitor for batch submissions in batcher logs -# Look for: "batch submitted successfully" or "published transaction" -``` - + ### Start op-batcher + + ```bash + # Start in a new terminal window + op-batcher \ + --l2-eth-rpc=http://localhost:8545 \ + --rollup-rpc=http://localhost:9545 \ + --poll-interval=1s \ + --sub-safety-margin=6 \ + --num-confirmations=1 \ + --safe-abort-nonce-too-low-count=3 \ + --resubmission-timeout=30s \ + --rpc.addr=0.0.0.0 --rpc.port=8548 \ + --rpc.enable-admin \ + --max-channel-duration=25 \ + --l1-eth-rpc=$L1_RPC_URL \ + --private-key=$GS_BATCHER_PRIVATE_KEY + ``` + + ### Verify op-batcher + + ```bash + # Check batcher health (wait ~2 minutes after startup) + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' \ + http://localhost:8548 + + # Monitor for batch submissions in batcher logs + # Look for: "batch submitted successfully" or "published transaction" + ``` **For detailed batcher configuration**: [op-batcher Deployment Guide](/operators/chain-operators/deploy/spin-batcher) @@ -361,34 +347,32 @@ curl -X POST -H "Content-Type: application/json" \ **Prerequisite**: All previous components must be running and healthy. - -### Start op-proposer - -```bash -# Start in a new terminal window -op-proposer \ - --poll-interval=12s \ - --rpc.port=8560 \ - --rollup-rpc=http://localhost:9545 \ - --game-factory-address=$OP_PROPOSER_GAME_FACTORY_ADDRESS \ - --proposal-interval=4m \ - --game-type=1 \ - --private-key=$GS_PROPOSER_PRIVATE_KEY \ - --l1-eth-rpc=$L1_RPC_URL -``` - -### Verify op-proposer - -```bash -# Check proposer health (wait ~1 minute after startup) -curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' \ - http://localhost:8560 - -# Monitor for state root proposals in proposer logs -# Look for: "state update proposal confirmed" or "proposal submitted" -``` - + ### Start op-proposer + + ```bash + # Start in a new terminal window + op-proposer \ + --poll-interval=12s \ + --rpc.port=8560 \ + --rollup-rpc=http://localhost:9545 \ + --game-factory-address=$OP_PROPOSER_GAME_FACTORY_ADDRESS \ + --proposal-interval=4m \ + --game-type=1 \ + --private-key=$GS_PROPOSER_PRIVATE_KEY \ + --l1-eth-rpc=$L1_RPC_URL + ``` + + ### Verify op-proposer + + ```bash + # Check proposer health (wait ~1 minute after startup) + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' \ + http://localhost:8560 + + # Monitor for state root proposals in proposer logs + # Look for: "state update proposal confirmed" or "proposal submitted" + ``` **For detailed proposer configuration**: [op-proposer Deployment Guide](/operators/chain-operators/deploy/proposer-setup-guide) @@ -398,33 +382,31 @@ curl -X POST -H "Content-Type: application/json" \ **Prerequisite**: All other components must be running and proposing state roots. - -### Start op-challenger - -```bash -# Start in a new terminal window -mkdir -p data/challenger -op-challenger \ - --trace-type=permissioned,cannon \ - --l1-eth-rpc=$L1_RPC_URL \ - --l2-eth-rpc=http://localhost:8545 \ - --rollup-rpc=http://localhost:9545 \ - --private-key=$GS_CHALLENGER_PRIVATE_KEY \ - --network=op-sepolia \ - --datadir=./data/challenger -``` - -### Verify op-challenger - -```bash -# Check challenger health (wait ~1 minute after startup) -# Challenger doesn't have an RPC endpoint, monitor logs for: -# "monitoring dispute games" or "challenger started successfully" - -# Verify challenger is monitoring the game factory -echo "Monitor challenger logs for dispute game monitoring messages" -``` - + ### Start op-challenger + + ```bash + # Start in a new terminal window + mkdir -p data/challenger + op-challenger \ + --trace-type=permissioned,cannon \ + --l1-eth-rpc=$L1_RPC_URL \ + --l2-eth-rpc=http://localhost:8545 \ + --rollup-rpc=http://localhost:9545 \ + --private-key=$GS_CHALLENGER_PRIVATE_KEY \ + --network=op-sepolia \ + --datadir=./data/challenger + ``` + + ### Verify op-challenger + + ```bash + # Check challenger health (wait ~1 minute after startup) + # Challenger doesn't have an RPC endpoint, monitor logs for: + # "monitoring dispute games" or "challenger started successfully" + + # Verify challenger is monitoring the game factory + echo "Monitor challenger logs for dispute game monitoring messages" + ``` **For detailed challenger configuration**: [op-challenger Configuration Guide](/operators/chain-operators/tools/op-challenger) @@ -438,23 +420,22 @@ echo "Visit: https://sepolia.etherscan.io/address/$OP_PROPOSER_GAME_FACTORY_ADDR echo "Call setInitBond with _gameType: 1, _initBond: 800000000000000" ``` - ## Troubleshooting Common integration issues and solutions: -**Component Dependencies**: Always start components in order: op-geth → op-node → op-batcher → op-proposer → op-challenger + **Component Dependencies**: Always start components in order: op-geth → op-node → op-batcher → op-proposer → op-challenger ### Common Issues -| Problem | Symptom | Solution | -|---------|---------|----------| -| **op-node won't sync** | "connection refused" errors | Verify op-geth is running and JWT secret matches | -| **Batcher not submitting** | No batch submissions in logs | Check L1 RPC connection and batcher private key has ETH | -| **Proposer not proposing** | No state root proposals | Verify rollup-rpc connection and proposal interval | -| **Challenger not monitoring** | No dispute monitoring logs | Check network parameter and L1/L2 RPC connections | +| Problem | Symptom | Solution | +| ----------------------------- | ---------------------------- | ------------------------------------------------------- | +| **op-node won't sync** | "connection refused" errors | Verify op-geth is running and JWT secret matches | +| **Batcher not submitting** | No batch submissions in logs | Check L1 RPC connection and batcher private key has ETH | +| **Proposer not proposing** | No state root proposals | Verify rollup-rpc connection and proposal interval | +| **Challenger not monitoring** | No dispute monitoring logs | Check network parameter and L1/L2 RPC connections | ## Next steps From bff8c8f8cb18d9653a0b00c514b106aa5dc19ab7 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Aug 2025 14:30:48 +0100 Subject: [PATCH 06/92] Enhance sequencer node deployment guide by adding tabbed navigation for building from source and using Docker. Streamline installation steps, clarify configuration setup, and improve overall structure for better user experience. Remove outdated L2 rollup tutorial as it is no longer relevant. --- .../chain-operators/deploy/sequencer-node.mdx | 887 +++++++++--------- .../tutorials/create-l2-rollup.mdx | 445 --------- .../tutorials/create-l2-rollup/_meta.json | 8 + .../tutorials/create-l2-rollup/index.mdx | 94 ++ .../create-l2-rollup/op-batcher-setup.mdx | 467 +++++++++ .../create-l2-rollup/op-challenger-setup.mdx | 263 ++++++ .../create-l2-rollup/op-deployer-setup.mdx | 383 ++++++++ .../create-l2-rollup/op-geth-setup.mdx | 606 ++++++++++++ .../create-l2-rollup/op-proposer-setup.mdx | 445 +++++++++ 9 files changed, 2707 insertions(+), 891 deletions(-) delete mode 100644 pages/operators/chain-operators/tutorials/create-l2-rollup.mdx create mode 100644 pages/operators/chain-operators/tutorials/create-l2-rollup/_meta.json create mode 100644 pages/operators/chain-operators/tutorials/create-l2-rollup/index.mdx create mode 100644 pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx create mode 100644 pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx create mode 100644 pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx create mode 100644 pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx create mode 100644 pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 5aa70cd7f..9d3a93ee6 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -17,7 +17,7 @@ categories: is_imported_content: 'false' --- -import { Callout, Steps } from 'nextra/components' +import { Callout, Steps, Tabs } from 'nextra/components' ## Overview @@ -87,504 +87,499 @@ Always check the release notes to ensure you're using compatible versions. ## Software installation -For spinning up a sequencer, we recommend **building from source** as it provides better control, and helps with debugging. -In this guide, a Docker alternative is also provided. +For spinning up a sequencer, we recommend building from source as it provides better control, and helps with debugging. +In this guide Docker alternative is also provided. -### Build from source (Recommended) + + + Building from source gives you full control over the binaries and is the preferred approach for this guide. -Building from source gives you full control over the binaries and is the preferred approach for this guide. + #### 1. Clone and build op-node -#### 1. Clone and build op-node + ```bash + # Clone the optimism monorepo + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism -```bash -# Clone the optimism monorepo -git clone https://github.com/ethereum-optimism/optimism.git -cd optimism + # Checkout the latest release tag + git checkout op-node/v1.13.3 -# Checkout the latest release tag -git checkout op-node/v1.13.3 + # Build op-node + cd op-node + just -# Build op-node -cd op-node -just + # Binary will be available at ./bin/op-node + ``` -# Binary will be available at ./bin/op-node -``` + #### 2. Clone and build op-geth -#### 2. Clone and build op-geth + ```bash + # Clone op-geth repository (in a separate directory) + git clone https://github.com/ethereum-optimism/op-geth.git + cd op-geth -```bash -# Clone op-geth repository (in a separate directory) -git clone https://github.com/ethereum-optimism/op-geth.git -cd op-geth + # Checkout to this release tag + git checkout v1.101511.0 -# Checkout to this release tag -git checkout v1.101511.0 + # Build op-geth + make geth -# Build op-geth -make geth + # Binary will be available at ./build/bin/geth + ``` -# Binary will be available at ./build/bin/geth -``` + ### Verify installation -### Verify installation + Check that you have properly installed the needed components. -Check that you have properly installed the needed components. + ```bash + # Make sure you're in the right directory + ./bin/op-node --version + ./build/bin/geth version + ``` -```bash -# Make sure you're in the right directory -./bin/op-node --version -./build/bin/geth version -``` + ## Configuration setup -## Configuration setup + ### 1. Organize your workspace -### 1. Organize your workspace + After building the binaries, you should have the following directory structure: -After building the binaries, you should have the following directory structure: + ``` + ~/ + ├── optimism/ # Optimism monorepo + │ └── op-node/ + │ └── bin/ + │ └── op-node # Built binary + ├── op-geth/ # OP-Geth repository + │ └── build/ + │ └── bin/ + │ └── geth # Built binary + └── .deployer/ # From op-deployer + ├── genesis.json + └── rollup.json + ``` -``` -~/ -├── optimism/ # Optimism monorepo -│ └── op-node/ -│ └── bin/ -│ └── op-node # Built binary -├── op-geth/ # OP-Geth repository -│ └── build/ -│ └── bin/ -│ └── geth # Built binary -└── .deployer/ # From op-deployer - ├── genesis.json - └── rollup.json -``` + Now create your sequencer working directory. We recommend creating it at the same level for easy path references: -Now create your sequencer working directory. We recommend creating it at the same level for easy path references: + ```bash + # Create sequencer directory at the root level + mkdir ~/sequencer-node + cd ~/sequencer-node + ``` -```bash -# Create sequencer directory at the root level -mkdir ~/sequencer-node -cd ~/sequencer-node -``` +
+ Alternative: Copy binaries to sequencer directory -
- Alternative: Copy binaries to sequencer directory + If you prefer to keep binaries close to your configuration, you can copy them: - If you prefer to keep binaries close to your configuration, you can copy them: + ```bash + mkdir ~/sequencer-node/bin + cp ~/optimism/op-node/bin/op-node ~/sequencer-node/bin/ + cp ~/op-geth/build/bin/geth ~/sequencer-node/bin/ - ```bash - mkdir ~/sequencer-node/bin - cp ~/optimism/op-node/bin/op-node ~/sequencer-node/bin/ - cp ~/op-geth/build/bin/geth ~/sequencer-node/bin/ + # Then update scripts to use: + # ./bin/geth + # ./bin/op-node + ``` +
- # Then update scripts to use: - # ./bin/geth - # ./bin/op-node - ``` -
+ ### 2. Generate JWT secret -### 2. Generate JWT secret + ```bash + # Generate JWT secret in the sequencer directory + openssl rand -hex 32 > jwt.txt -```bash -# Generate JWT secret in the sequencer directory -openssl rand -hex 32 > jwt.txt + # Set appropriate permissions + chmod 600 jwt.txt + ``` -# Set appropriate permissions -chmod 600 jwt.txt -``` + ### 3. Set up directory structure and copy files -### 3. Set up directory structure and copy files + In this guide, we're going to be using the binaries from their original build locations, we only need to create directories for configuration files and scripts. -In this guide, we're going to be using the binaries from their original build locations, we only need to create directories for configuration files and scripts. + ```bash + # Create scripts directory + mkdir scripts -```bash -# Create scripts directory -mkdir scripts + # Copy configuration files from op-deployer + cp ~/.deployer/genesis.json . + cp ~/.deployer/rollup.json . + ``` -# Copy configuration files from op-deployer -cp ~/.deployer/genesis.json . -cp ~/.deployer/rollup.json . -``` + Your final directory structure should look like: -Your final directory structure should look like: + ```bash + ~/sequencer-node/ + ├── jwt.txt + ├── genesis.json + ├── rollup.json + └── scripts/ + ├── start-op-geth.sh # (to be created) + └── start-op-node.sh # (to be created) + ``` -```bash -~/sequencer-node/ -├── jwt.txt -├── genesis.json -├── rollup.json -└── scripts/ - ├── start-op-geth.sh # (to be created) - └── start-op-node.sh # (to be created) -``` + ### 4. Environment variables -### 4. Environment variables + You'll need to gather several pieces of information before creating your configuration. Here's where to get each value: + + ### Get L1 network access -You'll need to gather several pieces of information before creating your configuration. Here's where to get each value: - -### Get L1 network access + You need access to the L1 network (Ethereum mainnet or Sepolia testnet) and its beacon node: -You need access to the L1 network (Ethereum mainnet or Sepolia testnet) and its beacon node: + **L1 RPC URL options:** -**L1 RPC URL options:** + * **Infura**: [infura.io](https://infura.io) - Requires an API key from a project + * **Alchemy**: [alchemy.com](https://alchemy.com) - Requires an API key from an app -* **Infura**: [infura.io](https://infura.io) - Requires an API key from a project -* **Alchemy**: [alchemy.com](https://alchemy.com) - Requires an API key from an app + **L1 Beacon URL options:** -**L1 Beacon URL options:** + * **Public beacon APIs**: `https://ethereum-sepolia-beacon-api.publicnode.com` (Sepolia) or `https://ethereum-beacon-api.publicnode.com` (Mainnet) + * **Infura beacon**: `https://sepolia.infura.io/v3/YOUR_KEY` (if your Infura plan includes beacon access) -* **Public beacon APIs**: `https://ethereum-sepolia-beacon-api.publicnode.com` (Sepolia) or `https://ethereum-beacon-api.publicnode.com` (Mainnet) -* **Infura beacon**: `https://sepolia.infura.io/v3/YOUR_KEY` (if your Infura plan includes beacon access) + ### Get private key from your wallet -### Get private key from your wallet + For this basic sequencer setup, you only need a private key during op-node initialization. -For this basic sequencer setup, you only need a private key during op-node initialization. + ### Get your public IP address -### Get your public IP address + ```bash + # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env + curl ifconfig.me + # or + curl ipinfo.io/ip + ``` + + ### Choose your ports + + The default ports are standard but can be changed if needed: + + * `8545`: op-geth HTTP RPC (standard Ethereum RPC port) + * `8546`: op-geth WebSocket RPC + * `8551`: op-geth Auth RPC (for op-node communication) + * `8547`: op-node RPC + * `9222`: P2P networking (must be open on firewall) + + + + Now create your `.env` file with the actual values: + + ```bash + # Create .env file with your actual values + # L1 Configuration - Replace with your actual RPC URLs + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com + + # Sequencer configuration + SEQUENCER_ENABLED=true + SEQUENCER_STOPPED=false + + # Private keys + PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY -```bash -# Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env -curl ifconfig.me -# or -curl ipinfo.io/ip -``` - -### Choose your ports - -The default ports are standard but can be changed if needed: - -* `8545`: op-geth HTTP RPC (standard Ethereum RPC port) -* `8546`: op-geth WebSocket RPC -* `8551`: op-geth Auth RPC (for op-node communication) -* `8547`: op-node RPC -* `9222`: P2P networking (must be open on firewall) - - - -Now create your `.env` file with the actual values: - -```bash -# Create .env file with your actual values -# L1 Configuration - Replace with your actual RPC URLs -L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY -L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com - -# Sequencer configuration -SEQUENCER_ENABLED=true -SEQUENCER_STOPPED=false - -# Private keys -PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + # P2P configuration - Replace with your actual public IP + P2P_LISTEN_PORT=9222 + P2P_ADVERTISE_IP=YOUR_ACTUAL_PUBLIC_IP + + # RPC configuration (can customize ports if needed) + OP_NODE_RPC_PORT=8547 + OP_GETH_HTTP_PORT=8545 + OP_GETH_WS_PORT=8546 + OP_GETH_AUTH_PORT=8551 + + # JWT secret location + JWT_SECRET=./jwt.txt + ``` -# P2P configuration - Replace with your actual public IP -P2P_LISTEN_PORT=9222 -P2P_ADVERTISE_IP=YOUR_ACTUAL_PUBLIC_IP - -# RPC configuration (can customize ports if needed) -OP_NODE_RPC_PORT=8547 -OP_GETH_HTTP_PORT=8545 -OP_GETH_WS_PORT=8546 -OP_GETH_AUTH_PORT=8551 - -# JWT secret location -JWT_SECRET=./jwt.txt -``` + **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. -**Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. + ## Sequencer specific configuration -## Sequencer specific configuration + ### op-geth configuration for sequencer + + Create `scripts/start-op-geth.sh`: + + ```bash + #!/bin/bash + source .env -### op-geth configuration for sequencer - -Create `scripts/start-op-geth.sh`: - -```bash -#!/bin/bash -source .env + # Path to the op-geth binary we built + ../op-geth/build/bin/geth \ + --datadir=./op-geth-data \ + --http \ + --http.addr=0.0.0.0 \ + --http.port=$OP_GETH_HTTP_PORT \ + --http.vhosts="*" \ + --http.corsdomain="*" \ + --http.api=eth,net,web3,debug,txpool,admin \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port=$OP_GETH_WS_PORT \ + --ws.origins="*" \ + --ws.api=eth,net,web3,debug,txpool,admin \ + --authrpc.addr=0.0.0.0 \ + --authrpc.port=$OP_GETH_AUTH_PORT \ + --authrpc.vhosts="*" \ + --authrpc.jwtsecret=$JWT_SECRET \ + --syncmode=full \ + --gcmode=archive \ + --rollup.disabletxpoolgossip=true \ + --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT + ``` -# Path to the op-geth binary we built -../op-geth/build/bin/geth \ - --datadir=./op-geth-data \ - --http \ - --http.addr=0.0.0.0 \ - --http.port=$OP_GETH_HTTP_PORT \ - --http.vhosts="*" \ - --http.corsdomain="*" \ - --http.api=eth,net,web3,debug,txpool,admin \ - --ws \ - --ws.addr=0.0.0.0 \ - --ws.port=$OP_GETH_WS_PORT \ - --ws.origins="*" \ - --ws.api=eth,net,web3,debug,txpool,admin \ - --authrpc.addr=0.0.0.0 \ - --authrpc.port=$OP_GETH_AUTH_PORT \ - --authrpc.vhosts="*" \ - --authrpc.jwtsecret=$JWT_SECRET \ - --syncmode=full \ - --gcmode=archive \ - --rollup.disabletxpoolgossip=true \ - --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT -``` + ### op-node configuration for sequencer -### op-node configuration for sequencer + Create `scripts/start-op-node.sh`: -Create `scripts/start-op-node.sh`: + ```bash + #!/bin/bash -```bash -#!/bin/bash - -source .env - -# Path to the op-node binary we built -../optimism/op-node/bin/op-node \ - --l1=$L1_RPC_URL \ - --l1.beacon=$L1_BEACON_URL \ - --l2=http://localhost:$OP_GETH_AUTH_PORT \ - --l2.jwt-secret=$JWT_SECRET \ - --rollup.config=./rollup.json \ - --sequencer.enabled=$SEQUENCER_ENABLED \ - --sequencer.stopped=$SEQUENCER_STOPPED \ - --sequencer.max-safe-lag=3600 \ - --verifier.l1-confs=4 \ - --p2p.listen.ip=0.0.0.0 \ - --p2p.listen.tcp=$P2P_LISTEN_PORT \ - --p2p.listen.udp=$P2P_LISTEN_PORT \ - --p2p.advertise.ip=$P2P_ADVERTISE_IP \ - --p2p.advertise.tcp=$P2P_LISTEN_PORT \ - --p2p.advertise.udp=$P2P_LISTEN_PORT \ - --p2p.sequencer.key=$PRIVATE_KEY \ - --rpc.addr=0.0.0.0 \ - --rpc.port=$OP_NODE_RPC_PORT \ - --rpc.enable-admin \ - --log.level=info \ - --log.format=json -``` - -## Initializing and starting the sequencer - - - -### Initialize op-geth with your genesis file - -```bash -# Make sure you're in the sequencer-node directory -cd ~/sequencer-node - -# Initialize op-geth with your genesis file -../op-geth/build/bin/geth init --datadir=./op-geth-data --state.scheme=hash ./genesis.json -``` - -### Start op-geth - -```bash -# Make scripts executable -chmod +x scripts/start-op-geth.sh -chmod +x scripts/start-op-node.sh - -# Start op-geth in the background or in a separate terminal -./scripts/start-op-geth.sh -``` - -**Note**: You should see output indicating that op-geth is starting and listening on the configured ports. - -### Start op-node - -```bash -# In a separate terminal, navigate to the sequencer directory -cd ~/sequencer-node - -# Start op-node -./scripts/start-op-node.sh -``` - -### Verify sequencer is running - -Once both services are running, verify they're working correctly: - -```bash -# Check op-geth is responding, do this in another terminal -curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - http://localhost:8545 - -# Check sequencer status -curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"admin_sequencerActive","params":[],"id":1}' \ - http://localhost:8547 -``` - - - -Your sequencer node is now operational and ready to process transactions. - -### Docker alternative (For containerized environments) - -If you prefer containerized deployment, you can use the official Docker images. - -### Complete Docker setup guide - -
- Complete Docker setup guide - - If you choose the Docker approach, you'll need to: - - 1. **Set up directory structure and copy configuration files:** - - ```bash - # Create your sequencer working directory - mkdir ~/sequencer-node - cd ~/sequencer-node - - # Copy configuration files from op-deployer output - # Note: Adjust the path if your .deployer directory is located elsewhere - cp ~/.deployer/genesis.json . - cp ~/.deployer/rollup.json . - - # Generate JWT secret - openssl rand -hex 32 > jwt.txt - chmod 600 jwt.txt - ``` - - 2. **Create environment variables file:** - - ```bash - # Create .env file with your actual values - cat > .env << 'EOF' - # L1 Configuration - Replace with your actual RPC URLs - L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY - L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com - - # Private keys - Replace with your actual private key - PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY - - # (Run `curl ifconfig.me` in a separate shell to obtain the value, then paste it below) - - # P2P configuration - Replace with your actual public IP - P2P_ADVERTISE_IP=YOUR_ACTUAL_PUBLIC_IP - - EOF - ``` - - **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. - - 3. **Create docker-compose.yml:** - - ```yaml -version: '3.8' - -services: - op-geth: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 - volumes: - # Mount entire directory to avoid file mounting issues - - .:/workspace - working_dir: /workspace - ports: - - "8545:8545" - - "8546:8546" - - "8551:8551" - command: - - "--datadir=/workspace/op-geth-data" - - "--http" - - "--http.addr=0.0.0.0" - - "--http.port=8545" - - "--ws" - - "--ws.addr=0.0.0.0" - - "--ws.port=8546" - - "--authrpc.addr=0.0.0.0" - - "--authrpc.port=8551" - - "--authrpc.jwtsecret=/workspace/jwt.txt" - - "--syncmode=full" - - "--gcmode=archive" - - "--rollup.disabletxpoolgossip=true" - - "--rollup.sequencerhttp=http://op-node:8547" - - "--http.vhosts=*" - - "--http.corsdomain=*" - - "--http.api=eth,net,web3,debug,txpool,admin" - - "--ws.origins=*" - - "--ws.api=eth,net,web3,debug,txpool,admin" - - "--authrpc.vhosts=*" - - op-node: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 - depends_on: - - op-geth - volumes: - - .:/workspace - working_dir: /workspace - ports: - - "8547:8547" - - "9222:9222" - environment: - - L1_RPC_URL=${L1_RPC_URL} - - L1_BEACON_URL=${L1_BEACON_URL} - - PRIVATE_KEY=${PRIVATE_KEY} - - P2P_ADVERTISE_IP=${P2P_ADVERTISE_IP} - command: - - "op-node" - - "--l1=${L1_RPC_URL}" - - "--l1.beacon=${L1_BEACON_URL}" - - "--l2=http://op-geth:8551" - - "--l2.jwt-secret=/workspace/jwt.txt" - - "--rollup.config=/workspace/rollup.json" - - "--sequencer.enabled=true" - - "--sequencer.stopped=false" - - "--sequencer.max-safe-lag=3600" - - "--verifier.l1-confs=4" - - "--p2p.listen.ip=0.0.0.0" - - "--p2p.listen.tcp=9222" - - "--p2p.listen.udp=9222" - - "--p2p.advertise.ip=${P2P_ADVERTISE_IP}" - - "--p2p.advertise.tcp=9222" - - "--p2p.advertise.udp=9222" - - "--p2p.sequencer.key=${PRIVATE_KEY}" - - "--rpc.addr=0.0.0.0" - - "--rpc.port=8547" - - "--rpc.enable-admin" - - "--log.level=info" - - "--log.format=json" - ``` - - 4. **Initialize op-geth with Docker:** - - ```bash - # Make sure you're in the sequencer-node directory with all files copied - cd ~/sequencer-node - - # Initialize op-geth using Docker - docker run --rm \ - -v $(pwd):/workspace \ - -w /workspace \ - us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 \ - init --datadir=./op-geth-data --state.scheme=hash ./genesis.json - ``` - - 5. **Start the services:** - - ```bash - # Start both services - docker-compose up -d - - # View logs - docker-compose logs -f - ``` - - 6. **Final directory structure:** - - ```bash - ~/sequencer-node/ - ├── jwt.txt # Generated JWT secret - ├── genesis.json # Copied from ~/.deployer/ - ├── rollup.json # Copied from ~/.deployer/ - ├── .env # Environment variables - ├── docker-compose.yml # Docker configuration - └── op-geth-data/ # Created by Docker during initialization - ├── geth/ # Geth data - └── keystore/ # Key files - ``` - -
- -Your sequencer node is now operational and ready to process transactions. + source .env + + # Path to the op-node binary we built + ../optimism/op-node/bin/op-node \ + --l1=$L1_RPC_URL \ + --l1.beacon=$L1_BEACON_URL \ + --l2=http://localhost:$OP_GETH_AUTH_PORT \ + --l2.jwt-secret=$JWT_SECRET \ + --rollup.config=./rollup.json \ + --sequencer.enabled=$SEQUENCER_ENABLED \ + --sequencer.stopped=$SEQUENCER_STOPPED \ + --sequencer.max-safe-lag=3600 \ + --verifier.l1-confs=4 \ + --p2p.listen.ip=0.0.0.0 \ + --p2p.listen.tcp=$P2P_LISTEN_PORT \ + --p2p.listen.udp=$P2P_LISTEN_PORT \ + --p2p.advertise.ip=$P2P_ADVERTISE_IP \ + --p2p.advertise.tcp=$P2P_LISTEN_PORT \ + --p2p.advertise.udp=$P2P_LISTEN_PORT \ + --p2p.sequencer.key=$PRIVATE_KEY \ + --rpc.addr=0.0.0.0 \ + --rpc.port=$OP_NODE_RPC_PORT \ + --rpc.enable-admin \ + --log.level=info \ + --log.format=json + ``` + + ## Initializing and starting the sequencer + + + + ### Initialize op-geth with your genesis file + + ```bash + # Make sure you're in the sequencer-node directory + cd ~/sequencer-node + + # Initialize op-geth with your genesis file + ../op-geth/build/bin/geth init --datadir=./op-geth-data --state.scheme=hash ./genesis.json + ``` + + ### Start op-geth + + ```bash + # Make scripts executable + chmod +x scripts/start-op-geth.sh + chmod +x scripts/start-op-node.sh + + # Start op-geth in the background or in a separate terminal + ./scripts/start-op-geth.sh + ``` + + **Note**: You should see output indicating that op-geth is starting and listening on the configured ports. + + ### Start op-node + + ```bash + # In a separate terminal, navigate to the sequencer directory + cd ~/sequencer-node + + # Start op-node + ./scripts/start-op-node.sh + ``` + + ### Verify sequencer is running + + Once both services are running, verify they're working correctly: + + ```bash + # Check op-geth is responding, do this in another terminal + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + http://localhost:8545 + + # Check sequencer status + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"admin_sequencerActive","params":[],"id":1}' \ + http://localhost:8547 + ``` + + + Your sequencer node is now operational and ready to process transactions. + +
+ + + If you prefer containerized deployment, you can use the official Docker images, and do the following: + + 1. **Set up directory structure and copy configuration files:** + + ```bash + # Create your sequencer working directory + mkdir ~/sequencer-node + cd ~/sequencer-node + + # Copy configuration files from op-deployer output + # Note: Adjust the path if your .deployer directory is located elsewhere + cp ~/.deployer/genesis.json . + cp ~/.deployer/rollup.json . + + # Generate JWT secret + openssl rand -hex 32 > jwt.txt + chmod 600 jwt.txt + ``` + + 2. **Create environment variables file:** + + ```bash + # Create .env file with your actual values + cat > .env << 'EOF' + # L1 Configuration - Replace with your actual RPC URLs + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com + + # Private keys - Replace with your actual private key + PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + + # (Run `curl ifconfig.me` in a separate shell to obtain the value, then paste it below) + + # P2P configuration - Replace with your actual public IP + P2P_ADVERTISE_IP=YOUR_ACTUAL_PUBLIC_IP + + EOF + ``` + + **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. + + 3. **Create docker-compose.yml:** + + ```yaml + version: '3.8' + + services: + op-geth: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 + volumes: + # Mount entire directory to avoid file mounting issues + - .:/workspace + working_dir: /workspace + ports: + - "8545:8545" + - "8546:8546" + - "8551:8551" + command: + - "--datadir=/workspace/op-geth-data" + - "--http" + - "--http.addr=0.0.0.0" + - "--http.port=8545" + - "--ws" + - "--ws.addr=0.0.0.0" + - "--ws.port=8546" + - "--authrpc.addr=0.0.0.0" + - "--authrpc.port=8551" + - "--authrpc.jwtsecret=/workspace/jwt.txt" + - "--syncmode=full" + - "--gcmode=archive" + - "--rollup.disabletxpoolgossip=true" + - "--rollup.sequencerhttp=http://op-node:8547" + - "--http.vhosts=*" + - "--http.corsdomain=*" + - "--http.api=eth,net,web3,debug,txpool,admin" + - "--ws.origins=*" + - "--ws.api=eth,net,web3,debug,txpool,admin" + - "--authrpc.vhosts=*" + + op-node: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 + depends_on: + - op-geth + volumes: + - .:/workspace + working_dir: /workspace + ports: + - "8547:8547" + - "9222:9222" + environment: + - L1_RPC_URL=${L1_RPC_URL} + - L1_BEACON_URL=${L1_BEACON_URL} + - PRIVATE_KEY=${PRIVATE_KEY} + - P2P_ADVERTISE_IP=${P2P_ADVERTISE_IP} + command: + - "op-node" + - "--l1=${L1_RPC_URL}" + - "--l1.beacon=${L1_BEACON_URL}" + - "--l2=http://op-geth:8551" + - "--l2.jwt-secret=/workspace/jwt.txt" + - "--rollup.config=/workspace/rollup.json" + - "--sequencer.enabled=true" + - "--sequencer.stopped=false" + - "--sequencer.max-safe-lag=3600" + - "--verifier.l1-confs=4" + - "--p2p.listen.ip=0.0.0.0" + - "--p2p.listen.tcp=9222" + - "--p2p.listen.udp=9222" + - "--p2p.advertise.ip=${P2P_ADVERTISE_IP}" + - "--p2p.advertise.tcp=9222" + - "--p2p.advertise.udp=9222" + - "--p2p.sequencer.key=${PRIVATE_KEY}" + - "--rpc.addr=0.0.0.0" + - "--rpc.port=8547" + - "--rpc.enable-admin" + - "--log.level=info" + - "--log.format=json" + ``` + + 4. **Initialize op-geth with Docker:** + + ```bash + # Make sure you're in the sequencer-node directory with all files copied + cd ~/sequencer-node + + # Initialize op-geth using Docker + docker run --rm \ + -v $(pwd):/workspace \ + -w /workspace \ + us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 \ + init --datadir=./op-geth-data --state.scheme=hash ./genesis.json + ``` + + 5. **Start the services:** + + ```bash + # Start both services + docker-compose up -d + + # View logs + docker-compose logs -f + ``` + + 6. **Final directory structure:** + + ```bash + ~/sequencer-node/ + ├── jwt.txt # Generated JWT secret + ├── genesis.json # Copied from ~/.deployer/ + ├── rollup.json # Copied from ~/.deployer/ + ├── .env # Environment variables + ├── docker-compose.yml # Docker configuration + └── op-geth-data/ # Created by Docker during initialization + ├── geth/ # Geth data + └── keystore/ # Key files + ``` + + Your sequencer node is now operational and ready to process transactions. + + + +
## Next steps diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx deleted file mode 100644 index 0b2493f8d..000000000 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ /dev/null @@ -1,445 +0,0 @@ ---- -title: Creating your own L2 rollup testnet -description: Learn how to orchestrate and integrate all OP Stack components for a complete testnet deployment. -lang: en-US -content_type: tutorial -topic: creating-your-own-l2-rollup-testnet -personas: - - chain-operator -categories: - - testnet - - chain-deployment - - op-deployer - - sequencer - - batcher - - proposer - - challenger - - integration -is_imported_content: 'false' ---- - -import { Callout, Card, Steps } from 'nextra/components' - -# Creating your own L2 rollup testnet - -This tutorial focuses on **orchestrating and integrating** all OP Stack components for a complete testnet deployment. Rather than repeating component-specific installation details, this guide emphasizes the unique challenges of getting all components working together seamlessly. - -## What you'll deploy - -This tutorial will guide you through setting up: - -1. **L1 Smart Contracts** - The core contracts on Sepolia testnet -2. **Execution Client** (op-geth) - Processes transactions and maintains state -3. **Consensus Client** (op-node) - Manages rollup consensus and L1 synchronization -4. **Batcher** (op-batcher) - Publishes transaction data to L1 -5. **Proposer** (op-proposer) - Submits state root proposals to L1 -6. **Challenger** (op-challenger) - Monitors and disputes invalid state roots - - - This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. - - -## Prerequisites - -### Component Installation - -This tutorial requires several OP Stack components. Install them using the specialized guides: - -| Component | Installation Guide | Purpose | -| ----------------- | -------------------------------------------------------------------------------------------- | ------------------------- | -| **op-deployer** | [Installation Guide](/operators/chain-operators/tools/op-deployer#installation) | Smart contract deployment | -| **op-geth** | [Build Guide](/operators/chain-operators/deploy/sequencer-node#building-op-geth) | Execution client | -| **op-node** | [Build Guide](/operators/chain-operators/deploy/sequencer-node#building-optimism-components) | Consensus client | -| **op-batcher** | [Build Guide](/operators/chain-operators/deploy/spin-batcher#build-the-software) | Transaction batching | -| **op-proposer** | [Build Guide](/operators/chain-operators/deploy/proposer-setup-guide#building-the-proposer) | State root proposals | -| **op-challenger** | [Build Guide](/operators/chain-operators/tools/op-challenger#build-the-executable) | Dispute monitoring | - -### Testnet Requirements - -For this tutorial, you'll need: - -* **Sepolia RPC URL** - Get from [Alchemy](https://www.alchemy.com/), [Infura](https://infura.io/), or [QuickNode](https://www.quicknode.com/) -* **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) (\~2-3 ETH recommended) -* **Private Keys** - For deployer, admin, batcher, proposer, and sequencer roles (5 separate keys) - - - **Security Note**: Never use testnet private keys in production. Generate fresh keys for mainnet deployments. - - -## Step 1: Verify Component Installation - -Before starting the deployment, verify all required components are properly installed: - - - ### Verify installations - - ```bash - # Verify all components are available - op-deployer --version - op-geth version - op-node --version - op-batcher --version - op-proposer --version - op-challenger --version - ``` - - If any component is missing, install it using the links in the [Prerequisites](#prerequisites) section. - - ### Set up workspace - - Create and organize your deployment workspace: - - ```bash - mkdir testnet-rollup && cd testnet-rollup - mkdir -p .deployer logs data components - ``` - - -## Step 2: Initialize deployment configuration - - - ### Set network parameters - - ```bash - # Sepolia L1 chain ID - export L1_CHAIN_ID=11155111 - # Your custom L2 chain ID (choose any unique number) - export L2_CHAIN_ID=42069 - ``` - - ### Initialize deployment workspace - - ```bash - ./op-deployer init --l1-chain-id $L1_CHAIN_ID --l2-chain-ids $L2_CHAIN_ID --workdir .deployer - ``` - - This creates a `.deployer` directory with initial configuration files. - - ### Configure deployment intent - - Edit the generated intent file to specify your deployment parameters: - - ```bash - # Edit the intent file with your preferred text editor - # For example: nano, vim, code, or any text editor - nano .deployer/intent.toml - ``` - - Update the `[[chains]]` section with your wallet addresses and preferences. For detailed configuration options, see the [op-deployer configuration guide](/operators/chain-operators/tools/op-deployer#configuration). - - -## Step 3: Deploy L1 Smart Contracts - -Deploy the L1 smart contracts and generate chain artifacts: - - - ### Quick deployment - - ```bash - # Set deployment parameters - export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" - export DEPLOYER_PRIVATE_KEY="0xYOUR_PRIVATE_KEY" - - # Deploy contracts and generate artifacts - op-deployer apply --workdir .deployer --l1-rpc-url $L1_RPC_URL --private-key $DEPLOYER_PRIVATE_KEY - op-deployer inspect genesis --workdir .deployer $L2_CHAIN_ID > .deployer/genesis.json - op-deployer inspect rollup --workdir .deployer $L2_CHAIN_ID > .deployer/rollup.json - op-deployer inspect l1 --workdir .deployer $L2_CHAIN_ID > .deployer/l1-contracts.json - ``` - - ### Verify deployment - - ```bash - # Check that all artifacts were generated - ls -la .deployer/ - # Should show: genesis.json, rollup.json, l1-contracts.json, state.json - ``` - - -**For detailed contract deployment and configuration**: [Smart Contract Deployment Guide](/operators/chain-operators/deploy/smart-contracts) - -## Step 4: Environment Setup and Configuration - -Set up the runtime environment and configuration files for component integration: - - - ### Generate JWT secret - - Create a shared JWT secret for op-geth and op-node authentication: - - ```bash - # Generate JWT secret - openssl rand -hex 32 > jwt.txt - echo "JWT secret generated: jwt.txt" - ``` - - ### Set up environment variables - - Configure environment variables for all components: - - ```bash - # L1 and L2 configuration - export L1_CHAIN_ID=11155111 - export L2_CHAIN_ID=42069 - export L1_RPC_URL="https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY" - export L1_BEACON_URL="https://ethereum-sepolia-beacon-api.publicnode.com" - export L1_RPC_KIND="alchemy" - - # Component private keys (use different keys for each role) - export GS_SEQUENCER_PRIVATE_KEY="0xYOUR_SEQUENCER_PRIVATE_KEY" - export GS_BATCHER_PRIVATE_KEY="0xYOUR_BATCHER_PRIVATE_KEY" - export GS_PROPOSER_PRIVATE_KEY="0xYOUR_PROPOSER_PRIVATE_KEY" - export GS_CHALLENGER_PRIVATE_KEY="0xYOUR_CHALLENGER_PRIVATE_KEY" - - # Extract contract addresses from deployment - export OP_PROPOSER_GAME_FACTORY_ADDRESS=$(cat .deployer/l1-contracts.json | jq -r .opChainDeployment.disputeGameFactoryProxyAddress) - ``` - - ### Organize configuration files - - ```bash - # Copy configuration files to accessible locations - cp .deployer/genesis.json ./genesis.json - cp .deployer/rollup.json ./rollup.json - cp jwt.txt ./jwt.txt - ``` - - -**For detailed component building**: See individual component guides in [Prerequisites](#prerequisites) - -## Step 5: Start op-geth (Execution Layer) - -**Start components in order**: op-geth must be running before starting op-node. - - - ### Initialize op-geth - - ```bash - # Initialize the data directory - mkdir -p data/geth - op-geth init --state.scheme=hash --datadir=data/geth genesis.json - ``` - - ### Start op-geth - - ```bash - # Start in a new terminal window - op-geth \ - --datadir=./op-geth-data \ - --http \ - --http.addr=0.0.0.0 \ - --http.port=$OP_GETH_HTTP_PORT \ - --http.vhosts="*" \ - --http.corsdomain="*" \ - --http.api=eth,net,web3,debug,txpool,admin \ - --ws \ - --ws.addr=0.0.0.0 \ - --ws.port=$OP_GETH_WS_PORT \ - --ws.origins="*" \ - --ws.api=eth,net,web3,debug,txpool,admin \ - --authrpc.addr=0.0.0.0 \ - --authrpc.port=$OP_GETH_AUTH_PORT \ - --authrpc.vhosts="*" \ - --authrpc.jwtsecret=$JWT_SECRET \ - --syncmode=full \ - --gcmode=archive \ - --rollup.disabletxpoolgossip=true \ - --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT - ``` - - ### Verify op-geth is running - - ```bash - # Check if op-geth is responding (wait ~30 seconds after startup) - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - http://localhost:8545 - - # Should return: {"jsonrpc":"2.0","id":1,"result":"0x0"} - ``` - - -**For detailed op-geth configuration**: [Sequencer Node Setup](/operators/chain-operators/deploy/sequencer-node) - -## Step 6: Start op-node (Consensus Layer) - -**Prerequisite**: op-geth must be running and verified before starting op-node. - - - ### Start op-node - - ```bash - # Start in a new terminal window (ensure op-geth is running first) - op-node \ - --l2=http://localhost:8551 \ - --l2.jwt-secret=./jwt.txt \ - --sequencer.enabled \ - --sequencer.l1-confs=5 \ - --verifier.l1-confs=4 \ - --rollup.config=./rollup.json \ - --rpc.addr=0.0.0.0 --rpc.port=9545 \ - --p2p.disable \ - --rpc.enable-admin \ - --p2p.sequencer.key=$GS_SEQUENCER_PRIVATE_KEY \ - --l1=$L1_RPC_URL \ - --l1.rpckind=$L1_RPC_KIND \ - --l1.beacon=$L1_BEACON_URL - ``` - - ### Verify op-node sync - - ```bash - # Check op-node status (wait ~1 minute after startup) - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' \ - http://localhost:9545 - - # Verify L2 block production - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - http://localhost:8545 - ``` - - -**For detailed op-node configuration**: [Sequencer Node Setup](/operators/chain-operators/deploy/sequencer-node) - -## Step 7: Start op-batcher (Data Publishing) - -**Prerequisite**: Both op-geth and op-node must be running and synced. - - - ### Start op-batcher - - ```bash - # Start in a new terminal window - op-batcher \ - --l2-eth-rpc=http://localhost:8545 \ - --rollup-rpc=http://localhost:9545 \ - --poll-interval=1s \ - --sub-safety-margin=6 \ - --num-confirmations=1 \ - --safe-abort-nonce-too-low-count=3 \ - --resubmission-timeout=30s \ - --rpc.addr=0.0.0.0 --rpc.port=8548 \ - --rpc.enable-admin \ - --max-channel-duration=25 \ - --l1-eth-rpc=$L1_RPC_URL \ - --private-key=$GS_BATCHER_PRIVATE_KEY - ``` - - ### Verify op-batcher - - ```bash - # Check batcher health (wait ~2 minutes after startup) - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' \ - http://localhost:8548 - - # Monitor for batch submissions in batcher logs - # Look for: "batch submitted successfully" or "published transaction" - ``` - - -**For detailed batcher configuration**: [op-batcher Deployment Guide](/operators/chain-operators/deploy/spin-batcher) - -## Step 8: Start op-proposer (State Root Proposals) - -**Prerequisite**: All previous components must be running and healthy. - - - ### Start op-proposer - - ```bash - # Start in a new terminal window - op-proposer \ - --poll-interval=12s \ - --rpc.port=8560 \ - --rollup-rpc=http://localhost:9545 \ - --game-factory-address=$OP_PROPOSER_GAME_FACTORY_ADDRESS \ - --proposal-interval=4m \ - --game-type=1 \ - --private-key=$GS_PROPOSER_PRIVATE_KEY \ - --l1-eth-rpc=$L1_RPC_URL - ``` - - ### Verify op-proposer - - ```bash - # Check proposer health (wait ~1 minute after startup) - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}' \ - http://localhost:8560 - - # Monitor for state root proposals in proposer logs - # Look for: "state update proposal confirmed" or "proposal submitted" - ``` - - -**For detailed proposer configuration**: [op-proposer Deployment Guide](/operators/chain-operators/deploy/proposer-setup-guide) - -## Step 9: Start op-challenger (Dispute Monitoring) - -**Prerequisite**: All other components must be running and proposing state roots. - - - ### Start op-challenger - - ```bash - # Start in a new terminal window - mkdir -p data/challenger - op-challenger \ - --trace-type=permissioned,cannon \ - --l1-eth-rpc=$L1_RPC_URL \ - --l2-eth-rpc=http://localhost:8545 \ - --rollup-rpc=http://localhost:9545 \ - --private-key=$GS_CHALLENGER_PRIVATE_KEY \ - --network=op-sepolia \ - --datadir=./data/challenger - ``` - - ### Verify op-challenger - - ```bash - # Check challenger health (wait ~1 minute after startup) - # Challenger doesn't have an RPC endpoint, monitor logs for: - # "monitoring dispute games" or "challenger started successfully" - - # Verify challenger is monitoring the game factory - echo "Monitor challenger logs for dispute game monitoring messages" - ``` - - -**For detailed challenger configuration**: [op-challenger Configuration Guide](/operators/chain-operators/tools/op-challenger) - -### Configure dispute resolution (Optional) - -```bash -# Get the Game Factory address for manual configuration -echo "Game Factory Address: $OP_PROPOSER_GAME_FACTORY_ADDRESS" -echo "Visit: https://sepolia.etherscan.io/address/$OP_PROPOSER_GAME_FACTORY_ADDRESS#writeProxyContract" -echo "Call setInitBond with _gameType: 1, _initBond: 800000000000000" -``` - -## Troubleshooting - -Common integration issues and solutions: - - - **Component Dependencies**: Always start components in order: op-geth → op-node → op-batcher → op-proposer → op-challenger - - -### Common Issues - -| Problem | Symptom | Solution | -| ----------------------------- | ---------------------------- | ------------------------------------------------------- | -| **op-node won't sync** | "connection refused" errors | Verify op-geth is running and JWT secret matches | -| **Batcher not submitting** | No batch submissions in logs | Check L1 RPC connection and batcher private key has ETH | -| **Proposer not proposing** | No state root proposals | Verify rollup-rpc connection and proposal interval | -| **Challenger not monitoring** | No dispute monitoring logs | Check network parameter and L1/L2 RPC connections | - -## Next steps - -* **Join the Superchain**: Learn about [Superchain compatibility](/superchain/superchain-explainer) -* **Deploy to mainnet**: Follow the [mainnet deployment guide](/operators/chain-operators/deploy/overview) -* **Add features**: Explore [OP Stack features](/stack/features) you can enable -* **Community support**: Join the [Optimism Discord](https://discord.gg/optimism) for help diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/_meta.json b/pages/operators/chain-operators/tutorials/create-l2-rollup/_meta.json new file mode 100644 index 000000000..43db0cad0 --- /dev/null +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/_meta.json @@ -0,0 +1,8 @@ +{ + "index": "Overview", + "op-deployer-setup": "Spin up op-deployer", + "op-geth-setup": "Spin up sequencer", + "op-batcher-setup": "Spin up batcher", + "op-proposer-setup": "Spin up proposer", + "op-challenger-setup": "Spin up challenger" +} diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/index.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/index.mdx new file mode 100644 index 000000000..803d48a7a --- /dev/null +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/index.mdx @@ -0,0 +1,94 @@ +--- +title: Creating your own L2 rollup testnet - Overview +description: Learn how to deploy and orchestrate all OP Stack components for a complete testnet deployment. +lang: en-US +content_type: tutorial +topic: creating-your-own-l2-rollup-testnet +personas: + - chain-operator +categories: + - testnet + - chain-deployment + - op-deployer + - sequencer + - batcher + - proposer + - challenger + - integration +is_imported_content: 'false' +--- + +import { Callout, Card, Steps } from 'nextra/components' + +# Creating your own L2 rollup testnet + +Welcome to the complete guide for deploying your own OP Stack L2 rollup testnet. This multi-part tutorial will walk you through each component step-by-step, from initial setup to a fully functioning rollup. + +## Tutorial Overview + +This tutorial is organized into sequential steps that build upon each other: + + + ### **[Spin up op-deployer](./op-deployer-setup)** + + Install op-deployer, deploy L1 contracts, and prepare your environment + + ### **[Spin up sequencer](./op-geth-setup)** + + Set up and run op-geth and op-node (the execution and consensus layers) + + ### **[Spin up batcher](./op-batcher-setup)** + + Configure and start op-batcher for L1 data publishing + + ### **[Spin up proposer](./op-proposer-setup)** + + Set up op-proposer for state root submissions + + ### **[Spin up challenger](./op-challenger-setup)** + + Configure op-challenger for dispute resolution monitoring + + +## What You'll Build + +By the end of this tutorial, you'll have a complete OP Stack testnet with: + +* **L1 Smart Contracts** deployed on Sepolia testnet +* **Execution Client** (op-geth) processing transactions +* **Consensus Client** (op-node) managing rollup consensus +* **Batcher** (op-batcher) publishing transaction data to L1 +* **Proposer** (op-proposer) submitting state root proposals +* **Challenger** (op-challenger) monitoring for disputes + + + **Testnet Only**: This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. + + +## Before You Start + +### Required Resources + +* **Sepolia RPC URL** - Get from [Alchemy](https://www.alchemy.com/), [Infura](https://infura.io/), or [QuickNode](https://www.quicknode.com/) +* **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) (\~2-3 ETH recommended) +* **Private Keys** - You'll need 5 separate keys for different roles (we'll generate these in the first step) + + + **Follow in Order**: Each step builds on the previous one. Start with spinning up op-deployer and complete them sequentially for the best experience. + + +## Ready to Start? + +Now that you understand what you'll be building, let's begin with the first step! + + + **Next**: Install op-deployer, prepare your environment, and set up the foundation for your rollup deployment. + + +*** + +## Need Help? + +* **Community Support**: Join the [Optimism Discord](https://discord.gg/optimism) +* **Development Questions**: Visit [Developer Support](https://github.com/ethereum-optimism/developers/discussions) +* **Issues**: Report bugs on [GitHub](https://github.com/ethereum-optimism/optimism/issues) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx new file mode 100644 index 000000000..9ce1c5786 --- /dev/null +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -0,0 +1,467 @@ +--- +title: Spin up batcher +lang: en-US +description: Learn how to set up and configure an OP Stack batcher to submit L2 transaction batches to L1. +content_type: tutorial +topic: batcher-setup +personas: + - chain-operator +categories: + - testnet + - mainnet + - op-batcher + - batch-submission + - l2-to-l1-data + - transaction-batching +is_imported_content: 'false' +--- + +import { Callout, Steps, Card, Tabs } from 'nextra/components' + +# Spin up batcher + +After you have spun up your sequencer, you need to configure a batcher to submit L2 transaction batches to L1. The batcher is a critical component that ensures L2 transaction data is available on L1 for data availability and enables users to reconstruct the L2 state. + + + **Step 3 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the previous one. + + +This guide assumes you already have a functioning sequencer and the necessary L1 contracts deployed using op-deployer. If you haven't set up your sequencer yet, please refer to the [sequencer guide](./op-geth-setup) first. + +## Understanding the batcher's role + +The batcher (`op-batcher`) serves as a crucial component that bridges your L2 chain data to L1. Its primary responsibilities include: + +* **Batch submission**: Collecting L2 transactions and submitting them as batches to L1 +* **Data availability**: Ensuring L2 transaction data is available on L1 for verification +* **Cost optimization**: Compressing and efficiently packing transaction data to minimize L1 costs +* **Channel management**: Managing data channels for optimal batch submission timing + +The batcher reads transaction data from your sequencer and submits compressed batches to the `BatchInbox` contract on L1. + +## Prerequisites + +Before setting up your batcher, ensure you have: + +**Running infrastructure:** + +* An operational sequencer node +* Access to a L1 RPC endpoint + +**Network information:** + +* Your L2 chain ID and network configuration +* L1 network details (chain ID, RPC endpoints) +* `BatchInbox` contract address from your deployment + +## Software installation + +### Finding the current stable releases + +To ensure you're using the latest compatible versions of OP Stack components, always check the official [releases page](https://github.com/ethereum-optimism/optimism/releases). + +Look for the latest `op-batcher/v*` release that's compatible with your sequencer setup. + + + This guide uses `op-batcher/v1.13.1` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.0 from the sequencer setup. + Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information. + + +For setting up the batcher, we recommend building from source as it provides better control and helps with debugging. Docker alternative is also provided. + + + + Building from source gives you full control over the binaries and is the preferred approach for this guide. + + + ### Clone and build op-batcher + + ```bash + # If you don't already have the optimism repository from the sequencer setup + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism + + # Checkout the latest release tag + git checkout op-batcher/v1.13.1 + + # Build op-batcher + cd op-batcher + just + + # Binary will be available at ./bin/op-batcher + ``` + + ### Verify installation + + Run this command to verify the installation: + + ```bash + ./bin/op-batcher --version + ``` + + + + + If you prefer containerized deployment, you can use the official Docker images and do the following: + + + ### Set up directory structure and copy configuration files + + ```bash + # Create your batcher working directory + mkdir ~/batcher-node + cd ~/batcher-node + + # Copy configuration files from op-deployer output + # Note: Adjust the path if your .deployer directory is located elsewhere + cp ~/.deployer/state.json . + + # Extract the BatchInbox address + BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].systemConfigProxyAddress') + echo "BatchInbox Address: $BATCH_INBOX_ADDRESS" + ``` + + ### Create environment variables file + + ```bash + # Create .env file with your actual values + cat > .env << 'EOF' + # L1 Configuration - Replace with your actual RPC URLs + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + + # L2 Configuration - Should match your sequencer setup + L2_RPC_URL=http://sequencer-node:8545 + ROLLUP_RPC_URL=http://sequencer-node:8547 + + # Contract addresses - Extract from your op-deployer output + BATCH_INBOX_ADDRESS=YOUR_ACTUAL_BATCH_INBOX_ADDRESS + + # Private key - Replace with your actual private key + BATCHER_PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + + # Batcher configuration + POLL_INTERVAL=1s + SUB_SAFETY_MARGIN=6 + NUM_CONFIRMATIONS=1 + SAFE_ABORT_NONCE_TOO_LOW_COUNT=3 + RESUBMISSION_TIMEOUT=30s + MAX_CHANNEL_DURATION=25 + + # RPC configuration + BATCHER_RPC_PORT=8548 + EOF + ``` + + **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. + + ### Create docker-compose.yml + + + This configuration assumes your sequencer is running in a Docker container named `sequencer-node` on the same `op-stack` network. + Make sure your sequencer is running before starting the batcher. + + + ```yaml + version: '3.8' + + services: + op-batcher: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:v1.13.1 + volumes: + - .:/workspace + working_dir: /workspace + ports: + - "8548:8548" + env_file: + - .env + command: + - "op-batcher" + - "--l2-eth-rpc=${L2_RPC_URL}" + - "--rollup-rpc=${ROLLUP_RPC_URL}" + - "--poll-interval=${POLL_INTERVAL}" + - "--sub-safety-margin=${SUB_SAFETY_MARGIN}" + - "--num-confirmations=${NUM_CONFIRMATIONS}" + - "--safe-abort-nonce-too-low-count=${SAFE_ABORT_NONCE_TOO_LOW_COUNT}" + - "--resubmission-timeout=${RESUBMISSION_TIMEOUT}" + - "--rpc.addr=0.0.0.0" + - "--rpc.port=${BATCHER_RPC_PORT}" + - "--rpc.enable-admin" + - "--max-channel-duration=${MAX_CHANNEL_DURATION}" + - "--l1-eth-rpc=${L1_RPC_URL}" + - "--private-key=${BATCHER_PRIVATE_KEY}" + - "--batch-type=1" + - "--data-availability-type=blobs" + - "--compress" + - "--log.level=info" + restart: unless-stopped + ``` + + ### Start the batcher service + + ```bash + # Make sure your sequencer network exists + docker network create op-stack 2>/dev/null || true + + # Start the batcher + docker-compose up -d + + # View logs + docker-compose logs -f op-batcher + ``` + + ### Verify batcher is running + + ```bash + # Check batcher RPC is responding + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"admin_startBatcher","params":[],"id":1}' \ + http://localhost:8548 + + # Check container status + docker-compose ps + ``` + + ### Final directory structure + + ```bash + ~/batcher-node/ + ├── state.json # Copied from ~/.deployer/ + ├── .env # Environment variables + └── docker-compose.yml # Docker configuration + ``` + + + Your batcher is now operational and will continuously submit L2 transaction batches to L1! + + + +## Configuration setup + + + The rest of this guide assumes you're using the **build-from-source** approach. + If you chose Docker, all the necessary configuration was covered in the Docker tab above. + + + + ### Organize your workspace + + Create your batcher working directory: + + ```bash + # Create batcher directory at the same level as your sequencer + mkdir batcher-node + cd batcher-node + + # Create scripts directory + mkdir scripts + ``` + + Your final directory structure should look like: + + ```bash + ~/ + ├── optimism/ # Contains op-batcher binary + ├── sequencer-node/ # Your sequencer setup + ├── proposer-node/ # Your proposer setup + ├── .deployer/ # From op-deployer + │ └── state.json + └── batcher-node/ # Your batcher working directory + ├── state.json # Copied from .deployer + ├── .env + └── scripts/ + └── start-batcher.sh + ``` + + ### Extract BatchInbox address + + Extract the `BatchInbox` contract address from your op-deployer output: + + ```bash + # Navigate to batcher directory + cd ~/batcher-node + + # Copy the deployment state file from op-deployer + # Update the path if your .deployer directory is located elsewhere + cp ../.deployer/state.json . + + # Extract the BatchInbox address + BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].systemConfigProxyAddress') + echo "BatchInbox Address: $BATCH_INBOX_ADDRESS" + ``` + + + The batcher submits transaction batches to the `BatchInbox` contract on L1. This contract is responsible for accepting and storing L2 transaction data. + + + ### Set up environment variables + + Create your `.env` file with the actual values: + + ```bash + # Create .env file with your actual values + # L1 Configuration - Replace with your actual RPC URL + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + + # L2 Configuration - Should match your sequencer setup + L2_RPC_URL=http://localhost:8545 + ROLLUP_RPC_URL=http://localhost:8547 + + # Contract addresses - Extract from your op-deployer output + BATCH_INBOX_ADDRESS=YOUR_ACTUAL_BATCH_INBOX_ADDRESS + + # Private key - Replace with your actual private key + BATCHER_PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + + # Batcher configuration + POLL_INTERVAL=1s + SUB_SAFETY_MARGIN=6 + NUM_CONFIRMATIONS=1 + SAFE_ABORT_NONCE_TOO_LOW_COUNT=3 + RESUBMISSION_TIMEOUT=30s + MAX_CHANNEL_DURATION=25 + + # RPC configuration + BATCHER_RPC_PORT=8548 + ``` + + **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values! + + ### Get your private key + + Get a private key from your wallet that will be used for submitting batches to L1. This account needs sufficient ETH to pay for L1 gas costs. + + + The batcher account needs to be funded with ETH on L1 to pay for batch submission transactions. Monitor this account's balance regularly as it will consume ETH for each batch submission. + + + +## Batcher configuration + +Create `scripts/start-batcher.sh`: + +```bash +#!/bin/bash + +source .env + +# Path to the op-batcher binary we built +../optimism/op-batcher/bin/op-batcher \ + --l2-eth-rpc=$L2_RPC_URL \ + --rollup-rpc=$ROLLUP_RPC_URL \ + --poll-interval=$POLL_INTERVAL \ + --sub-safety-margin=$SUB_SAFETY_MARGIN \ + --num-confirmations=$NUM_CONFIRMATIONS \ + --safe-abort-nonce-too-low-count=$SAFE_ABORT_NONCE_TOO_LOW_COUNT \ + --resubmission-timeout=$RESUBMISSION_TIMEOUT \ + --rpc.addr=0.0.0.0 \ + --rpc.port=$BATCHER_RPC_PORT \ + --rpc.enable-admin \ + --max-channel-duration=$MAX_CHANNEL_DURATION \ + --l1-eth-rpc=$L1_RPC_URL \ + --private-key=$BATCHER_PRIVATE_KEY \ + --batch-type=1 \ + --data-availability-type=blobs \ + --compress \ + --log.level=info +``` + +### Batcher parameters explained + +* **`--poll-interval`**: How frequently the batcher checks for new L2 blocks to batch +* **`--sub-safety-margin`**: Number of confirmations to wait before considering L1 transactions safe +* **`--max-channel-duration`**: Maximum time (in L1 blocks) to keep a channel open +* **`--batch-type`**: Type of batch encoding (1 for span batches, 0 for singular batches) +* **`--data-availability-type`**: Whether to use blobs or calldata for data availability +* **`--compress`**: Enable compression to reduce L1 data costs + +## Starting the batcher + + + ### Verify prerequisites + + Ensure your sequencer and rollup node are running: + + ```bash + # Test L1 connectivity + # Note: Make sure you have exported these environment variables to your current shell session: + # export L1_RPC_URL="https://sepolia.infura.io/v3/YOUR_KEY" + # export L2_RPC_URL="http://localhost:8545" + # export ROLLUP_RPC_URL="http://localhost:8547" + + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + $L1_RPC_URL + + # Test L2 connectivity + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + $L2_RPC_URL + + # Test rollup node connectivity + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' \ + $ROLLUP_RPC_URL + ``` + + ### Start the batcher + + ```bash + # Make the script executable + chmod +x scripts/start-batcher.sh + + # Start the batcher + ./scripts/start-batcher.sh + ``` + + +## Verification + + + ### Check batcher status + + Verify your batcher is working correctly: + + ```bash + # Check batcher RPC is responding + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"admin_startBatcher","params":[],"id":1}' \ + http://localhost:8548 + ``` + + ### Monitor batch submission activity + + ```bash + # Monitor batch submission activity (check L1 for recent transactions from your batcher address) + # Replace with your actual batcher address + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0xYOUR_BATCHER_ADDRESS","latest"],"id":1}' \ + $L1_RPC_URL + + # Check if your batcher address has enough ETH for gas + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xYOUR_BATCHER_ADDRESS","latest"],"id":1}' \ + $L1_RPC_URL + ``` + + + + For detailed cost analysis and optimization strategies, refer to the [Fee calculation tools](/operators/chain-operators/tools/fee-calculator). + + +Your batcher is now operational and will continuously submit L2 transaction batches to L1! + +## What's Next? + +Excellent! Your batcher is publishing transaction data to L1. The next step is to set up the proposer to submit state root proposals. + + + **Next**: Configure and start op-proposer to submit L2 state roots to L1 for withdrawal verification. + + +*** + +## Need Help? + +* **Community Support**: Join the [Optimism Discord](https://discord.optimism.io) +* **Batcher Configuration**: [op-batcher Configuration Reference](/operators/chain-operators/configuration/batcher) +* **Monitoring Guide**: [Chain Monitoring](/operators/chain-operators/tools/chain-monitoring) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx new file mode 100644 index 000000000..e2da01982 --- /dev/null +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -0,0 +1,263 @@ +--- +title: Spin up challenger +description: Learn how to configure challenger for your OP Stack chain. +lang: en-US +content_type: tutorial +topic: configure-challenger-for-your-chain +personas: + - chain-operator +categories: + - mainnet + - testnet + - fault-proofs + - op-challenger + - chain-configuration +is_imported_content: 'false' +--- + +import { Callout, Steps, Card } from 'nextra/components' + +# Spin up challenger + +After you have spun up your sequencer, batcher, and proposer, the final step is to configure a challenger to monitor and respond to disputes. The challenger is the security component that ensures the integrity of your rollup by monitoring dispute games and responding to invalid claims. + + + **Step 5 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the previous one. + + +This guide provides a walkthrough of setting up the configuration and monitoring options for `op-challenger`. See the [OP-Challenger Explainer](/stack/fault-proofs/challenger) for a general overview of this fault proofs feature. + + + ### Build the executable + + * Clone the monorepo + + ```bash + git clone https://github.com/ethereum-optimism/optimism.git + ``` + + * Check out the [latest release of `op-challenger`](https://github.com/ethereum-optimism/optimism/releases) and use the commit to deploy. Alternatively, chain operators can use the prebuilt challenger docker images included in the release notes. + If a Docker image is used, it already comes with `op-program` server and an executable for Cannon embedded, so the Cannon bin doesn't need to be specified. + + ```bash + git checkout op-challenger/vX.Y.Z + ``` + + + Chain operators need to specify the arguments and `op-program` server if `op-challenger` is running outside of Docker, but there's a Cannon server option which points to `op-program`'s executable. + + + * Build challenger + + ```bash + cd optimism + pnpm install + make op-challenger + ``` + + ### Configure challenger + + * Configure challenger with the required flags. Tip: Use the `op-challenger --help` to view all subcommands, command line, and environment variable options. + * The example config file below shows the flags to configure in this step: + + ```docker + challenger: + user: "1000" + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v0.2.11 + command: + - "op-challenger" + - "--l1-eth-rpc=http://sepolia-el-1:8545" + - "--l1-beacon=http://sepolia-cl-1:5051" + - "--l2-eth-rpc=http://op-sepolia-el-1:8545" + - "--rollup-rpc=http://op-sepolia-cl-1:5051" + - "--selective-claim-resolution" + - "--private-key=...." + - "--network=..." + - "--datadir=/data" + - "--cannon-prestates-url=..." + volumes: + - "./challenger-data:/data" + ``` + + #### `--l1-eth-rpc` + + * This is the HTTP provider URL for a standard L1 node, can be a full node. `op-challenger` will be sending many requests, so chain operators need a node that is trusted and can easily handle many transactions. + * Note: Challenger has a lot of money, and it will spend it if it needs to interact with games. That might risk not defending games or challenging games correctly, so chain operators should really trust the nodes being pointed at Challenger. + + #### `--l1-beacon` + + * This is needed just to get blobs from. + * In some instances, chain operators might need a blob archiver or L1 consensus node configured not to prune blobs: + * If the chain is proposing regularly, a blob archiver isn't needed. There's only a small window in the blob retention period that games can be played. + * If the chain doesn't post a valid output root in 18 days, then a blob archiver running a challenge game is needed. If the actor gets pushed to the bottom of the game, it could lose if it's the only one protecting the chain. + + #### `--l2-eth-rpc` + + * This needs to be `op-geth` archive node, with `debug` enabled. + * Technically doesn't need to go to bedrock, but needs to have access to the start of any game that is still in progress. + + #### `--rollup-rpc` + + * This needs to be an `op-node` archive node because challenger needs access to output roots from back when the games start. See below for important configuration details: + + 1. Safe Head Database (SafeDB) Configuration for op-node: + + * The `op-node` behind the `op-conductor` must have the SafeDB enabled to ensure it is not stateless. + + * To enable SafeDB, set the `--safedb.path` value in your configuration. This specifies the file path used to persist safe head update data. + + * Example Configuration: + + ``` + --safedb.path # Replace with your actual path + ``` + + + If this path is not set, the SafeDB feature will be disabled. + + + 2. Ensuring Historical Data Availability: + + * Both `op-node` and `op-geth` must have data from the start of the games to maintain network consistency and allow nodes to reference historical state and transactions. + * For `op-node`: Configure it to maintain a sufficient history of blockchain data locally or use an archive node. + * For `op-geth`: Similarly, configure to store or access historical data. + * Example Configuration: + + ``` + op-node \ + --rollup-rpc \ + --safedb.path + ``` + + + Replace `` with the URL of your archive node and `` with the desired path for storing SafeDB data. + + + #### `--private-key` + + * Chain operators must specify a private key or use something else (like `op-signer`). + * This uses the same transaction manager arguments as `op-node` , batcher, and proposer, so chain operators can choose one of the following options: + * a mnemonic + * a private key + * `op-signer` endpoints + + #### `--network` + + * This identifies the L2 network `op-challenger` is running for, e.g., `op-sepolia` or `op-mainnet`. + * When using the `--network` flag, the `--game-factory-address` will be automatically pulled from the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json). + * When cannon is executed, challenger needs the roll-up config and the L2 Genesis, which is op-geth's Genesis file. Both files are automatically loaded when Cannon Network is used, but custom networks will need to specify both Cannon L2 Genesis and Cannon rollup config. + * For custom networks not in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), the `--game-factory-address` and rollup must be specified, as follows: + + ``` + --cannon-rollup-config rollup.json \ + --cannon-l2-genesis genesis-l2.json \ + # use this if running challenger outside of the docker image + --cannon-server ./op-program/bin/op-program \ + # json or url, version of op-program deployed on chain + # if you use the wrong one, you will lose the game + # if you deploy your own contracts, you specify the hash, the root of the json file + # op mainnet are tagged versions of op-program + # make reproducible prestate + # challenger verifies that onchain + --cannon-prestate ./op-program/bin/prestate.json \ + # load the game factory address from system config or superchain registry + # point the game factory address at the dispute game factory proxy + --game-factory-address + ``` + + + These options vary based on which `--network` is specified. Chain operators always need to specify a way to load prestates and must also specify the cannon-server whenever the docker image isn't being used. + + + #### `--datadir` + + * This is a directory that `op-challenger` can write to and store whatever data it needs. It will manage this directory to add or remove data as needed under that directory. + * If running in docker, it should point to a docker volume or mountpoint, so the data isn't lost on every restart. The data can be recreated if needed but particularly if challenger has executed cannon as part of responding to a game it may mean a lot of extra processing. + + #### `--cannon-prestates-url` + + The pre-state is effectively the version of `op-program` that is deployed on chain. And chain operators must use the right version. `op-challenger` will refuse to interact with games that have a different absolute prestate hash to avoid making invalid claims. If deploying your own contracts, chain operators must specify an absolute prestate hash taken from the `make reproducible-prestate` command during contract deployment, which will also build the required prestate json file. + + All governance approved releases use a tagged version of `op-program`. These can be rebuilt by checking out the version tag and running `make reproducible-prestate`. + + * There are two ways to specify the prestate to use: + * `--cannon-prestate`: specifies a path to a single Cannon pre-state Json file + * `--cannon-prestates-url`: specifies a URL to load pre-states from. This enables participating in games that use different prestates, for example due to a network upgrade. The prestates are stored in this directory named by their hash. + * Example final URL for a prestate: + * [https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json](https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json) + * This file contains the cannon memory state. + + + Challenger will refuse to interact with any games if it doesn't have the matching prestate. + + + ### Execute challenger + + The final step is to execute challenger with the required flags. It will look something like this (but with required flags added): + + ```bash + ./op-challenger/bin/op-challenger \ + --trace-type permissioned,cannon \ + --l1-eth-rpc http://localhost:8545 \ + --rollup-rpc http://localhost:9546 \ + --game-factory-address $DISPUTE_GAME_FACTORY \ + --datadir temp/challenger-data \ + --cannon-rollup-config .devnet/rollup.json \ + --cannon-l2-genesis .devnet/genesis-l2.json \ + --cannon-bin ./cannon/bin/cannon \ + --cannon-server ./op-program/bin/op-program \ + --cannon-prestate ./op-program/bin/prestate.json \ + --l2-eth-rpc http://localhost:9545 \ + --mnemonic "test test test test test test test test test test test junk" \ + --hd-path "m/44'/60'/0'/0/8" \ + ``` + + ### Test and debug challenger (optional) + + This is an optional step to use `op-challenger` subcommands, which allow chain operators to interact with the Fault Proof System onchain for testing and debugging purposes. For example, it is possible to test and explore the system in the following ways: + + * create games yourself, and it doesn't matter if the games are valid or invalid. + * perform moves in games and then claim and resolve things. + + Here's the list of op-challenger subcommands: + + | subcommand | description | + | --------------- | -------------------------------------------------------- | + | `list-games` | List the games created by a dispute game factory | + | `list-claims` | List the claims in a dispute game | + | `list-credits` | List the credits in a dispute game | + | `create-game` | Creates a dispute game via the factory | + | `move` | Creates and sends a move transaction to the dispute game | + | `resolve` | Resolves the specified dispute game if possible | + | `resolve-claim` | Resolves the specified claim if possible | + + Additionally, chain operators should consider running `op-dispute-mon`. It's an incredibly useful security monitoring service to keep an eye on games, basically giving chain operators visibility into all the status of the games for the last 28 days. + Chain operators can easily create their grafana dashboard for Dispute Monitor using the following json file: [Download the Dispute Monitor JSON](/resources/grafana/dispute-monitor-1718214549035.json). + + +## Congratulations! 🎉 + +You've successfully completed the entire L2 rollup testnet tutorial! Your rollup is now fully operational with all components running: + +✅ **op-deployer** - L1 contracts deployed\ +✅ **Sequencer** - Processing transactions\ +✅ **Batcher** - Publishing data to L1\ +✅ **Proposer** - Submitting state roots\ +✅ **Challenger** - Monitoring disputes + +## What's Next? + +Your rollup testnet is complete, but there's always more to explore and optimize. + + + **Back to Overview**: See what you've accomplished and explore advanced topics for production deployments. + + +*** + +## Need Help? + +* **Community Support**: Join the [Optimism Discord](https://discord.optimism.io) +* **OP Challenger Explainer**: [Fault Proofs Overview](/stack/fault-proofs/challenger) +* **Technical Specs**: [Honest Challenger Specification](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html) +* **Developer Support**: [GitHub Discussions](https://github.com/ethereum-optimism/developers/discussions) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx new file mode 100644 index 000000000..38c3e3e49 --- /dev/null +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -0,0 +1,383 @@ +--- +title: Spin up op-deployer +description: Install op-deployer, prepare your environment, and set up the foundation for your rollup deployment. +lang: en-US +content_type: tutorial +topic: create-l2-rollup-setup +personas: + - chain-operator +categories: + - testnet + - chain-deployment + - op-deployer +is_imported_content: 'false' +--- + +import {Callout, Steps, Card, Tabs} from 'nextra/components' + +# Spin up op-deployer + +Welcome to the first step of creating your own L2 rollup testnet! In this section, you'll install the op-deployer tool and prepare your environment for the deployment. + + + **Step 1 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the previous one. + + +## About op-deployer + +`op-deployer` simplifies the process of deploying the OP Stack. It works similarly to [Terraform](https://www.terraform.io/) - you define a declarative config file called an "**intent**," then run a command to apply it. `op-deployer` compares your chain's current state against the intent and makes the necessary changes to match. + +## Installation + +There are a couple of ways to install `op-deployer`: + + + + To install from source, you will need [Go](https://go.dev/doc/install), `just`, and `git`. + After installing all of that, run following: + + ```bash + + git clone https://github.com/ethereum-optimism/optimism.git # you can skip this if you already have the repo + cd optimism/op-deployer + just build + cp ./bin/op-deployer /usr/local/bin/op-deployer # or any other directory in your $PATH + + # Verify installation, run this command to verify that you have it installed. + op-deployer --version + ``` + + + + Another way to install `op-deployer`, is to download the latest release from the monorepo's [release page](https://github.com/ethereum-optimism/optimism/releases). + + 1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) + 2. Find the latest release that includes op-deployer + 3. Under **assets**, download the binary that matches your operating system: + + * `op-deployer-linux-amd64` for Linux + * `op-deployer-darwin-amd64` or `op-deployer-darwin-arm64` for macOS + * `op-deployer-windows-amd64.exe` for Windows + + 4. Extract the binary to a location on your system PATH + 5. Verify installation, run this command to verify that you have it installed. + + ```bash + op-deployer --version + ``` + + + +## Deployment usage + + + Deploying an OP Stack chain involves deploying multiple contracts, which can consume a substantial amount of gas. On testnets like Sepolia, costs may fluctuate significantly depending on network congestion. We recommend ensuring your deployer wallet has a buffer of **at least 1.5 to 3.5 ETH** , depending on gas prices and configuration. Always check current gas estimates before deploying. + + +The base use case for `op-deployer` is deploying new OP Chains. This process is broken down into three steps: + +### `init`: configure your chain + +To get started with `op-deployer`, create an intent file that defines your desired chain configuration. Use the built-in `op-deployer` utility to generate this file: + + + op-deployer uses a declarative intent file to determine how a new chain should be configured. + Then, it runs through a deployment pipeline to actually deploy the chain. + + +```bash +op-deployer init \ + --l1-chain-id \ + --l2-chain-ids \ + --workdir .deployer \ + --intent-type + +``` + +* Replace `` with the exact value. +* The `--workdir` flag specifies the output directory for the generated intent file and related configs. You can name this directory anything you like , `.deployer` is just an example. + +This command will create a directory called `.deployer` in your current working directory containing the intent file and an empty `state.json` file. `state.json` is populated with the results of your deployment, and never needs to be edited directly. + +Your intent file will need to be modified to your parameters, but it will initially look something like this: + + + Do not use the default addresses in the intent for a production chain! They are generated from the `test... junk` + mnemonic. **Any funds they hold will be stolen on a live chain.** + + +```toml +deploymentStrategy = "live" +configType = "standard-overrides" +l1ChainID = 11155111# The chain ID of Sepolia (L1) you'll be deploying to. +fundDevAccounts = true# Whether or not to fund dev accounts using the test... junk mnemonic on L2. +l1ContractsLocator = "tag://op-contracts/v1.8.0-rc.4"# L1 smart contracts versions +l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts"# L2 smart contracts versions# Delete this table if you are using the shared Superchain contracts on the L1# If you are deploying your own SuperchainConfig and ProtocolVersions contracts, fill in these details +[superchainRoles] + proxyAdminOwner = "0x1eb2ffc903729a0f03966b917003800b145f56e2" + protocolVersionsOwner = "0x79add5713b383daa0a138d3c4780c7a1804a8090" + guardian = "0x7a50f00e8d05b95f98fe38d8bee366a7324dcf7e" + +# List of L2s to deploy. op-deployer can deploy multiple L2s at once +[[chains]] +# Your chain's ID, encoded as a 32-byte hex string + id = "0x00000000000000000000000000000000000000000000000000000a25406f3e60" +# Update the fee recipient contract + baseFeeVaultRecipient = "0x100f829718B5Be38013CC7b29c5c62a08D00f1ff" + l1FeeVaultRecipient = "0xbAEaf33e883068937aB4a50871f2FD52e241013A" + sequencerFeeVaultRecipient = "0xd0D5D18F0ebb07B7d728b14AAE014eedA814d6BD" + eip1559DenominatorCanyon = 250 + eip1559Denominator = 50 + eip1559Elasticity = 6 +# Various ownership roles for your chain. When you use op-deployer init, these roles are generated using the# test... junk mnemonic. You should replace these with your own addresses for production chains. + [chains.roles] + l1ProxyAdminOwner = "0xdf5a644aed1b5d6cE0DA2aDd778bc5f39d97Ac88" + l2ProxyAdminOwner = "0xC40445CD88dDa2A410F86F6eF8E00fd52D8381FD" + systemConfigOwner = "0xB32296E6929F2507dB8153A64b036D175Ac6E89e" + unsafeBlockSigner = "0xA53526b516df4eEe3791734CE85311569e0eAD78" + batcher = "0x8680d36811420359093fd321ED386a6e76BE2AF3" + proposer = "0x41b3B204099771aDf857F826015703A1030b6675" + challenger = "0x7B51A480dAeE699CA3a4F68F9AAA434452112eF7" + +``` + + + Before you can use your intent file for a deployment, you will need to update all zero values to whatever is appropriate for your chain. + For dev environments, it is ok to use all EOAs/hot-wallets. + + +**Production setup** + +In production environments, you should use a more secure setup with cold-wallet multisigs (e.g. Gnosis Safes) for the following: + +* **baseFeeVaultRecipient** +* **l1FeeVaultRecipient** +* **sequencerFeeVaultRecipient** +* **l1ProxyAdminOwner** +* **l2ProxyAdminOwner** +* **systemConfigOwner** + +HSMs (hardware security modules) are recommended for the following hot-wallets: + +* **unsafeBlockSigner** +* **batcher** +* **proposer** +* **challenger** + +### Understanding the intent.toml fields + +
+ Here's an explanation of the key fields in the intent file: + + **Global configuration:** + + * `deploymentStrategy`: Used to deploy both to live chains and L1 genesis files. Valid values are `live` and `genesis`. + * `configType`: Type of configuration to use ("standard-overrides" is most common) + * `l1ChainID`: The chain ID of the L1 network you're deploying to + * `fundDevAccounts`: Whether to fund development accounts on L2 (set to false for production) + * `l1ContractsLocator`: The version of L1 contracts to deploy + * `l2ContractsLocator`: The version of L2 contracts to deploy + + **Superchain roles:** + + * `proxyAdminOwner`: Address that can upgrade Superchain-wide contracts + * `protocolVersionsOwner`: Address that can update protocol versions + * `guardian`: Address authorized to pause L1 withdrawals from contracts, blacklist dispute games, and set the respected game type in the `OptimismPortal` + + **Chain-specific configuration:** + + * `id`: Unique identifier for your chain + * `baseFeeVaultRecipient`: Address that represents the recipient of fees accumulated in the `BaseFeeVault` + * `l1FeeVaultRecipient`: Address that represents the recipient of fees accumulated in the `L1FeeVault` + * `sequencerFeeVaultRecipient`: Address that receives sequencer fees + * `eip1559DenominatorCanyon`, `eip1559Denominator`, `eip1559Elasticity`: Parameters for fee calculation + + **Chain roles:** + + * `l1ProxyAdminOwner`: Address authorized to update the L1 Proxy Admin + * `l2ProxyAdminOwner`: Address authorized to upgrade protocol contracts via calls to the `ProxyAdmin`. This is the aliased L1 ProxyAdmin owner address. + * `systemConfigOwner`: Address authorized to change values in the `SystemConfig` contract. All configuration is stored on L1 and picked up by L2 as part of the [derivation](https://specs.optimism.io/protocol/derivation.html) of the L2 chain + * `unsafeBlockSigner`: Address which authenticates the unsafe/pre-submitted blocks for a chain at the P2P layer + * `batcher`: Address that batches transactions from L2 to L1 + * `proposer`: Address which can create and interact with [permissioned dispute games](https://specs.optimism.io/fault-proof/stage-one/bridge-integration.html#permissioned-faultdisputegame) on L1. + * `challenger`: Address Account which can interact with existing permissioned dispute games +
+ +### Working with artifacts + +The `artifacts-locator` parameter specifies where the contract deployment artifacts are located. There are several ways to provide artifacts: + +### Using local files + +To use local artifacts (recommended for production or if you're experiencing issues with remote artifacts): + +1. Clone the contracts repository: + + ```bash + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism + git checkout v1.8.0-rc.4 # Use the desired version + ``` + +2. Build the contract artifacts: + + ```bash + cd packages/contracts-bedrock + just build + ``` + +3. Use the local path in your command, referencing the artifacts from: + `/packages/contracts-bedrock/forge-artifacts` + +### Using tagged artifacts + +For development or testing, you can try using tagged artifacts: + +```bash +--artifacts-locator tag://op-contracts/v1.8.0-rc.4 +``` + +If you encounter the error `Application failed: failed to parse artifacts URL: unsupported tag`, you'll need to use the local files method described above, else If you use an invalid tag, the command will display all valid options. + +### Contract locator schemes + +op-deployer uses contract locators to find contract artifacts to deploy. +Locators are just URLs under the hood. +The `l1ContractsLocator` and `l2ContractsLocator` fields support several schemes for specifying where to find the contract implementations: + +* `tag://` - References a specific tagged release of the contracts (e.g., `tag://op-contracts/v1.8.0-rc.4`). In this case, the contracts bytecode will be downloaded from a fixed bytecode bundle on GCS. +* `file://` - Points to a directory on local disk containing the artifacts. + This is useful for local development, since you can point it at your local monorepo + e.g. `file:///packages/contracts-bedrock/forge-artifacts` +* `http://` or `https://` - Points to a target directory containing contract artifacts. The URL should directly reference the directory containing the `forge-artifacts` directory, in this case, the bytecode will be downloaded from the URL specified. + + + When using any scheme other than tag://, you must set configType to either custom or standard-overrides in your intent file. + + +For example: + +```toml +# When using tag:// scheme +configType = "standard-overrides" +l1ContractsLocator = "tag://op-contracts/v1.8.0-rc.4" +l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" + +# When using other schemes (file://, http://, https://) +configType = "custom" # or "standard-overrides" +l1ContractsLocator = "file:///path/to/local/op-contracts/v1.8.0-rc.4/forge-artifacts" +l2ContractsLocator = "" +``` + +By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html?utm_source=op-docs\&utm_medium=docs). You can override these default settings by adding them to your intent file using the table below: + +```toml +[globalDeployOverrides] + l2BlockTime = 1# 1s L2blockTime is also standard, op-deployer defaults to 2s +``` + +You can also do chain by chain configurations in the `chains` table. + +### `apply`: deploy your chain + + + Hardware wallets are not supported, but you can use ephemeral hot wallets since this deployer key has no privileges. + + +Now that you've created your intent file, you can apply it to your chain to deploy the L1 smart contracts: + +```bash +op-deployer apply --workdir .deployer --l1-rpc-url --private-key +``` + +* Replace `` with your `L1_RPC_URL` and `` with your private key + +This command will deploy the OP Stack to L1. It will deploy all L1 contracts for each L2 specified in the intent file. + +Superchain configuration will be set to the Superchain-wide defaults - i.e., your chain will be opted into the [Superchain pause](https://specs.optimism.io/protocol/superchain-config.html#pausability) and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) address as other chains on the Superchain. +You will need to specify additional arguments depending on what you're trying to do. +See below for a reference of each supported CLI arg: + +* Deployment targets: + + The `--deployment-target` flag specifies where to deploy: + + * `live`: Deploys directly to a live L1 network. Requires `-l1-rpc-url` and `-private-key`. + * `genesis`: Generates an L1 genesis file for local testing or development. + * `calldata`: Produces calldata for multisig wallets, enabling offline deployment. + * `noop`: Performs a dry-run without actual deployment, useful for testing configurations. + + Choose the deployment target that best fits your use case. + +### `verify`: verify contract source code on block explorers + +After deploying your contracts, you can verify them on block explorers like Etherscan: + +```bash +op-deployer verify \ + --l1-rpc-url \ + --input-file \ + --etherscan-api-key \ + --artifacts-locator +``` + +**Common options:** + +* `-l1-rpc-url`: RPC URL for the L1 chain +* `-etherscan-api-key`: API key for the block explorer (e.g., from Etherscan) +* `-artifacts-locator`: Path or plugin to locate contract artifacts +* `-input-file`: Path to a JSON file containing deployment data: + * Create an `input.json` file in the same directory. + * Navigate to your `state.json` file and locate the `implementationsDeployment` object. + * Copy everything inside the `implementationsDeployment` object (without the object name itself) and paste it into your new `input.json` file. + + + You don't need to specify a `--workdir`, op-deployer will automatically look for deployment artifacts from the deploy step, unless overridden. + + +**Example:** + +```bash +op-deployer verify \ + --l1-rpc-url \ + --etherscan-api-key \ + --input-file \ + --artifacts-locator +``` + +### `inspect`: generate genesis files and chain information + + + To add your chain to the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry) you will need to provide the chain artifacts. To get these chain artifacts, you will need to write the output of these commands to new files. + + +Inspect the `state.json` file by navigating to your working directory. With the contracts deployed, generate the genesis and rollup configuration files by running the following commands: + +```bash +op-deployer inspect genesis --workdir .deployer > .deployer/genesis.json +op-deployer inspect rollup --workdir .deployer > .deployer/rollup.json +``` + +Now that you have your `genesis.json` and `rollup.json` you can spin up a node on your network. You can also use the following inspect subcommands to get additional chain artifacts: + +```bash +op-deployer inspect l1 --workdir .deployer # outputs all L1 contract addresses for an L2 chain +op-deployer inspect deploy-config --workdir .deployer # outputs the deploy config for an L2 chain +op-deployer inspect l2-semvers --workdir .deployer # outputs the semvers for all L2 chains +``` + +## What's Next? + +Great! You've completed the setup and have op-deployer installed and ready. Since op-deployer handles L1 smart contract deployment automatically, you can now move on to setting up the execution layer. + + + **Next**: Set up and run op-geth and op-node, the execution and consensus layers for your rollup. + + +*** + +## Need Help? + +* **Community Support**: Join the [Optimism Discord](https://discord.gg/optimism) +* **op-deployer Repository**: [GitHub](https://github.com/ethereum-optimism/optimism/tree/develop/op-deployer/cmd/op-deployer) +* **OPCM Documentation**: [OP Contracts Manager](/stack/opcm) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx new file mode 100644 index 000000000..51845a28a --- /dev/null +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -0,0 +1,606 @@ +--- +title: Spin up sequencer +lang: en-US +description: Set up and run op-geth and op-node, the execution and consensus layers for your rollup. +content_type: tutorial +topic: create-l2-rollup-geth +personas: + - chain-operator +categories: + - chain-deployment + - op-geth + - op-node + - sequencer-configuration +is_imported_content: 'false' +--- + +import { Callout, Steps, Card, Tabs } from 'nextra/components' + +# Spin up sequencer + +Now that you have op-deployer configured, it's time to spin up the sequencer for your rollup. This involves running both op-geth and op-node to create a functioning sequencer. + + + **Step 2 of 5**: This tutorial builds on [Spin up op-deployer](./op-deployer-setup). Make sure you've completed that first. + + +## What You'll Set Up + +The sequencer node consists of two core components: + +* **op-geth**: Execution layer that processes transactions and maintains state +* **op-node**: Consensus layer that orders transactions and creates L2 blocks + +The sequencer is responsible for: + +* Ordering transactions from users +* Building L2 blocks +* Signing blocks on the P2P network + +## Prerequisites + +### Essential requirements + +Before spinning up your sequencer, complete the following steps: + + + ### Successful L1 contract deployment + + * Deployed L1 contracts using [`op-deployer apply`](/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup#apply-deploy-your-chain) command. + * Generated genesis and rollup configuration files using: + + ```bash + op-deployer inspect genesis --workdir .deployer > .deployer/genesis.json + op-deployer inspect rollup --workdir .deployer > .deployer/rollup.json + ``` + + ### Required configuration files + + * `genesis.json` - L2 genesis file for initializing op-geth + * `rollup.json` - Rollup configuration file for op-node + * Access to your deployment `state.json` file from op-deployer + + ### L1 network access + + * L1 RPC endpoint (Ethereum, Sepolia, etc.) + * L1 Beacon node endpoint + + +### Software requirements + +* Git (for cloning repositories) +* Go 1.21+ (if building from source) +* Docker and Docker Compose (optional but recommended) +* OpenSSL for JWT secret generation + +### Finding the current stable releases + +To ensure you're using the latest compatible versions of OP Stack components, always check the official releases page: + +**[release page](https://github.com/ethereum-optimism/optimism/releases)** + +The main components you'll need for sequencer deployment are: + +* **op-node**: Look for the latest `op-node/v*` release +* **op-geth**: Look for the latest `op-geth/v*` [release](https://github.com/ethereum-optimism/op-geth/releases) + + + The versions used in this guide (**op-node/v1.13.3** and **op-geth/v1.101511.0**) are verified compatible versions. + + According to the **op-node v1.13.3** [release notes](https://github.com/ethereum-optimism/optimism/releases/tag/op-node%2Fv1.13.3), this op-node version specifically corresponds to **op-geth v1.101511.0**. + Always check the release notes to ensure you're using compatible versions. + + +## Software installation + +For spinning up a sequencer, we recommend building from source as it provides better control, and helps with debugging. +In this guide Docker alternative is also provided. + + + + Building from source gives you full control over the binaries and is the preferred approach for this guide. + + + ### Clone and build op-node + + ```bash + # Clone the optimism monorepo + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism + + # Checkout the latest release tag + git checkout op-node/v1.13.3 + + # Build op-node + cd op-node + just + + # Binary will be available at ./bin/op-node + ``` + + ### Clone and build op-geth + + ```bash + # Clone op-geth repository (in a separate directory) + git clone https://github.com/ethereum-optimism/op-geth.git + cd op-geth + + # Checkout to this release tag + git checkout v1.101511.0 + + # Build op-geth + make geth + + # Binary will be available at ./build/bin/geth + ``` + + ### Verify installation + + Check that you have properly installed the needed components. + + ```bash + # Make sure you're in the right directory + ./bin/op-node --version + ./build/bin/geth version + ``` + + + ## Configuration setup + + + ### Organize your workspace + + After building the binaries, you should have the following directory structure: + + ``` + ~/ + ├── optimism/ # Optimism monorepo + │ └── op-node/ + │ └── bin/ + │ └── op-node # Built binary + ├── op-geth/ # OP-Geth repository + │ └── build/ + │ └── bin/ + │ └── geth # Built binary + └── .deployer/ # From op-deployer + ├── genesis.json + └── rollup.json + ``` + + Now create your sequencer working directory. We recommend creating it at the same level for easy path references: + + ```bash + # Create sequencer directory at the root level + mkdir ~/sequencer-node + cd ~/sequencer-node + ``` + +
+ Alternative: Copy binaries to sequencer directory + + If you prefer to keep binaries close to your configuration, you can copy them: + + ```bash + mkdir ~/sequencer-node/bin + cp ~/optimism/op-node/bin/op-node ~/sequencer-node/bin/ + cp ~/op-geth/build/bin/geth ~/sequencer-node/bin/ + + # Then update scripts to use: + # ./bin/geth + # ./bin/op-node + ``` +
+ + ### Generate JWT secret + + ```bash + # Generate JWT secret in the sequencer directory + openssl rand -hex 32 > jwt.txt + + # Set appropriate permissions + chmod 600 jwt.txt + ``` + + ### Set up directory structure and copy files + + In this guide, we're going to be using the binaries from their original build locations, we only need to create directories for configuration files and scripts. + + ```bash + # Create scripts directory + mkdir scripts + + # Copy configuration files from op-deployer + cp ~/.deployer/genesis.json . + cp ~/.deployer/rollup.json . + ``` + + Your final directory structure should look like: + + ```bash + ~/sequencer-node/ + ├── jwt.txt + ├── genesis.json + ├── rollup.json + └── scripts/ + ├── start-op-geth.sh # (to be created) + └── start-op-node.sh # (to be created) + ``` + + ### Environment variables + + You'll need to gather several pieces of information before creating your configuration. Here's where to get each value: + + + ### Get L1 network access + + You need access to the L1 network (Ethereum mainnet or Sepolia testnet) and its beacon node: + + **L1 RPC URL options:** + + * **Infura**: [infura.io](https://infura.io) - Requires an API key from a project + * **Alchemy**: [alchemy.com](https://alchemy.com) - Requires an API key from an app + + **L1 Beacon URL options:** + + * **Public beacon APIs**: `https://ethereum-sepolia-beacon-api.publicnode.com` (Sepolia) or `https://ethereum-beacon-api.publicnode.com` (Mainnet) + * **Infura beacon**: `https://sepolia.infura.io/v3/YOUR_KEY` (if your Infura plan includes beacon access) + + ### Get private key from your wallet + + For this basic sequencer setup, you only need a private key during op-node initialization. + + ### Get your public IP address + + ```bash + # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env + curl ifconfig.me + # or + curl ipinfo.io/ip + ``` + + ### Choose your ports + + The default ports are standard but can be changed if needed: + + * `8545`: op-geth HTTP RPC (standard Ethereum RPC port) + * `8546`: op-geth WebSocket RPC + * `8551`: op-geth Auth RPC (for op-node communication) + * `8547`: op-node RPC + * `9222`: P2P networking (must be open on firewall) + + + Now create your `.env` file and copy the values below: + +
+ Replace ALL placeholder values with your real configuration values. + + ```bash + # Create .env file with your actual values + # L1 Configuration - Replace with your actual RPC URLs + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com + + # Sequencer configuration + SEQUENCER_ENABLED=true + SEQUENCER_STOPPED=false + + # Private keys + PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + + # P2P configuration - Replace with your actual public IP + P2P_LISTEN_PORT=9222 + P2P_ADVERTISE_IP=YOUR_ACTUAL_PUBLIC_IP + + # RPC configuration (can customize ports if needed) + OP_NODE_RPC_PORT=8547 + OP_GETH_HTTP_PORT=8545 + OP_GETH_WS_PORT=8546 + OP_GETH_AUTH_PORT=8551 + + # JWT secret location + JWT_SECRET=./jwt.txt + ``` +
+
+ + ## Sequencer specific configuration + + ### op-geth configuration for sequencer + + Create `scripts/start-op-geth.sh`: + + ```bash + #!/bin/bash + source .env + + # Path to the op-geth binary we built + ../op-geth/build/bin/geth \ + --datadir=./op-geth-data \ + --http \ + --http.addr=0.0.0.0 \ + --http.port=$OP_GETH_HTTP_PORT \ + --http.vhosts="*" \ + --http.corsdomain="*" \ + --http.api=eth,net,web3,debug,txpool,admin \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port=$OP_GETH_WS_PORT \ + --ws.origins="*" \ + --ws.api=eth,net,web3,debug,txpool,admin \ + --authrpc.addr=0.0.0.0 \ + --authrpc.port=$OP_GETH_AUTH_PORT \ + --authrpc.vhosts="*" \ + --authrpc.jwtsecret=$JWT_SECRET \ + --syncmode=full \ + --gcmode=archive \ + --rollup.disabletxpoolgossip=true \ + --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT + ``` + + ### op-node configuration for sequencer + + Create `scripts/start-op-node.sh`: + + ```bash + #!/bin/bash + + source .env + + # Path to the op-node binary we built + ../optimism/op-node/bin/op-node \ + --l1=$L1_RPC_URL \ + --l1.beacon=$L1_BEACON_URL \ + --l2=http://localhost:$OP_GETH_AUTH_PORT \ + --l2.jwt-secret=$JWT_SECRET \ + --rollup.config=./rollup.json \ + --sequencer.enabled=$SEQUENCER_ENABLED \ + --sequencer.stopped=$SEQUENCER_STOPPED \ + --sequencer.max-safe-lag=3600 \ + --verifier.l1-confs=4 \ + --p2p.listen.ip=0.0.0.0 \ + --p2p.listen.tcp=$P2P_LISTEN_PORT \ + --p2p.listen.udp=$P2P_LISTEN_PORT \ + --p2p.advertise.ip=$P2P_ADVERTISE_IP \ + --p2p.advertise.tcp=$P2P_LISTEN_PORT \ + --p2p.advertise.udp=$P2P_LISTEN_PORT \ + --p2p.sequencer.key=$PRIVATE_KEY \ + --rpc.addr=0.0.0.0 \ + --rpc.port=$OP_NODE_RPC_PORT \ + --rpc.enable-admin \ + --log.level=info \ + --log.format=json + ``` + + ## Initializing and starting the sequencer + + + ### Initialize op-geth with your genesis file + + ```bash + # Make sure you're in the sequencer-node directory + cd ~/sequencer-node + + # Initialize op-geth with your genesis file + ../op-geth/build/bin/geth init --datadir=./op-geth-data --state.scheme=hash ./genesis.json + ``` + + ### Start op-geth + + ```bash + # Make scripts executable + chmod +x scripts/start-op-geth.sh + chmod +x scripts/start-op-node.sh + + # Start op-geth in the background or in a separate terminal + ./scripts/start-op-geth.sh + ``` + + **Note**: You should see output indicating that op-geth is starting and listening on the configured ports. + + ### Start op-node + + ```bash + # In a separate terminal, navigate to the sequencer directory + cd ~/sequencer-node + + # Start op-node + ./scripts/start-op-node.sh + ``` + + ### Verify sequencer is running + + Once both services are running, verify they're working correctly: + + ```bash + # Check op-geth is responding, do this in another terminal + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + http://localhost:8545 + + # Check sequencer status + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"admin_sequencerActive","params":[],"id":1}' \ + http://localhost:8547 + ``` + + + Your sequencer node is now operational and ready to process transactions. +
+ + + If you prefer containerized deployment, you can use the official Docker images, and do the following: + + 1. **Set up directory structure and copy configuration files:** + + ```bash + # Create your sequencer working directory + mkdir ~/sequencer-node + cd ~/sequencer-node + + # Copy configuration files from op-deployer output + # Note: Adjust the path if your .deployer directory is located elsewhere + cp ~/.deployer/genesis.json . + cp ~/.deployer/rollup.json . + + # Generate JWT secret + openssl rand -hex 32 > jwt.txt + chmod 600 jwt.txt + ``` + + 2. **Create environment variables file:** + + ```bash + # Create .env file with your actual values + cat > .env << 'EOF' + # L1 Configuration - Replace with your actual RPC URLs + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com + + # Private keys - Replace with your actual private key + PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + + # (Run `curl ifconfig.me` in a separate shell to obtain the value, then paste it below) + + # P2P configuration - Replace with your actual public IP + P2P_ADVERTISE_IP=YOUR_ACTUAL_PUBLIC_IP + + EOF + ``` + + **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. + + 3. **Create docker-compose.yml:** + + ```yaml + version: '3.8' + + services: + op-geth: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 + volumes: + # Mount entire directory to avoid file mounting issues + - .:/workspace + working_dir: /workspace + ports: + - "8545:8545" + - "8546:8546" + - "8551:8551" + command: + - "--datadir=/workspace/op-geth-data" + - "--http" + - "--http.addr=0.0.0.0" + - "--http.port=8545" + - "--ws" + - "--ws.addr=0.0.0.0" + - "--ws.port=8546" + - "--authrpc.addr=0.0.0.0" + - "--authrpc.port=8551" + - "--authrpc.jwtsecret=/workspace/jwt.txt" + - "--syncmode=full" + - "--gcmode=archive" + - "--rollup.disabletxpoolgossip=true" + - "--rollup.sequencerhttp=http://op-node:8547" + - "--http.vhosts=*" + - "--http.corsdomain=*" + - "--http.api=eth,net,web3,debug,txpool,admin" + - "--ws.origins=*" + - "--ws.api=eth,net,web3,debug,txpool,admin" + - "--authrpc.vhosts=*" + + op-node: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 + depends_on: + - op-geth + volumes: + - .:/workspace + working_dir: /workspace + ports: + - "8547:8547" + - "9222:9222" + environment: + - L1_RPC_URL=${L1_RPC_URL} + - L1_BEACON_URL=${L1_BEACON_URL} + - PRIVATE_KEY=${PRIVATE_KEY} + - P2P_ADVERTISE_IP=${P2P_ADVERTISE_IP} + command: + - "op-node" + - "--l1=${L1_RPC_URL}" + - "--l1.beacon=${L1_BEACON_URL}" + - "--l2=http://op-geth:8551" + - "--l2.jwt-secret=/workspace/jwt.txt" + - "--rollup.config=/workspace/rollup.json" + - "--sequencer.enabled=true" + - "--sequencer.stopped=false" + - "--sequencer.max-safe-lag=3600" + - "--verifier.l1-confs=4" + - "--p2p.listen.ip=0.0.0.0" + - "--p2p.listen.tcp=9222" + - "--p2p.listen.udp=9222" + - "--p2p.advertise.ip=${P2P_ADVERTISE_IP}" + - "--p2p.advertise.tcp=9222" + - "--p2p.advertise.udp=9222" + - "--p2p.sequencer.key=${PRIVATE_KEY}" + - "--rpc.addr=0.0.0.0" + - "--rpc.port=8547" + - "--rpc.enable-admin" + - "--log.level=info" + - "--log.format=json" + ``` + + 4. **Initialize op-geth with Docker:** + + ```bash + # Make sure you're in the sequencer-node directory with all files copied + cd ~/sequencer-node + + # Initialize op-geth using Docker + docker run --rm \ + -v $(pwd):/workspace \ + -w /workspace \ + us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 \ + init --datadir=./op-geth-data --state.scheme=hash ./genesis.json + ``` + + 5. **Start the services:** + + ```bash + # Start both services + docker-compose up -d + + # View logs + docker-compose logs -f + ``` + + 6. **Final directory structure:** + + ```bash + ~/sequencer-node/ + ├── jwt.txt # Generated JWT secret + ├── genesis.json # Copied from ~/.deployer/ + ├── rollup.json # Copied from ~/.deployer/ + ├── .env # Environment variables + ├── docker-compose.yml # Docker configuration + └── op-geth-data/ # Created by Docker during initialization + ├── geth/ # Geth data + └── keystore/ # Key files + ``` + + Your sequencer node is now operational and ready to process transactions. + +
+ +## What's Next? + +Great! Your sequencer is running and processing transactions. The next step is to set up the batcher to publish transaction data to L1. + + + **Next**: Configure and start op-batcher to publish L2 transaction data to L1 for data availability. + + +*** + +## Need Help? + +* **Community Support**: Join the [Optimism Discord](https://discord.optimism.io) +* **Batcher Configuration**: [op-batcher Configuration Guide](/operators/chain-operators/configuration/batcher) +* **Best Practices**: [Chain Operator Best Practices](/operators/chain-operators/management/best-practices) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx new file mode 100644 index 000000000..1fe3b7ba2 --- /dev/null +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -0,0 +1,445 @@ +--- +title: Spin up proposer +lang: en-US +description: Learn how to set up and configure an OP Stack proposer to post L2 state roots. +content_type: tutorial +topic: proposer-setup +personas: + - chain-operator +categories: + - testnet + - mainnet + - op-proposer + - state-commitment + - l2-output-submission + - withdrawal-verification +is_imported_content: 'false' +--- + +import { Callout, Steps, Card, Tabs } from 'nextra/components' + +# Spin up proposer + +After you have spun up your sequencer and batcher, you need to attach a proposer to post your L2 state roots data back onto L1 so we can prove withdrawal validity. The proposer is a critical component that enables trustless L2-to-L1 messaging and creates the authoritative view of L2 state from L1's perspective. + + + **Step 4 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the previous one. + + +This guide assumes you already have a functioning sequencer, batcher, and the necessary L1 contracts deployed using [`op-deployer`](./op-deployer-setup). If you haven't set up your sequencer and batcher yet, please refer to the [sequencer guide](./op-geth-setup) and [batcher guide](./op-batcher-setup) first. + +To see configuration info for the proposer, check out the [configuration page](/operators/chain-operators/configuration/proposer). + +## Understanding the proposer's role + +The proposer (`op-proposer`) serves as a crucial bridge between your L2 chain and L1. Its primary responsibilities include: + +* **State commitment**: Proposing L2 state roots to L1 at regular intervals +* **Withdrawal enablement**: Providing the necessary commitments for users to prove and finalize withdrawals + +The proposer creates dispute games via the `DisputeGameFactory` contract. + +## Prerequisites + +Before setting up your proposer, ensure you have: + +**Running infrastructure:** + +* An operational sequencer node +* Access to a L1 RPC endpoint + +**Network information:** + +* Your L2 chain ID and network configuration +* L1 network details (chain ID, RPC endpoints) + +## Software installation + +### Finding the current stable releases + +To ensure you're using the latest compatible versions of OP Stack components, always check the official [releases page](https://github.com/ethereum-optimism/optimism/releases). + +Look for the latest `op-proposer/v*` release that's compatible with your sequencer setup. + + + This guide uses `op-proposer/v1.10.0` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.0 from the sequencer setup. + Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information. + + +For setting up the proposer, we recommend building from source as it provides better control and helps with debugging. Docker alternative is also provided. + + + + Building from source gives you full control over the binaries and is the preferred approach for this guide. + + + ### Clone and build op-proposer + + ```bash + # If you don't already have the optimism repository from the sequencer setup + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism + + # Checkout the latest release tag + git checkout op-proposer/v1.10.0 + + # Build op-proposer + cd op-proposer + just + + # Binary will be available at ./bin/op-proposer + ``` + + ### Verify installation + + Run this command to verify the installation: + + ```bash + ./bin/op-proposer --version + ``` + + + + + If you prefer containerized deployment, you can use the official Docker images and do the following: + + + ### Set up directory structure and copy configuration files + + ```bash + # Create your proposer working directory + mkdir ~/proposer-node + cd ~/proposer-node + + # Copy configuration files from op-deployer output + # Note: Adjust the path if your .deployer directory is located elsewhere + cp ~/.deployer/state.json . + + # Extract the DisputeGameFactory address + GAME_FACTORY_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].disputeGameFactoryProxyAddress') + echo "DisputeGameFactory Address: $GAME_FACTORY_ADDRESS" + ``` + + ### Create environment variables file + + ```bash + # Create .env file with your actual values + cat > .env << 'EOF' + # L1 Configuration - Replace with your actual RPC URLs + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + + # L2 Configuration - Should match your sequencer setup + L2_RPC_URL=http://sequencer-node:8545 + ROLLUP_RPC_URL=http://sequencer-node:8547 + + # Contract addresses - Extract from your op-deployer output + GAME_FACTORY_ADDRESS=YOUR_ACTUAL_GAME_FACTORY_ADDRESS + + # Private key - Replace with your actual private key + PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + + # Proposer configuration + PROPOSAL_INTERVAL=3600s + GAME_TYPE=0 + POLL_INTERVAL=20s + + # RPC configuration + PROPOSER_RPC_PORT=8560 + EOF + ``` + + **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. + + ### Create docker-compose.yml + + + This configuration assumes your sequencer is running in a Docker container named `sequencer-node` on the same `op-stack` network. + Make sure your sequencer is running before starting the proposer. + + + ```yaml + version: '3.8' + + services: + op-proposer: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-proposer:v1.10.0 + volumes: + - .:/workspace + working_dir: /workspace + ports: + - "8560:8560" + env_file: + - .env + command: + - "op-proposer" + - "--poll-interval=${POLL_INTERVAL}" + - "--rpc.port=${PROPOSER_RPC_PORT}" + - "--rpc.enable-admin" + - "--rollup-rpc=${ROLLUP_RPC_URL}" + - "--l1-eth-rpc=${L1_RPC_URL}" + - "--private-key=${PRIVATE_KEY}" + - "--game-factory-address=${GAME_FACTORY_ADDRESS}" + - "--game-type=${GAME_TYPE}" + - "--proposal-interval=${PROPOSAL_INTERVAL}" + - "--num-confirmations=1" + - "--resubmission-timeout=30s" + - "--wait-node-sync=true" + - "--log.level=info" + restart: unless-stopped + networks: + - op-stack + + networks: + op-stack: + external: true + ``` + + ### Start the proposer service + + ```bash + # Make sure your sequencer network exists + docker network create op-stack 2>/dev/null || true + + # Start the proposer + docker-compose up -d + + # View logs + docker-compose logs -f op-proposer + ``` + + ### Verify proposer is running + + ```bash + # Check proposer RPC is responding + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"optimism_outputAtBlock","params":["latest"],"id":1}' \ + http://localhost:8560 + + # Check container status + docker-compose ps + ``` + + ### Final directory structure + + ```bash + ~/proposer-node/ + ├── state.json # Copied from ~/.deployer/ + ├── .env # Environment variables + └── docker-compose.yml # Docker configuration + ``` + + + Your proposer is now operational and will continuously submit state roots to L1! + + + +## Configuration setup + + + The rest of this guide assumes you're using the **build-from-source** approach. + If you chose Docker, all the necessary configuration was covered in the Docker tab above. + + + + ### Organize your workspace + + Create your proposer working directory at the same level as your sequencer: + + ```bash + # Create proposer directory at the same level as your sequencer + mkdir proposer-node + cd proposer-node + + # Create scripts directory + mkdir scripts + ``` + + ### Extract DisputeGameFactory address + + Extract the `DisputeGameFactory` contract address from your op-deployer output: + + ```bash + # Navigate to proposer directory + cd proposer-node + + # Copy the state.json from .deployer directory created while using op-deployer + # Update the path if your .deployer directory is located elsewhere + cp ../.deployer/state.json . + + # Extract the DisputeGameFactory address + GAME_FACTORY_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].disputeGameFactoryProxyAddress') + echo "DisputeGameFactory Address: $GAME_FACTORY_ADDRESS" + ``` + + + The proposer only needs the `DisputeGameFactory` address to submit proposals. + The `GAME_TYPE=0` represents the standard fault proof game type. + + + ### Set up environment variables + + Create your `.env` file with the actual values: + + ```bash + # Create .env file with your actual values + # L1 Configuration - Replace with your actual RPC URL + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + + # L2 Configuration - Should match your sequencer setup + L2_RPC_URL=http://localhost:8545 + ROLLUP_RPC_URL=http://localhost:8547 + + # Contract addresses - Extract from your op-deployer output + GAME_FACTORY_ADDRESS=YOUR_ACTUAL_GAME_FACTORY_ADDRESS + + # Private key - Replace with your actual private key + PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + + # Proposer configuration + PROPOSAL_INTERVAL=3600s + GAME_TYPE=0 + POLL_INTERVAL=20s + + # RPC configuration + PROPOSER_RPC_PORT=8560 + ``` + + **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values! + + ### Get your private key + + Get a private key from your wallet that will be used for submitting proposals to L1. This account needs sufficient ETH to pay for L1 gas costs. + + + The proposer account needs to be funded with ETH on L1 to pay for proposal submission transactions. Monitor this account's balance regularly as it will consume ETH for each proposal submission. + + + +## Proposer configuration + +Create `scripts/start-proposer.sh`: + +```bash +#!/bin/bash + +source .env + +# Path to the op-proposer binary we built +../optimism/op-proposer/bin/op-proposer \ + --poll-interval=$POLL_INTERVAL \ + --rpc.port=$PROPOSER_RPC_PORT \ + --rpc.enable-admin \ + --rollup-rpc=$ROLLUP_RPC_URL \ + --l1-eth-rpc=$L1_RPC_URL \ + --private-key=$PRIVATE_KEY \ + --game-factory-address=$GAME_FACTORY_ADDRESS \ + --game-type=$GAME_TYPE \ + --proposal-interval=$PROPOSAL_INTERVAL \ + --num-confirmations=1 \ + --resubmission-timeout=30s \ + --wait-node-sync=true \ + --log.level=info +``` + +Your final directory structure should look like: + +```bash +~/ +├── optimism/ # Contains op-proposer binary +├── sequencer-node/ # Your sequencer setup +├── .deployer/ # From op-deployer +│ └── state.json +└── proposer-node/ # Your proposer working directory + ├── state.json # Copied from .deployer + ├── .env + └── scripts/ + └── start-proposer.sh +``` + +## Starting the proposer + + + ### Verify prerequisites + + Ensure your sequencer and op-node are running: + + ```bash + # Test L1 connectivity + # Note: Make sure you have exported these environment variables to your current shell session: + # export L1_RPC_URL="https://sepolia.infura.io/v3/YOUR_KEY" + # export L2_RPC_URL="http://localhost:8545" + # export ROLLUP_RPC_URL="http://localhost:8547" + + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + $L1_RPC_URL + + # Test L2 connectivity + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + $L2_RPC_URL + + # Test rollup node connectivity + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' \ + $ROLLUP_RPC_URL + ``` + + ### Start the proposer + + ```bash + # Make the script executable + chmod +x scripts/start-proposer.sh + + # Start the proposer + ./scripts/start-proposer.sh + ``` + + +## Verification + + + ### Check proposer status + + Verify your proposer is working correctly: + + ```bash + # Monitor proposal activity + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"optimism_outputAtBlock","params":["latest"],"id":1}' \ + http://localhost:8547 + + # Check if your proposer address has enough ETH for gas + # (Replace with your actual proposer address) + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xYOUR_PROPOSER_ADDRESS","latest"],"id":1}' \ + $L1_RPC_URL + ``` + + ### Verify proposer RPC + + ```bash + # Check proposer RPC is responding + curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"optimism_outputAtBlock","params":["latest"],"id":1}' \ + http://localhost:8560 + ``` + + +Your proposer is now operational! + +## What's Next? + +Perfect! Your proposer is submitting state roots to L1. The final step is to set up the challenger to monitor and respond to disputes. + + + **Next**: Configure and start op-challenger to monitor disputes and maintain your rollup's security. + + +*** + +## Need Help? + +* **Community Support**: Join the [Optimism Discord](https://discord.optimism.io) +* **Proposer Configuration**: [op-proposer Configuration Reference](/operators/chain-operators/configuration/proposer) +* **Dispute Games**: [Deploying Dispute Games with OPCM](/operators/chain-operators/tutorials/dispute-games) From 057155f5617477e8b94e0a884ae0b0fb551b0956 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Aug 2025 14:45:28 +0100 Subject: [PATCH 07/92] Refine L2 rollup tutorial by enhancing clarity in callout sections and adding new content on connecting wallets and depositing ETH. --- .../create-l2-rollup/op-challenger-setup.mdx | 45 ++++++++++++++----- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index e2da01982..205fc4f60 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -112,9 +112,9 @@ This guide provides a walkthrough of setting up the configuration and monitoring --safedb.path # Replace with your actual path ``` - - If this path is not set, the SafeDB feature will be disabled. - + + If this path is not set, the SafeDB feature will be disabled. + 2. Ensuring Historical Data Availability: @@ -129,9 +129,9 @@ This guide provides a walkthrough of setting up the configuration and monitoring --safedb.path ``` - - Replace `` with the URL of your archive node and `` with the desired path for storing SafeDB data. - + + Replace `` with the URL of your archive node and `` with the desired path for storing SafeDB data. + #### `--private-key` @@ -245,13 +245,36 @@ You've successfully completed the entire L2 rollup testnet tutorial! Your rollup ✅ **Proposer** - Submitting state roots\ ✅ **Challenger** - Monitoring disputes -## What's Next? +## Connect your wallet to your chain -Your rollup testnet is complete, but there's always more to explore and optimize. +You now have a fully functioning OP Stack Rollup with a Sequencer node running on `http://localhost:8545`. You can connect your wallet to this chain the same way you'd connect your wallet to any other EVM chain. - - **Back to Overview**: See what you've accomplished and explore advanced topics for production deployments. - +## Get ETH on your chain + +Once you've connected your wallet, you'll probably notice that you don't have any ETH to pay for gas on your chain. + +The easiest way to deposit Sepolia ETH into your chain is to send ETH directly to the `L1StandardBridge` contract. + +### Navigate to the contracts-bedrock directory + +```bash +cd ~/optimism/packages/contracts-bedrock +``` + +### Get the address of the `L1StandardBridgeProxy` contract + +```bash +cat deployments/getting-started/.deploy | jq -r .L1StandardBridgeProxy +``` + +### Send some Sepolia ETH to the L1StandardBridgeProxy contract + +Grab the L1 bridge proxy contract address and, using the wallet that you want to have ETH on your Rollup, send that address a small amount of ETH on Sepolia (0.1 or less is fine). This will trigger a deposit that will mint ETH into your wallet on L2. It may take up to 5 minutes for that ETH to appear in your wallet on L2. + +## See your rollup in action + +You can interact with your Rollup the same way you'd interact with any other EVM chain. +Send some transactions, deploy some contracts, and see what happens! *** From fb86172f74f9aa196916763d016e0179e7a24410 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Aug 2025 14:57:35 +0100 Subject: [PATCH 08/92] Remove outdated L2 rollup tutorial as it is no longer relevant to current deployment practices. This cleanup aligns with recent updates to the OP Stack documentation. --- .../{create-l2-rollup/index.mdx => create-l2-rollup.mdx} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename pages/operators/chain-operators/tutorials/{create-l2-rollup/index.mdx => create-l2-rollup.mdx} (98%) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/index.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx similarity index 98% rename from pages/operators/chain-operators/tutorials/create-l2-rollup/index.mdx rename to pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index 803d48a7a..bba1fcab0 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/index.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -1,5 +1,5 @@ --- -title: Creating your own L2 rollup testnet - Overview +title: Creating your own L2 rollup testnet description: Learn how to deploy and orchestrate all OP Stack components for a complete testnet deployment. lang: en-US content_type: tutorial From cb07788e227e299f7203d2029d2afe2b08a41c9a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Aug 2025 15:00:13 +0100 Subject: [PATCH 09/92] fixed links --- .../chain-operators/tutorials/create-l2-rollup.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index bba1fcab0..e3ce76403 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -29,23 +29,23 @@ Welcome to the complete guide for deploying your own OP Stack L2 rollup testnet. This tutorial is organized into sequential steps that build upon each other: - ### **[Spin up op-deployer](./op-deployer-setup)** + ### **[Spin up op-deployer](/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup)** Install op-deployer, deploy L1 contracts, and prepare your environment - ### **[Spin up sequencer](./op-geth-setup)** + ### **[Spin up sequencer](/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup)** Set up and run op-geth and op-node (the execution and consensus layers) - ### **[Spin up batcher](./op-batcher-setup)** + ### **[Spin up batcher](/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup)** Configure and start op-batcher for L1 data publishing - ### **[Spin up proposer](./op-proposer-setup)** + ### **[Spin up proposer](/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup)** Set up op-proposer for state root submissions - ### **[Spin up challenger](./op-challenger-setup)** + ### **[Spin up challenger](/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup)** Configure op-challenger for dispute resolution monitoring From 95a338d3699d4fa932dc59bab9e7784d54d6d226 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Aug 2025 15:02:31 +0100 Subject: [PATCH 10/92] update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 97163bd87..ebc2ad338 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Optimism Docs", "type": "module", "scripts": { - "lint": "eslint . --ext mdx --max-warnings 0 && pnpm spellcheck:lint && pnpm check-breadcrumbs && pnpm check-redirects && pnpm validate-metadata && pnpm link-checker", + "lint": "eslint . --ext mdx --max-warnings 0 && pnpm spellcheck:lint && pnpm check-redirects && pnpm validate-metadata && pnpm link-checker", "fix": "eslint . --ext mdx --fix && pnpm spellcheck:fix && pnpm fix-redirects && pnpm fix-links", "spellcheck:lint": "cspell lint \"**/*.mdx\"", "prepare": "husky", From f684c64b61bda210e5c6cd04d29a0a0afa8aa51d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Aug 2025 15:04:27 +0100 Subject: [PATCH 11/92] Remove the breadcrumbs job from the CircleCI configuration as it is no longer needed, streamlining the CI/CD workflow. --- .circleci/config.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d87d65749..5a68c86ee 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -65,16 +65,6 @@ jobs: # NEXT_PUBLIC_ALGOLIA_WRITE_API_KEY # NEXT_PUBLIC_ALGOLIA_INDEX_NAME pnpm run index:docs - - breadcrumbs: - description: Check breadcrumbs in documentation - executor: ubuntu - steps: - - checkout - - setup-node - - run: - name: Run breadcrumb check - command: pnpm check-breadcrumbs lint: description: Lint Markdown files and validate metadata @@ -154,7 +144,6 @@ workflows: pr-workflow: jobs: - - breadcrumbs - links - lint monthly-workflow: From 449474de5dd873606018e6125c473a0115133f50 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Aug 2025 16:46:28 +0100 Subject: [PATCH 12/92] Update L2 rollup tutorial with specific L1 chain ID and version changes for op-geth. Remove outdated prerequisites and enhance clarity in deployment steps, including updates to Docker image versions and configuration instructions. --- .../create-l2-rollup/op-deployer-setup.mdx | 2 +- .../create-l2-rollup/op-geth-setup.mdx | 56 +++++++------------ 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 38c3e3e49..200b39f8e 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -87,7 +87,7 @@ To get started with `op-deployer`, create an intent file that defines your desir ```bash op-deployer init \ - --l1-chain-id \ + --l1-chain-id 11155111 \ --l2-chain-ids \ --workdir .deployer \ --intent-type diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 51845a28a..bc6260fc7 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -39,33 +39,6 @@ The sequencer is responsible for: ## Prerequisites -### Essential requirements - -Before spinning up your sequencer, complete the following steps: - - - ### Successful L1 contract deployment - - * Deployed L1 contracts using [`op-deployer apply`](/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup#apply-deploy-your-chain) command. - * Generated genesis and rollup configuration files using: - - ```bash - op-deployer inspect genesis --workdir .deployer > .deployer/genesis.json - op-deployer inspect rollup --workdir .deployer > .deployer/rollup.json - ``` - - ### Required configuration files - - * `genesis.json` - L2 genesis file for initializing op-geth - * `rollup.json` - Rollup configuration file for op-node - * Access to your deployment `state.json` file from op-deployer - - ### L1 network access - - * L1 RPC endpoint (Ethereum, Sepolia, etc.) - * L1 Beacon node endpoint - - ### Software requirements * Git (for cloning repositories) @@ -85,9 +58,9 @@ The main components you'll need for sequencer deployment are: * **op-geth**: Look for the latest `op-geth/v*` [release](https://github.com/ethereum-optimism/op-geth/releases) - The versions used in this guide (**op-node/v1.13.3** and **op-geth/v1.101511.0**) are verified compatible versions. + The versions used in this guide (**op-node/v1.13.3** and **op-geth/v1.101511.1**) are verified compatible versions. - According to the **op-node v1.13.3** [release notes](https://github.com/ethereum-optimism/optimism/releases/tag/op-node%2Fv1.13.3), this op-node version specifically corresponds to **op-geth v1.101511.0**. + According to the **op-node v1.13.3** [release notes](https://github.com/ethereum-optimism/optimism/releases), this op-node version specifically corresponds to **op-geth v1.101511.1**. Always check the release notes to ensure you're using compatible versions. @@ -109,7 +82,7 @@ In this guide Docker alternative is also provided. cd optimism # Checkout the latest release tag - git checkout op-node/v1.13.3 + git checkout op-node/v1.13.5 # Build op-node cd op-node @@ -126,7 +99,7 @@ In this guide Docker alternative is also provided. cd op-geth # Checkout to this release tag - git checkout v1.101511.0 + git checkout v1.101511.1 # Build op-geth make geth @@ -467,16 +440,25 @@ In this guide Docker alternative is also provided. EOF ``` + 3. Get your public IP address + + ```bash + # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env + curl ifconfig.me + # or + curl ipinfo.io/ip + ``` + **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. - 3. **Create docker-compose.yml:** + 4. **Create docker-compose.yml:** ```yaml version: '3.8' services: op-geth: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.1 volumes: # Mount entire directory to avoid file mounting issues - .:/workspace @@ -547,7 +529,7 @@ In this guide Docker alternative is also provided. - "--log.format=json" ``` - 4. **Initialize op-geth with Docker:** + 5. **Initialize op-geth with Docker:** ```bash # Make sure you're in the sequencer-node directory with all files copied @@ -557,11 +539,11 @@ In this guide Docker alternative is also provided. docker run --rm \ -v $(pwd):/workspace \ -w /workspace \ - us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 \ + us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.1 \ init --datadir=./op-geth-data --state.scheme=hash ./genesis.json ``` - 5. **Start the services:** + 6. **Start the services:** ```bash # Start both services @@ -571,7 +553,7 @@ In this guide Docker alternative is also provided. docker-compose logs -f ``` - 6. **Final directory structure:** + 7. **Final directory structure:** ```bash ~/sequencer-node/ From f337a6f59177b0c32568d332824c1d404ff68ec7 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Aug 2025 16:47:02 +0100 Subject: [PATCH 13/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../tutorials/create-l2-rollup/op-geth-setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index bc6260fc7..0943a3002 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -440,7 +440,7 @@ In this guide Docker alternative is also provided. EOF ``` - 3. Get your public IP address + 3. Get your public IP address ```bash # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env From c090eeb9b97209721d48789fcf762782fac1a4c7 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Aug 2025 16:47:13 +0100 Subject: [PATCH 14/92] Clarify instructions in L2 rollup tutorial by rephrasing the creation of the docker-compose.yml file for improved readability. --- .../tutorials/create-l2-rollup/op-geth-setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 0943a3002..8e951a545 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -451,7 +451,7 @@ In this guide Docker alternative is also provided. **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. - 4. **Create docker-compose.yml:** + 4. Create a docker-compose.yml file: ```yaml version: '3.8' From b35849b5eea363431a646334749ef90e0bb5826c Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Aug 2025 16:59:21 +0100 Subject: [PATCH 15/92] Update compatibility information in deployment guides for op-geth and op-batcher to reflect version changes from v1.101511.0 to v1.101511.1 and v1.13.1 to v1.13.2, ensuring accurate instructions for users. --- .../chain-operators/deploy/proposer-setup-guide.mdx | 2 +- .../chain-operators/deploy/sequencer-node.mdx | 10 +++++----- .../operators/chain-operators/deploy/spin-batcher.mdx | 4 ++-- .../tutorials/create-l2-rollup/op-batcher-setup.mdx | 4 ++-- .../tutorials/create-l2-rollup/op-proposer-setup.mdx | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx b/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx index 734d9771a..935138f7e 100644 --- a/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx +++ b/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx @@ -71,7 +71,7 @@ just ``` - This uses `op-proposer/v1.10.0` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.0 from [spinning up the sequencer guide](/operators/chain-operators/deploy/sequencer-node). + This uses `op-proposer/v1.10.0` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.1 from [spinning up the sequencer guide](/operators/chain-operators/deploy/sequencer-node). Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility. diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 9d3a93ee6..5f3d75e74 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -79,9 +79,9 @@ The main components you'll need for sequencer deployment are: * **op-geth**: Look for the latest `op-geth/v*` [release](https://github.com/ethereum-optimism/op-geth/releases) -The versions used in this guide (**op-node/v1.13.3** and **op-geth/v1.101511.0**) are verified compatible versions. +The versions used in this guide (**op-node/v1.13.3** and **op-geth/v1.101511.1**) are verified compatible versions. -According to the **op-node v1.13.3** [release notes](https://github.com/ethereum-optimism/optimism/releases/tag/op-node%2Fv1.13.3), this op-node version specifically corresponds to **op-geth v1.101511.0**. +According to the **op-node v1.13.3** [release notes](https://github.com/ethereum-optimism/optimism/releases/tag/op-node%2Fv1.13.3), this op-node version specifically corresponds to **op-geth v1.101511.1**. Always check the release notes to ensure you're using compatible versions. @@ -119,7 +119,7 @@ In this guide Docker alternative is also provided. cd op-geth # Checkout to this release tag - git checkout v1.101511.0 + git checkout v1.101511.1 # Build op-geth make geth @@ -466,7 +466,7 @@ In this guide Docker alternative is also provided. services: op-geth: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.1 volumes: # Mount entire directory to avoid file mounting issues - .:/workspace @@ -547,7 +547,7 @@ In this guide Docker alternative is also provided. docker run --rm \ -v $(pwd):/workspace \ -w /workspace \ - us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 \ + us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.1 \ init --datadir=./op-geth-data --state.scheme=hash ./genesis.json ``` diff --git a/pages/operators/chain-operators/deploy/spin-batcher.mdx b/pages/operators/chain-operators/deploy/spin-batcher.mdx index ec16cd85d..5cf092be3 100644 --- a/pages/operators/chain-operators/deploy/spin-batcher.mdx +++ b/pages/operators/chain-operators/deploy/spin-batcher.mdx @@ -59,7 +59,7 @@ To ensure you're using the latest compatible versions of OP Stack components, al Look for the latest `op-batcher/v*` release that's compatible with your sequencer setup. - This guide uses `op-batcher/v1.13.1` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.0 from the sequencer setup. + This guide uses `op-batcher/v1.13.2` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.1 from the sequencer setup. Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information. @@ -73,7 +73,7 @@ git clone https://github.com/ethereum-optimism/optimism.git cd optimism # Checkout the latest release tag -git checkout op-batcher/v1.13.1 +git checkout op-batcher/v1.13.2 # Build op-batcher cd op-batcher diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index 9ce1c5786..83e56c579 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -63,7 +63,7 @@ To ensure you're using the latest compatible versions of OP Stack components, al Look for the latest `op-batcher/v*` release that's compatible with your sequencer setup. - This guide uses `op-batcher/v1.13.1` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.0 from the sequencer setup. + This guide uses `op-batcher/v1.13.2` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.1 from the sequencer setup. Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information. @@ -82,7 +82,7 @@ For setting up the batcher, we recommend building from source as it provides bet cd optimism # Checkout the latest release tag - git checkout op-batcher/v1.13.1 + git checkout op-batcher/v1.13.2 # Build op-batcher cd op-batcher diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index 1fe3b7ba2..e3eea08f2 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -62,7 +62,7 @@ To ensure you're using the latest compatible versions of OP Stack components, al Look for the latest `op-proposer/v*` release that's compatible with your sequencer setup. - This guide uses `op-proposer/v1.10.0` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.0 from the sequencer setup. + This guide uses `op-proposer/v1.10.0` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.1 from the sequencer setup. Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information. From 13597548f996b3ad8dfdc14544991ac7e37a10f6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Aug 2025 18:04:53 +0100 Subject: [PATCH 16/92] Remove compression option from op-batcher and op-geth setup instructions, update op-batcher image version to v1.13.2, and enhance clarity in docker-compose.yml file creation. --- .../chain-operators/deploy/spin-batcher.mdx | 2 - .../create-l2-rollup/op-batcher-setup.mdx | 9 +--- .../create-l2-rollup/op-geth-setup.mdx | 42 +++++++++---------- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/pages/operators/chain-operators/deploy/spin-batcher.mdx b/pages/operators/chain-operators/deploy/spin-batcher.mdx index 5cf092be3..a206e7ae1 100644 --- a/pages/operators/chain-operators/deploy/spin-batcher.mdx +++ b/pages/operators/chain-operators/deploy/spin-batcher.mdx @@ -187,7 +187,6 @@ services: - "--private-key=${BATCHER_PRIVATE_KEY}" - "--batch-type=1" - "--data-availability-type=blobs" - - "--compress" - "--log.level=info" restart: unless-stopped ``` @@ -351,7 +350,6 @@ source .env --private-key=$BATCHER_PRIVATE_KEY \ --batch-type=1 \ --data-availability-type=blobs \ - --compress \ --log.level=info ``` diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index 83e56c579..733d720cb 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -154,7 +154,7 @@ For setting up the batcher, we recommend building from source as it provides bet **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. - ### Create docker-compose.yml + ### Create a docker-compose.yml file This configuration assumes your sequencer is running in a Docker container named `sequencer-node` on the same `op-stack` network. @@ -166,7 +166,7 @@ For setting up the batcher, we recommend building from source as it provides bet services: op-batcher: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:v1.13.1 + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:v1.13.2 volumes: - .:/workspace working_dir: /workspace @@ -191,7 +191,6 @@ For setting up the batcher, we recommend building from source as it provides bet - "--private-key=${BATCHER_PRIVATE_KEY}" - "--batch-type=1" - "--data-availability-type=blobs" - - "--compress" - "--log.level=info" restart: unless-stopped ``` @@ -200,8 +199,6 @@ For setting up the batcher, we recommend building from source as it provides bet ```bash # Make sure your sequencer network exists - docker network create op-stack 2>/dev/null || true - # Start the batcher docker-compose up -d @@ -361,7 +358,6 @@ source .env --private-key=$BATCHER_PRIVATE_KEY \ --batch-type=1 \ --data-availability-type=blobs \ - --compress \ --log.level=info ``` @@ -372,7 +368,6 @@ source .env * **`--max-channel-duration`**: Maximum time (in L1 blocks) to keep a channel open * **`--batch-type`**: Type of batch encoding (1 for span batches, 0 for singular batches) * **`--data-availability-type`**: Whether to use blobs or calldata for data availability -* **`--compress`**: Enable compression to reduce L1 data costs ## Starting the batcher diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 8e951a545..5a08d9d18 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -287,27 +287,27 @@ In this guide Docker alternative is also provided. source .env # Path to the op-geth binary we built - ../op-geth/build/bin/geth \ - --datadir=./op-geth-data \ - --http \ - --http.addr=0.0.0.0 \ - --http.port=$OP_GETH_HTTP_PORT \ - --http.vhosts="*" \ - --http.corsdomain="*" \ - --http.api=eth,net,web3,debug,txpool,admin \ - --ws \ - --ws.addr=0.0.0.0 \ - --ws.port=$OP_GETH_WS_PORT \ - --ws.origins="*" \ - --ws.api=eth,net,web3,debug,txpool,admin \ - --authrpc.addr=0.0.0.0 \ - --authrpc.port=$OP_GETH_AUTH_PORT \ - --authrpc.vhosts="*" \ - --authrpc.jwtsecret=$JWT_SECRET \ - --syncmode=full \ - --gcmode=archive \ - --rollup.disabletxpoolgossip=true \ - --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT +../op-geth/build/bin/geth \ + --datadir=./op-geth-data \ + --http \ + --http.addr=0.0.0.0 \ + --http.port=$OP_GETH_HTTP_PORT \ + --http.vhosts="*" \ + --http.corsdomain="*" \ + --http.api=eth,net,web3,debug,txpool,admin,miner \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port=$OP_GETH_WS_PORT \ + --ws.origins="*" \ + --ws.api=eth,net,web3,debug,txpool,admin,miner \ + --authrpc.addr=0.0.0.0 \ + --authrpc.port=$OP_GETH_AUTH_PORT \ + --authrpc.vhosts="*" \ + --authrpc.jwtsecret=$JWT_SECRET \ + --syncmode=full \ + --gcmode=archive \ + --rollup.disabletxpoolgossip=true \ + --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT ``` ### op-node configuration for sequencer From e2d3c4512135338e44ec62170c2ad8971d6f841f Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 19 Aug 2025 15:26:18 +0100 Subject: [PATCH 17/92] Update op-challenger setup documentation: enhance clarity in configuration steps, add prerequisites, and improve instructions for building and deploying the challenger. Correct DisputeGameFactory address extraction command in proposer setup guide for accuracy. --- .../create-l2-rollup/op-challenger-setup.mdx | 599 +++++++++++++----- .../create-l2-rollup/op-proposer-setup.mdx | 2 +- 2 files changed, 436 insertions(+), 165 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 205fc4f60..5acc28451 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -15,7 +15,7 @@ categories: is_imported_content: 'false' --- -import { Callout, Steps, Card } from 'nextra/components' +import { Callout, Steps, Tabs, Tab } from 'nextra/components' # Spin up challenger @@ -25,225 +25,496 @@ After you have spun up your sequencer, batcher, and proposer, the final step is **Step 5 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the previous one. -This guide provides a walkthrough of setting up the configuration and monitoring options for `op-challenger`. See the [OP-Challenger Explainer](/stack/fault-proofs/challenger) for a general overview of this fault proofs feature. +This guide provides step-by-step instructions for setting up the configuration and monitoring options for `op-challenger`. The challenger is a critical fault proofs component that monitors dispute games and challenges invalid claims to protect your OP Stack chain. + +See the [OP-Challenger Explainer](/stack/fault-proofs/challenger) for a general overview of this fault proofs feature. + +The challenger is responsible for: + +* Monitoring dispute games created by the fault proof system +* Challenging invalid claims in dispute games +* Defending valid state transitions +* Resolving games when possible + +## Prerequisites + +### Essential requirements + +Before configuring your challenger, complete the following steps: - ### Build the executable - * Clone the monorepo +### Deploy OP Stack chain with fault proofs enabled +* L1 contracts deployed with dispute game factory +* Fault proof system active on your chain +* Access to your chain's contract addresses +* [Generate an absolute prestate](/operators/chain-operators/tutorials/absolute-prestate#generating-the-absolute-prestate) for your network version - This is critical as the challenger will refuse to interact with games if it doesn't have the matching prestate - ```bash - git clone https://github.com/ethereum-optimism/optimism.git - ``` +### Set up required infrastructure access +* L1 RPC endpoint (Ethereum, Sepolia, etc.) +* L1 Beacon node endpoint (for blob access) +* L2 archive node with debug API enabled +* Rollup node (op-node) with historical data - * Check out the [latest release of `op-challenger`](https://github.com/ethereum-optimism/optimism/releases) and use the commit to deploy. Alternatively, chain operators can use the prebuilt challenger docker images included in the release notes. - If a Docker image is used, it already comes with `op-program` server and an executable for Cannon embedded, so the Cannon bin doesn't need to be specified. +### Prepare configuration files +* `rollup.json` - Rollup configuration file +* `genesis-l2.json` - L2 genesis file +* `prestate.json` - The absolute prestate file generated in step 1 - ```bash - git checkout op-challenger/vX.Y.Z - ``` + - - Chain operators need to specify the arguments and `op-program` server if `op-challenger` is running outside of Docker, but there's a Cannon server option which points to `op-program`'s executable. - +### Software requirements - * Build challenger +* Git (for cloning repositories) +* Go 1.21+ (if building from source) +* Docker and Docker Compose (optional but recommended) +* Access to a funded Ethereum account for challenger operations - ```bash - cd optimism - pnpm install - make op-challenger - ``` +### Finding the current stable releases - ### Configure challenger +To ensure you're using the latest compatible versions of OP Stack components, always check the official releases page: - * Configure challenger with the required flags. Tip: Use the `op-challenger --help` to view all subcommands, command line, and environment variable options. - * The example config file below shows the flags to configure in this step: +[OP Stack releases page](https://github.com/ethereum-optimism/optimism/releases) - ```docker - challenger: - user: "1000" - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v0.2.11 - command: - - "op-challenger" - - "--l1-eth-rpc=http://sepolia-el-1:8545" - - "--l1-beacon=http://sepolia-cl-1:5051" - - "--l2-eth-rpc=http://op-sepolia-el-1:8545" - - "--rollup-rpc=http://op-sepolia-cl-1:5051" - - "--selective-claim-resolution" - - "--private-key=...." - - "--network=..." - - "--datadir=/data" - - "--cannon-prestates-url=..." - volumes: - - "./challenger-data:/data" - ``` +Look for the latest `op-challenger/v*` release. The challenger version used in this guide (op-challenger/v1.5.0) is a verified stable version. - #### `--l1-eth-rpc` +Always check the release notes to ensure you're using compatible versions with your chain's deployment. - * This is the HTTP provider URL for a standard L1 node, can be a full node. `op-challenger` will be sending many requests, so chain operators need a node that is trusted and can easily handle many transactions. - * Note: Challenger has a lot of money, and it will spend it if it needs to interact with games. That might risk not defending games or challenging games correctly, so chain operators should really trust the nodes being pointed at Challenger. +## Software installation - #### `--l1-beacon` +For challenger deployment, you can either build from source (recommended for better control and debugging) or use Docker for a containerized setup. - * This is needed just to get blobs from. - * In some instances, chain operators might need a blob archiver or L1 consensus node configured not to prune blobs: - * If the chain is proposing regularly, a blob archiver isn't needed. There's only a small window in the blob retention period that games can be played. - * If the chain doesn't post a valid output root in 18 days, then a blob archiver running a challenge game is needed. If the actor gets pushed to the bottom of the game, it could lose if it's the only one protecting the chain. + + +### Build and Configure - #### `--l2-eth-rpc` +Building from source gives you full control over the binaries and is the preferred approach for production deployments. - * This needs to be `op-geth` archive node, with `debug` enabled. - * Technically doesn't need to go to bedrock, but needs to have access to the start of any game that is still in progress. +**Clone and build op-challenger** - #### `--rollup-rpc` +```bash +# Clone the optimism monorepo +git clone https://github.com/ethereum-optimism/optimism.git +cd optimism - * This needs to be an `op-node` archive node because challenger needs access to output roots from back when the games start. See below for important configuration details: +# Check out the latest release of op-challenger +git checkout op-challenger/v1.5.0 - 1. Safe Head Database (SafeDB) Configuration for op-node: +# Install dependencies and build +just op-challenger - * The `op-node` behind the `op-conductor` must have the SafeDB enabled to ensure it is not stateless. +# Binary will be available at ./op-challenger/bin/op-challenger +``` - * To enable SafeDB, set the `--safedb.path` value in your configuration. This specifies the file path used to persist safe head update data. +### Verify installation - * Example Configuration: +Check that you have properly installed the challenger component: - ``` - --safedb.path # Replace with your actual path - ``` +```bash +# Make sure you're in the optimism directory +./op-challenger/bin/op-challenger --help + +# You should see the challenger help output with available commands and flags +``` + +## Configuration setup + + - - If this path is not set, the SafeDB feature will be disabled. - +### Organize your workspace - 2. Ensuring Historical Data Availability: +After building the binaries, create your challenger working directory: - * Both `op-node` and `op-geth` must have data from the start of the games to maintain network consistency and allow nodes to reference historical state and transactions. - * For `op-node`: Configure it to maintain a sufficient history of blockchain data locally or use an archive node. - * For `op-geth`: Similarly, configure to store or access historical data. - * Example Configuration: +```bash +# Create challenger directory (this should be at the same level as optimism directory) +mkdir challenger-node +cd challenger-node + +# Create necessary subdirectories +mkdir scripts +mkdir challenger-data + +# Verify the optimism directory is accessible +# Directory structure should look like: +# /optimism/ (contains the built binaries) +# /challenger-node/ (your working directory) +``` - ``` - op-node \ - --rollup-rpc \ - --safedb.path - ``` +### Copy configuration files - - Replace `` with the URL of your archive node and `` with the desired path for storing SafeDB data. - +```bash +# Copy configuration files to your challenger directory +# Adjust paths based on your deployment setup +cp /path/to/your/rollup.json . +cp /path/to/your/genesis-l2.json . +``` - #### `--private-key` +### Set up environment variables - * Chain operators must specify a private key or use something else (like `op-signer`). - * This uses the same transaction manager arguments as `op-node` , batcher, and proposer, so chain operators can choose one of the following options: - * a mnemonic - * a private key - * `op-signer` endpoints +You'll need to gather several pieces of information before creating your configuration. Here's where to get each value: - #### `--network` +**L1 network access:** +* L1 RPC URL: Your L1 node endpoint (Infura, Alchemy, or self-hosted) +* L1 Beacon URL: Beacon chain API endpoint for blob access - * This identifies the L2 network `op-challenger` is running for, e.g., `op-sepolia` or `op-mainnet`. - * When using the `--network` flag, the `--game-factory-address` will be automatically pulled from the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json). - * When cannon is executed, challenger needs the roll-up config and the L2 Genesis, which is op-geth's Genesis file. Both files are automatically loaded when Cannon Network is used, but custom networks will need to specify both Cannon L2 Genesis and Cannon rollup config. - * For custom networks not in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), the `--game-factory-address` and rollup must be specified, as follows: +**L2 network access:** +* L2 RPC URL: Your op-geth archive node endpoint +* Rollup RPC URL: Your op-node endpoint with historical data - ``` - --cannon-rollup-config rollup.json \ - --cannon-l2-genesis genesis-l2.json \ - # use this if running challenger outside of the docker image - --cannon-server ./op-program/bin/op-program \ - # json or url, version of op-program deployed on chain - # if you use the wrong one, you will lose the game - # if you deploy your own contracts, you specify the hash, the root of the json file - # op mainnet are tagged versions of op-program - # make reproducible prestate - # challenger verifies that onchain - --cannon-prestate ./op-program/bin/prestate.json \ - # load the game factory address from system config or superchain registry - # point the game factory address at the dispute game factory proxy - --game-factory-address - ``` +**Challenger wallet:** +* Private key for challenger operations (must be funded) - - These options vary based on which `--network` is specified. Chain operators always need to specify a way to load prestates and must also specify the cannon-server whenever the docker image isn't being used. - +**Network configuration:** +* Game factory address from your contract deployment +* Network identifier (e.g., op-sepolia, op-mainnet, or custom) - #### `--datadir` +Copy and paste in your terminal, to create your env file. - * This is a directory that `op-challenger` can write to and store whatever data it needs. It will manage this directory to add or remove data as needed under that directory. - * If running in docker, it should point to a docker volume or mountpoint, so the data isn't lost on every restart. The data can be recreated if needed but particularly if challenger has executed cannon as part of responding to a game it may mean a lot of extra processing. +```bash +# Create .env file with your actual values +cat > .env << 'EOF' +# L1 Configuration - Replace with your actual RPC URLs +L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + +# L2 Configuration - Replace with your actual node endpoints +L2_RPC_URL=http://localhost:8545 +ROLLUP_RPC_URL=http://localhost:8547 +L1_BEACON=http://sepolia-cl-1:5051 + +# Wallet configuration - Choose either mnemonic + HD path OR private key +MNEMONIC="test test test test test test test test test test test junk" +HD_PATH="m/44'/60'/0'/0/0" +# PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY # Alternative to mnemonic + +# Network configuration +NETWORK=op-sepolia +GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS + +# Trace configuration +TRACE_TYPE=permissioned,cannon + +# Data directory +DATADIR=./challenger-data + +# Cannon configuration +# Path to the cannon binary (built from optimism repo) +CANNON_BIN=/cannon/bin/cannon + +# Configuration files +CANNON_ROLLUP_CONFIG= +CANNON_L2_GENESIS= +CANNON_SERVER=/op-program/bin/op-program +CANNON_PRESTATE= +EOF +``` - #### `--cannon-prestates-url` +**Important:** Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. - The pre-state is effectively the version of `op-program` that is deployed on chain. And chain operators must use the right version. `op-challenger` will refuse to interact with games that have a different absolute prestate hash to avoid making invalid claims. If deploying your own contracts, chain operators must specify an absolute prestate hash taken from the `make reproducible-prestate` command during contract deployment, which will also build the required prestate json file. +### Understanding key configuration flags - All governance approved releases use a tagged version of `op-program`. These can be rebuilt by checking out the version tag and running `make reproducible-prestate`. +
+--l1-eth-rpc - * There are two ways to specify the prestate to use: - * `--cannon-prestate`: specifies a path to a single Cannon pre-state Json file - * `--cannon-prestates-url`: specifies a URL to load pre-states from. This enables participating in games that use different prestates, for example due to a network upgrade. The prestates are stored in this directory named by their hash. - * Example final URL for a prestate: - * [https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json](https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json) - * This file contains the cannon memory state. - - - Challenger will refuse to interact with any games if it doesn't have the matching prestate. - +* This is the HTTP provider URL for a standard L1 node, can be a full node. `op-challenger` will be sending many requests, so chain operators need a node that is trusted and can easily handle many transactions. +* Note: Challenger has a lot of money, and it will spend it if it needs to interact with games. That might risk not defending games or challenging games correctly, so chain operators should really trust the nodes being pointed at Challenger. +
- ### Execute challenger +
+--l1-beacon - The final step is to execute challenger with the required flags. It will look something like this (but with required flags added): - - ```bash - ./op-challenger/bin/op-challenger \ - --trace-type permissioned,cannon \ - --l1-eth-rpc http://localhost:8545 \ - --rollup-rpc http://localhost:9546 \ - --game-factory-address $DISPUTE_GAME_FACTORY \ - --datadir temp/challenger-data \ - --cannon-rollup-config .devnet/rollup.json \ - --cannon-l2-genesis .devnet/genesis-l2.json \ - --cannon-bin ./cannon/bin/cannon \ - --cannon-server ./op-program/bin/op-program \ - --cannon-prestate ./op-program/bin/prestate.json \ - --l2-eth-rpc http://localhost:9545 \ - --mnemonic "test test test test test test test test test test test junk" \ - --hd-path "m/44'/60'/0'/0/8" \ +* This is needed just to get blobs from. +* In some instances, chain operators might need a blob archiver or L1 consensus node configured not to prune blobs: + * If the chain is proposing regularly, a blob archiver isn't needed. There's only a small window in the blob retention period that games can be played. + * If the chain doesn't post a valid output root in 18 days, then a blob archiver running a challenge game is needed. If the actor gets pushed to the bottom of the game, it could lose if it's the only one protecting the chain. +
+ +
+--l2-eth-rpc + +* This needs to be `op-geth` archive node, with `debug` enabled. +* Technically doesn't need to go to bedrock, but needs to have access to the start of any game that is still in progress. +
+ +
+--rollup-rpc + +* This needs to be an `op-node` archive node because challenger needs access to output roots from back when the games start. See below for important configuration details: + +1. Safe Head Database (SafeDB) Configuration for op-node: + + * The `op-node` behind the `op-conductor` must have the SafeDB enabled to ensure it is not stateless. + * To enable SafeDB, set the `--safedb.path` value in your configuration. This specifies the file path used to persist safe head update data. + * Example Configuration: + + ``` + --safedb.path # Replace with your actual path + ``` + + + If this path is not set, the SafeDB feature will be disabled. + + +2. Ensuring Historical Data Availability: + + * Both `op-node` and `op-geth` must have data from the start of the games to maintain network consistency and allow nodes to reference historical state and transactions. + * For `op-node`: Configure it to maintain a sufficient history of blockchain data locally or use an archive node. + * For `op-geth`: Similarly, configure to store or access historical data. + * Example Configuration: + + ``` + op-node \ + --rollup-rpc \ + --safedb.path + ``` + + + Replace `` with the URL of your archive node and `` with the desired path for storing SafeDB data. + +
+ +
+--private-key + +* Chain operators must specify a private key or use something else (like `op-signer`). +* This uses the same transaction manager arguments as `op-node` , batcher, and proposer, so chain operators can choose one of the following options: + * a mnemonic + * a private key + * `op-signer` endpoints +
+ +
+--network + +* This identifies the L2 network `op-challenger` is running for, e.g., `op-sepolia` or `op-mainnet`. +* When using the `--network` flag, the `--game-factory-address` will be automatically pulled from the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json). +* When cannon is executed, challenger needs the roll-up config and the L2 Genesis, which is op-geth's Genesis file. Both files are automatically loaded when Cannon Network is used, but custom networks will need to specify both Cannon L2 Genesis and Cannon rollup config. +* For custom networks not in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), the `--game-factory-address` and rollup must be specified, as follows: + + ``` + --cannon-rollup-config rollup.json \ + --cannon-l2-genesis genesis-l2.json \ + # use this if running challenger outside of the docker image + --cannon-server ./op-program/bin/op-program \ + # json or url, version of op-program deployed on chain + # if you use the wrong one, you will lose the game + # if you deploy your own contracts, you specify the hash, the root of the json file + # op mainnet are tagged versions of op-program + # make reproducible prestate + # challenger verifies that onchain + --cannon-prestate ./op-program/bin/prestate.json \ + # load the game factory address from system config or superchain registry + # point the game factory address at the dispute game factory proxy + --game-factory-address ``` - ### Test and debug challenger (optional) + + These options vary based on which `--network` is specified. Chain operators always need to specify a way to load prestates and must also specify the cannon-server whenever the docker image isn't being used. + +
+ +
+--datadir + +* This is a directory that `op-challenger` can write to and store whatever data it needs. It will manage this directory to add or remove data as needed under that directory. +* If running in docker, it should point to a docker volume or mount point, so the data isn't lost on every restart. The data can be recreated if needed but particularly if challenger has executed cannon as part of responding to a game it may mean a lot of extra processing. +
- This is an optional step to use `op-challenger` subcommands, which allow chain operators to interact with the Fault Proof System onchain for testing and debugging purposes. For example, it is possible to test and explore the system in the following ways: +
+--cannon-prestates-url - * create games yourself, and it doesn't matter if the games are valid or invalid. - * perform moves in games and then claim and resolve things. +The pre-state is effectively the version of `op-program` that is deployed on chain. And chain operators must use the right version. `op-challenger` will refuse to interact with games that have a different absolute prestate hash to avoid making invalid claims. If deploying your own contracts, chain operators must specify an absolute prestate hash taken from the `make reproducible-prestate` command during contract deployment, which will also build the required prestate json file. - Here's the list of op-challenger subcommands: +All governance approved releases use a tagged version of `op-program`. These can be rebuilt by checking out the version tag and running `make reproducible-prestate`. - | subcommand | description | - | --------------- | -------------------------------------------------------- | - | `list-games` | List the games created by a dispute game factory | - | `list-claims` | List the claims in a dispute game | - | `list-credits` | List the credits in a dispute game | - | `create-game` | Creates a dispute game via the factory | - | `move` | Creates and sends a move transaction to the dispute game | - | `resolve` | Resolves the specified dispute game if possible | - | `resolve-claim` | Resolves the specified claim if possible | +* There are two ways to specify the prestate to use: + * `--cannon-prestate`: specifies a path to a single Cannon pre-state Json file + * `--cannon-prestates-url`: specifies a URL to load pre-states from. This enables participating in games that use different prestates, for example due to a network upgrade. The prestates are stored in this directory named by their hash. +* Example final URL for a prestate: + * [https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json](https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json) + * This file contains the cannon memory state. + + + Challenger will refuse to interact with any games if it doesn't have the matching prestate. + Check this [guide](/operators/chain-operators/tutorials/absolute-prestate#generating-the-absolute-prestate) on how to generate an absolute prestate. + +
- Additionally, chain operators should consider running `op-dispute-mon`. It's an incredibly useful security monitoring service to keep an eye on games, basically giving chain operators visibility into all the status of the games for the last 28 days. - Chain operators can easily create their grafana dashboard for Dispute Monitor using the following json file: [Download the Dispute Monitor JSON](/resources/grafana/dispute-monitor-1718214549035.json).
-## Congratulations! 🎉 +### Create challenger startup script + +Create `scripts/start-challenger.sh`: + +```bash +#!/bin/bash +source .env + +# Path to the challenger binary +../optimism/op-challenger/bin/op-challenger \ + --trace-type permissioned,cannon \ + --l1-eth-rpc=$L1_RPC_URL \ + --l2-eth-rpc=$L2_RPC_URL \ + --l1-beacon=$L1_BEACON \ + --rollup-rpc=$ROLLUP_RPC_URL \ + --game-factory-address $GAME_FACTORY_ADDRESS \ + --datadir=$DATADIR \ + --cannon-bin=$CANNON_BIN \ + --cannon-rollup-config=$CANNON_ROLLUP_CONFIG \ + --cannon-l2-genesis=$CANNON_L2_GENESIS \ + --cannon-server=$CANNON_SERVER \ + --cannon-prestate=$CANNON_PRESTATE \ + --mnemonic "$MNEMONIC" \ + --hd-path "$HD_PATH" +``` + +
+ +### Docker Setup + +The Docker setup provides a containerized environment for running the challenger. This method uses the official Docker image that includes embedded `op-program` server and Cannon executable. + + + +### Create environment file +First, create a `.env` file with your configuration values. This file will be used by Docker Compose to set up the environment variables: + +```bash +# Create .env file with your actual values +cat > .env << 'EOF' +# L1 Configuration - Replace with your actual RPC URLs +L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY +L1_BEACON=http://sepolia-cl-1:5051 + +# L2 Configuration - Replace with your actual node endpoints +L2_RPC_URL=http://localhost:8545 +ROLLUP_RPC_URL=http://localhost:8547 + +# Wallet configuration - Choose either mnemonic + HD path OR private key +MNEMONIC="test test test test test test test test test test test junk" +HD_PATH="m/44'/60'/0'/0/0" + +# Network configuration +NETWORK=op-sepolia +GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS +EOF +``` + +**Important:** Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. + +### Set up Docker Compose +Create a `docker-compose.yml` file that defines the challenger service: + +```yaml +version: '3.8' + +services: + challenger: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.5.0 + user: "1000" + volumes: + - ./challenger-data:/data + - ./rollup.json:/workspace/rollup.json:ro + - ./genesis-l2.json:/workspace/genesis-l2.json:ro + environment: + - L1_RPC_URL=${L1_RPC_URL} + - L1_BEACON=${L1_BEACON} + - L2_RPC_URL=${L2_RPC_URL} + - ROLLUP_RPC_URL=${ROLLUP_RPC_URL} + - MNEMONIC=${MNEMONIC} + - HD_PATH=${HD_PATH} + - NETWORK=${NETWORK} + - GAME_FACTORY_ADDRESS=${GAME_FACTORY_ADDRESS} + command: + - "op-challenger" + - "--l1-eth-rpc=${L1_RPC_URL}" + - "--l1-beacon=${L1_BEACON}" + - "--l2-eth-rpc=${L2_RPC_URL}" + - "--rollup-rpc=${ROLLUP_RPC_URL}" + - "--selective-claim-resolution" + - "--mnemonic=${MNEMONIC}" + - "--hd-path=${HD_PATH}" + - "--network=${NETWORK}" + - "--game-factory-address=${GAME_FACTORY_ADDRESS}" + - "--datadir=/data" + - "--cannon-prestate=/workspace/prestate-proof.json" + restart: unless-stopped + ports: + - "8548:8548" # If challenger exposes metrics endpoint +``` + +### Launch the challenger +Start the challenger service and monitor its logs: + +```bash +# Start the challenger service +docker-compose up -d + +# View logs +docker-compose logs -f challenger +``` + + + + +
+ +## Initializing and starting the challenger + +### Start the challenger + +```bash +# Make sure you're in the challenger-node directory +cd challenger-node + +# Make script executable +chmod +x scripts/start-challenger.sh + +# Start challenger +./scripts/start-challenger.sh +``` + +### Verify challenger is running + +Monitor challenger logs to ensure it's operating correctly: + +```bash +# Check challenger logs +tail -f challenger-data/challenger.log + +# Or if running in foreground, monitor the output +``` + +The challenger should show logs indicating: + +* Successful connection to L1 and L2 nodes +* Loading of prestates and configuration +* Monitoring of dispute games + +### Monitoring with op-dispute-mon + +Consider running [`op-dispute-mon`](/operators/chain-operators/tools/chain-monitoring#dispute-mon) for enhanced security monitoring: + +* Provides visibility into all game statuses for the last 28 days +* Essential for production challenger deployments +* Create Grafana dashboards using: [Download the Dispute Monitor JSON](/resources/grafana/dispute-monitor-1718214549035.json) + +## Congratulations You've successfully completed the entire L2 rollup testnet tutorial! Your rollup is now fully operational with all components running: -✅ **op-deployer** - L1 contracts deployed\ -✅ **Sequencer** - Processing transactions\ -✅ **Batcher** - Publishing data to L1\ -✅ **Proposer** - Submitting state roots\ -✅ **Challenger** - Monitoring disputes +**op-deployer** - L1 contracts deployed +**Sequencer** - Processing transactions +**Batcher** - Publishing data to L1 +**Proposer** - Submitting state roots +**Challenger** - Monitoring disputes + +## Need Help? + +* **Community Support**: Join the [Optimism Discord](https://discord.optimism.io) +* **OP Challenger Explainer**: [Fault Proofs Overview](/stack/fault-proofs/challenger) +* **Technical Specs**: [Honest Challenger Specification](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html) +* **Developer Support**: [GitHub Discussions](https://github.com/ethereum-optimism/developers/discussions) +
## Connect your wallet to your chain diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index e3eea08f2..cb78326bf 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -116,7 +116,7 @@ For setting up the proposer, we recommend building from source as it provides be cp ~/.deployer/state.json . # Extract the DisputeGameFactory address - GAME_FACTORY_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].disputeGameFactoryProxyAddress') + GAME_FACTORY_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].DisputeGameFactoryProxy') echo "DisputeGameFactory Address: $GAME_FACTORY_ADDRESS" ``` From 432ecf2bdd876262b485b958bd8f59938fc2cf5f Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 19 Aug 2025 15:29:59 +0100 Subject: [PATCH 18/92] Refine op-challenger setup documentation: remove outdated help section, clarify L1StandardBridge address retrieval, and enhance deposit instructions for improved user experience. --- .../create-l2-rollup/op-challenger-setup.mdx | 31 +++++++------------ 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 5acc28451..52c2ac2d6 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -508,14 +508,6 @@ You've successfully completed the entire L2 rollup testnet tutorial! Your rollup **Proposer** - Submitting state roots **Challenger** - Monitoring disputes -## Need Help? - -* **Community Support**: Join the [Optimism Discord](https://discord.optimism.io) -* **OP Challenger Explainer**: [Fault Proofs Overview](/stack/fault-proofs/challenger) -* **Technical Specs**: [Honest Challenger Specification](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html) -* **Developer Support**: [GitHub Discussions](https://github.com/ethereum-optimism/developers/discussions) -
- ## Connect your wallet to your chain You now have a fully functioning OP Stack Rollup with a Sequencer node running on `http://localhost:8545`. You can connect your wallet to this chain the same way you'd connect your wallet to any other EVM chain. @@ -526,29 +518,28 @@ Once you've connected your wallet, you'll probably notice that you don't have an The easiest way to deposit Sepolia ETH into your chain is to send ETH directly to the `L1StandardBridge` contract. -### Navigate to the contracts-bedrock directory +### Get the L1StandardBridge address -```bash -cd ~/optimism/packages/contracts-bedrock -``` +The L1StandardBridge address is part of your deployment artifacts. You can find it in two ways: -### Get the address of the `L1StandardBridgeProxy` contract +1. Check your deployment configuration output after running the deployer +2. Use the Contract Addresses page in your chain's documentation -```bash -cat deployments/getting-started/.deploy | jq -r .L1StandardBridgeProxy -``` +### Deposit ETH to your L2 -### Send some Sepolia ETH to the L1StandardBridgeProxy contract +Once you have the L1StandardBridge address, send a small amount of Sepolia ETH (0.1 or less) to that address from the wallet you want to use on L2. +This will trigger a deposit that will mint ETH into your wallet on L2. -Grab the L1 bridge proxy contract address and, using the wallet that you want to have ETH on your Rollup, send that address a small amount of ETH on Sepolia (0.1 or less is fine). This will trigger a deposit that will mint ETH into your wallet on L2. It may take up to 5 minutes for that ETH to appear in your wallet on L2. + + It may take up to 5 minutes for the ETH to appear in your wallet on L2. + This delay is due to the time needed for the deposit transaction to be processed and finalized. + ## See your rollup in action You can interact with your Rollup the same way you'd interact with any other EVM chain. Send some transactions, deploy some contracts, and see what happens! -*** - ## Need Help? * **Community Support**: Join the [Optimism Discord](https://discord.optimism.io) From f0bd49c0588a5de6d70cf344828939455932905e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 19 Aug 2025 15:30:35 +0100 Subject: [PATCH 19/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../create-l2-rollup/op-challenger-setup.mdx | 709 +++++++++--------- 1 file changed, 356 insertions(+), 353 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 52c2ac2d6..4e058cc56 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -31,10 +31,10 @@ See the [OP-Challenger Explainer](/stack/fault-proofs/challenger) for a general The challenger is responsible for: -* Monitoring dispute games created by the fault proof system -* Challenging invalid claims in dispute games -* Defending valid state transitions -* Resolving games when possible +* Monitoring dispute games created by the fault proof system +* Challenging invalid claims in dispute games +* Defending valid state transitions +* Resolving games when possible ## Prerequisites @@ -43,32 +43,33 @@ The challenger is responsible for: Before configuring your challenger, complete the following steps: + ### Deploy OP Stack chain with fault proofs enabled -### Deploy OP Stack chain with fault proofs enabled -* L1 contracts deployed with dispute game factory -* Fault proof system active on your chain -* Access to your chain's contract addresses -* [Generate an absolute prestate](/operators/chain-operators/tutorials/absolute-prestate#generating-the-absolute-prestate) for your network version - This is critical as the challenger will refuse to interact with games if it doesn't have the matching prestate + * L1 contracts deployed with dispute game factory + * Fault proof system active on your chain + * Access to your chain's contract addresses + * [Generate an absolute prestate](/operators/chain-operators/tutorials/absolute-prestate#generating-the-absolute-prestate) for your network version - This is critical as the challenger will refuse to interact with games if it doesn't have the matching prestate -### Set up required infrastructure access -* L1 RPC endpoint (Ethereum, Sepolia, etc.) -* L1 Beacon node endpoint (for blob access) -* L2 archive node with debug API enabled -* Rollup node (op-node) with historical data + ### Set up required infrastructure access -### Prepare configuration files -* `rollup.json` - Rollup configuration file -* `genesis-l2.json` - L2 genesis file -* `prestate.json` - The absolute prestate file generated in step 1 + * L1 RPC endpoint (Ethereum, Sepolia, etc.) + * L1 Beacon node endpoint (for blob access) + * L2 archive node with debug API enabled + * Rollup node (op-node) with historical data + ### Prepare configuration files + + * `rollup.json` - Rollup configuration file + * `genesis-l2.json` - L2 genesis file + * `prestate.json` - The absolute prestate file generated in step 1 ### Software requirements -* Git (for cloning repositories) -* Go 1.21+ (if building from source) -* Docker and Docker Compose (optional but recommended) -* Access to a funded Ethereum account for challenger operations +* Git (for cloning repositories) +* Go 1.21+ (if building from source) +* Docker and Docker Compose (optional but recommended) +* Access to a funded Ethereum account for challenger operations ### Finding the current stable releases @@ -85,377 +86,379 @@ Always check the release notes to ensure you're using compatible versions with y For challenger deployment, you can either build from source (recommended for better control and debugging) or use Docker for a containerized setup. - -### Build and Configure + + ### Build and Configure -Building from source gives you full control over the binaries and is the preferred approach for production deployments. + Building from source gives you full control over the binaries and is the preferred approach for production deployments. -**Clone and build op-challenger** + **Clone and build op-challenger** -```bash -# Clone the optimism monorepo -git clone https://github.com/ethereum-optimism/optimism.git -cd optimism + ```bash + # Clone the optimism monorepo + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism -# Check out the latest release of op-challenger -git checkout op-challenger/v1.5.0 + # Check out the latest release of op-challenger + git checkout op-challenger/v1.5.0 -# Install dependencies and build -just op-challenger + # Install dependencies and build + just op-challenger -# Binary will be available at ./op-challenger/bin/op-challenger -``` + # Binary will be available at ./op-challenger/bin/op-challenger + ``` -### Verify installation + ### Verify installation -Check that you have properly installed the challenger component: + Check that you have properly installed the challenger component: -```bash -# Make sure you're in the optimism directory -./op-challenger/bin/op-challenger --help + ```bash + # Make sure you're in the optimism directory + ./op-challenger/bin/op-challenger --help -# You should see the challenger help output with available commands and flags -``` + # You should see the challenger help output with available commands and flags + ``` -## Configuration setup + ## Configuration setup - + + ### Organize your workspace -### Organize your workspace + After building the binaries, create your challenger working directory: -After building the binaries, create your challenger working directory: + ```bash + # Create challenger directory (this should be at the same level as optimism directory) + mkdir challenger-node + cd challenger-node -```bash -# Create challenger directory (this should be at the same level as optimism directory) -mkdir challenger-node -cd challenger-node + # Create necessary subdirectories + mkdir scripts + mkdir challenger-data -# Create necessary subdirectories -mkdir scripts -mkdir challenger-data + # Verify the optimism directory is accessible + # Directory structure should look like: + # /optimism/ (contains the built binaries) + # /challenger-node/ (your working directory) + ``` -# Verify the optimism directory is accessible -# Directory structure should look like: -# /optimism/ (contains the built binaries) -# /challenger-node/ (your working directory) -``` + ### Copy configuration files -### Copy configuration files + ```bash + # Copy configuration files to your challenger directory + # Adjust paths based on your deployment setup + cp /path/to/your/rollup.json . + cp /path/to/your/genesis-l2.json . + ``` -```bash -# Copy configuration files to your challenger directory -# Adjust paths based on your deployment setup -cp /path/to/your/rollup.json . -cp /path/to/your/genesis-l2.json . -``` + ### Set up environment variables -### Set up environment variables + You'll need to gather several pieces of information before creating your configuration. Here's where to get each value: -You'll need to gather several pieces of information before creating your configuration. Here's where to get each value: + **L1 network access:** -**L1 network access:** -* L1 RPC URL: Your L1 node endpoint (Infura, Alchemy, or self-hosted) -* L1 Beacon URL: Beacon chain API endpoint for blob access + * L1 RPC URL: Your L1 node endpoint (Infura, Alchemy, or self-hosted) + * L1 Beacon URL: Beacon chain API endpoint for blob access -**L2 network access:** -* L2 RPC URL: Your op-geth archive node endpoint -* Rollup RPC URL: Your op-node endpoint with historical data + **L2 network access:** -**Challenger wallet:** -* Private key for challenger operations (must be funded) + * L2 RPC URL: Your op-geth archive node endpoint + * Rollup RPC URL: Your op-node endpoint with historical data -**Network configuration:** -* Game factory address from your contract deployment -* Network identifier (e.g., op-sepolia, op-mainnet, or custom) + **Challenger wallet:** -Copy and paste in your terminal, to create your env file. + * Private key for challenger operations (must be funded) -```bash -# Create .env file with your actual values -cat > .env << 'EOF' -# L1 Configuration - Replace with your actual RPC URLs -L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY - -# L2 Configuration - Replace with your actual node endpoints -L2_RPC_URL=http://localhost:8545 -ROLLUP_RPC_URL=http://localhost:8547 -L1_BEACON=http://sepolia-cl-1:5051 - -# Wallet configuration - Choose either mnemonic + HD path OR private key -MNEMONIC="test test test test test test test test test test test junk" -HD_PATH="m/44'/60'/0'/0/0" -# PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY # Alternative to mnemonic - -# Network configuration -NETWORK=op-sepolia -GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS - -# Trace configuration -TRACE_TYPE=permissioned,cannon - -# Data directory -DATADIR=./challenger-data - -# Cannon configuration -# Path to the cannon binary (built from optimism repo) -CANNON_BIN=/cannon/bin/cannon - -# Configuration files -CANNON_ROLLUP_CONFIG= -CANNON_L2_GENESIS= -CANNON_SERVER=/op-program/bin/op-program -CANNON_PRESTATE= -EOF -``` + **Network configuration:** -**Important:** Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. - -### Understanding key configuration flags - -
---l1-eth-rpc - -* This is the HTTP provider URL for a standard L1 node, can be a full node. `op-challenger` will be sending many requests, so chain operators need a node that is trusted and can easily handle many transactions. -* Note: Challenger has a lot of money, and it will spend it if it needs to interact with games. That might risk not defending games or challenging games correctly, so chain operators should really trust the nodes being pointed at Challenger. -
- -
---l1-beacon - -* This is needed just to get blobs from. -* In some instances, chain operators might need a blob archiver or L1 consensus node configured not to prune blobs: - * If the chain is proposing regularly, a blob archiver isn't needed. There's only a small window in the blob retention period that games can be played. - * If the chain doesn't post a valid output root in 18 days, then a blob archiver running a challenge game is needed. If the actor gets pushed to the bottom of the game, it could lose if it's the only one protecting the chain. -
- -
---l2-eth-rpc - -* This needs to be `op-geth` archive node, with `debug` enabled. -* Technically doesn't need to go to bedrock, but needs to have access to the start of any game that is still in progress. -
- -
---rollup-rpc - -* This needs to be an `op-node` archive node because challenger needs access to output roots from back when the games start. See below for important configuration details: - -1. Safe Head Database (SafeDB) Configuration for op-node: - - * The `op-node` behind the `op-conductor` must have the SafeDB enabled to ensure it is not stateless. - * To enable SafeDB, set the `--safedb.path` value in your configuration. This specifies the file path used to persist safe head update data. - * Example Configuration: - - ``` - --safedb.path # Replace with your actual path - ``` - - - If this path is not set, the SafeDB feature will be disabled. - - -2. Ensuring Historical Data Availability: - - * Both `op-node` and `op-geth` must have data from the start of the games to maintain network consistency and allow nodes to reference historical state and transactions. - * For `op-node`: Configure it to maintain a sufficient history of blockchain data locally or use an archive node. - * For `op-geth`: Similarly, configure to store or access historical data. - * Example Configuration: - - ``` - op-node \ - --rollup-rpc \ - --safedb.path - ``` - - - Replace `` with the URL of your archive node and `` with the desired path for storing SafeDB data. - -
- -
---private-key - -* Chain operators must specify a private key or use something else (like `op-signer`). -* This uses the same transaction manager arguments as `op-node` , batcher, and proposer, so chain operators can choose one of the following options: - * a mnemonic - * a private key - * `op-signer` endpoints -
- -
---network - -* This identifies the L2 network `op-challenger` is running for, e.g., `op-sepolia` or `op-mainnet`. -* When using the `--network` flag, the `--game-factory-address` will be automatically pulled from the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json). -* When cannon is executed, challenger needs the roll-up config and the L2 Genesis, which is op-geth's Genesis file. Both files are automatically loaded when Cannon Network is used, but custom networks will need to specify both Cannon L2 Genesis and Cannon rollup config. -* For custom networks not in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), the `--game-factory-address` and rollup must be specified, as follows: - - ``` - --cannon-rollup-config rollup.json \ - --cannon-l2-genesis genesis-l2.json \ - # use this if running challenger outside of the docker image - --cannon-server ./op-program/bin/op-program \ - # json or url, version of op-program deployed on chain - # if you use the wrong one, you will lose the game - # if you deploy your own contracts, you specify the hash, the root of the json file - # op mainnet are tagged versions of op-program - # make reproducible prestate - # challenger verifies that onchain - --cannon-prestate ./op-program/bin/prestate.json \ - # load the game factory address from system config or superchain registry - # point the game factory address at the dispute game factory proxy - --game-factory-address - ``` - - - These options vary based on which `--network` is specified. Chain operators always need to specify a way to load prestates and must also specify the cannon-server whenever the docker image isn't being used. - -
+ * Game factory address from your contract deployment + * Network identifier (e.g., op-sepolia, op-mainnet, or custom) -
---datadir + Copy and paste in your terminal, to create your env file. -* This is a directory that `op-challenger` can write to and store whatever data it needs. It will manage this directory to add or remove data as needed under that directory. -* If running in docker, it should point to a docker volume or mount point, so the data isn't lost on every restart. The data can be recreated if needed but particularly if challenger has executed cannon as part of responding to a game it may mean a lot of extra processing. -
+ ```bash + # Create .env file with your actual values + cat > .env << 'EOF' + # L1 Configuration - Replace with your actual RPC URLs + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY -
---cannon-prestates-url + # L2 Configuration - Replace with your actual node endpoints + L2_RPC_URL=http://localhost:8545 + ROLLUP_RPC_URL=http://localhost:8547 + L1_BEACON=http://sepolia-cl-1:5051 -The pre-state is effectively the version of `op-program` that is deployed on chain. And chain operators must use the right version. `op-challenger` will refuse to interact with games that have a different absolute prestate hash to avoid making invalid claims. If deploying your own contracts, chain operators must specify an absolute prestate hash taken from the `make reproducible-prestate` command during contract deployment, which will also build the required prestate json file. + # Wallet configuration - Choose either mnemonic + HD path OR private key + MNEMONIC="test test test test test test test test test test test junk" + HD_PATH="m/44'/60'/0'/0/0" + # PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY # Alternative to mnemonic -All governance approved releases use a tagged version of `op-program`. These can be rebuilt by checking out the version tag and running `make reproducible-prestate`. + # Network configuration + NETWORK=op-sepolia + GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS -* There are two ways to specify the prestate to use: - * `--cannon-prestate`: specifies a path to a single Cannon pre-state Json file - * `--cannon-prestates-url`: specifies a URL to load pre-states from. This enables participating in games that use different prestates, for example due to a network upgrade. The prestates are stored in this directory named by their hash. -* Example final URL for a prestate: - * [https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json](https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json) - * This file contains the cannon memory state. + # Trace configuration + TRACE_TYPE=permissioned,cannon - - Challenger will refuse to interact with any games if it doesn't have the matching prestate. - Check this [guide](/operators/chain-operators/tutorials/absolute-prestate#generating-the-absolute-prestate) on how to generate an absolute prestate. - -
+ # Data directory + DATADIR=./challenger-data -
+ # Cannon configuration + # Path to the cannon binary (built from optimism repo) + CANNON_BIN=/cannon/bin/cannon -### Create challenger startup script + # Configuration files + CANNON_ROLLUP_CONFIG= + CANNON_L2_GENESIS= + CANNON_SERVER=/op-program/bin/op-program + CANNON_PRESTATE= + EOF + ``` -Create `scripts/start-challenger.sh`: + **Important:** Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. -```bash -#!/bin/bash -source .env - -# Path to the challenger binary -../optimism/op-challenger/bin/op-challenger \ - --trace-type permissioned,cannon \ - --l1-eth-rpc=$L1_RPC_URL \ - --l2-eth-rpc=$L2_RPC_URL \ - --l1-beacon=$L1_BEACON \ - --rollup-rpc=$ROLLUP_RPC_URL \ - --game-factory-address $GAME_FACTORY_ADDRESS \ - --datadir=$DATADIR \ - --cannon-bin=$CANNON_BIN \ - --cannon-rollup-config=$CANNON_ROLLUP_CONFIG \ - --cannon-l2-genesis=$CANNON_L2_GENESIS \ - --cannon-server=$CANNON_SERVER \ - --cannon-prestate=$CANNON_PRESTATE \ - --mnemonic "$MNEMONIC" \ - --hd-path "$HD_PATH" -``` + ### Understanding key configuration flags -
- -### Docker Setup +
+ --l1-eth-rpc -The Docker setup provides a containerized environment for running the challenger. This method uses the official Docker image that includes embedded `op-program` server and Cannon executable. + * This is the HTTP provider URL for a standard L1 node, can be a full node. `op-challenger` will be sending many requests, so chain operators need a node that is trusted and can easily handle many transactions. + * Note: Challenger has a lot of money, and it will spend it if it needs to interact with games. That might risk not defending games or challenging games correctly, so chain operators should really trust the nodes being pointed at Challenger. +
- +
+ --l1-beacon -### Create environment file -First, create a `.env` file with your configuration values. This file will be used by Docker Compose to set up the environment variables: + * This is needed just to get blobs from. + * In some instances, chain operators might need a blob archiver or L1 consensus node configured not to prune blobs: + * If the chain is proposing regularly, a blob archiver isn't needed. There's only a small window in the blob retention period that games can be played. + * If the chain doesn't post a valid output root in 18 days, then a blob archiver running a challenge game is needed. If the actor gets pushed to the bottom of the game, it could lose if it's the only one protecting the chain. +
-```bash -# Create .env file with your actual values -cat > .env << 'EOF' -# L1 Configuration - Replace with your actual RPC URLs -L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY -L1_BEACON=http://sepolia-cl-1:5051 - -# L2 Configuration - Replace with your actual node endpoints -L2_RPC_URL=http://localhost:8545 -ROLLUP_RPC_URL=http://localhost:8547 - -# Wallet configuration - Choose either mnemonic + HD path OR private key -MNEMONIC="test test test test test test test test test test test junk" -HD_PATH="m/44'/60'/0'/0/0" - -# Network configuration -NETWORK=op-sepolia -GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS -EOF -``` +
+ --l2-eth-rpc -**Important:** Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. - -### Set up Docker Compose -Create a `docker-compose.yml` file that defines the challenger service: - -```yaml -version: '3.8' - -services: - challenger: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.5.0 - user: "1000" - volumes: - - ./challenger-data:/data - - ./rollup.json:/workspace/rollup.json:ro - - ./genesis-l2.json:/workspace/genesis-l2.json:ro - environment: - - L1_RPC_URL=${L1_RPC_URL} - - L1_BEACON=${L1_BEACON} - - L2_RPC_URL=${L2_RPC_URL} - - ROLLUP_RPC_URL=${ROLLUP_RPC_URL} - - MNEMONIC=${MNEMONIC} - - HD_PATH=${HD_PATH} - - NETWORK=${NETWORK} - - GAME_FACTORY_ADDRESS=${GAME_FACTORY_ADDRESS} - command: - - "op-challenger" - - "--l1-eth-rpc=${L1_RPC_URL}" - - "--l1-beacon=${L1_BEACON}" - - "--l2-eth-rpc=${L2_RPC_URL}" - - "--rollup-rpc=${ROLLUP_RPC_URL}" - - "--selective-claim-resolution" - - "--mnemonic=${MNEMONIC}" - - "--hd-path=${HD_PATH}" - - "--network=${NETWORK}" - - "--game-factory-address=${GAME_FACTORY_ADDRESS}" - - "--datadir=/data" - - "--cannon-prestate=/workspace/prestate-proof.json" - restart: unless-stopped - ports: - - "8548:8548" # If challenger exposes metrics endpoint -``` + * This needs to be `op-geth` archive node, with `debug` enabled. + * Technically doesn't need to go to bedrock, but needs to have access to the start of any game that is still in progress. +
-### Launch the challenger -Start the challenger service and monitor its logs: +
+ --rollup-rpc -```bash -# Start the challenger service -docker-compose up -d + * This needs to be an `op-node` archive node because challenger needs access to output roots from back when the games start. See below for important configuration details: -# View logs -docker-compose logs -f challenger -``` + 1. Safe Head Database (SafeDB) Configuration for op-node: - + * The `op-node` behind the `op-conductor` must have the SafeDB enabled to ensure it is not stateless. + * To enable SafeDB, set the `--safedb.path` value in your configuration. This specifies the file path used to persist safe head update data. + * Example Configuration: + + ``` + --safedb.path # Replace with your actual path + ``` + + + If this path is not set, the SafeDB feature will be disabled. + - + 2. Ensuring Historical Data Availability: + + * Both `op-node` and `op-geth` must have data from the start of the games to maintain network consistency and allow nodes to reference historical state and transactions. + * For `op-node`: Configure it to maintain a sufficient history of blockchain data locally or use an archive node. + * For `op-geth`: Similarly, configure to store or access historical data. + * Example Configuration: + + ``` + op-node \ + --rollup-rpc \ + --safedb.path + ``` + + + Replace `` with the URL of your archive node and `` with the desired path for storing SafeDB data. + +
+ +
+ --private-key + + * Chain operators must specify a private key or use something else (like `op-signer`). + * This uses the same transaction manager arguments as `op-node` , batcher, and proposer, so chain operators can choose one of the following options: + * a mnemonic + * a private key + * `op-signer` endpoints +
+ +
+ --network + + * This identifies the L2 network `op-challenger` is running for, e.g., `op-sepolia` or `op-mainnet`. + * When using the `--network` flag, the `--game-factory-address` will be automatically pulled from the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json). + * When cannon is executed, challenger needs the roll-up config and the L2 Genesis, which is op-geth's Genesis file. Both files are automatically loaded when Cannon Network is used, but custom networks will need to specify both Cannon L2 Genesis and Cannon rollup config. + * For custom networks not in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), the `--game-factory-address` and rollup must be specified, as follows: + + ``` + --cannon-rollup-config rollup.json \ + --cannon-l2-genesis genesis-l2.json \ + # use this if running challenger outside of the docker image + --cannon-server ./op-program/bin/op-program \ + # json or url, version of op-program deployed on chain + # if you use the wrong one, you will lose the game + # if you deploy your own contracts, you specify the hash, the root of the json file + # op mainnet are tagged versions of op-program + # make reproducible prestate + # challenger verifies that onchain + --cannon-prestate ./op-program/bin/prestate.json \ + # load the game factory address from system config or superchain registry + # point the game factory address at the dispute game factory proxy + --game-factory-address + ``` + + + These options vary based on which `--network` is specified. Chain operators always need to specify a way to load prestates and must also specify the cannon-server whenever the docker image isn't being used. + +
+ +
+ --datadir + + * This is a directory that `op-challenger` can write to and store whatever data it needs. It will manage this directory to add or remove data as needed under that directory. + * If running in docker, it should point to a docker volume or mount point, so the data isn't lost on every restart. The data can be recreated if needed but particularly if challenger has executed cannon as part of responding to a game it may mean a lot of extra processing. +
+ +
+ --cannon-prestates-url + + The pre-state is effectively the version of `op-program` that is deployed on chain. And chain operators must use the right version. `op-challenger` will refuse to interact with games that have a different absolute prestate hash to avoid making invalid claims. If deploying your own contracts, chain operators must specify an absolute prestate hash taken from the `make reproducible-prestate` command during contract deployment, which will also build the required prestate json file. + + All governance approved releases use a tagged version of `op-program`. These can be rebuilt by checking out the version tag and running `make reproducible-prestate`. + + * There are two ways to specify the prestate to use: + * `--cannon-prestate`: specifies a path to a single Cannon pre-state Json file + * `--cannon-prestates-url`: specifies a URL to load pre-states from. This enables participating in games that use different prestates, for example due to a network upgrade. The prestates are stored in this directory named by their hash. + * Example final URL for a prestate: + * [https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json](https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json) + * This file contains the cannon memory state. + + + Challenger will refuse to interact with any games if it doesn't have the matching prestate. + Check this [guide](/operators/chain-operators/tutorials/absolute-prestate#generating-the-absolute-prestate) on how to generate an absolute prestate. + +
+
+ + ### Create challenger startup script + + Create `scripts/start-challenger.sh`: + + ```bash + #!/bin/bash + source .env + + # Path to the challenger binary + ../optimism/op-challenger/bin/op-challenger \ + --trace-type permissioned,cannon \ + --l1-eth-rpc=$L1_RPC_URL \ + --l2-eth-rpc=$L2_RPC_URL \ + --l1-beacon=$L1_BEACON \ + --rollup-rpc=$ROLLUP_RPC_URL \ + --game-factory-address $GAME_FACTORY_ADDRESS \ + --datadir=$DATADIR \ + --cannon-bin=$CANNON_BIN \ + --cannon-rollup-config=$CANNON_ROLLUP_CONFIG \ + --cannon-l2-genesis=$CANNON_L2_GENESIS \ + --cannon-server=$CANNON_SERVER \ + --cannon-prestate=$CANNON_PRESTATE \ + --mnemonic "$MNEMONIC" \ + --hd-path "$HD_PATH" + ``` +
+ + + ### Docker Setup + + The Docker setup provides a containerized environment for running the challenger. This method uses the official Docker image that includes embedded `op-program` server and Cannon executable. + + + ### Create environment file + + First, create a `.env` file with your configuration values. This file will be used by Docker Compose to set up the environment variables: + + ```bash + # Create .env file with your actual values + cat > .env << 'EOF' + # L1 Configuration - Replace with your actual RPC URLs + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + L1_BEACON=http://sepolia-cl-1:5051 + + # L2 Configuration - Replace with your actual node endpoints + L2_RPC_URL=http://localhost:8545 + ROLLUP_RPC_URL=http://localhost:8547 + + # Wallet configuration - Choose either mnemonic + HD path OR private key + MNEMONIC="test test test test test test test test test test test junk" + HD_PATH="m/44'/60'/0'/0/0" + + # Network configuration + NETWORK=op-sepolia + GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS + EOF + ``` + + **Important:** Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. + + ### Set up Docker Compose + + Create a `docker-compose.yml` file that defines the challenger service: + + ```yaml + version: '3.8' + + services: + challenger: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.5.0 + user: "1000" + volumes: + - ./challenger-data:/data + - ./rollup.json:/workspace/rollup.json:ro + - ./genesis-l2.json:/workspace/genesis-l2.json:ro + environment: + - L1_RPC_URL=${L1_RPC_URL} + - L1_BEACON=${L1_BEACON} + - L2_RPC_URL=${L2_RPC_URL} + - ROLLUP_RPC_URL=${ROLLUP_RPC_URL} + - MNEMONIC=${MNEMONIC} + - HD_PATH=${HD_PATH} + - NETWORK=${NETWORK} + - GAME_FACTORY_ADDRESS=${GAME_FACTORY_ADDRESS} + command: + - "op-challenger" + - "--l1-eth-rpc=${L1_RPC_URL}" + - "--l1-beacon=${L1_BEACON}" + - "--l2-eth-rpc=${L2_RPC_URL}" + - "--rollup-rpc=${ROLLUP_RPC_URL}" + - "--selective-claim-resolution" + - "--mnemonic=${MNEMONIC}" + - "--hd-path=${HD_PATH}" + - "--network=${NETWORK}" + - "--game-factory-address=${GAME_FACTORY_ADDRESS}" + - "--datadir=/data" + - "--cannon-prestate=/workspace/prestate-proof.json" + restart: unless-stopped + ports: + - "8548:8548" # If challenger exposes metrics endpoint + ``` + + ### Launch the challenger + + Start the challenger service and monitor its logs: + + ```bash + # Start the challenger service + docker-compose up -d + + # View logs + docker-compose logs -f challenger + ``` + +
## Initializing and starting the challenger @@ -486,17 +489,17 @@ tail -f challenger-data/challenger.log The challenger should show logs indicating: -* Successful connection to L1 and L2 nodes -* Loading of prestates and configuration -* Monitoring of dispute games +* Successful connection to L1 and L2 nodes +* Loading of prestates and configuration +* Monitoring of dispute games ### Monitoring with op-dispute-mon Consider running [`op-dispute-mon`](/operators/chain-operators/tools/chain-monitoring#dispute-mon) for enhanced security monitoring: -* Provides visibility into all game statuses for the last 28 days -* Essential for production challenger deployments -* Create Grafana dashboards using: [Download the Dispute Monitor JSON](/resources/grafana/dispute-monitor-1718214549035.json) +* Provides visibility into all game statuses for the last 28 days +* Essential for production challenger deployments +* Create Grafana dashboards using: [Download the Dispute Monitor JSON](/resources/grafana/dispute-monitor-1718214549035.json) ## Congratulations @@ -522,16 +525,16 @@ The easiest way to deposit Sepolia ETH into your chain is to send ETH directly t The L1StandardBridge address is part of your deployment artifacts. You can find it in two ways: -1. Check your deployment configuration output after running the deployer -2. Use the Contract Addresses page in your chain's documentation +1. Check your deployment configuration output after running the deployer +2. Use the Contract Addresses page in your chain's documentation ### Deposit ETH to your L2 -Once you have the L1StandardBridge address, send a small amount of Sepolia ETH (0.1 or less) to that address from the wallet you want to use on L2. +Once you have the L1StandardBridge address, send a small amount of Sepolia ETH (0.1 or less) to that address from the wallet you want to use on L2. This will trigger a deposit that will mint ETH into your wallet on L2. - It may take up to 5 minutes for the ETH to appear in your wallet on L2. + It may take up to 5 minutes for the ETH to appear in your wallet on L2. This delay is due to the time needed for the deposit transaction to be processed and finalized. From 3a24576e81bde04777b062c51d37585d620a0583 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 19 Aug 2025 15:35:22 +0100 Subject: [PATCH 20/92] Update op-challenger setup documentation: clarify retrieval of L1StandardBridge proxy address with command example and emphasize the importance of using the proxy address for deposits. --- .../tutorials/create-l2-rollup/op-challenger-setup.mdx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 4e058cc56..c3103fb25 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -523,10 +523,14 @@ The easiest way to deposit Sepolia ETH into your chain is to send ETH directly t ### Get the L1StandardBridge address -The L1StandardBridge address is part of your deployment artifacts. You can find it in two ways: +The `L1StandardBridge` proxy address can be found in your deployment state file. To get it, run: -1. Check your deployment configuration output after running the deployer -2. Use the Contract Addresses page in your chain's documentation +```bash +# From your project root +jq -r .l1StandardBridgeProxyAddress /.deployer/state.json +``` + +This will output the `L1StandardBridge` proxy address that you should use for deposits. Make sure to use the proxy address, not the implementation address. ### Deposit ETH to your L2 From c98578c177525f3304856da60615026500531fed Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 19 Aug 2025 15:35:45 +0100 Subject: [PATCH 21/92] Clarify the usage of the `L1StandardBridge` address in the op-challenger setup documentation by adding backticks for improved readability in the deposit instructions. --- .../tutorials/create-l2-rollup/op-challenger-setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index c3103fb25..3d9e78e44 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -534,7 +534,7 @@ This will output the `L1StandardBridge` proxy address that you should use for de ### Deposit ETH to your L2 -Once you have the L1StandardBridge address, send a small amount of Sepolia ETH (0.1 or less) to that address from the wallet you want to use on L2. +Once you have the `L1StandardBridge` address, send a small amount of Sepolia ETH (0.1 or less) to that address from the wallet you want to use on L2. This will trigger a deposit that will mint ETH into your wallet on L2. From c7969d600c6c156002852dd6575000a866bea307 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 19 Aug 2025 15:37:25 +0100 Subject: [PATCH 22/92] Enhance clarity in the op-challenger setup tutorial by separating the final step description into two lines, emphasizing that it is the last part of the tutorial while maintaining the step-by-step structure. --- .../tutorials/create-l2-rollup/op-challenger-setup.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 3d9e78e44..53b9430c6 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -22,7 +22,8 @@ import { Callout, Steps, Tabs, Tab } from 'nextra/components' After you have spun up your sequencer, batcher, and proposer, the final step is to configure a challenger to monitor and respond to disputes. The challenger is the security component that ensures the integrity of your rollup by monitoring dispute games and responding to invalid claims. - **Step 5 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the previous one. + **Step 5 of 5**: This tutorial is designed to be followed step-by-step. + Each step builds on the previous one, and this is the last part of the tutorial. This guide provides step-by-step instructions for setting up the configuration and monitoring options for `op-challenger`. The challenger is a critical fault proofs component that monitors dispute games and challenges invalid claims to protect your OP Stack chain. From e95ae3729524cb2d0cc8e44d80b517bf0a4a30a6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 19 Aug 2025 15:44:55 +0100 Subject: [PATCH 23/92] Update op-challenger setup tutorial: enhance configuration section by providing specific paths for configuration files and binaries, improving clarity for users during deployment. --- .../create-l2-rollup/op-challenger-setup.mdx | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 53b9430c6..d42848c80 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -201,15 +201,19 @@ For challenger deployment, you can either build from source (recommended for bet # Data directory DATADIR=./challenger-data + # Configuration files from your deployment + CANNON_ROLLUP_CONFIG=./rollup.json + CANNON_L2_GENESIS=./genesis-l2.json + # Cannon configuration - # Path to the cannon binary (built from optimism repo) - CANNON_BIN=/cannon/bin/cannon - - # Configuration files - CANNON_ROLLUP_CONFIG= - CANNON_L2_GENESIS= - CANNON_SERVER=/op-program/bin/op-program - CANNON_PRESTATE= + # Prestate file - Generate this using the absolute prestate guide + # Run 'make reproducible-prestate' in the optimism repo to generate it + # The Cannon binary is a specific hash file that matches your deployment + CANNON_BIN=./0x.bin.gz + # The op-program server binary is built when you run 'just op-challenger' + CANNON_SERVER=../optimism/op-program/bin/op-program + CANNON_PRESTATE=../optimism/op-program/bin/prestate.json + EOF ``` From 7b4c40bc41ecccb6d3bc070d35d085762e1e7003 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 19 Aug 2025 15:45:19 +0100 Subject: [PATCH 24/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../tutorials/create-l2-rollup/op-challenger-setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index d42848c80..8812fd4ae 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -22,7 +22,7 @@ import { Callout, Steps, Tabs, Tab } from 'nextra/components' After you have spun up your sequencer, batcher, and proposer, the final step is to configure a challenger to monitor and respond to disputes. The challenger is the security component that ensures the integrity of your rollup by monitoring dispute games and responding to invalid claims. - **Step 5 of 5**: This tutorial is designed to be followed step-by-step. + **Step 5 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the previous one, and this is the last part of the tutorial. From 41b5bb5648784fc534f2dbea5d75c9e1e9288983 Mon Sep 17 00:00:00 2001 From: krofax Date: Wed, 20 Aug 2025 12:14:20 +0100 Subject: [PATCH 25/92] updated a statement --- .../operators/chain-operators/deploy/spin-batcher.mdx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pages/operators/chain-operators/deploy/spin-batcher.mdx b/pages/operators/chain-operators/deploy/spin-batcher.mdx index 8bd139141..1df8fdf32 100644 --- a/pages/operators/chain-operators/deploy/spin-batcher.mdx +++ b/pages/operators/chain-operators/deploy/spin-batcher.mdx @@ -59,7 +59,7 @@ To ensure you're using the latest compatible versions of OP Stack components, al Look for the latest `op-batcher/v*` release that's compatible with your sequencer setup. - This guide uses `op-batcher/v1.13.2` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.1 from the sequencer setup. + This guide uses `op-batcher/v1.13.1` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.0 from the sequencer setup. Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information. @@ -73,7 +73,7 @@ git clone https://github.com/ethereum-optimism/optimism.git cd optimism # Checkout the latest release tag -git checkout op-batcher/v1.13.2 +git checkout op-batcher/v1.13.1 # Build op-batcher cd op-batcher @@ -113,7 +113,7 @@ If you prefer containerized deployment, you can use the official Docker images. cp ~/.deployer/state.json . # Extract the BatchInbox address - BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].systemConfigProxyAddress') + BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].SystemConfigProxy') echo "BatchInbox Address: $BATCH_INBOX_ADDRESS" ``` @@ -187,6 +187,7 @@ services: - "--private-key=${BATCHER_PRIVATE_KEY}" - "--batch-type=1" - "--data-availability-type=blobs" + - "--compress" - "--log.level=info" restart: unless-stopped ``` @@ -275,7 +276,7 @@ cd ~/batcher-node cp ../.deployer/state.json . # Extract the BatchInbox address -BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].systemConfigProxyAddress') +BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].SystemConfigProxy') echo "BatchInbox Address: $BATCH_INBOX_ADDRESS" ``` @@ -350,6 +351,7 @@ source .env --private-key=$BATCHER_PRIVATE_KEY \ --batch-type=1 \ --data-availability-type=blobs \ + --compress \ --log.level=info ``` From 3a806ebc621d88f3a7a10ea8391fd30db3852330 Mon Sep 17 00:00:00 2001 From: krofax Date: Wed, 20 Aug 2025 12:14:39 +0100 Subject: [PATCH 26/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- words.txt | 230 +++++++++++++++++++++++++++--------------------------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/words.txt b/words.txt index d61b5f50a..e59bd0e7f 100644 --- a/words.txt +++ b/words.txt @@ -1,7 +1,7 @@ -ACCOUNTQUEUE accountqueue -ACCOUNTSLOTS +ACCOUNTQUEUE accountslots +ACCOUNTSLOTS ACDC ADDI ADDIU @@ -9,58 +9,58 @@ ADDU airgap Allnodes allocs -Alphanet alphanet -Alphanets +Alphanet alphanets +Alphanets altda ANDI Ankr Apeworx Arweave authrpc -Autorelay autorelay +Autorelay autorelayer basefee bcde -Betanet betanet -Betanets +Betanet betanets +Betanets BGEZ BGTZ Biconomy BLEZ -BLOBPOOL blobpool +BLOBPOOL blobspace Blockdaemon blockhash blocklists -BLOCKLOGS blocklogs -BLOCKPROFILERATE +BLOCKLOGS blockprofilerate +BLOCKPROFILERATE Blockscout -Blockspace blockspace +Blockspace blocktime -Blocktimes blocktimes -BLOOMFILTER +Blocktimes bloomfilter +BLOOMFILTER BLTZ Bootcamp bootnode -BOOTNODES -Bootnodes bootnodes +Bootnodes +BOOTNODES bottlenecked -Brotli brotli -Callouts +Brotli callouts +Callouts CCIP cdef Celestia @@ -73,65 +73,65 @@ chaosnet Chugsplash Clabby codebases -Collateralized collateralized +Collateralized compr Comprensive -COMPUTEPENDINGBLOCK computependingblock +COMPUTEPENDINGBLOCK confs corsdomain counterfactually -Crosschain crosschain +Crosschain Crossmint daserver -DATACAP datacap -DATADIR +DATACAP datadir +DATADIR Defi Defillama's delegatecall -Devnet devnet -Devnets +Devnet devnets +Devnets devs -DISABLETXPOOLGOSSIP disabletxpoolgossip -Discv +DISABLETXPOOLGOSSIP discv +Discv DIVU Drand dripcheck Drippie Eigen EIPs -ENABLEDEPRECATEDPERSONAL enabledeprecatedpersonal +ENABLEDEPRECATEDPERSONAL enginekind -Erigon erigon -ETHERBASE +Erigon etherbase +ETHERBASE Ethernity Ethernow -ETHSTATS ethstats -EVMTIMEOUT +ETHSTATS evmtimeout +EVMTIMEOUT executability exfiltrate -EXITWHENSYNCED exitwhensynced +EXITWHENSYNCED extensibly -EXTRADATA extradata +EXTRADATA Farcaster Faultproof -FDLIMIT fdlimit +FDLIMIT Flashblocks Flashbots forkable @@ -140,51 +140,51 @@ FPVM FPVMs Fraxtal Funct -GASCAP gascap +GASCAP gaslessly -GCMODE gcmode +GCMODE Gelato gifs -GLOBALQUEUE globalqueue -GLOBALSLOTS +GLOBALQUEUE globalslots +GLOBALSLOTS gokzg growthepie hardfork hardforks -HEALTHCHECK healthcheck +HEALTHCHECK healthchecks -HISTORICALRPC historicalrpc -HISTORICALRPCTIMEOUT +HISTORICALRPC historicalrpctimeout -HOLESKY -Holesky +HISTORICALRPCTIMEOUT holesky +Holesky +HOLESKY IERC -IGNOREPRICE ignoreprice +IGNOREPRICE Immunefi -Inator inator -INFLUXDBV +Inator influxdbv +INFLUXDBV initcode -IPCDISABLE ipcdisable +IPCDISABLE ipcfile -IPCPATH ipcpath +IPCPATH IPFS JALR -JOURNALREMOTES journalremotes -JSPATH +JOURNALREMOTES jspath +JSPATH jwtsecret Keccak leveldb @@ -193,34 +193,34 @@ Lisk logfile logfmt Mainnets -MAXAGE maxage -MAXBACKUPS +MAXAGE maxbackups -MAXPEERS +MAXBACKUPS maxpeers -MAXPENDPEERS +MAXPEERS maxpendpeers -MAXPRICE +MAXPENDPEERS maxprice -MEMPROFILERATE +MAXPRICE memprofilerate -Merkle +MEMPROFILERATE merkle +Merkle MFHI MFLO Mgas Minato -MINFREEDISK minfreedisk -MINSUGGESTEDPRIORITYFEE +MINFREEDISK minsuggestedpriorityfee +MINSUGGESTEDPRIORITYFEE Mintable Mintplex MIPSEVM Mitigations -Monitorism monitorism +Monitorism Moralis Mordor MOVN @@ -229,145 +229,145 @@ MTHI MTLO MULT multiaddr -Multichain multichain +Multichain multiclient multisigs MULTU Nethermind -NETRESTRICT netrestrict -NETWORKID +NETRESTRICT networkid -NEWPAYLOAD +NETWORKID newpayload +NEWPAYLOAD nextra -NOCOMPACTION nocompaction -NODEKEY +NOCOMPACTION nodekey -NODEKEYHEX +NODEKEY nodekeyhex +NODEKEYHEX nodename Nodies -NODISCOVER nodiscover -NOLOCALS +NODISCOVER nolocals -NOPREFETCH +NOLOCALS noprefetch -NOPRUNING +NOPREFETCH nopruning -NOSYNCSERVE +NOPRUNING nosyncserve +NOSYNCSERVE Numba NVME -Offchain offchain +Offchain onlyreqtostatic opchaina opchainb -OPCM opcm +OPCM Openfort oplabs opnode's outfile outperformance pcscdpath -Pectra pectra +Pectra Pectra's -Peerstore peerstore +Peerstore peerstores -Permissioned permissioned +Permissioned permissioning -Permissionless permissionless +Permissionless permissionlessly Perps Peta Pimlico POAP POAPs -PPROF pprof -Precommitments +PPROF precommitments +Precommitments preconfigured predeploy -Predeployed predeployed -Predeploys +Predeployed predeploys +Predeploys prefunded -Preimage preimage -PREIMAGES +Preimage preimages +PREIMAGES preinstall -Preinstalls preinstalls -Prestate +Preinstalls prestate +Prestate prestates PREVRANDAO -PRICEBUMP pricebump -PRICELIMIT +PRICEBUMP pricelimit +PRICELIMIT productionize productionized Protip Proxied -Proxyd proxyd +Proxyd Pyth Pyth's QRNG -Quicknode quicknode +Quicknode quickstarts rebalancing reemit Reemitting -Regenesis regenesis +Regenesis Reimagine -REJOURNAL rejournal -REMOTEDB +REJOURNAL remotedb +REMOTEDB Reown Reown's replayability replayor reposts reproven -REQUIREDBLOCKS requiredblocks +REQUIREDBLOCKS rollouts -Rollups rollups +Rollups Routescan rpckind -RPCPREFIX rpcprefix +RPCPREFIX rpcs RPGF -Runbooks runbooks +Runbooks RWAs safedb Schnorr -SEPOLIA -Sepolia sepolia +Sepolia +SEPOLIA seqnr -SEQUENCERHTTP sequencerhttp +SEQUENCERHTTP serv signup SLLV @@ -376,16 +376,16 @@ SLTIU SLTU smartcard snapshotlog -Snapsync snapsync +Snapsync Solana Soneium soyboy Spearbit SRAV SRLV -Stablecoins stablecoins +Stablecoins statefulset structs subcomponents @@ -394,21 +394,21 @@ subheaders subsecond SUBU Sunnyside -SUPERCHAIN -Superchain superchain +Superchain +SUPERCHAIN Superchain's superchainerc Superlend Superloans Superscan Superseed -Supersim supersim -SYNCMODE +Supersim syncmode -SYNCTARGET +SYNCMODE synctarget +SYNCTARGET syscalls SYSCON thirdweb @@ -422,8 +422,8 @@ Twei txfeecap txmgr txns -TXPOOL txpool +TXPOOL txproxy txproxyd uncensorable @@ -434,21 +434,21 @@ Unprotect unsubmitted UPNP upstreaming -VERKLE verkle -VHOSTS +VERKLE vhosts -Viem +VHOSTS viem -Viem's +Viem viem's -VMDEBUG +Viem's vmdebug -VMODULE +VMDEBUG vmodule +VMODULE xlarge XORI ZKPs ZKVM -Zora zora +Zora From 3622f73efb0376f752c1dc092ed7f27ecad3300b Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 20 Aug 2025 12:53:54 +0100 Subject: [PATCH 27/92] Refactor op-deployer installation instructions: Introduce tabs for clearer presentation of installation options, swapping the recommended status of the download method, and enhancing the step-by-step process for building from source. --- .../chain-operators/tools/op-deployer.mdx | 56 ++++++++++--------- .../create-l2-rollup/op-deployer-setup.mdx | 2 +- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/pages/operators/chain-operators/tools/op-deployer.mdx b/pages/operators/chain-operators/tools/op-deployer.mdx index e062e93c9..36258152d 100644 --- a/pages/operators/chain-operators/tools/op-deployer.mdx +++ b/pages/operators/chain-operators/tools/op-deployer.mdx @@ -13,7 +13,7 @@ categories: is_imported_content: 'false' --- -import {Callout, Steps} from 'nextra/components' +import {Callout, Steps, Tabs} from 'nextra/components' # Deployer @@ -23,40 +23,42 @@ import {Callout, Steps} from 'nextra/components' There are a couple of ways to install `op-deployer`: -### Option 1: Build from source (Recommended) + + + To install from source, you will need [Go](https://go.dev/doc/install), `just`, and `git`. + After installing all of that, run following: -To install from source, you will need [Go](https://go.dev/doc/install), `just`, and `git`. -After installing all of that, run following: - -```bash - -git clone https://github.com/ethereum-optimism/optimism.git # you can skip this if you already have the repo -cd optimism/op-deployer -just build -cp ./bin/op-deployer /usr/local/bin/op-deployer # or any other directory in your $PATH + ```bash -# Verify installation, run this command to verify that you have it installed. -op-deployer --version -``` + git clone https://github.com/ethereum-optimism/optimism.git # you can skip this if you already have the repo + cd optimism/op-deployer + just build + cp ./bin/op-deployer /usr/local/bin/op-deployer # or any other directory in your $PATH -### Option 2: Download pre-built binary + # Verify installation, run this command to verify that you have it installed. + op-deployer --version + ``` + -The recommended way to install `op-deployer` is to download the latest release from the monorepo's [release page](https://github.com/ethereum-optimism/optimism/releases). + + Another way to install `op-deployer`, is to download the latest release from the monorepo's [release page](https://github.com/ethereum-optimism/optimism/releases). -1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) -2. Find the latest release that includes op-deployer -3. Under **assets**, download the binary that matches your operating system: + 1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) + 2. Find the latest release that includes op-deployer + 3. Under **assets**, download the binary that matches your operating system: -* `op-deployer-linux-amd64` for Linux -* `op-deployer-darwin-amd64` or `op-deployer-darwin-arm64` for macOS -* `op-deployer-windows-amd64.exe` for Windows + * `op-deployer-linux-amd64` for Linux + * `op-deployer-darwin-amd64` or `op-deployer-darwin-arm64` for macOS + * `op-deployer-windows-amd64.exe` for Windows -4. Extract the binary to a location on your system PATH -5. Verify installation, run this command to verify that you have it installed. + 4. Extract the binary to a location on your system PATH + 5. Verify installation, run this command to verify that you have it installed. -```bash -op-deployer --version -``` + ```bash + op-deployer --version + ``` + + ## Deployment usage diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 200b39f8e..da5a5e180 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -31,7 +31,7 @@ Welcome to the first step of creating your own L2 rollup testnet! In this sectio There are a couple of ways to install `op-deployer`: - + To install from source, you will need [Go](https://go.dev/doc/install), `just`, and `git`. After installing all of that, run following: From 7746bc05fa93ce5cb89efdc750ae0471c58751f0 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 20 Aug 2025 12:57:03 +0100 Subject: [PATCH 28/92] Refine words list and enhance op-challenger setup tutorial: standardize formatting for code snippets and callouts, improving clarity and consistency in configuration instructions. --- .../create-l2-rollup/op-challenger-setup.mdx | 32 +-- words.txt | 230 +++++++++--------- 2 files changed, 131 insertions(+), 131 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 8812fd4ae..8dd630f2f 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -255,13 +255,13 @@ For challenger deployment, you can either build from source (recommended for bet * To enable SafeDB, set the `--safedb.path` value in your configuration. This specifies the file path used to persist safe head update data. * Example Configuration: - ``` - --safedb.path # Replace with your actual path - ``` + ``` + --safedb.path # Replace with your actual path + ``` - - If this path is not set, the SafeDB feature will be disabled. - + + If this path is not set, the SafeDB feature will be disabled. + 2. Ensuring Historical Data Availability: @@ -270,15 +270,15 @@ For challenger deployment, you can either build from source (recommended for bet * For `op-geth`: Similarly, configure to store or access historical data. * Example Configuration: - ``` - op-node \ - --rollup-rpc \ - --safedb.path - ``` + ``` + op-node \ + --rollup-rpc \ + --safedb.path + ``` - - Replace `` with the URL of your archive node and `` with the desired path for storing SafeDB data. - + + Replace `` with the URL of your archive node and `` with the desired path for storing SafeDB data. +
@@ -310,10 +310,10 @@ For challenger deployment, you can either build from source (recommended for bet # op mainnet are tagged versions of op-program # make reproducible prestate # challenger verifies that onchain - --cannon-prestate ./op-program/bin/prestate.json \ + --cannon-prestate ./op-program/bin/prestate.json \ # load the game factory address from system config or superchain registry # point the game factory address at the dispute game factory proxy - --game-factory-address + --game-factory-address ``` diff --git a/words.txt b/words.txt index e59bd0e7f..d61b5f50a 100644 --- a/words.txt +++ b/words.txt @@ -1,7 +1,7 @@ -accountqueue ACCOUNTQUEUE -accountslots +accountqueue ACCOUNTSLOTS +accountslots ACDC ADDI ADDIU @@ -9,58 +9,58 @@ ADDU airgap Allnodes allocs -alphanet Alphanet -alphanets +alphanet Alphanets +alphanets altda ANDI Ankr Apeworx Arweave authrpc -autorelay Autorelay +autorelay autorelayer basefee bcde -betanet Betanet -betanets +betanet Betanets +betanets BGEZ BGTZ Biconomy BLEZ -blobpool BLOBPOOL +blobpool blobspace Blockdaemon blockhash blocklists -blocklogs BLOCKLOGS -blockprofilerate +blocklogs BLOCKPROFILERATE +blockprofilerate Blockscout -blockspace Blockspace +blockspace blocktime -blocktimes Blocktimes -bloomfilter +blocktimes BLOOMFILTER +bloomfilter BLTZ Bootcamp bootnode -bootnodes -Bootnodes BOOTNODES +Bootnodes +bootnodes bottlenecked -brotli Brotli -callouts +brotli Callouts +callouts CCIP cdef Celestia @@ -73,65 +73,65 @@ chaosnet Chugsplash Clabby codebases -collateralized Collateralized +collateralized compr Comprensive -computependingblock COMPUTEPENDINGBLOCK +computependingblock confs corsdomain counterfactually -crosschain Crosschain +crosschain Crossmint daserver -datacap DATACAP -datadir +datacap DATADIR +datadir Defi Defillama's delegatecall -devnet Devnet -devnets +devnet Devnets +devnets devs -disabletxpoolgossip DISABLETXPOOLGOSSIP -discv +disabletxpoolgossip Discv +discv DIVU Drand dripcheck Drippie Eigen EIPs -enabledeprecatedpersonal ENABLEDEPRECATEDPERSONAL +enabledeprecatedpersonal enginekind -erigon Erigon -etherbase +erigon ETHERBASE +etherbase Ethernity Ethernow -ethstats ETHSTATS -evmtimeout +ethstats EVMTIMEOUT +evmtimeout executability exfiltrate -exitwhensynced EXITWHENSYNCED +exitwhensynced extensibly -extradata EXTRADATA +extradata Farcaster Faultproof -fdlimit FDLIMIT +fdlimit Flashblocks Flashbots forkable @@ -140,51 +140,51 @@ FPVM FPVMs Fraxtal Funct -gascap GASCAP +gascap gaslessly -gcmode GCMODE +gcmode Gelato gifs -globalqueue GLOBALQUEUE -globalslots +globalqueue GLOBALSLOTS +globalslots gokzg growthepie hardfork hardforks -healthcheck HEALTHCHECK +healthcheck healthchecks -historicalrpc HISTORICALRPC -historicalrpctimeout +historicalrpc HISTORICALRPCTIMEOUT -holesky -Holesky +historicalrpctimeout HOLESKY +Holesky +holesky IERC -ignoreprice IGNOREPRICE +ignoreprice Immunefi -inator Inator -influxdbv +inator INFLUXDBV +influxdbv initcode -ipcdisable IPCDISABLE +ipcdisable ipcfile -ipcpath IPCPATH +ipcpath IPFS JALR -journalremotes JOURNALREMOTES -jspath +journalremotes JSPATH +jspath jwtsecret Keccak leveldb @@ -193,34 +193,34 @@ Lisk logfile logfmt Mainnets -maxage MAXAGE -maxbackups +maxage MAXBACKUPS -maxpeers +maxbackups MAXPEERS -maxpendpeers +maxpeers MAXPENDPEERS -maxprice +maxpendpeers MAXPRICE -memprofilerate +maxprice MEMPROFILERATE -merkle +memprofilerate Merkle +merkle MFHI MFLO Mgas Minato -minfreedisk MINFREEDISK -minsuggestedpriorityfee +minfreedisk MINSUGGESTEDPRIORITYFEE +minsuggestedpriorityfee Mintable Mintplex MIPSEVM Mitigations -monitorism Monitorism +monitorism Moralis Mordor MOVN @@ -229,145 +229,145 @@ MTHI MTLO MULT multiaddr -multichain Multichain +multichain multiclient multisigs MULTU Nethermind -netrestrict NETRESTRICT -networkid +netrestrict NETWORKID -newpayload +networkid NEWPAYLOAD +newpayload nextra -nocompaction NOCOMPACTION -nodekey +nocompaction NODEKEY -nodekeyhex +nodekey NODEKEYHEX +nodekeyhex nodename Nodies -nodiscover NODISCOVER -nolocals +nodiscover NOLOCALS -noprefetch +nolocals NOPREFETCH -nopruning +noprefetch NOPRUNING -nosyncserve +nopruning NOSYNCSERVE +nosyncserve Numba NVME -offchain Offchain +offchain onlyreqtostatic opchaina opchainb -opcm OPCM +opcm Openfort oplabs opnode's outfile outperformance pcscdpath -pectra Pectra +pectra Pectra's -peerstore Peerstore +peerstore peerstores -permissioned Permissioned +permissioned permissioning -permissionless Permissionless +permissionless permissionlessly Perps Peta Pimlico POAP POAPs -pprof PPROF -precommitments +pprof Precommitments +precommitments preconfigured predeploy -predeployed Predeployed -predeploys +predeployed Predeploys +predeploys prefunded -preimage Preimage -preimages +preimage PREIMAGES +preimages preinstall -preinstalls Preinstalls -prestate +preinstalls Prestate +prestate prestates PREVRANDAO -pricebump PRICEBUMP -pricelimit +pricebump PRICELIMIT +pricelimit productionize productionized Protip Proxied -proxyd Proxyd +proxyd Pyth Pyth's QRNG -quicknode Quicknode +quicknode quickstarts rebalancing reemit Reemitting -regenesis Regenesis +regenesis Reimagine -rejournal REJOURNAL -remotedb +rejournal REMOTEDB +remotedb Reown Reown's replayability replayor reposts reproven -requiredblocks REQUIREDBLOCKS +requiredblocks rollouts -rollups Rollups +rollups Routescan rpckind -rpcprefix RPCPREFIX +rpcprefix rpcs RPGF -runbooks Runbooks +runbooks RWAs safedb Schnorr -sepolia -Sepolia SEPOLIA +Sepolia +sepolia seqnr -sequencerhttp SEQUENCERHTTP +sequencerhttp serv signup SLLV @@ -376,16 +376,16 @@ SLTIU SLTU smartcard snapshotlog -snapsync Snapsync +snapsync Solana Soneium soyboy Spearbit SRAV SRLV -stablecoins Stablecoins +stablecoins statefulset structs subcomponents @@ -394,21 +394,21 @@ subheaders subsecond SUBU Sunnyside -superchain -Superchain SUPERCHAIN +Superchain +superchain Superchain's superchainerc Superlend Superloans Superscan Superseed -supersim Supersim -syncmode +supersim SYNCMODE -synctarget +syncmode SYNCTARGET +synctarget syscalls SYSCON thirdweb @@ -422,8 +422,8 @@ Twei txfeecap txmgr txns -txpool TXPOOL +txpool txproxy txproxyd uncensorable @@ -434,21 +434,21 @@ Unprotect unsubmitted UPNP upstreaming -verkle VERKLE -vhosts +verkle VHOSTS -viem +vhosts Viem -viem's +viem Viem's -vmdebug +viem's VMDEBUG -vmodule +vmdebug VMODULE +vmodule xlarge XORI ZKPs ZKVM -zora Zora +zora From 014af12a6e351ac5c53eb663261e1a54ea5ea3ad Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 20 Aug 2025 13:14:15 +0100 Subject: [PATCH 29/92] Add warning callout in op-challenger setup tutorial: emphasize the requirement for Cannon binary and op-program server paths to ensure proper configuration. --- .../tutorials/create-l2-rollup/op-challenger-setup.mdx | 5 +++++ .../tutorials/create-l2-rollup/op-proposer-setup.mdx | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 8dd630f2f..6f7b7a71f 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -121,6 +121,11 @@ For challenger deployment, you can either build from source (recommended for bet ## Configuration setup + + The following steps require a Cannon binary and the op-program server. + Ensure these binaries are available at the paths you configure (CANNON_BIN and CANNON_SERVER). + + ### Organize your workspace diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index cb78326bf..43f33037b 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -407,7 +407,7 @@ Your final directory structure should look like: # Monitor proposal activity curl -X POST -H "Content-Type: application/json" \ --data '{"jsonrpc":"2.0","method":"optimism_outputAtBlock","params":["latest"],"id":1}' \ - http://localhost:8547 + http://localhost:8560 # Check if your proposer address has enough ETH for gas # (Replace with your actual proposer address) From e4cb9c8d8482f8f3b21e6b73a1ec1677eb043e1e Mon Sep 17 00:00:00 2001 From: krofax Date: Wed, 20 Aug 2025 16:05:06 +0100 Subject: [PATCH 30/92] updated the scripts --- pages/operators/chain-operators/tools/op-deployer.mdx | 2 +- .../tutorials/create-l2-rollup/op-deployer-setup.mdx | 2 +- .../tutorials/create-l2-rollup/op-proposer-setup.mdx | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/tools/op-deployer.mdx b/pages/operators/chain-operators/tools/op-deployer.mdx index e062e93c9..4c0b8c314 100644 --- a/pages/operators/chain-operators/tools/op-deployer.mdx +++ b/pages/operators/chain-operators/tools/op-deployer.mdx @@ -258,7 +258,7 @@ l1ContractsLocator = "file:///path/to/local/op-contracts/v1.8.0-rc.4/forge-artif l2ContractsLocator = "" ``` -By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html?utm_source=op-docs\&utm_medium=docs). You can override these default settings by adding them to your intent file using the table below: +By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html?utm_source=op-docs&utm_medium=docs). You can override these default settings by adding them to your intent file using the table below: ```toml [globalDeployOverrides] diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 200b39f8e..69d287716 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -269,7 +269,7 @@ l1ContractsLocator = "file:///path/to/local/op-contracts/v1.8.0-rc.4/forge-artif l2ContractsLocator = "" ``` -By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html?utm_source=op-docs\&utm_medium=docs). You can override these default settings by adding them to your intent file using the table below: +By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html?utm_source=op-docs&utm_medium=docs). You can override these default settings by adding them to your intent file using the table below: ```toml [globalDeployOverrides] diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index cb78326bf..5d9c0f5d4 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -55,6 +55,10 @@ Before setting up your proposer, ensure you have: ## Software installation +* Download Node.js >= 16.x +* Download Docker (optional) +* Install jq (`sudo apt-get install jq` or `brew install jq`) + ### Finding the current stable releases To ensure you're using the latest compatible versions of OP Stack components, always check the official [releases page](https://github.com/ethereum-optimism/optimism/releases). From c1d2bca1c30aa6264bdf86e0aeb8fbff8a159da4 Mon Sep 17 00:00:00 2001 From: krofax Date: Wed, 20 Aug 2025 16:13:44 +0100 Subject: [PATCH 31/92] updated the software requirement --- .../tutorials/create-l2-rollup.mdx | 52 ++++++++++++++++++- .../create-l2-rollup/op-proposer-setup.mdx | 6 --- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index e3ce76403..66b22d4c7 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -67,9 +67,59 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with: ## Before You Start +### Software dependencies + +| Dependency | Version | Version Check Command | +| ------------------------------------------------------------- | -------- | --------------------- | +| [git](https://git-scm.com/) | `^2` | `git --version` | +| [go](https://go.dev/) | `^1.21` | `go version` | +| [node](https://nodejs.org/en/) | `^20` | `node --version` | +| [pnpm](https://pnpm.io/installation) | `^8` | `pnpm --version` | +| [foundry](https://github.com/foundry-rs/foundry#installation) | `^0.2.0` | `forge --version` | +| [make](https://linux.die.net/man/1/make) | `^3` | `make --version` | +| [jq](https://github.com/jqlang/jq) | `^1.6` | `jq --version` | +| [direnv](https://direnv.net) | `^2` | `direnv --version` | + +### Notes on specific dependencies + +#### `node` + +We recommend using the latest LTS version of Node.js (currently v20). +[`nvm`](https://github.com/nvm-sh/nvm) is a useful tool that can help you manage multiple versions of Node.js on your machine. +You may experience unexpected errors on older versions of Node.js. + +#### `foundry` + +It's recommended to use the scripts in the monorepo's `package.json` for managing `foundry` to ensure you're always working with the correct version. This approach simplifies the installation, update, and version checking process. Make sure to clone the monorepo locally before proceeding. +#### `direnv` + +Parts of this tutorial use [`direnv`](https://direnv.net) as a way of loading environment variables from `.envrc` files into your shell. +This means you won't have to manually export environment variables every time you want to use them. +`direnv` only ever has access to files that you explicitly allow it to see. + +After [installing `direnv`](https://direnv.net/docs/installation.html), you will need to **make sure that [`direnv` is hooked into your shell](https://direnv.net/docs/hook.html)**. +Make sure you've followed [the guide on the `direnv` website](https://direnv.net/docs/hook.html), then **close your terminal and reopen it** so that the changes take effect (or `source` your config file if you know how to do that). + + +Make sure that you have correctly hooked `direnv` into your shell by modifying your shell configuration file (like `~/.bashrc` or `~/.zshrc`). +If you haven't edited a config file then you probably haven't configured `direnv` properly (and things might not work later). + + +### Get access to a sepolia node + +You'll be deploying a OP Stack Rollup chain that uses a Layer 1 blockchain to host and order transaction data. +The OP Stack Rollups were designed to use EVM Equivalent blockchains like Ethereum, OP Mainnet, or standard Ethereum testnets as their L1 chains. + +**This guide uses the Sepolia testnet as an L1 chain**. +We recommend that you also use Sepolia. +You can also use other EVM-compatible blockchains, but you may run into unexpected errors. +If you want to use an alternative network, make sure to carefully review each command and replace any Sepolia-specific values with the values for your network. + +Since you're deploying your OP Stack chain to Sepolia, you'll need to have access to a Sepolia node. +You can either use a node provider like [Alchemy](https://www.alchemy.com/) (easier) or run your own Sepolia node (harder). + ### Required Resources -* **Sepolia RPC URL** - Get from [Alchemy](https://www.alchemy.com/), [Infura](https://infura.io/), or [QuickNode](https://www.quicknode.com/) * **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) (\~2-3 ETH recommended) * **Private Keys** - You'll need 5 separate keys for different roles (we'll generate these in the first step) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index dfa7d9288..b5f2b938d 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -53,12 +53,6 @@ Before setting up your proposer, ensure you have: * Your L2 chain ID and network configuration * L1 network details (chain ID, RPC endpoints) -## Software installation - -* Download Node.js >= 16.x -* Download Docker (optional) -* Install jq (`sudo apt-get install jq` or `brew install jq`) - ### Finding the current stable releases To ensure you're using the latest compatible versions of OP Stack components, always check the official [releases page](https://github.com/ethereum-optimism/optimism/releases). From c5f04b76c79864a44d54695115bf04079631c3cf Mon Sep 17 00:00:00 2001 From: krofax Date: Wed, 20 Aug 2025 16:14:03 +0100 Subject: [PATCH 32/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- words.txt | 231 +++++++++++++++++++++++++++--------------------------- 1 file changed, 116 insertions(+), 115 deletions(-) diff --git a/words.txt b/words.txt index d61b5f50a..61c94a4a4 100644 --- a/words.txt +++ b/words.txt @@ -1,7 +1,7 @@ -ACCOUNTQUEUE accountqueue -ACCOUNTSLOTS +ACCOUNTQUEUE accountslots +ACCOUNTSLOTS ACDC ADDI ADDIU @@ -9,58 +9,58 @@ ADDU airgap Allnodes allocs -Alphanet alphanet -Alphanets +Alphanet alphanets +Alphanets altda ANDI Ankr Apeworx Arweave authrpc -Autorelay autorelay +Autorelay autorelayer basefee bcde -Betanet betanet -Betanets +Betanet betanets +Betanets BGEZ BGTZ Biconomy BLEZ -BLOBPOOL blobpool +BLOBPOOL blobspace Blockdaemon blockhash blocklists -BLOCKLOGS blocklogs -BLOCKPROFILERATE +BLOCKLOGS blockprofilerate +BLOCKPROFILERATE Blockscout -Blockspace blockspace +Blockspace blocktime -Blocktimes blocktimes -BLOOMFILTER +Blocktimes bloomfilter +BLOOMFILTER BLTZ Bootcamp bootnode -BOOTNODES -Bootnodes bootnodes +Bootnodes +BOOTNODES bottlenecked -Brotli brotli -Callouts +Brotli callouts +Callouts CCIP cdef Celestia @@ -73,65 +73,66 @@ chaosnet Chugsplash Clabby codebases -Collateralized collateralized +Collateralized compr Comprensive -COMPUTEPENDINGBLOCK computependingblock +COMPUTEPENDINGBLOCK confs corsdomain counterfactually -Crosschain crosschain +Crosschain Crossmint daserver -DATACAP datacap -DATADIR +DATACAP datadir +DATADIR Defi Defillama's delegatecall -Devnet devnet -Devnets +Devnet devnets +Devnets devs -DISABLETXPOOLGOSSIP +direnv disabletxpoolgossip -Discv +DISABLETXPOOLGOSSIP discv +Discv DIVU Drand dripcheck Drippie Eigen EIPs -ENABLEDEPRECATEDPERSONAL enabledeprecatedpersonal +ENABLEDEPRECATEDPERSONAL enginekind -Erigon erigon -ETHERBASE +Erigon etherbase +ETHERBASE Ethernity Ethernow -ETHSTATS ethstats -EVMTIMEOUT +ETHSTATS evmtimeout +EVMTIMEOUT executability exfiltrate -EXITWHENSYNCED exitwhensynced +EXITWHENSYNCED extensibly -EXTRADATA extradata +EXTRADATA Farcaster Faultproof -FDLIMIT fdlimit +FDLIMIT Flashblocks Flashbots forkable @@ -140,51 +141,51 @@ FPVM FPVMs Fraxtal Funct -GASCAP gascap +GASCAP gaslessly -GCMODE gcmode +GCMODE Gelato gifs -GLOBALQUEUE globalqueue -GLOBALSLOTS +GLOBALQUEUE globalslots +GLOBALSLOTS gokzg growthepie hardfork hardforks -HEALTHCHECK healthcheck +HEALTHCHECK healthchecks -HISTORICALRPC historicalrpc -HISTORICALRPCTIMEOUT +HISTORICALRPC historicalrpctimeout -HOLESKY -Holesky +HISTORICALRPCTIMEOUT holesky +Holesky +HOLESKY IERC -IGNOREPRICE ignoreprice +IGNOREPRICE Immunefi -Inator inator -INFLUXDBV +Inator influxdbv +INFLUXDBV initcode -IPCDISABLE ipcdisable +IPCDISABLE ipcfile -IPCPATH ipcpath +IPCPATH IPFS JALR -JOURNALREMOTES journalremotes -JSPATH +JOURNALREMOTES jspath +JSPATH jwtsecret Keccak leveldb @@ -193,34 +194,34 @@ Lisk logfile logfmt Mainnets -MAXAGE maxage -MAXBACKUPS +MAXAGE maxbackups -MAXPEERS +MAXBACKUPS maxpeers -MAXPENDPEERS +MAXPEERS maxpendpeers -MAXPRICE +MAXPENDPEERS maxprice -MEMPROFILERATE +MAXPRICE memprofilerate -Merkle +MEMPROFILERATE merkle +Merkle MFHI MFLO Mgas Minato -MINFREEDISK minfreedisk -MINSUGGESTEDPRIORITYFEE +MINFREEDISK minsuggestedpriorityfee +MINSUGGESTEDPRIORITYFEE Mintable Mintplex MIPSEVM Mitigations -Monitorism monitorism +Monitorism Moralis Mordor MOVN @@ -229,145 +230,145 @@ MTHI MTLO MULT multiaddr -Multichain multichain +Multichain multiclient multisigs MULTU Nethermind -NETRESTRICT netrestrict -NETWORKID +NETRESTRICT networkid -NEWPAYLOAD +NETWORKID newpayload +NEWPAYLOAD nextra -NOCOMPACTION nocompaction -NODEKEY +NOCOMPACTION nodekey -NODEKEYHEX +NODEKEY nodekeyhex +NODEKEYHEX nodename Nodies -NODISCOVER nodiscover -NOLOCALS +NODISCOVER nolocals -NOPREFETCH +NOLOCALS noprefetch -NOPRUNING +NOPREFETCH nopruning -NOSYNCSERVE +NOPRUNING nosyncserve +NOSYNCSERVE Numba NVME -Offchain offchain +Offchain onlyreqtostatic opchaina opchainb -OPCM opcm +OPCM Openfort oplabs opnode's outfile outperformance pcscdpath -Pectra pectra +Pectra Pectra's -Peerstore peerstore +Peerstore peerstores -Permissioned permissioned +Permissioned permissioning -Permissionless permissionless +Permissionless permissionlessly Perps Peta Pimlico POAP POAPs -PPROF pprof -Precommitments +PPROF precommitments +Precommitments preconfigured predeploy -Predeployed predeployed -Predeploys +Predeployed predeploys +Predeploys prefunded -Preimage preimage -PREIMAGES +Preimage preimages +PREIMAGES preinstall -Preinstalls preinstalls -Prestate +Preinstalls prestate +Prestate prestates PREVRANDAO -PRICEBUMP pricebump -PRICELIMIT +PRICEBUMP pricelimit +PRICELIMIT productionize productionized Protip Proxied -Proxyd proxyd +Proxyd Pyth Pyth's QRNG -Quicknode quicknode +Quicknode quickstarts rebalancing reemit Reemitting -Regenesis regenesis +Regenesis Reimagine -REJOURNAL rejournal -REMOTEDB +REJOURNAL remotedb +REMOTEDB Reown Reown's replayability replayor reposts reproven -REQUIREDBLOCKS requiredblocks +REQUIREDBLOCKS rollouts -Rollups rollups +Rollups Routescan rpckind -RPCPREFIX rpcprefix +RPCPREFIX rpcs RPGF -Runbooks runbooks +Runbooks RWAs safedb Schnorr -SEPOLIA -Sepolia sepolia +Sepolia +SEPOLIA seqnr -SEQUENCERHTTP sequencerhttp +SEQUENCERHTTP serv signup SLLV @@ -376,16 +377,16 @@ SLTIU SLTU smartcard snapshotlog -Snapsync snapsync +Snapsync Solana Soneium soyboy Spearbit SRAV SRLV -Stablecoins stablecoins +Stablecoins statefulset structs subcomponents @@ -394,21 +395,21 @@ subheaders subsecond SUBU Sunnyside -SUPERCHAIN -Superchain superchain +Superchain +SUPERCHAIN Superchain's superchainerc Superlend Superloans Superscan Superseed -Supersim supersim -SYNCMODE +Supersim syncmode -SYNCTARGET +SYNCMODE synctarget +SYNCTARGET syscalls SYSCON thirdweb @@ -422,8 +423,8 @@ Twei txfeecap txmgr txns -TXPOOL txpool +TXPOOL txproxy txproxyd uncensorable @@ -434,21 +435,21 @@ Unprotect unsubmitted UPNP upstreaming -VERKLE verkle -VHOSTS +VERKLE vhosts -Viem +VHOSTS viem -Viem's +Viem viem's -VMDEBUG +Viem's vmdebug -VMODULE +VMDEBUG vmodule +VMODULE xlarge XORI ZKPs ZKVM -Zora zora +Zora From ca54060a5263b68f878099ea06c998a758dcd659 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 28 Aug 2025 14:38:11 +0100 Subject: [PATCH 33/92] Update pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../tutorials/create-l2-rollup/op-deployer-setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 156a38513..ae4392e07 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -95,7 +95,7 @@ op-deployer init \ ``` * Replace `` with the exact value. -* The `--workdir` flag specifies the output directory for the generated intent file and related configs. You can name this directory anything you like , `.deployer` is just an example. +* The `--workdir` flag specifies the output directory for the generated intent file and related configs. You can name this directory anything you like. This command will create a directory called `.deployer` in your current working directory containing the intent file and an empty `state.json` file. `state.json` is populated with the results of your deployment, and never needs to be edited directly. From a1ea30d493da059e0be77705982c9079913b97bc Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 28 Aug 2025 14:38:51 +0100 Subject: [PATCH 34/92] Update pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../tutorials/create-l2-rollup/op-geth-setup.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 5a08d9d18..d9d863f35 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -48,9 +48,9 @@ The sequencer is responsible for: ### Finding the current stable releases -To ensure you're using the latest compatible versions of OP Stack components, always check the official releases page: +To ensure you're using the latest compatible versions of OP Stack components, always check the official [release page](https://github.com/ethereum-optimism/optimism/releases). -**[release page](https://github.com/ethereum-optimism/optimism/releases)** +**** The main components you'll need for sequencer deployment are: From 7a9cfbf8f707f06f95eccac11b6033cc62e395d9 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 28 Aug 2025 16:17:42 +0100 Subject: [PATCH 35/92] Update pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../tutorials/create-l2-rollup/op-batcher-setup.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index 733d720cb..8e3f5eb56 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -26,7 +26,6 @@ After you have spun up your sequencer, you need to configure a batcher to submit **Step 3 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the previous one. -This guide assumes you already have a functioning sequencer and the necessary L1 contracts deployed using op-deployer. If you haven't set up your sequencer yet, please refer to the [sequencer guide](./op-geth-setup) first. ## Understanding the batcher's role From c1b6c7f8f301471d3c4495c534676567d33cf4a9 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 28 Aug 2025 16:17:53 +0100 Subject: [PATCH 36/92] Update pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../tutorials/create-l2-rollup/op-challenger-setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 6f7b7a71f..feb44302d 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -123,7 +123,7 @@ For challenger deployment, you can either build from source (recommended for bet The following steps require a Cannon binary and the op-program server. - Ensure these binaries are available at the paths you configure (CANNON_BIN and CANNON_SERVER). + Ensure these binaries are available at the paths you configure (`CANNON_BIN` and `CANNON_SERVER`). From 47e219aef76bb773f89603ccc9cb26c995175abe Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 28 Aug 2025 16:18:09 +0100 Subject: [PATCH 37/92] Update pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../tutorials/create-l2-rollup/op-challenger-setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index feb44302d..ce5cbeeb7 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -28,7 +28,7 @@ After you have spun up your sequencer, batcher, and proposer, the final step is This guide provides step-by-step instructions for setting up the configuration and monitoring options for `op-challenger`. The challenger is a critical fault proofs component that monitors dispute games and challenges invalid claims to protect your OP Stack chain. -See the [OP-Challenger Explainer](/stack/fault-proofs/challenger) for a general overview of this fault proofs feature. +See the [OP-Challenger explainer](/stack/fault-proofs/challenger) for a general overview of this fault proofs feature. The challenger is responsible for: From 02b27d00f4f4702c0095b01c3c5ba497a26a0bda Mon Sep 17 00:00:00 2001 From: krofax Date: Thu, 28 Aug 2025 16:50:32 +0100 Subject: [PATCH 38/92] reslved comments in the pr --- .../tutorials/create-l2-rollup.mdx | 101 ++-- .../create-l2-rollup/op-batcher-setup.mdx | 2 +- .../create-l2-rollup/op-challenger-setup.mdx | 27 +- .../create-l2-rollup/op-deployer-setup.mdx | 527 +++++++++--------- .../create-l2-rollup/op-geth-setup.mdx | 66 +-- words.txt | 1 + 6 files changed, 371 insertions(+), 353 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index 66b22d4c7..c689afdfe 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -24,32 +24,6 @@ import { Callout, Card, Steps } from 'nextra/components' Welcome to the complete guide for deploying your own OP Stack L2 rollup testnet. This multi-part tutorial will walk you through each component step-by-step, from initial setup to a fully functioning rollup. -## Tutorial Overview - -This tutorial is organized into sequential steps that build upon each other: - - - ### **[Spin up op-deployer](/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup)** - - Install op-deployer, deploy L1 contracts, and prepare your environment - - ### **[Spin up sequencer](/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup)** - - Set up and run op-geth and op-node (the execution and consensus layers) - - ### **[Spin up batcher](/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup)** - - Configure and start op-batcher for L1 data publishing - - ### **[Spin up proposer](/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup)** - - Set up op-proposer for state root submissions - - ### **[Spin up challenger](/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup)** - - Configure op-challenger for dispute resolution monitoring - - ## What You'll Build By the end of this tutorial, you'll have a complete OP Stack testnet with: @@ -61,11 +35,7 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with: * **Proposer** (op-proposer) submitting state root proposals * **Challenger** (op-challenger) monitoring for disputes - - **Testnet Only**: This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. - - -## Before You Start +## Before you start ### Software dependencies @@ -82,29 +52,44 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with: ### Notes on specific dependencies -#### `node` + +Expand each dependency below for details + -We recommend using the latest LTS version of Node.js (currently v20). -[`nvm`](https://github.com/nvm-sh/nvm) is a useful tool that can help you manage multiple versions of Node.js on your machine. +
+node + +We recommend using the latest LTS version of Node.js (currently v20). +[`nvm`](https://github.com/nvm-sh/nvm) is a useful tool that can help you manage multiple versions of Node.js on your machine. You may experience unexpected errors on older versions of Node.js. -#### `foundry` +
+ +
+foundry -It's recommended to use the scripts in the monorepo's `package.json` for managing `foundry` to ensure you're always working with the correct version. This approach simplifies the installation, update, and version checking process. Make sure to clone the monorepo locally before proceeding. -#### `direnv` +It's recommended to use the scripts in the monorepo's `package.json` for managing `foundry` to ensure you're always working with the correct version. +This approach simplifies the installation, update, and version checking process. +Make sure to clone the monorepo locally before proceeding. -Parts of this tutorial use [`direnv`](https://direnv.net) as a way of loading environment variables from `.envrc` files into your shell. -This means you won't have to manually export environment variables every time you want to use them. +
+ +
+direnv + +Parts of this tutorial use [`direnv`](https://direnv.net) as a way of loading environment variables from `.envrc` files into your shell. +This means you won't have to manually export environment variables every time you want to use them. `direnv` only ever has access to files that you explicitly allow it to see. -After [installing `direnv`](https://direnv.net/docs/installation.html), you will need to **make sure that [`direnv` is hooked into your shell](https://direnv.net/docs/hook.html)**. +After [installing `direnv`](https://direnv.net/docs/installation.html), you will need to **make sure that [`direnv` is hooked into your shell](https://direnv.net/docs/hook.html)**. Make sure you've followed [the guide on the `direnv` website](https://direnv.net/docs/hook.html), then **close your terminal and reopen it** so that the changes take effect (or `source` your config file if you know how to do that). -Make sure that you have correctly hooked `direnv` into your shell by modifying your shell configuration file (like `~/.bashrc` or `~/.zshrc`). +Make sure that you have correctly hooked `direnv` into your shell by modifying your shell configuration file (like `~/.bashrc` or `~/.zshrc`). If you haven't edited a config file then you probably haven't configured `direnv` properly (and things might not work later). +
### Get access to a sepolia node You'll be deploying a OP Stack Rollup chain that uses a Layer 1 blockchain to host and order transaction data. @@ -127,12 +112,44 @@ You can either use a node provider like [Alchemy](https://www.alchemy.com/) (eas **Follow in Order**: Each step builds on the previous one. Start with spinning up op-deployer and complete them sequentially for the best experience. + +## Tutorial Overview + +This tutorial is organized into sequential steps that build upon each other: + + + ### **[Spin up op-deployer](/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup)** + + Install op-deployer, deploy L1 contracts, and prepare your environment + + ### **[Spin up sequencer](/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup)** + + Set up and run op-geth and op-node (the execution and consensus layers) + + ### **[Spin up batcher](/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup)** + + Configure and start op-batcher for L1 data publishing + + ### **[Spin up proposer](/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup)** + + Set up op-proposer for state root submissions + + ### **[Spin up challenger](/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup)** + + Configure op-challenger for dispute resolution monitoring + + + + **Testnet Only**: This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. + + + ## Ready to Start? Now that you understand what you'll be building, let's begin with the first step! - **Next**: Install op-deployer, prepare your environment, and set up the foundation for your rollup deployment. + Already have your dependencies? Get started and spin up op-deployer *** diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index 733d720cb..5da9e5782 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -23,7 +23,7 @@ import { Callout, Steps, Card, Tabs } from 'nextra/components' After you have spun up your sequencer, you need to configure a batcher to submit L2 transaction batches to L1. The batcher is a critical component that ensures L2 transaction data is available on L1 for data availability and enables users to reconstruct the L2 state. - **Step 3 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the previous one. + **Step 3 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the [previous one](/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup). This guide assumes you already have a functioning sequencer and the necessary L1 contracts deployed using op-deployer. If you haven't set up your sequencer yet, please refer to the [sequencer guide](./op-geth-setup) first. diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 6f7b7a71f..4016d8cfd 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -46,32 +46,21 @@ Before configuring your challenger, complete the following steps: ### Deploy OP Stack chain with fault proofs enabled - * L1 contracts deployed with dispute game factory - * Fault proof system active on your chain - * Access to your chain's contract addresses + * L1 contracts [deployed with dispute game factory](/operators/chain-operators/tutorials/dispute-games) * [Generate an absolute prestate](/operators/chain-operators/tutorials/absolute-prestate#generating-the-absolute-prestate) for your network version - This is critical as the challenger will refuse to interact with games if it doesn't have the matching prestate ### Set up required infrastructure access * L1 RPC endpoint (Ethereum, Sepolia, etc.) * L1 Beacon node endpoint (for blob access) - * L2 archive node with debug API enabled - * Rollup node (op-node) with historical data ### Prepare configuration files - * `rollup.json` - Rollup configuration file - * `genesis-l2.json` - L2 genesis file * `prestate.json` - The absolute prestate file generated in step 1 + * `rollup.json` - Rollup configuration file from the `op-deployer` guide + * `genesis-l2.json` - L2 genesis file from the `op-deployer` guide -### Software requirements - -* Git (for cloning repositories) -* Go 1.21+ (if building from source) -* Docker and Docker Compose (optional but recommended) -* Access to a funded Ethereum account for challenger operations - ### Finding the current stable releases To ensure you're using the latest compatible versions of OP Stack components, always check the official releases page: @@ -515,11 +504,11 @@ Consider running [`op-dispute-mon`](/operators/chain-operators/tools/chain-monit You've successfully completed the entire L2 rollup testnet tutorial! Your rollup is now fully operational with all components running: -**op-deployer** - L1 contracts deployed -**Sequencer** - Processing transactions -**Batcher** - Publishing data to L1 -**Proposer** - Submitting state roots -**Challenger** - Monitoring disputes +* **op-deployer** - L1 contracts deployed +* **Sequencer** - Processing transactions +* **Batcher** - Publishing data to L1 +* **Proposer** - Submitting state roots +* *Challenger** - Monitoring disputes ## Connect your wallet to your chain diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index ae4392e07..a01c367cd 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -31,25 +31,9 @@ Welcome to the first step of creating your own L2 rollup testnet! In this sectio There are a couple of ways to install `op-deployer`: - + - To install from source, you will need [Go](https://go.dev/doc/install), `just`, and `git`. - After installing all of that, run following: - - ```bash - - git clone https://github.com/ethereum-optimism/optimism.git # you can skip this if you already have the repo - cd optimism/op-deployer - just build - cp ./bin/op-deployer /usr/local/bin/op-deployer # or any other directory in your $PATH - - # Verify installation, run this command to verify that you have it installed. - op-deployer --version - ``` - - - - Another way to install `op-deployer`, is to download the latest release from the monorepo's [release page](https://github.com/ethereum-optimism/optimism/releases). + The recommended way to install `op-deployer`, is to download the latest release from the monorepo's [release page](https://github.com/ethereum-optimism/optimism/releases). 1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) 2. Find the latest release that includes op-deployer @@ -66,6 +50,22 @@ There are a couple of ways to install `op-deployer`: op-deployer --version ``` + + + To install from source, you will need [Go](https://go.dev/doc/install), `just`, and `git`. + After installing all of that, run following: + + ```bash + + git clone https://github.com/ethereum-optimism/optimism.git # you can skip this if you already have the repo + cd optimism/op-deployer + just build + cp ./bin/op-deployer /usr/local/bin/op-deployer # or any other directory in your $PATH + + # Verify installation, run this command to verify that you have it installed. + op-deployer --version + ``` + ## Deployment usage @@ -76,295 +76,306 @@ There are a couple of ways to install `op-deployer`: The base use case for `op-deployer` is deploying new OP Chains. This process is broken down into three steps: -### `init`: configure your chain - -To get started with `op-deployer`, create an intent file that defines your desired chain configuration. Use the built-in `op-deployer` utility to generate this file: - op-deployer uses a declarative intent file to determine how a new chain should be configured. Then, it runs through a deployment pipeline to actually deploy the chain. -```bash -op-deployer init \ - --l1-chain-id 11155111 \ - --l2-chain-ids \ - --workdir .deployer \ - --intent-type - -``` - -* Replace `` with the exact value. -* The `--workdir` flag specifies the output directory for the generated intent file and related configs. You can name this directory anything you like. - -This command will create a directory called `.deployer` in your current working directory containing the intent file and an empty `state.json` file. `state.json` is populated with the results of your deployment, and never needs to be edited directly. - -Your intent file will need to be modified to your parameters, but it will initially look something like this: - - - Do not use the default addresses in the intent for a production chain! They are generated from the `test... junk` - mnemonic. **Any funds they hold will be stolen on a live chain.** - - -```toml -deploymentStrategy = "live" -configType = "standard-overrides" -l1ChainID = 11155111# The chain ID of Sepolia (L1) you'll be deploying to. -fundDevAccounts = true# Whether or not to fund dev accounts using the test... junk mnemonic on L2. -l1ContractsLocator = "tag://op-contracts/v1.8.0-rc.4"# L1 smart contracts versions -l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts"# L2 smart contracts versions# Delete this table if you are using the shared Superchain contracts on the L1# If you are deploying your own SuperchainConfig and ProtocolVersions contracts, fill in these details -[superchainRoles] - proxyAdminOwner = "0x1eb2ffc903729a0f03966b917003800b145f56e2" - protocolVersionsOwner = "0x79add5713b383daa0a138d3c4780c7a1804a8090" - guardian = "0x7a50f00e8d05b95f98fe38d8bee366a7324dcf7e" - -# List of L2s to deploy. op-deployer can deploy multiple L2s at once -[[chains]] -# Your chain's ID, encoded as a 32-byte hex string - id = "0x00000000000000000000000000000000000000000000000000000a25406f3e60" -# Update the fee recipient contract - baseFeeVaultRecipient = "0x100f829718B5Be38013CC7b29c5c62a08D00f1ff" - l1FeeVaultRecipient = "0xbAEaf33e883068937aB4a50871f2FD52e241013A" - sequencerFeeVaultRecipient = "0xd0D5D18F0ebb07B7d728b14AAE014eedA814d6BD" - eip1559DenominatorCanyon = 250 - eip1559Denominator = 50 - eip1559Elasticity = 6 -# Various ownership roles for your chain. When you use op-deployer init, these roles are generated using the# test... junk mnemonic. You should replace these with your own addresses for production chains. - [chains.roles] - l1ProxyAdminOwner = "0xdf5a644aed1b5d6cE0DA2aDd778bc5f39d97Ac88" - l2ProxyAdminOwner = "0xC40445CD88dDa2A410F86F6eF8E00fd52D8381FD" - systemConfigOwner = "0xB32296E6929F2507dB8153A64b036D175Ac6E89e" - unsafeBlockSigner = "0xA53526b516df4eEe3791734CE85311569e0eAD78" - batcher = "0x8680d36811420359093fd321ED386a6e76BE2AF3" - proposer = "0x41b3B204099771aDf857F826015703A1030b6675" - challenger = "0x7B51A480dAeE699CA3a4F68F9AAA434452112eF7" - -``` - - - Before you can use your intent file for a deployment, you will need to update all zero values to whatever is appropriate for your chain. - For dev environments, it is ok to use all EOAs/hot-wallets. - - -**Production setup** - -In production environments, you should use a more secure setup with cold-wallet multisigs (e.g. Gnosis Safes) for the following: - -* **baseFeeVaultRecipient** -* **l1FeeVaultRecipient** -* **sequencerFeeVaultRecipient** -* **l1ProxyAdminOwner** -* **l2ProxyAdminOwner** -* **systemConfigOwner** - -HSMs (hardware security modules) are recommended for the following hot-wallets: - -* **unsafeBlockSigner** -* **batcher** -* **proposer** -* **challenger** - -### Understanding the intent.toml fields - -
- Here's an explanation of the key fields in the intent file: - - **Global configuration:** - - * `deploymentStrategy`: Used to deploy both to live chains and L1 genesis files. Valid values are `live` and `genesis`. - * `configType`: Type of configuration to use ("standard-overrides" is most common) - * `l1ChainID`: The chain ID of the L1 network you're deploying to - * `fundDevAccounts`: Whether to fund development accounts on L2 (set to false for production) - * `l1ContractsLocator`: The version of L1 contracts to deploy - * `l2ContractsLocator`: The version of L2 contracts to deploy - - **Superchain roles:** - - * `proxyAdminOwner`: Address that can upgrade Superchain-wide contracts - * `protocolVersionsOwner`: Address that can update protocol versions - * `guardian`: Address authorized to pause L1 withdrawals from contracts, blacklist dispute games, and set the respected game type in the `OptimismPortal` - - **Chain-specific configuration:** - - * `id`: Unique identifier for your chain - * `baseFeeVaultRecipient`: Address that represents the recipient of fees accumulated in the `BaseFeeVault` - * `l1FeeVaultRecipient`: Address that represents the recipient of fees accumulated in the `L1FeeVault` - * `sequencerFeeVaultRecipient`: Address that receives sequencer fees - * `eip1559DenominatorCanyon`, `eip1559Denominator`, `eip1559Elasticity`: Parameters for fee calculation + + ### `init`: configure your chain + + To get started with `op-deployer`, create an intent file that defines your desired chain configuration. Use the built-in `op-deployer` utility to generate this file: + + ```bash + op-deployer init \ + --l1-chain-id 11155111 \ + --l2-chain-ids \ + --workdir .deployer \ + --intent-type + + ``` + + * Replace `` with the exact value. + * The `--workdir` flag specifies the output directory for the generated intent file and related configs. You can name this directory anything you like. + + This command will create a directory called `.deployer` in your current working directory containing the intent file and an empty `state.json` file. `state.json` is populated with the results of your deployment, and never needs to be edited directly. + + Your intent file will need to be modified to your parameters, but it will initially look something like this: + + + Do not use the default addresses in the intent for a production chain! They are generated from the `test... junk` + mnemonic. **Any funds they hold will be stolen on a live chain.** + + + ```toml + deploymentStrategy = "live" + configType = "standard-overrides" + l1ChainID = 11155111# The chain ID of Sepolia (L1) you'll be deploying to. + fundDevAccounts = true# Whether or not to fund dev accounts using the test... junk mnemonic on L2. + l1ContractsLocator = "tag://op-contracts/v1.8.0-rc.4"# L1 smart contracts versions + l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts"# L2 smart contracts versions# Delete this table if you are using the shared Superchain contracts on the L1# If you are deploying your own SuperchainConfig and ProtocolVersions contracts, fill in these details + [superchainRoles] + proxyAdminOwner = "0x1eb2ffc903729a0f03966b917003800b145f56e2" + protocolVersionsOwner = "0x79add5713b383daa0a138d3c4780c7a1804a8090" + guardian = "0x7a50f00e8d05b95f98fe38d8bee366a7324dcf7e" + + # List of L2s to deploy. op-deployer can deploy multiple L2s at once + [[chains]] + # Your chain's ID, encoded as a 32-byte hex string + id = "0x00000000000000000000000000000000000000000000000000000a25406f3e60" + # Update the fee recipient contract + baseFeeVaultRecipient = "0x100f829718B5Be38013CC7b29c5c62a08D00f1ff" + l1FeeVaultRecipient = "0xbAEaf33e883068937aB4a50871f2FD52e241013A" + sequencerFeeVaultRecipient = "0xd0D5D18F0ebb07B7d728b14AAE014eedA814d6BD" + eip1559DenominatorCanyon = 250 + eip1559Denominator = 50 + eip1559Elasticity = 6 + # Various ownership roles for your chain. When you use op-deployer init, these roles are generated using the# test... junk mnemonic. You should replace these with your own addresses for production chains. + [chains.roles] + l1ProxyAdminOwner = "0xdf5a644aed1b5d6cE0DA2aDd778bc5f39d97Ac88" + l2ProxyAdminOwner = "0xC40445CD88dDa2A410F86F6eF8E00fd52D8381FD" + systemConfigOwner = "0xB32296E6929F2507dB8153A64b036D175Ac6E89e" + unsafeBlockSigner = "0xA53526b516df4eEe3791734CE85311569e0eAD78" + batcher = "0x8680d36811420359093fd321ED386a6e76BE2AF3" + proposer = "0x41b3B204099771aDf857F826015703A1030b6675" + challenger = "0x7B51A480dAeE699CA3a4F68F9AAA434452112eF7" + + ``` + + + Before you can use your intent file for a deployment, you will need to update all zero values to whatever is appropriate for your chain. + For dev environments, it is ok to use all EOAs/hot-wallets. + + + **Production setup** + + In production environments, you should use a more secure setup with cold-wallet multisigs (e.g. Gnosis Safes) for the following: + + * `baseFeeVaultRecipient` + * `l1FeeVaultRecipient` + * `sequencerFeeVaultRecipient` + * `l1ProxyAdminOwner` + * `l2ProxyAdminOwner` + * \`systemConfigOwn\`\` + + HSMs (hardware security modules) are recommended for the following hot-wallets: + + * `unsafeBlockSigner` + * `batcher` + * `proposer` + * `challenger` + + #### Understanding the intent.toml fields + +
+ Here's an explanation of the key fields in the intent file: + + **Global configuration:** + + * `deploymentStrategy`: Used to deploy both to live chains and L1 genesis files. Valid values are `live` and `genesis`. + * `configType`: Type of configuration to use ("standard-overrides" is most common) + * `l1ChainID`: The chain ID of the L1 network you're deploying to + * `fundDevAccounts`: Whether to fund development accounts on L2 (set to false for production) + * `l1ContractsLocator`: The version of L1 contracts to deploy + * `l2ContractsLocator`: The version of L2 contracts to deploy + + **Superchain roles:** + + * `proxyAdminOwner`: Address that can upgrade Superchain-wide contracts + * `protocolVersionsOwner`: Address that can update protocol versions + * `guardian`: Address authorized to pause L1 withdrawals from contracts, blacklist dispute games, and set the respected game type in the `OptimismPortal` + + **Chain-specific configuration:** + + * `id`: Unique identifier for your chain + * `baseFeeVaultRecipient`: Address that represents the recipient of fees accumulated in the `BaseFeeVault` + * `l1FeeVaultRecipient`: Address that represents the recipient of fees accumulated in the `L1FeeVault` + * `sequencerFeeVaultRecipient`: Address that receives sequencer fees + * `eip1559DenominatorCanyon`, `eip1559Denominator`, `eip1559Elasticity`: Parameters for fee calculation + + **Chain roles:** + + * `l1ProxyAdminOwner`: Address authorized to update the L1 Proxy Admin + * `l2ProxyAdminOwner`: Address authorized to upgrade protocol contracts via calls to the `ProxyAdmin`. This is the aliased L1 ProxyAdmin owner address. + * `systemConfigOwner`: Address authorized to change values in the `SystemConfig` contract. All configuration is stored on L1 and picked up by L2 as part of the [derivation](https://specs.optimism.io/protocol/derivation.html) of the L2 chain + * `unsafeBlockSigner`: Address which authenticates the unsafe/pre-submitted blocks for a chain at the P2P layer + * `batcher`: Address that batches transactions from L2 to L1 + * `proposer`: Address which can create and interact with [permissioned dispute games](https://specs.optimism.io/fault-proof/stage-one/bridge-integration.html#permissioned-faultdisputegame) on L1. + * `challenger`: Address Account which can interact with existing permissioned dispute games +
+ + #### Working with artifacts + + Artifacts are the outputs generated by `op-deployer` when configuring a chain deployment.\ + They typically include compiled contract binaries, deployment metadata, and chain configuration files (like genesis, or rollup).\ + These files serve as the source of truth for deploying, upgrading, or verifying an OP Stack chain. + We'll cover how to generate and retrieve artifacts later in this tutorial. + + The `artifacts-locator` parameter specifies where the contract deployment artifacts are located.\ + There are several ways to provide artifacts: - **Chain roles:** + + + To use local artifacts (recommended for production or if you're experiencing issues with remote artifacts): - * `l1ProxyAdminOwner`: Address authorized to update the L1 Proxy Admin - * `l2ProxyAdminOwner`: Address authorized to upgrade protocol contracts via calls to the `ProxyAdmin`. This is the aliased L1 ProxyAdmin owner address. - * `systemConfigOwner`: Address authorized to change values in the `SystemConfig` contract. All configuration is stored on L1 and picked up by L2 as part of the [derivation](https://specs.optimism.io/protocol/derivation.html) of the L2 chain - * `unsafeBlockSigner`: Address which authenticates the unsafe/pre-submitted blocks for a chain at the P2P layer - * `batcher`: Address that batches transactions from L2 to L1 - * `proposer`: Address which can create and interact with [permissioned dispute games](https://specs.optimism.io/fault-proof/stage-one/bridge-integration.html#permissioned-faultdisputegame) on L1. - * `challenger`: Address Account which can interact with existing permissioned dispute games -
+ 1. Clone the contracts repository: -### Working with artifacts + ```bash + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism + git checkout v1.8.0-rc.4 # Use the desired version + ``` -The `artifacts-locator` parameter specifies where the contract deployment artifacts are located. There are several ways to provide artifacts: + 2. Build the contract artifacts: -### Using local files + ```bash + cd packages/contracts-bedrock + just build + ``` -To use local artifacts (recommended for production or if you're experiencing issues with remote artifacts): + 3. Use the local path in your command, referencing the artifacts from:\ + `/packages/contracts-bedrock/forge-artifacts` + -1. Clone the contracts repository: + + For development or testing, you can try using tagged artifacts: - ```bash - git clone https://github.com/ethereum-optimism/optimism.git - cd optimism - git checkout v1.8.0-rc.4 # Use the desired version - ``` - -2. Build the contract artifacts: + ```bash + --artifacts-locator tag://op-contracts/v1.8.0-rc.4 + ``` - ```bash - cd packages/contracts-bedrock - just build - ``` + If you encounter the error `Application failed: failed to parse artifacts URL: unsupported tag`, you'll need to use the local files method described above. + If you use an invalid tag, the command will display all valid options. + +
-3. Use the local path in your command, referencing the artifacts from: - `/packages/contracts-bedrock/forge-artifacts` + #### Contract locator schemes -### Using tagged artifacts + op-deployer uses contract locators to find contract artifacts to deploy. + Locators are just URLs under the hood. + The `l1ContractsLocator` and `l2ContractsLocator` fields support several schemes for specifying where to find the contract implementations: -For development or testing, you can try using tagged artifacts: + * `tag://` - References a specific tagged release of the contracts (e.g., `tag://op-contracts/v1.8.0-rc.4`). In this case, the contracts bytecode will be downloaded from a fixed bytecode bundle on GCS. + * `file://` - Points to a directory on local disk containing the artifacts. + This is useful for local development, since you can point it at your local monorepo + e.g. `file:///packages/contracts-bedrock/forge-artifacts` + * `http://` or `https://` - Points to a target directory containing contract artifacts. The URL should directly reference the directory containing the `forge-artifacts` directory, in this case, the bytecode will be downloaded from the URL specified. -```bash ---artifacts-locator tag://op-contracts/v1.8.0-rc.4 -``` + + When using any scheme other than tag://, you must set configType to either custom or standard-overrides in your intent file. + -If you encounter the error `Application failed: failed to parse artifacts URL: unsupported tag`, you'll need to use the local files method described above, else If you use an invalid tag, the command will display all valid options. + For example: -### Contract locator schemes + ```toml + # When using tag:// scheme + configType = "standard-overrides" + l1ContractsLocator = "tag://op-contracts/v1.8.0-rc.4" + l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" -op-deployer uses contract locators to find contract artifacts to deploy. -Locators are just URLs under the hood. -The `l1ContractsLocator` and `l2ContractsLocator` fields support several schemes for specifying where to find the contract implementations: + # When using other schemes (file://, http://, https://) + configType = "custom" # or "standard-overrides" + l1ContractsLocator = "file:///path/to/local/op-contracts/v1.8.0-rc.4/forge-artifacts" + l2ContractsLocator = "" + ``` -* `tag://` - References a specific tagged release of the contracts (e.g., `tag://op-contracts/v1.8.0-rc.4`). In this case, the contracts bytecode will be downloaded from a fixed bytecode bundle on GCS. -* `file://` - Points to a directory on local disk containing the artifacts. - This is useful for local development, since you can point it at your local monorepo - e.g. `file:///packages/contracts-bedrock/forge-artifacts` -* `http://` or `https://` - Points to a target directory containing contract artifacts. The URL should directly reference the directory containing the `forge-artifacts` directory, in this case, the bytecode will be downloaded from the URL specified. + By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html?utm_source=op-docs\&utm_medium=docs). You can override these default settings by adding them to your intent file using the table below: - - When using any scheme other than tag://, you must set configType to either custom or standard-overrides in your intent file. - + ```toml + [globalDeployOverrides] + l2BlockTime = 1# 1s L2blockTime is also standard, op-deployer defaults to 2s + ``` -For example: + You can also do chain by chain configurations in the `chains` table. -```toml -# When using tag:// scheme -configType = "standard-overrides" -l1ContractsLocator = "tag://op-contracts/v1.8.0-rc.4" -l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" + ### `apply`: deploy your chain -# When using other schemes (file://, http://, https://) -configType = "custom" # or "standard-overrides" -l1ContractsLocator = "file:///path/to/local/op-contracts/v1.8.0-rc.4/forge-artifacts" -l2ContractsLocator = "" -``` + + Hardware wallets are not supported, but you can use ephemeral hot wallets since this deployer key has no privileges. + -By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html?utm_source=op-docs&utm_medium=docs). You can override these default settings by adding them to your intent file using the table below: + Now that you've created your intent file, you can apply it to your chain to deploy the L1 smart contracts: -```toml -[globalDeployOverrides] - l2BlockTime = 1# 1s L2blockTime is also standard, op-deployer defaults to 2s -``` + ```bash + op-deployer apply --workdir .deployer --l1-rpc-url --private-key + ``` -You can also do chain by chain configurations in the `chains` table. + * Replace `` with your `L1_RPC_URL` and `` with your private key -### `apply`: deploy your chain + This command will deploy the OP Stack to L1. It will deploy all L1 contracts for each L2 specified in the intent file. - - Hardware wallets are not supported, but you can use ephemeral hot wallets since this deployer key has no privileges. - + Superchain configuration will be set to the Superchain-wide defaults - i.e., your chain will be opted into the [Superchain pause](https://specs.optimism.io/protocol/superchain-config.html#pausability) and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) address as other chains on the Superchain. + You will need to specify additional arguments depending on what you're trying to do. + See below for a reference of each supported CLI arg: -Now that you've created your intent file, you can apply it to your chain to deploy the L1 smart contracts: + * Deployment targets: -```bash -op-deployer apply --workdir .deployer --l1-rpc-url --private-key -``` + The `--deployment-target` flag specifies where to deploy: -* Replace `` with your `L1_RPC_URL` and `` with your private key + * `live`(default): Deploys directly to a live L1 network. Requires `-l1-rpc-url` and `-private-key`. + * `genesis`: Generates an L1 genesis file for local testing or development. + * `calldata`: Produces calldata for multisig wallets, enabling offline deployment. + * `noop`: Performs a dry-run without actual deployment, useful for testing configurations. -This command will deploy the OP Stack to L1. It will deploy all L1 contracts for each L2 specified in the intent file. + Choose the deployment target that best fits your use case. -Superchain configuration will be set to the Superchain-wide defaults - i.e., your chain will be opted into the [Superchain pause](https://specs.optimism.io/protocol/superchain-config.html#pausability) and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) address as other chains on the Superchain. -You will need to specify additional arguments depending on what you're trying to do. -See below for a reference of each supported CLI arg: + ### `verify`: verify contract source code on block explorers -* Deployment targets: + After deploying your contracts, you can verify them on block explorers like Etherscan: - The `--deployment-target` flag specifies where to deploy: + ```bash + op-deployer verify \ + --l1-rpc-url \ + --input-file \ + --etherscan-api-key \ + --artifacts-locator + ``` - * `live`: Deploys directly to a live L1 network. Requires `-l1-rpc-url` and `-private-key`. - * `genesis`: Generates an L1 genesis file for local testing or development. - * `calldata`: Produces calldata for multisig wallets, enabling offline deployment. - * `noop`: Performs a dry-run without actual deployment, useful for testing configurations. + **Common options:** - Choose the deployment target that best fits your use case. + * `-l1-rpc-url`: RPC URL for the L1 chain + * `-etherscan-api-key`: API key for the block explorer (e.g., from Etherscan) + * `-artifacts-locator`: Path or plugin to locate contract artifacts + * `-input-file`: Path to a JSON file containing deployment data: + * Create an `input.json` file in the same directory. + * Navigate to your `state.json` file and locate the `implementationsDeployment` object. + * Copy everything inside the `implementationsDeployment` object (without the object name itself) and paste it into your new `input.json` file. -### `verify`: verify contract source code on block explorers + + You don't need to specify a `--workdir`, op-deployer will automatically look for deployment artifacts from the deploy step, unless overridden. + -After deploying your contracts, you can verify them on block explorers like Etherscan: + **Example:** -```bash -op-deployer verify \ - --l1-rpc-url \ - --input-file \ - --etherscan-api-key \ - --artifacts-locator -``` + ```bash + op-deployer verify \ + --l1-rpc-url \ + --etherscan-api-key \ + --input-file \ + --artifacts-locator + ``` -**Common options:** + ### `inspect`: generate genesis files and chain information -* `-l1-rpc-url`: RPC URL for the L1 chain -* `-etherscan-api-key`: API key for the block explorer (e.g., from Etherscan) -* `-artifacts-locator`: Path or plugin to locate contract artifacts -* `-input-file`: Path to a JSON file containing deployment data: - * Create an `input.json` file in the same directory. - * Navigate to your `state.json` file and locate the `implementationsDeployment` object. - * Copy everything inside the `implementationsDeployment` object (without the object name itself) and paste it into your new `input.json` file. - - - You don't need to specify a `--workdir`, op-deployer will automatically look for deployment artifacts from the deploy step, unless overridden. - - -**Example:** - -```bash -op-deployer verify \ - --l1-rpc-url \ - --etherscan-api-key \ - --input-file \ - --artifacts-locator -``` - -### `inspect`: generate genesis files and chain information - - - To add your chain to the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry) you will need to provide the chain artifacts. To get these chain artifacts, you will need to write the output of these commands to new files. - + + To add your chain to the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry) you will need to provide the chain artifacts. To get these chain artifacts, you will need to write the output of these commands to new files. + -Inspect the `state.json` file by navigating to your working directory. With the contracts deployed, generate the genesis and rollup configuration files by running the following commands: + Inspect the `state.json` file by navigating to your working directory. With the contracts deployed, generate the genesis and rollup configuration files by running the following commands: -```bash -op-deployer inspect genesis --workdir .deployer > .deployer/genesis.json -op-deployer inspect rollup --workdir .deployer > .deployer/rollup.json -``` + ```bash + op-deployer inspect genesis --workdir .deployer > .deployer/genesis.json + op-deployer inspect rollup --workdir .deployer > .deployer/rollup.json + ``` -Now that you have your `genesis.json` and `rollup.json` you can spin up a node on your network. You can also use the following inspect subcommands to get additional chain artifacts: + Now that you have your `genesis.json` and `rollup.json` you can spin up a node on your network. You can also use the following inspect subcommands to get additional chain artifacts: -```bash -op-deployer inspect l1 --workdir .deployer # outputs all L1 contract addresses for an L2 chain -op-deployer inspect deploy-config --workdir .deployer # outputs the deploy config for an L2 chain -op-deployer inspect l2-semvers --workdir .deployer # outputs the semvers for all L2 chains -``` + ```bash + op-deployer inspect l1 --workdir .deployer # outputs all L1 contract addresses for an L2 chain + op-deployer inspect deploy-config --workdir .deployer # outputs the deploy config for an L2 chain + op-deployer inspect l2-semvers --workdir .deployer # outputs the semvers for all L2 chains + ``` +
## What's Next? diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index d9d863f35..bbffdf796 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -18,7 +18,7 @@ import { Callout, Steps, Card, Tabs } from 'nextra/components' # Spin up sequencer -Now that you have op-deployer configured, it's time to spin up the sequencer for your rollup. This involves running both op-geth and op-node to create a functioning sequencer. +Now that you have op-deployer configured, it's time to spin up the sequencer for your rollup. This involves running both `op-geth` and `op-node` to create a functioning sequencer. **Step 2 of 5**: This tutorial builds on [Spin up op-deployer](./op-deployer-setup). Make sure you've completed that first. @@ -28,8 +28,8 @@ Now that you have op-deployer configured, it's time to spin up the sequencer for The sequencer node consists of two core components: -* **op-geth**: Execution layer that processes transactions and maintains state -* **op-node**: Consensus layer that orders transactions and creates L2 blocks +* `op-geth`: Execution layer that processes transactions and maintains state +* `op-node`: Consensus layer that orders transactions and creates L2 blocks The sequencer is responsible for: @@ -50,12 +50,12 @@ The sequencer is responsible for: To ensure you're using the latest compatible versions of OP Stack components, always check the official [release page](https://github.com/ethereum-optimism/optimism/releases). -**** +*** The main components you'll need for sequencer deployment are: -* **op-node**: Look for the latest `op-node/v*` release -* **op-geth**: Look for the latest `op-geth/v*` [release](https://github.com/ethereum-optimism/op-geth/releases) +* `op-node`: Look for the latest `op-node/v*` release +* `op-geth`: Look for the latest `op-geth/v*` [release](https://github.com/ethereum-optimism/op-geth/releases) The versions used in this guide (**op-node/v1.13.3** and **op-geth/v1.101511.1**) are verified compatible versions. @@ -287,27 +287,27 @@ In this guide Docker alternative is also provided. source .env # Path to the op-geth binary we built -../op-geth/build/bin/geth \ - --datadir=./op-geth-data \ - --http \ - --http.addr=0.0.0.0 \ - --http.port=$OP_GETH_HTTP_PORT \ - --http.vhosts="*" \ - --http.corsdomain="*" \ - --http.api=eth,net,web3,debug,txpool,admin,miner \ - --ws \ - --ws.addr=0.0.0.0 \ - --ws.port=$OP_GETH_WS_PORT \ - --ws.origins="*" \ - --ws.api=eth,net,web3,debug,txpool,admin,miner \ - --authrpc.addr=0.0.0.0 \ - --authrpc.port=$OP_GETH_AUTH_PORT \ - --authrpc.vhosts="*" \ - --authrpc.jwtsecret=$JWT_SECRET \ - --syncmode=full \ - --gcmode=archive \ - --rollup.disabletxpoolgossip=true \ - --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT + ../op-geth/build/bin/geth \ + --datadir=./op-geth-data \ + --http \ + --http.addr=0.0.0.0 \ + --http.port=$OP_GETH_HTTP_PORT \ + --http.vhosts="*" \ + --http.corsdomain="*" \ + --http.api=eth,net,web3,debug,txpool,admin,miner \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port=$OP_GETH_WS_PORT \ + --ws.origins="*" \ + --ws.api=eth,net,web3,debug,txpool,admin,miner \ + --authrpc.addr=0.0.0.0 \ + --authrpc.port=$OP_GETH_AUTH_PORT \ + --authrpc.vhosts="*" \ + --authrpc.jwtsecret=$JWT_SECRET \ + --syncmode=full \ + --gcmode=archive \ + --rollup.disabletxpoolgossip=true \ + --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT ``` ### op-node configuration for sequencer @@ -442,12 +442,12 @@ In this guide Docker alternative is also provided. 3. Get your public IP address - ```bash - # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env - curl ifconfig.me - # or - curl ipinfo.io/ip - ``` + ```bash + # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env + curl ifconfig.me + # or + curl ipinfo.io/ip + ``` **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. diff --git a/words.txt b/words.txt index 61c94a4a4..1f659eaf6 100644 --- a/words.txt +++ b/words.txt @@ -447,6 +447,7 @@ vmdebug VMDEBUG vmodule VMODULE +workdir xlarge XORI ZKPs From 5a5f579bcf1987384af6c6856da478dcab69b33d Mon Sep 17 00:00:00 2001 From: krofax Date: Thu, 28 Aug 2025 16:51:55 +0100 Subject: [PATCH 39/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- words.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/words.txt b/words.txt index 424eb2413..6f6fd5300 100644 --- a/words.txt +++ b/words.txt @@ -135,9 +135,9 @@ fdlimit FDLIMIT flashblock flashblock's -FLASHBLOCKS -Flashblocks flashblocks +Flashblocks +FLASHBLOCKS Flashbots forkable forkchoice @@ -438,8 +438,6 @@ Unichain Unprotect unsubmitted UPNP -upstreaming -VERKLE verkle VERKLE vhosts From 84302d688f2582e1ad707c97d40cfafaa9dacf21 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 29 Aug 2025 14:15:14 +0100 Subject: [PATCH 40/92] updated the instructions --- .../chain-operators/tutorials/create-l2-rollup.mdx | 8 ++++---- .../create-l2-rollup/op-deployer-setup.mdx | 13 +++++++------ .../tutorials/create-l2-rollup/op-geth-setup.mdx | 9 --------- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index c689afdfe..21762422a 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -108,6 +108,10 @@ You can either use a node provider like [Alchemy](https://www.alchemy.com/) (eas * **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) (\~2-3 ETH recommended) * **Private Keys** - You'll need 5 separate keys for different roles (we'll generate these in the first step) + + **Testnet Only**: This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. + + **Follow in Order**: Each step builds on the previous one. Start with spinning up op-deployer and complete them sequentially for the best experience. @@ -139,10 +143,6 @@ This tutorial is organized into sequential steps that build upon each other: Configure op-challenger for dispute resolution monitoring - - **Testnet Only**: This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. - - ## Ready to Start? diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index a01c367cd..6e28180f7 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -36,7 +36,7 @@ There are a couple of ways to install `op-deployer`: The recommended way to install `op-deployer`, is to download the latest release from the monorepo's [release page](https://github.com/ethereum-optimism/optimism/releases). 1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) - 2. Find the latest release that includes op-deployer + 2. Find the latest release that includes `op-deployer` 3. Under **assets**, download the binary that matches your operating system: * `op-deployer-linux-amd64` for Linux @@ -319,7 +319,7 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is Choose the deployment target that best fits your use case. - ### `verify`: verify contract source code on block explorers + {/* ### `verify`: verify contract source code on block explorers //THIS IS NO LONGER SUPPORTED After deploying your contracts, you can verify them on block explorers like Etherscan: @@ -337,7 +337,7 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is * `-etherscan-api-key`: API key for the block explorer (e.g., from Etherscan) * `-artifacts-locator`: Path or plugin to locate contract artifacts * `-input-file`: Path to a JSON file containing deployment data: - * Create an `input.json` file in the same directory. + * Create an `input.json` file in the same directory(`./deployer`). * Navigate to your `state.json` file and locate the `implementationsDeployment` object. * Copy everything inside the `implementationsDeployment` object (without the object name itself) and paste it into your new `input.json` file. @@ -353,7 +353,7 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is --etherscan-api-key \ --input-file \ --artifacts-locator - ``` + ``` */} ### `inspect`: generate genesis files and chain information @@ -379,10 +379,11 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is ## What's Next? -Great! You've completed the setup and have op-deployer installed and ready. Since op-deployer handles L1 smart contract deployment automatically, you can now move on to setting up the execution layer. +Great! You now have `op-deployer` installed and ready to use. +Since op-deployer handles L1 smart contract deployment automatically, you can now move on to spin up the sequencer for your rollup. - **Next**: Set up and run op-geth and op-node, the execution and consensus layers for your rollup. + **Next**: Set up op-geth and op-node, essential building blocks of the execution and consensus layers in your rollup. *** diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index bbffdf796..8a223ec1b 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -37,15 +37,6 @@ The sequencer is responsible for: * Building L2 blocks * Signing blocks on the P2P network -## Prerequisites - -### Software requirements - -* Git (for cloning repositories) -* Go 1.21+ (if building from source) -* Docker and Docker Compose (optional but recommended) -* OpenSSL for JWT secret generation - ### Finding the current stable releases To ensure you're using the latest compatible versions of OP Stack components, always check the official [release page](https://github.com/ethereum-optimism/optimism/releases). From 95df5531afcd13c09750aa6421ac1a6be766e20c Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 29 Aug 2025 14:18:52 +0100 Subject: [PATCH 41/92] updated the versions --- .../tutorials/create-l2-rollup/op-geth-setup.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 8a223ec1b..4064692da 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -49,9 +49,9 @@ The main components you'll need for sequencer deployment are: * `op-geth`: Look for the latest `op-geth/v*` [release](https://github.com/ethereum-optimism/op-geth/releases) - The versions used in this guide (**op-node/v1.13.3** and **op-geth/v1.101511.1**) are verified compatible versions. + The versions used in this guide (**op-node/v1.13.5** and **op-geth/v1.101511.1**) are verified compatible versions. - According to the **op-node v1.13.3** [release notes](https://github.com/ethereum-optimism/optimism/releases), this op-node version specifically corresponds to **op-geth v1.101511.1**. + According to the **op-node v1.13.5** [release notes](https://github.com/ethereum-optimism/optimism/releases), this op-node version specifically corresponds to **op-geth v1.101511.1**. Always check the release notes to ensure you're using compatible versions. @@ -481,7 +481,7 @@ In this guide Docker alternative is also provided. - "--authrpc.vhosts=*" op-node: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.5 depends_on: - op-geth volumes: From 0d49d5f222f68a2341de755653f7a66e31e975f8 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 29 Aug 2025 14:36:47 +0100 Subject: [PATCH 42/92] Added steps --- .../tutorials/create-l2-rollup.mdx | 3 +++ .../create-l2-rollup/op-geth-setup.mdx | 18 +++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index 21762422a..46d291238 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -107,6 +107,9 @@ You can either use a node provider like [Alchemy](https://www.alchemy.com/) (eas * **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) (\~2-3 ETH recommended) * **Private Keys** - You'll need 5 separate keys for different roles (we'll generate these in the first step) +* **L1 RPC URL** - An RPC endpoint to connect to the Sepolia network. You can get this from node providers like [Alchemy](https://www.alchemy.com/), [Infura](https://www.infura.io/). This is required so `op-deployer` and other services can read from and send transactions to L1. +* **L1 Beacon URL** - A consensus-layer endpoint for Sepolia. This comes from your node provider or your own beacon node. It allows components like `op-node` to verify the L1 chain’s consensus state. + **Testnet Only**: This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 4064692da..07252357f 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -392,9 +392,11 @@ In this guide Docker alternative is also provided. + + If you prefer containerized deployment, you can use the official Docker images, and do the following: - 1. **Set up directory structure and copy configuration files:** + ### Set up directory structure and copy configuration files ```bash # Create your sequencer working directory @@ -411,7 +413,7 @@ In this guide Docker alternative is also provided. chmod 600 jwt.txt ``` - 2. **Create environment variables file:** + ### Create environment variables file ```bash # Create .env file with your actual values @@ -431,7 +433,7 @@ In this guide Docker alternative is also provided. EOF ``` - 3. Get your public IP address + ### Get your public IP address ```bash # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env @@ -442,7 +444,7 @@ In this guide Docker alternative is also provided. **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. - 4. Create a docker-compose.yml file: + ### Create a docker-compose.yml file: ```yaml version: '3.8' @@ -520,7 +522,7 @@ In this guide Docker alternative is also provided. - "--log.format=json" ``` - 5. **Initialize op-geth with Docker:** + ### Initialize op-geth with Docker ```bash # Make sure you're in the sequencer-node directory with all files copied @@ -534,7 +536,7 @@ In this guide Docker alternative is also provided. init --datadir=./op-geth-data --state.scheme=hash ./genesis.json ``` - 6. **Start the services:** + ### Start the services ```bash # Start both services @@ -544,7 +546,7 @@ In this guide Docker alternative is also provided. docker-compose logs -f ``` - 7. **Final directory structure:** + ### Final directory structure ```bash ~/sequencer-node/ @@ -559,7 +561,9 @@ In this guide Docker alternative is also provided. ``` Your sequencer node is now operational and ready to process transactions. + + ## What's Next? From fdcc0bc61b3514ae551fbcd0c28eb23bd9afcda1 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 29 Aug 2025 14:37:02 +0100 Subject: [PATCH 43/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../tutorials/create-l2-rollup.mdx | 49 +++++++++---------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index 46d291238..ba78df2a1 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -53,43 +53,41 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with: ### Notes on specific dependencies -Expand each dependency below for details + Expand each dependency below for details
-node - -We recommend using the latest LTS version of Node.js (currently v20). -[`nvm`](https://github.com/nvm-sh/nvm) is a useful tool that can help you manage multiple versions of Node.js on your machine. -You may experience unexpected errors on older versions of Node.js. + node + We recommend using the latest LTS version of Node.js (currently v20).\ + [`nvm`](https://github.com/nvm-sh/nvm) is a useful tool that can help you manage multiple versions of Node.js on your machine.\ + You may experience unexpected errors on older versions of Node.js.
-foundry - -It's recommended to use the scripts in the monorepo's `package.json` for managing `foundry` to ensure you're always working with the correct version. -This approach simplifies the installation, update, and version checking process. -Make sure to clone the monorepo locally before proceeding. + foundry + It's recommended to use the scripts in the monorepo's `package.json` for managing `foundry` to ensure you're always working with the correct version.\ + This approach simplifies the installation, update, and version checking process.\ + Make sure to clone the monorepo locally before proceeding.
-direnv + direnv -Parts of this tutorial use [`direnv`](https://direnv.net) as a way of loading environment variables from `.envrc` files into your shell. -This means you won't have to manually export environment variables every time you want to use them. -`direnv` only ever has access to files that you explicitly allow it to see. + Parts of this tutorial use [`direnv`](https://direnv.net) as a way of loading environment variables from `.envrc` files into your shell.\ + This means you won't have to manually export environment variables every time you want to use them.\ + `direnv` only ever has access to files that you explicitly allow it to see. -After [installing `direnv`](https://direnv.net/docs/installation.html), you will need to **make sure that [`direnv` is hooked into your shell](https://direnv.net/docs/hook.html)**. -Make sure you've followed [the guide on the `direnv` website](https://direnv.net/docs/hook.html), then **close your terminal and reopen it** so that the changes take effect (or `source` your config file if you know how to do that). - - -Make sure that you have correctly hooked `direnv` into your shell by modifying your shell configuration file (like `~/.bashrc` or `~/.zshrc`). -If you haven't edited a config file then you probably haven't configured `direnv` properly (and things might not work later). - + After [installing `direnv`](https://direnv.net/docs/installation.html), you will need to **make sure that [`direnv` is hooked into your shell](https://direnv.net/docs/hook.html)**.\ + Make sure you've followed [the guide on the `direnv` website](https://direnv.net/docs/hook.html), then **close your terminal and reopen it** so that the changes take effect (or `source` your config file if you know how to do that). + + Make sure that you have correctly hooked `direnv` into your shell by modifying your shell configuration file (like `~/.bashrc` or `~/.zshrc`).\ + If you haven't edited a config file then you probably haven't configured `direnv` properly (and things might not work later). +
+ ### Get access to a sepolia node You'll be deploying a OP Stack Rollup chain that uses a Layer 1 blockchain to host and order transaction data. @@ -107,9 +105,8 @@ You can either use a node provider like [Alchemy](https://www.alchemy.com/) (eas * **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) (\~2-3 ETH recommended) * **Private Keys** - You'll need 5 separate keys for different roles (we'll generate these in the first step) -* **L1 RPC URL** - An RPC endpoint to connect to the Sepolia network. You can get this from node providers like [Alchemy](https://www.alchemy.com/), [Infura](https://www.infura.io/). This is required so `op-deployer` and other services can read from and send transactions to L1. -* **L1 Beacon URL** - A consensus-layer endpoint for Sepolia. This comes from your node provider or your own beacon node. It allows components like `op-node` to verify the L1 chain’s consensus state. - +* **L1 RPC URL** - An RPC endpoint to connect to the Sepolia network. You can get this from node providers like [Alchemy](https://www.alchemy.com/), [Infura](https://www.infura.io/). This is required so `op-deployer` and other services can read from and send transactions to L1. +* **L1 Beacon URL** - A consensus-layer endpoint for Sepolia. This comes from your node provider or your own beacon node. It allows components like `op-node` to verify the L1 chain's consensus state. **Testnet Only**: This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. @@ -119,7 +116,6 @@ You can either use a node provider like [Alchemy](https://www.alchemy.com/) (eas **Follow in Order**: Each step builds on the previous one. Start with spinning up op-deployer and complete them sequentially for the best experience. - ## Tutorial Overview This tutorial is organized into sequential steps that build upon each other: @@ -146,7 +142,6 @@ This tutorial is organized into sequential steps that build upon each other: Configure op-challenger for dispute resolution monitoring - ## Ready to Start? Now that you understand what you'll be building, let's begin with the first step! From 4eac10fa58fb68d9da8072dffc6ac8a71fdef313 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 29 Aug 2025 15:58:23 +0100 Subject: [PATCH 44/92] updated the instructions --- .../create-l2-rollup/op-batcher-setup.mdx | 68 ++-- .../create-l2-rollup/op-geth-setup.mdx | 351 +++++++++--------- 2 files changed, 212 insertions(+), 207 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index 237b48a8b..67aefe0cd 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -20,7 +20,7 @@ import { Callout, Steps, Card, Tabs } from 'nextra/components' # Spin up batcher -After you have spun up your sequencer, you need to configure a batcher to submit L2 transaction batches to L1. The batcher is a critical component that ensures L2 transaction data is available on L1 for data availability and enables users to reconstruct the L2 state. +After you have spun up your sequencer, you need to configure a batcher to submit L2 transaction batches to L1. **Step 3 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the [previous one](/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup). @@ -68,39 +68,9 @@ Look for the latest `op-batcher/v*` release that's compatible with your sequence For setting up the batcher, we recommend building from source as it provides better control and helps with debugging. Docker alternative is also provided. - - - Building from source gives you full control over the binaries and is the preferred approach for this guide. - - - ### Clone and build op-batcher - - ```bash - # If you don't already have the optimism repository from the sequencer setup - git clone https://github.com/ethereum-optimism/optimism.git - cd optimism - - # Checkout the latest release tag - git checkout op-batcher/v1.13.2 - - # Build op-batcher - cd op-batcher - just - - # Binary will be available at ./bin/op-batcher - ``` - - ### Verify installation - - Run this command to verify the installation: + - ```bash - ./bin/op-batcher --version - ``` - - - - + If you prefer containerized deployment, you can use the official Docker images and do the following: @@ -229,6 +199,38 @@ For setting up the batcher, we recommend building from source as it provides bet Your batcher is now operational and will continuously submit L2 transaction batches to L1! + + + Building from source gives you full control over the binaries and is the preferred approach for this guide. + + + ### Clone and build op-batcher + + ```bash + # If you don't already have the optimism repository from the sequencer setup + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism + + # Checkout the latest release tag + git checkout op-batcher/v1.13.2 + + # Build op-batcher + cd op-batcher + just + + # Binary will be available at ./bin/op-batcher + ``` + + ### Verify installation + + Run this command to verify the installation: + + ```bash + ./bin/op-batcher --version + ``` + + + ## Configuration setup diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 07252357f..5eb2e8078 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -60,7 +60,183 @@ The main components you'll need for sequencer deployment are: For spinning up a sequencer, we recommend building from source as it provides better control, and helps with debugging. In this guide Docker alternative is also provided. - + + + + + + If you prefer containerized deployment, you can use the official Docker images, and do the following: + + ### Set up directory structure and copy configuration files + + ```bash + # Create your sequencer working directory + mkdir ~/sequencer-node + cd ~/sequencer-node + + # Copy configuration files from op-deployer output + # Note: Adjust the path if your .deployer directory is located elsewhere + cp ~/.deployer/genesis.json . + cp ~/.deployer/rollup.json . + + # Generate JWT secret + openssl rand -hex 32 > jwt.txt + chmod 600 jwt.txt + ``` + + ### Create environment variables file + + ```bash + # Create .env file with your actual values + cat > .env << 'EOF' + # L1 Configuration - Replace with your actual RPC URLs + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com + + # Private keys - Replace with your actual private key + PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + + # (Run `curl ifconfig.me` in a separate shell to obtain the value, then paste it below) + + # P2P configuration - Replace with your actual public IP + P2P_ADVERTISE_IP=YOUR_ACTUAL_PUBLIC_IP + + EOF + ``` + + ### Get your public IP address + + ```bash + # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env + curl ifconfig.me + # or + curl ipinfo.io/ip + ``` + + **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. + + ### Make sure your docker application is running + Create a `docker-compose.yml` file + + ```yaml + version: '3.8' + + services: + op-geth: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.1 + volumes: + # Mount entire directory to avoid file mounting issues + - .:/workspace + working_dir: /workspace + ports: + - "8545:8545" + - "8546:8546" + - "8551:8551" + command: + - "--datadir=/workspace/op-geth-data" + - "--http" + - "--http.addr=0.0.0.0" + - "--http.port=8545" + - "--ws" + - "--ws.addr=0.0.0.0" + - "--ws.port=8546" + - "--authrpc.addr=0.0.0.0" + - "--authrpc.port=8551" + - "--authrpc.jwtsecret=/workspace/jwt.txt" + - "--syncmode=full" + - "--gcmode=archive" + - "--rollup.disabletxpoolgossip=true" + - "--rollup.sequencerhttp=http://op-node:8547" + - "--http.vhosts=*" + - "--http.corsdomain=*" + - "--http.api=eth,net,web3,debug,txpool,admin" + - "--ws.origins=*" + - "--ws.api=eth,net,web3,debug,txpool,admin" + - "--authrpc.vhosts=*" + + op-node: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.5 + depends_on: + - op-geth + volumes: + - .:/workspace + working_dir: /workspace + ports: + - "8547:8547" + - "9222:9222" + environment: + - L1_RPC_URL=${L1_RPC_URL} + - L1_BEACON_URL=${L1_BEACON_URL} + - PRIVATE_KEY=${PRIVATE_KEY} + - P2P_ADVERTISE_IP=${P2P_ADVERTISE_IP} + command: + - "op-node" + - "--l1=${L1_RPC_URL}" + - "--l1.beacon=${L1_BEACON_URL}" + - "--l2=http://op-geth:8551" + - "--l2.jwt-secret=/workspace/jwt.txt" + - "--rollup.config=/workspace/rollup.json" + - "--sequencer.enabled=true" + - "--sequencer.stopped=false" + - "--sequencer.max-safe-lag=3600" + - "--verifier.l1-confs=4" + - "--p2p.listen.ip=0.0.0.0" + - "--p2p.listen.tcp=9222" + - "--p2p.listen.udp=9222" + - "--p2p.advertise.ip=${P2P_ADVERTISE_IP}" + - "--p2p.advertise.tcp=9222" + - "--p2p.advertise.udp=9222" + - "--p2p.sequencer.key=${PRIVATE_KEY}" + - "--rpc.addr=0.0.0.0" + - "--rpc.port=8547" + - "--rpc.enable-admin" + - "--log.level=info" + - "--log.format=json" + ``` + + ### Initialize op-geth with Docker + + ```bash + # Make sure you're in the sequencer-node directory with all files copied + cd ~/sequencer-node + + # Initialize op-geth using Docker + docker run --rm \ + -v $(pwd):/workspace \ + -w /workspace \ + us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.1 \ + init --datadir=./op-geth-data --state.scheme=hash ./genesis.json + ``` + + ### Start the services + + ```bash + # Start both services + docker-compose up -d + + # View logs + docker-compose logs -f + ``` + + ### Final directory structure + + ```bash + ~/sequencer-node/ + ├── jwt.txt # Generated JWT secret + ├── genesis.json # Copied from ~/.deployer/ + ├── rollup.json # Copied from ~/.deployer/ + ├── .env # Environment variables + ├── docker-compose.yml # Docker configuration + └── op-geth-data/ # Created by Docker during initialization + ├── geth/ # Geth data + └── keystore/ # Key files + ``` + + Your sequencer node is now operational and ready to process transactions. + + + + Building from source gives you full control over the binaries and is the preferred approach for this guide. @@ -391,179 +567,6 @@ In this guide Docker alternative is also provided. Your sequencer node is now operational and ready to process transactions. - - - - If you prefer containerized deployment, you can use the official Docker images, and do the following: - - ### Set up directory structure and copy configuration files - - ```bash - # Create your sequencer working directory - mkdir ~/sequencer-node - cd ~/sequencer-node - - # Copy configuration files from op-deployer output - # Note: Adjust the path if your .deployer directory is located elsewhere - cp ~/.deployer/genesis.json . - cp ~/.deployer/rollup.json . - - # Generate JWT secret - openssl rand -hex 32 > jwt.txt - chmod 600 jwt.txt - ``` - - ### Create environment variables file - - ```bash - # Create .env file with your actual values - cat > .env << 'EOF' - # L1 Configuration - Replace with your actual RPC URLs - L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY - L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com - - # Private keys - Replace with your actual private key - PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY - - # (Run `curl ifconfig.me` in a separate shell to obtain the value, then paste it below) - - # P2P configuration - Replace with your actual public IP - P2P_ADVERTISE_IP=YOUR_ACTUAL_PUBLIC_IP - - EOF - ``` - - ### Get your public IP address - - ```bash - # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env - curl ifconfig.me - # or - curl ipinfo.io/ip - ``` - - **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. - - ### Create a docker-compose.yml file: - - ```yaml - version: '3.8' - - services: - op-geth: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.1 - volumes: - # Mount entire directory to avoid file mounting issues - - .:/workspace - working_dir: /workspace - ports: - - "8545:8545" - - "8546:8546" - - "8551:8551" - command: - - "--datadir=/workspace/op-geth-data" - - "--http" - - "--http.addr=0.0.0.0" - - "--http.port=8545" - - "--ws" - - "--ws.addr=0.0.0.0" - - "--ws.port=8546" - - "--authrpc.addr=0.0.0.0" - - "--authrpc.port=8551" - - "--authrpc.jwtsecret=/workspace/jwt.txt" - - "--syncmode=full" - - "--gcmode=archive" - - "--rollup.disabletxpoolgossip=true" - - "--rollup.sequencerhttp=http://op-node:8547" - - "--http.vhosts=*" - - "--http.corsdomain=*" - - "--http.api=eth,net,web3,debug,txpool,admin" - - "--ws.origins=*" - - "--ws.api=eth,net,web3,debug,txpool,admin" - - "--authrpc.vhosts=*" - - op-node: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.5 - depends_on: - - op-geth - volumes: - - .:/workspace - working_dir: /workspace - ports: - - "8547:8547" - - "9222:9222" - environment: - - L1_RPC_URL=${L1_RPC_URL} - - L1_BEACON_URL=${L1_BEACON_URL} - - PRIVATE_KEY=${PRIVATE_KEY} - - P2P_ADVERTISE_IP=${P2P_ADVERTISE_IP} - command: - - "op-node" - - "--l1=${L1_RPC_URL}" - - "--l1.beacon=${L1_BEACON_URL}" - - "--l2=http://op-geth:8551" - - "--l2.jwt-secret=/workspace/jwt.txt" - - "--rollup.config=/workspace/rollup.json" - - "--sequencer.enabled=true" - - "--sequencer.stopped=false" - - "--sequencer.max-safe-lag=3600" - - "--verifier.l1-confs=4" - - "--p2p.listen.ip=0.0.0.0" - - "--p2p.listen.tcp=9222" - - "--p2p.listen.udp=9222" - - "--p2p.advertise.ip=${P2P_ADVERTISE_IP}" - - "--p2p.advertise.tcp=9222" - - "--p2p.advertise.udp=9222" - - "--p2p.sequencer.key=${PRIVATE_KEY}" - - "--rpc.addr=0.0.0.0" - - "--rpc.port=8547" - - "--rpc.enable-admin" - - "--log.level=info" - - "--log.format=json" - ``` - - ### Initialize op-geth with Docker - - ```bash - # Make sure you're in the sequencer-node directory with all files copied - cd ~/sequencer-node - - # Initialize op-geth using Docker - docker run --rm \ - -v $(pwd):/workspace \ - -w /workspace \ - us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.1 \ - init --datadir=./op-geth-data --state.scheme=hash ./genesis.json - ``` - - ### Start the services - - ```bash - # Start both services - docker-compose up -d - - # View logs - docker-compose logs -f - ``` - - ### Final directory structure - - ```bash - ~/sequencer-node/ - ├── jwt.txt # Generated JWT secret - ├── genesis.json # Copied from ~/.deployer/ - ├── rollup.json # Copied from ~/.deployer/ - ├── .env # Environment variables - ├── docker-compose.yml # Docker configuration - └── op-geth-data/ # Created by Docker during initialization - ├── geth/ # Geth data - └── keystore/ # Key files - ``` - - Your sequencer node is now operational and ready to process transactions. - - - ## What's Next? From 1147a0a8a5456fc0bffbfbe25adf2e30ec669451 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 3 Sep 2025 20:47:29 +0100 Subject: [PATCH 45/92] Refactor L2 Rollup tutorials: streamline Sepolia node instructions, enhance op-deployer setup with artifact handling details, and remove redundant content. --- .../tutorials/create-l2-rollup.mdx | 8 -- .../create-l2-rollup/op-challenger-setup.mdx | 2 +- .../create-l2-rollup/op-deployer-setup.mdx | 95 +++++++++---------- 3 files changed, 47 insertions(+), 58 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index c689afdfe..8fa745e14 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -92,14 +92,6 @@ If you haven't edited a config file then you probably haven't configured `direnv
### Get access to a sepolia node -You'll be deploying a OP Stack Rollup chain that uses a Layer 1 blockchain to host and order transaction data. -The OP Stack Rollups were designed to use EVM Equivalent blockchains like Ethereum, OP Mainnet, or standard Ethereum testnets as their L1 chains. - -**This guide uses the Sepolia testnet as an L1 chain**. -We recommend that you also use Sepolia. -You can also use other EVM-compatible blockchains, but you may run into unexpected errors. -If you want to use an alternative network, make sure to carefully review each command and replace any Sepolia-specific values with the values for your network. - Since you're deploying your OP Stack chain to Sepolia, you'll need to have access to a Sepolia node. You can either use a node provider like [Alchemy](https://www.alchemy.com/) (easier) or run your own Sepolia node (harder). diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index a6f44f376..b258992b9 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -79,7 +79,7 @@ For challenger deployment, you can either build from source (recommended for bet ### Build and Configure - Building from source gives you full control over the binaries and is the preferred approach for production deployments. + Building from source gives you full control over the binaries. **Clone and build op-challenger** diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index a01c367cd..1494fab3a 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -65,6 +65,51 @@ There are a couple of ways to install `op-deployer`: # Verify installation, run this command to verify that you have it installed. op-deployer --version ``` + + #### Working with artifacts + + When building from source, you'll need to work with contract artifacts. These are the outputs generated by `op-deployer` when configuring a chain deployment. + They typically include compiled contract binaries, deployment metadata, and chain configuration files (like genesis, or rollup).\ + These files serve as the source of truth for deploying, upgrading, or verifying an OP Stack chain. + We'll cover how to generate and retrieve artifacts later in this tutorial. + + The `artifacts-locator` parameter specifies where the contract deployment artifacts are located. + There are several ways to provide artifacts: + + + + To use local artifacts (recommended for production or if you're experiencing issues with remote artifacts): + + 1. Clone the contracts repository: + + ```bash + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism + git checkout v1.8.0-rc.4 # Use the desired version + ``` + + 2. Build the contract artifacts: + + ```bash + cd packages/contracts-bedrock + just build + ``` + + 3. Use the local path in your command, referencing the artifacts from:\ + `/packages/contracts-bedrock/forge-artifacts` + + + + For development or testing, you can try using tagged artifacts: + + ```bash + --artifacts-locator tag://op-contracts/v1.8.0-rc.4 + ``` + + If you encounter the error `Application failed: failed to parse artifacts URL: unsupported tag`, you'll need to use the local files method described above. + If you use an invalid tag, the command will display all valid options. + +
@@ -154,8 +199,6 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is * `baseFeeVaultRecipient` * `l1FeeVaultRecipient` * `sequencerFeeVaultRecipient` - * `l1ProxyAdminOwner` - * `l2ProxyAdminOwner` * \`systemConfigOwn\`\` HSMs (hardware security modules) are recommended for the following hot-wallets: @@ -163,7 +206,6 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is * `unsafeBlockSigner` * `batcher` * `proposer` - * `challenger` #### Understanding the intent.toml fields @@ -204,51 +246,6 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is * `challenger`: Address Account which can interact with existing permissioned dispute games - #### Working with artifacts - - Artifacts are the outputs generated by `op-deployer` when configuring a chain deployment.\ - They typically include compiled contract binaries, deployment metadata, and chain configuration files (like genesis, or rollup).\ - These files serve as the source of truth for deploying, upgrading, or verifying an OP Stack chain. - We'll cover how to generate and retrieve artifacts later in this tutorial. - - The `artifacts-locator` parameter specifies where the contract deployment artifacts are located.\ - There are several ways to provide artifacts: - - - - To use local artifacts (recommended for production or if you're experiencing issues with remote artifacts): - - 1. Clone the contracts repository: - - ```bash - git clone https://github.com/ethereum-optimism/optimism.git - cd optimism - git checkout v1.8.0-rc.4 # Use the desired version - ``` - - 2. Build the contract artifacts: - - ```bash - cd packages/contracts-bedrock - just build - ``` - - 3. Use the local path in your command, referencing the artifacts from:\ - `/packages/contracts-bedrock/forge-artifacts` - - - - For development or testing, you can try using tagged artifacts: - - ```bash - --artifacts-locator tag://op-contracts/v1.8.0-rc.4 - ``` - - If you encounter the error `Application failed: failed to parse artifacts URL: unsupported tag`, you'll need to use the local files method described above. - If you use an invalid tag, the command will display all valid options. - - - #### Contract locator schemes op-deployer uses contract locators to find contract artifacts to deploy. @@ -391,4 +388,4 @@ Great! You've completed the setup and have op-deployer installed and ready. Sinc * **Community Support**: Join the [Optimism Discord](https://discord.gg/optimism) * **op-deployer Repository**: [GitHub](https://github.com/ethereum-optimism/optimism/tree/develop/op-deployer/cmd/op-deployer) -* **OPCM Documentation**: [OP Contracts Manager](/stack/opcm) +* **OPCM Documentation**: [OP Contracts Manager](/stack/opcm) \ No newline at end of file From a8bb3390216db111bbade116d87cc2094d2a4b0a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 3 Sep 2025 20:56:43 +0100 Subject: [PATCH 46/92] Refactor L2 Rollup tutorials: update recommendations for building from source and using Docker, enhance clarity on contract locator schemes, and standardize environment variable configurations. --- .../chain-operators/deploy/sequencer-node.mdx | 2 +- .../create-l2-rollup/op-batcher-setup.mdx | 10 +- .../create-l2-rollup/op-challenger-setup.mdx | 12 +-- .../create-l2-rollup/op-deployer-setup.mdx | 97 ++++++------------- .../create-l2-rollup/op-geth-setup.mdx | 13 +-- .../create-l2-rollup/op-proposer-setup.mdx | 10 +- 6 files changed, 47 insertions(+), 97 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 5f3d75e74..b99af0f06 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -92,7 +92,7 @@ In this guide Docker alternative is also provided. - Building from source gives you full control over the binaries and is the preferred approach for this guide. + Building from source gives you full control over the binaries. #### 1. Clone and build op-node diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index 67aefe0cd..d24506747 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -66,9 +66,9 @@ Look for the latest `op-batcher/v*` release that's compatible with your sequence Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information.
-For setting up the batcher, we recommend building from source as it provides better control and helps with debugging. Docker alternative is also provided. +For setting up the batcher, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available for more advanced users. - + If you prefer containerized deployment, you can use the official Docker images and do the following: @@ -201,7 +201,7 @@ For setting up the batcher, we recommend building from source as it provides bet - Building from source gives you full control over the binaries and is the preferred approach for this guide. + Building from source gives you full control over the binaries. ### Clone and build op-batcher @@ -301,8 +301,8 @@ For setting up the batcher, we recommend building from source as it provides bet L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY # L2 Configuration - Should match your sequencer setup - L2_RPC_URL=http://localhost:8545 - ROLLUP_RPC_URL=http://localhost:8547 + L2_RPC_URL=http://op-geth:8545 + ROLLUP_RPC_URL=http://op-node:8547 # Contract addresses - Extract from your op-deployer output BATCH_INBOX_ADDRESS=YOUR_ACTUAL_BATCH_INBOX_ADDRESS diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index b258992b9..e1e0c2c7f 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -73,9 +73,9 @@ Always check the release notes to ensure you're using compatible versions with y ## Software installation -For challenger deployment, you can either build from source (recommended for better control and debugging) or use Docker for a containerized setup. +For challenger deployment, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available for more advanced users. - + ### Build and Configure @@ -176,8 +176,8 @@ For challenger deployment, you can either build from source (recommended for bet L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY # L2 Configuration - Replace with your actual node endpoints - L2_RPC_URL=http://localhost:8545 - ROLLUP_RPC_URL=http://localhost:8547 + L2_RPC_URL=http://op-geth:8545 + ROLLUP_RPC_URL=http://op-node:8547 L1_BEACON=http://sepolia-cl-1:5051 # Wallet configuration - Choose either mnemonic + HD path OR private key @@ -388,8 +388,8 @@ For challenger deployment, you can either build from source (recommended for bet L1_BEACON=http://sepolia-cl-1:5051 # L2 Configuration - Replace with your actual node endpoints - L2_RPC_URL=http://localhost:8545 - ROLLUP_RPC_URL=http://localhost:8547 + L2_RPC_URL=http://op-geth:8545 + ROLLUP_RPC_URL=http://op-node:8547 # Wallet configuration - Choose either mnemonic + HD path OR private key MNEMONIC="test test test test test test test test test test test junk" diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index b44013755..a79d7808f 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -56,7 +56,6 @@ There are a couple of ways to install `op-deployer`: After installing all of that, run following: ```bash - git clone https://github.com/ethereum-optimism/optimism.git # you can skip this if you already have the repo cd optimism/op-deployer just build @@ -110,6 +109,34 @@ There are a couple of ways to install `op-deployer`: If you use an invalid tag, the command will display all valid options. + + #### Contract locator schemes + + When building from source, you'll need to understand contract locators. These are used to find contract artifacts for deployment. + The `l1ContractsLocator` and `l2ContractsLocator` fields in your intent file support several URL schemes: + + * `tag://` - References a specific tagged release (e.g., `tag://op-contracts/v1.8.0-rc.4`). Downloads bytecode from a fixed bundle on GCS. + * `file://` - Points to local artifacts directory, useful when building from source. + Example: `file:///packages/contracts-bedrock/forge-artifacts` + * `http://` or `https://` - Points to a remote artifacts directory containing `forge-artifacts`. + + + When using `file://`, `http://`, or `https://` schemes, set `configType` to either `custom` or `standard-overrides` in your intent file. + + + For example: + + ```toml + # When using tag:// scheme (recommended for binary installation) + configType = "standard-overrides" + l1ContractsLocator = "tag://op-contracts/v1.8.0-rc.4" + l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" + + # When building from source (using file://, http://, https://) + configType = "custom" # or "standard-overrides" + l1ContractsLocator = "file:///path/to/local/op-contracts/v1.8.0-rc.4/forge-artifacts" + l2ContractsLocator = "" + ``` @@ -137,7 +164,6 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is --l2-chain-ids \ --workdir .deployer \ --intent-type - ``` * Replace `` with the exact value. @@ -184,7 +210,6 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is batcher = "0x8680d36811420359093fd321ED386a6e76BE2AF3" proposer = "0x41b3B204099771aDf857F826015703A1030b6675" challenger = "0x7B51A480dAeE699CA3a4F68F9AAA434452112eF7" - ``` @@ -246,36 +271,6 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is * `challenger`: Address Account which can interact with existing permissioned dispute games - #### Contract locator schemes - - op-deployer uses contract locators to find contract artifacts to deploy. - Locators are just URLs under the hood. - The `l1ContractsLocator` and `l2ContractsLocator` fields support several schemes for specifying where to find the contract implementations: - - * `tag://` - References a specific tagged release of the contracts (e.g., `tag://op-contracts/v1.8.0-rc.4`). In this case, the contracts bytecode will be downloaded from a fixed bytecode bundle on GCS. - * `file://` - Points to a directory on local disk containing the artifacts. - This is useful for local development, since you can point it at your local monorepo - e.g. `file:///packages/contracts-bedrock/forge-artifacts` - * `http://` or `https://` - Points to a target directory containing contract artifacts. The URL should directly reference the directory containing the `forge-artifacts` directory, in this case, the bytecode will be downloaded from the URL specified. - - - When using any scheme other than tag://, you must set configType to either custom or standard-overrides in your intent file. - - - For example: - - ```toml - # When using tag:// scheme - configType = "standard-overrides" - l1ContractsLocator = "tag://op-contracts/v1.8.0-rc.4" - l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" - - # When using other schemes (file://, http://, https://) - configType = "custom" # or "standard-overrides" - l1ContractsLocator = "file:///path/to/local/op-contracts/v1.8.0-rc.4/forge-artifacts" - l2ContractsLocator = "" - ``` - By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html?utm_source=op-docs\&utm_medium=docs). You can override these default settings by adding them to your intent file using the table below: ```toml @@ -316,42 +311,6 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is Choose the deployment target that best fits your use case. - {/* ### `verify`: verify contract source code on block explorers //THIS IS NO LONGER SUPPORTED - - After deploying your contracts, you can verify them on block explorers like Etherscan: - - ```bash - op-deployer verify \ - --l1-rpc-url \ - --input-file \ - --etherscan-api-key \ - --artifacts-locator - ``` - - **Common options:** - - * `-l1-rpc-url`: RPC URL for the L1 chain - * `-etherscan-api-key`: API key for the block explorer (e.g., from Etherscan) - * `-artifacts-locator`: Path or plugin to locate contract artifacts - * `-input-file`: Path to a JSON file containing deployment data: - * Create an `input.json` file in the same directory(`./deployer`). - * Navigate to your `state.json` file and locate the `implementationsDeployment` object. - * Copy everything inside the `implementationsDeployment` object (without the object name itself) and paste it into your new `input.json` file. - - - You don't need to specify a `--workdir`, op-deployer will automatically look for deployment artifacts from the deploy step, unless overridden. - - - **Example:** - - ```bash - op-deployer verify \ - --l1-rpc-url \ - --etherscan-api-key \ - --input-file \ - --artifacts-locator - ``` */} - ### `inspect`: generate genesis files and chain information diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 5eb2e8078..6d91b6580 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -104,19 +104,10 @@ In this guide Docker alternative is also provided. EOF ``` - ### Get your public IP address - - ```bash - # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env - curl ifconfig.me - # or - curl ipinfo.io/ip - ``` - **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. ### Make sure your docker application is running - Create a `docker-compose.yml` file + Create a `docker-compose.yml` file in the same directory ```yaml version: '3.8' @@ -238,7 +229,7 @@ In this guide Docker alternative is also provided. - Building from source gives you full control over the binaries and is the preferred approach for this guide. + Building from source gives you full control over the binaries. ### Clone and build op-node diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index b5f2b938d..d2ebbbe3d 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -64,11 +64,11 @@ Look for the latest `op-proposer/v*` release that's compatible with your sequenc Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information. -For setting up the proposer, we recommend building from source as it provides better control and helps with debugging. Docker alternative is also provided. +For setting up the proposer, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available for more advanced users. - + - Building from source gives you full control over the binaries and is the preferred approach for this guide. + Building from source gives you full control over the binaries. ### Clone and build op-proposer @@ -284,8 +284,8 @@ For setting up the proposer, we recommend building from source as it provides be L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY # L2 Configuration - Should match your sequencer setup - L2_RPC_URL=http://localhost:8545 - ROLLUP_RPC_URL=http://localhost:8547 + L2_RPC_URL=http://op-geth:8545 + ROLLUP_RPC_URL=http://op-node:8547 # Contract addresses - Extract from your op-deployer output GAME_FACTORY_ADDRESS=YOUR_ACTUAL_GAME_FACTORY_ADDRESS From 0649f3000288a4e81ff5582e9695a6c65ad0e86a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 3 Sep 2025 20:57:09 +0100 Subject: [PATCH 47/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../create-l2-rollup/op-deployer-setup.mdx | 2 +- words.txt | 235 +++++++++--------- 2 files changed, 118 insertions(+), 119 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index a79d7808f..074db66e2 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -348,4 +348,4 @@ Since op-deployer handles L1 smart contract deployment automatically, you can no * **Community Support**: Join the [Optimism Discord](https://discord.gg/optimism) * **op-deployer Repository**: [GitHub](https://github.com/ethereum-optimism/optimism/tree/develop/op-deployer/cmd/op-deployer) -* **OPCM Documentation**: [OP Contracts Manager](/stack/opcm) \ No newline at end of file +* **OPCM Documentation**: [OP Contracts Manager](/stack/opcm) diff --git a/words.txt b/words.txt index 6f6fd5300..65eb75e8f 100644 --- a/words.txt +++ b/words.txt @@ -1,7 +1,7 @@ -accountqueue ACCOUNTQUEUE -accountslots +accountqueue ACCOUNTSLOTS +accountslots ACDC ADDI ADDIU @@ -9,58 +9,58 @@ ADDU airgap Allnodes allocs -alphanet Alphanet -alphanets +alphanet Alphanets +alphanets altda ANDI Ankr Apeworx Arweave authrpc -autorelay Autorelay +autorelay autorelayer basefee bcde -betanet Betanet -betanets +betanet Betanets +betanets BGEZ BGTZ Biconomy BLEZ -blobpool BLOBPOOL +blobpool blobspace Blockdaemon blockhash blocklists -blocklogs BLOCKLOGS -blockprofilerate +blocklogs BLOCKPROFILERATE +blockprofilerate Blockscout -blockspace Blockspace +blockspace blocktime -blocktimes Blocktimes -bloomfilter +blocktimes BLOOMFILTER +bloomfilter BLTZ Bootcamp bootnode -bootnodes -Bootnodes BOOTNODES +Bootnodes +bootnodes bottlenecked -brotli Brotli -callouts +brotli Callouts +callouts CCIP cdef Celestia @@ -73,71 +73,71 @@ chaosnet Chugsplash Clabby codebases -collateralized Collateralized +collateralized compr Comprensive -computependingblock COMPUTEPENDINGBLOCK +computependingblock confs corsdomain counterfactually -crosschain Crosschain +crosschain Crossmint daserver -datacap DATACAP -datadir +datacap DATADIR +datadir Defi Defillama's delegatecall -devnet Devnet -devnets +devnet Devnets +devnets devs direnv -disabletxpoolgossip DISABLETXPOOLGOSSIP -discv +disabletxpoolgossip Discv +discv DIVU Drand dripcheck Drippie Eigen EIPs -enabledeprecatedpersonal ENABLEDEPRECATEDPERSONAL +enabledeprecatedpersonal enginekind -erigon Erigon -etherbase +erigon ETHERBASE +etherbase Ethernity Ethernow -ethstats ETHSTATS -evmtimeout +ethstats EVMTIMEOUT +evmtimeout executability exfiltrate -exitwhensynced EXITWHENSYNCED +exitwhensynced extensibly -extradata EXTRADATA +extradata Farcaster Faultproof -fdlimit FDLIMIT +fdlimit flashblock flashblock's -flashblocks -Flashblocks FLASHBLOCKS +Flashblocks +flashblocks Flashbots forkable forkchoice @@ -145,51 +145,51 @@ FPVM FPVMs Fraxtal Funct -gascap GASCAP +gascap gaslessly -gcmode GCMODE +gcmode Gelato gifs -globalqueue GLOBALQUEUE -globalslots +globalqueue GLOBALSLOTS +globalslots gokzg growthepie hardfork hardforks -healthcheck HEALTHCHECK +healthcheck healthchecks -historicalrpc HISTORICALRPC -historicalrpctimeout +historicalrpc HISTORICALRPCTIMEOUT -holesky -Holesky +historicalrpctimeout HOLESKY +Holesky +holesky IERC -ignoreprice IGNOREPRICE +ignoreprice Immunefi -inator Inator -influxdbv +inator INFLUXDBV +influxdbv initcode -ipcdisable IPCDISABLE +ipcdisable ipcfile -ipcpath IPCPATH +ipcpath IPFS JALR -journalremotes JOURNALREMOTES -jspath +journalremotes JSPATH +jspath jwtsecret Keccak leveldb @@ -198,34 +198,34 @@ Lisk logfile logfmt Mainnets -maxage MAXAGE -maxbackups +maxage MAXBACKUPS -maxpeers +maxbackups MAXPEERS -maxpendpeers +maxpeers MAXPENDPEERS -maxprice +maxpendpeers MAXPRICE -memprofilerate +maxprice MEMPROFILERATE -merkle +memprofilerate Merkle +merkle MFHI MFLO Mgas Minato -minfreedisk MINFREEDISK -minsuggestedpriorityfee +minfreedisk MINSUGGESTEDPRIORITYFEE +minsuggestedpriorityfee Mintable Mintplex MIPSEVM Mitigations -monitorism Monitorism +monitorism Moralis Mordor MOVN @@ -234,145 +234,145 @@ MTHI MTLO MULT multiaddr -multichain Multichain +multichain multiclient multisigs MULTU Nethermind -netrestrict NETRESTRICT -networkid +netrestrict NETWORKID -newpayload +networkid NEWPAYLOAD +newpayload nextra -nocompaction NOCOMPACTION -nodekey +nocompaction NODEKEY -nodekeyhex +nodekey NODEKEYHEX +nodekeyhex nodename Nodies -nodiscover NODISCOVER -nolocals +nodiscover NOLOCALS -noprefetch +nolocals NOPREFETCH -nopruning +noprefetch NOPRUNING -nosyncserve +nopruning NOSYNCSERVE +nosyncserve Numba NVME -offchain Offchain +offchain onlyreqtostatic opchaina opchainb -opcm OPCM +opcm Openfort oplabs opnode's outfile outperformance pcscdpath -pectra Pectra +pectra Pectra's -peerstore Peerstore +peerstore peerstores -permissioned Permissioned +permissioned permissioning -permissionless Permissionless +permissionless permissionlessly Perps Peta Pimlico POAP POAPs -pprof PPROF -precommitments +pprof Precommitments +precommitments preconfigured predeploy -predeployed Predeployed -predeploys +predeployed Predeploys +predeploys prefunded -preimage Preimage -preimages +preimage PREIMAGES +preimages preinstall -preinstalls Preinstalls -prestate +preinstalls Prestate +prestate prestates PREVRANDAO -pricebump PRICEBUMP -pricelimit +pricebump PRICELIMIT +pricelimit productionize productionized Protip Proxied -proxyd Proxyd +proxyd Pyth Pyth's QRNG -quicknode Quicknode +quicknode quickstarts rebalancing reemit Reemitting -regenesis Regenesis +regenesis Reimagine -rejournal REJOURNAL -remotedb +rejournal REMOTEDB +remotedb Reown Reown's replayability replayor reposts reproven -requiredblocks REQUIREDBLOCKS +requiredblocks rollouts -rollups Rollups +rollups Routescan rpckind -rpcprefix RPCPREFIX +rpcprefix rpcs RPGF -runbooks Runbooks +runbooks RWAs safedb Schnorr -sepolia -Sepolia SEPOLIA +Sepolia +sepolia seqnr -sequencerhttp SEQUENCERHTTP +sequencerhttp serv signup SLLV @@ -381,16 +381,16 @@ SLTIU SLTU smartcard snapshotlog -snapsync Snapsync +snapsync Solana Soneium soyboy Spearbit SRAV SRLV -stablecoins Stablecoins +stablecoins statefulset structs subcomponents @@ -399,21 +399,21 @@ subheaders subsecond SUBU Sunnyside -superchain -Superchain SUPERCHAIN +Superchain +superchain Superchain's superchainerc Superlend Superloans Superscan Superseed -supersim Supersim -syncmode +supersim SYNCMODE -synctarget +syncmode SYNCTARGET +synctarget syscalls SYSCON thirdweb @@ -427,8 +427,8 @@ Twei txfeecap txmgr txns -txpool TXPOOL +txpool txproxy txproxyd uncensorable @@ -438,22 +438,21 @@ Unichain Unprotect unsubmitted UPNP -verkle VERKLE -vhosts +verkle VHOSTS -viem +vhosts Viem -viem's +viem Viem's -vmdebug +viem's VMDEBUG -vmodule +vmdebug VMODULE -workdir +vmodule xlarge XORI ZKPs ZKVM -zora Zora +zora From 32f90054aa8482e44d5557f8b5097683374a420f Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 3 Sep 2025 20:59:07 +0100 Subject: [PATCH 48/92] Update L2 Rollup tutorials: change L2 and Rollup RPC URLs from Docker references to localhost for improved clarity and accessibility. --- .../tutorials/create-l2-rollup/op-challenger-setup.mdx | 8 ++++---- .../tutorials/create-l2-rollup/op-proposer-setup.mdx | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index e1e0c2c7f..67a9629d6 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -176,8 +176,8 @@ For challenger deployment, we recommend using Docker as it provides a consistent L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY # L2 Configuration - Replace with your actual node endpoints - L2_RPC_URL=http://op-geth:8545 - ROLLUP_RPC_URL=http://op-node:8547 + L2_RPC_URL=http://localhost:8545 + ROLLUP_RPC_URL=http://localhost:8547 L1_BEACON=http://sepolia-cl-1:5051 # Wallet configuration - Choose either mnemonic + HD path OR private key @@ -388,8 +388,8 @@ For challenger deployment, we recommend using Docker as it provides a consistent L1_BEACON=http://sepolia-cl-1:5051 # L2 Configuration - Replace with your actual node endpoints - L2_RPC_URL=http://op-geth:8545 - ROLLUP_RPC_URL=http://op-node:8547 + L2_RPC_URL=http://localhost:8545 + ROLLUP_RPC_URL=http://localhost:8547 # Wallet configuration - Choose either mnemonic + HD path OR private key MNEMONIC="test test test test test test test test test test test junk" diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index d2ebbbe3d..0694f5e38 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -284,8 +284,8 @@ For setting up the proposer, we recommend using Docker as it provides a consiste L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY # L2 Configuration - Should match your sequencer setup - L2_RPC_URL=http://op-geth:8545 - ROLLUP_RPC_URL=http://op-node:8547 + L2_RPC_URL=http://localhost:8545 + ROLLUP_RPC_URL=http://localhost:8547 # Contract addresses - Extract from your op-deployer output GAME_FACTORY_ADDRESS=YOUR_ACTUAL_GAME_FACTORY_ADDRESS From 92ffe9bf3de96c44755bb55d64e9eecd6f35fd3b Mon Sep 17 00:00:00 2001 From: krofax Date: Thu, 4 Sep 2025 15:30:26 +0100 Subject: [PATCH 49/92] update files --- pages/operators/chain-operators/deploy/op-challenger.mdx | 2 +- pages/operators/chain-operators/deploy/sequencer-node.mdx | 2 +- pages/operators/chain-operators/deploy/spin-batcher.mdx | 2 +- .../tutorials/create-l2-rollup/op-batcher-setup.mdx | 2 +- .../tutorials/create-l2-rollup/op-challenger-setup.mdx | 2 +- .../tutorials/create-l2-rollup/op-geth-setup.mdx | 5 ++--- .../tutorials/create-l2-rollup/op-proposer-setup.mdx | 2 +- 7 files changed, 8 insertions(+), 9 deletions(-) diff --git a/pages/operators/chain-operators/deploy/op-challenger.mdx b/pages/operators/chain-operators/deploy/op-challenger.mdx index 7e72b1b4e..7b084909d 100644 --- a/pages/operators/chain-operators/deploy/op-challenger.mdx +++ b/pages/operators/chain-operators/deploy/op-challenger.mdx @@ -569,7 +569,7 @@ All governance approved releases use a tagged version of `op-program`. These can Create a `docker-compose.yml` file that defines the challenger service: ```yaml -version: '3.8' +' services: challenger: diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 5f3d75e74..67ac06e16 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -462,7 +462,7 @@ In this guide Docker alternative is also provided. 3. **Create docker-compose.yml:** ```yaml - version: '3.8' + ' services: op-geth: diff --git a/pages/operators/chain-operators/deploy/spin-batcher.mdx b/pages/operators/chain-operators/deploy/spin-batcher.mdx index 1df8fdf32..6c0947a32 100644 --- a/pages/operators/chain-operators/deploy/spin-batcher.mdx +++ b/pages/operators/chain-operators/deploy/spin-batcher.mdx @@ -158,7 +158,7 @@ If you prefer containerized deployment, you can use the official Docker images. ```yaml - version: '3.8' + ' services: op-batcher: diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index 67aefe0cd..b4f2f9e6b 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -131,7 +131,7 @@ For setting up the batcher, we recommend building from source as it provides bet
```yaml - version: '3.8' + ' services: op-batcher: diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index a6f44f376..b099f25fd 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -408,7 +408,7 @@ For challenger deployment, you can either build from source (recommended for bet Create a `docker-compose.yml` file that defines the challenger service: ```yaml - version: '3.8' + ' services: challenger: diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 5eb2e8078..c2febfbee 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -57,8 +57,7 @@ The main components you'll need for sequencer deployment are: ## Software installation -For spinning up a sequencer, we recommend building from source as it provides better control, and helps with debugging. -In this guide Docker alternative is also provided. +For spinning up a sequencer, we recommend using Docker, as it provides a simpler setup and consistent environment. In this guide, building from source is also provided as an alternative for those who need more control and easier debugging. @@ -119,7 +118,7 @@ In this guide Docker alternative is also provided. Create a `docker-compose.yml` file ```yaml - version: '3.8' + ' services: op-geth: diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index b5f2b938d..8527a76f0 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -156,7 +156,7 @@ For setting up the proposer, we recommend building from source as it provides be ```yaml - version: '3.8' + ' services: op-proposer: From c46271b1fc8c06a8ba48e6499fcefab05ed77cf0 Mon Sep 17 00:00:00 2001 From: krofax Date: Thu, 4 Sep 2025 16:11:14 +0100 Subject: [PATCH 50/92] updated the instructions --- .../tutorials/create-l2-rollup/op-batcher-setup.mdx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index e9f476e21..64bdb0279 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -143,6 +143,8 @@ For setting up the batcher, we recommend using Docker as it provides a consisten - "8548:8548" env_file: - .env + networks: + - sequencer-node_default command: - "op-batcher" - "--l2-eth-rpc=${L2_RPC_URL}" @@ -161,7 +163,12 @@ For setting up the batcher, we recommend using Docker as it provides a consisten - "--batch-type=1" - "--data-availability-type=blobs" - "--log.level=info" + - "--max-pending-tx=0" restart: unless-stopped + + networks: + sequencer-node_default: + external: true ``` ### Start the batcher service From 7919f7739f00ae30c113b31fcf39dd06ef3834c4 Mon Sep 17 00:00:00 2001 From: krofax Date: Thu, 4 Sep 2025 16:11:33 +0100 Subject: [PATCH 51/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- words.txt | 234 +++++++++++++++++++++++++++--------------------------- 1 file changed, 117 insertions(+), 117 deletions(-) diff --git a/words.txt b/words.txt index 65eb75e8f..d20533f57 100644 --- a/words.txt +++ b/words.txt @@ -1,7 +1,7 @@ -ACCOUNTQUEUE accountqueue -ACCOUNTSLOTS +ACCOUNTQUEUE accountslots +ACCOUNTSLOTS ACDC ADDI ADDIU @@ -9,58 +9,58 @@ ADDU airgap Allnodes allocs -Alphanet alphanet -Alphanets +Alphanet alphanets +Alphanets altda ANDI Ankr Apeworx Arweave authrpc -Autorelay autorelay +Autorelay autorelayer basefee bcde -Betanet betanet -Betanets +Betanet betanets +Betanets BGEZ BGTZ Biconomy BLEZ -BLOBPOOL blobpool +BLOBPOOL blobspace Blockdaemon blockhash blocklists -BLOCKLOGS blocklogs -BLOCKPROFILERATE +BLOCKLOGS blockprofilerate +BLOCKPROFILERATE Blockscout -Blockspace blockspace +Blockspace blocktime -Blocktimes blocktimes -BLOOMFILTER +Blocktimes bloomfilter +BLOOMFILTER BLTZ Bootcamp bootnode -BOOTNODES -Bootnodes bootnodes +Bootnodes +BOOTNODES bottlenecked -Brotli brotli -Callouts +Brotli callouts +Callouts CCIP cdef Celestia @@ -73,71 +73,71 @@ chaosnet Chugsplash Clabby codebases -Collateralized collateralized +Collateralized compr Comprensive -COMPUTEPENDINGBLOCK computependingblock +COMPUTEPENDINGBLOCK confs corsdomain counterfactually -Crosschain crosschain +Crosschain Crossmint daserver -DATACAP datacap -DATADIR +DATACAP datadir +DATADIR Defi Defillama's delegatecall -Devnet devnet -Devnets +Devnet devnets +Devnets devs direnv -DISABLETXPOOLGOSSIP disabletxpoolgossip -Discv +DISABLETXPOOLGOSSIP discv +Discv DIVU Drand dripcheck Drippie Eigen EIPs -ENABLEDEPRECATEDPERSONAL enabledeprecatedpersonal +ENABLEDEPRECATEDPERSONAL enginekind -Erigon erigon -ETHERBASE +Erigon etherbase +ETHERBASE Ethernity Ethernow -ETHSTATS ethstats -EVMTIMEOUT +ETHSTATS evmtimeout +EVMTIMEOUT executability exfiltrate -EXITWHENSYNCED exitwhensynced +EXITWHENSYNCED extensibly -EXTRADATA extradata +EXTRADATA Farcaster Faultproof -FDLIMIT fdlimit +FDLIMIT flashblock flashblock's -FLASHBLOCKS -Flashblocks flashblocks +Flashblocks +FLASHBLOCKS Flashbots forkable forkchoice @@ -145,51 +145,51 @@ FPVM FPVMs Fraxtal Funct -GASCAP gascap +GASCAP gaslessly -GCMODE gcmode +GCMODE Gelato gifs -GLOBALQUEUE globalqueue -GLOBALSLOTS +GLOBALQUEUE globalslots +GLOBALSLOTS gokzg growthepie hardfork hardforks -HEALTHCHECK healthcheck +HEALTHCHECK healthchecks -HISTORICALRPC historicalrpc -HISTORICALRPCTIMEOUT +HISTORICALRPC historicalrpctimeout -HOLESKY -Holesky +HISTORICALRPCTIMEOUT holesky +Holesky +HOLESKY IERC -IGNOREPRICE ignoreprice +IGNOREPRICE Immunefi -Inator inator -INFLUXDBV +Inator influxdbv +INFLUXDBV initcode -IPCDISABLE ipcdisable +IPCDISABLE ipcfile -IPCPATH ipcpath +IPCPATH IPFS JALR -JOURNALREMOTES journalremotes -JSPATH +JOURNALREMOTES jspath +JSPATH jwtsecret Keccak leveldb @@ -198,34 +198,34 @@ Lisk logfile logfmt Mainnets -MAXAGE maxage -MAXBACKUPS +MAXAGE maxbackups -MAXPEERS +MAXBACKUPS maxpeers -MAXPENDPEERS +MAXPEERS maxpendpeers -MAXPRICE +MAXPENDPEERS maxprice -MEMPROFILERATE +MAXPRICE memprofilerate -Merkle +MEMPROFILERATE merkle +Merkle MFHI MFLO Mgas Minato -MINFREEDISK minfreedisk -MINSUGGESTEDPRIORITYFEE +MINFREEDISK minsuggestedpriorityfee +MINSUGGESTEDPRIORITYFEE Mintable Mintplex MIPSEVM Mitigations -Monitorism monitorism +Monitorism Moralis Mordor MOVN @@ -234,145 +234,145 @@ MTHI MTLO MULT multiaddr -Multichain multichain +Multichain multiclient multisigs MULTU Nethermind -NETRESTRICT netrestrict -NETWORKID +NETRESTRICT networkid -NEWPAYLOAD +NETWORKID newpayload +NEWPAYLOAD nextra -NOCOMPACTION nocompaction -NODEKEY +NOCOMPACTION nodekey -NODEKEYHEX +NODEKEY nodekeyhex +NODEKEYHEX nodename Nodies -NODISCOVER nodiscover -NOLOCALS +NODISCOVER nolocals -NOPREFETCH +NOLOCALS noprefetch -NOPRUNING +NOPREFETCH nopruning -NOSYNCSERVE +NOPRUNING nosyncserve +NOSYNCSERVE Numba NVME -Offchain offchain +Offchain onlyreqtostatic opchaina opchainb -OPCM opcm +OPCM Openfort oplabs opnode's outfile outperformance pcscdpath -Pectra pectra +Pectra Pectra's -Peerstore peerstore +Peerstore peerstores -Permissioned permissioned +Permissioned permissioning -Permissionless permissionless +Permissionless permissionlessly Perps Peta Pimlico POAP POAPs -PPROF pprof -Precommitments +PPROF precommitments +Precommitments preconfigured predeploy -Predeployed predeployed -Predeploys +Predeployed predeploys +Predeploys prefunded -Preimage preimage -PREIMAGES +Preimage preimages +PREIMAGES preinstall -Preinstalls preinstalls -Prestate +Preinstalls prestate +Prestate prestates PREVRANDAO -PRICEBUMP pricebump -PRICELIMIT +PRICEBUMP pricelimit +PRICELIMIT productionize productionized Protip Proxied -Proxyd proxyd +Proxyd Pyth Pyth's QRNG -Quicknode quicknode +Quicknode quickstarts rebalancing reemit Reemitting -Regenesis regenesis +Regenesis Reimagine -REJOURNAL rejournal -REMOTEDB +REJOURNAL remotedb +REMOTEDB Reown Reown's replayability replayor reposts reproven -REQUIREDBLOCKS requiredblocks +REQUIREDBLOCKS rollouts -Rollups rollups +Rollups Routescan rpckind -RPCPREFIX rpcprefix +RPCPREFIX rpcs RPGF -Runbooks runbooks +Runbooks RWAs safedb Schnorr -SEPOLIA -Sepolia sepolia +Sepolia +SEPOLIA seqnr -SEQUENCERHTTP sequencerhttp +SEQUENCERHTTP serv signup SLLV @@ -381,16 +381,16 @@ SLTIU SLTU smartcard snapshotlog -Snapsync snapsync +Snapsync Solana Soneium soyboy Spearbit SRAV SRLV -Stablecoins stablecoins +Stablecoins statefulset structs subcomponents @@ -399,21 +399,21 @@ subheaders subsecond SUBU Sunnyside -SUPERCHAIN -Superchain superchain +Superchain +SUPERCHAIN Superchain's superchainerc Superlend Superloans Superscan Superseed -Supersim supersim -SYNCMODE +Supersim syncmode -SYNCTARGET +SYNCMODE synctarget +SYNCTARGET syscalls SYSCON thirdweb @@ -427,8 +427,8 @@ Twei txfeecap txmgr txns -TXPOOL txpool +TXPOOL txproxy txproxyd uncensorable @@ -438,21 +438,21 @@ Unichain Unprotect unsubmitted UPNP -VERKLE verkle -VHOSTS +VERKLE vhosts -Viem +VHOSTS viem -Viem's +Viem viem's -VMDEBUG +Viem's vmdebug -VMODULE +VMDEBUG vmodule +VMODULE xlarge XORI ZKPs ZKVM -Zora zora +Zora From 603e26ffffa403e14dd802ef64d92fe45d94979e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 16:43:22 +0100 Subject: [PATCH 52/92] Enhance L2 Rollup tutorials: update op-deployer setup instructions with clearer deployment steps, add advanced configuration options for batchers, and improve clarity on intent file setup and key generation processes. --- .../create-l2-rollup/op-batcher-setup.mdx | 24 + .../create-l2-rollup/op-deployer-setup.mdx | 508 +++++++++--------- 2 files changed, 264 insertions(+), 268 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index d24506747..9add144cf 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -240,6 +240,18 @@ For setting up the batcher, we recommend using Docker as it provides a consisten If you chose Docker, all the necessary configuration was covered in the Docker tab above. + + For advanced configuration options and fine-tuning your batcher, including: + - Batch submission policies + - Channel duration settings + - Data availability types (blobs vs calldata) + - Transaction throttling + - Network timeouts + + Check out the [Batcher Configuration Reference](/operators/chain-operators/configuration/batcher). + This will help you optimize your batcher's performance and cost-efficiency. + + ### Organize your workspace @@ -446,6 +458,18 @@ source .env Your batcher is now operational and will continuously submit L2 transaction batches to L1! + + **Understanding common startup messages** + + When starting your batcher, you might see various log messages: + - `Added L2 block to local state`: Normal operation, shows the batcher processing blocks + - `SetMaxDASize RPC method unavailable`: Expected if the `op-geth` version used doesn't support this method. + - `context canceled` errors during shutdown: Normal cleanup messages + - `Failed to query L1 tip`: Can occur during graceful shutdowns + + Most of these messages are part of normal operation. For detailed explanations of configuration options and troubleshooting, see the [Batcher configuration reference](/operators/chain-operators/configuration/batcher). + + ## What's Next? Excellent! Your batcher is publishing transaction data to L1. The next step is to set up the proposer to submit state root proposals. diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 074db66e2..9068270f7 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -1,6 +1,6 @@ --- -title: Spin up op-deployer -description: Install op-deployer, prepare your environment, and set up the foundation for your rollup deployment. +title: Deploy L1 contracts with op-deployer +description: Install op-deployer, prepare your environment, and deploy the L1 smart contracts for your rollup. lang: en-US content_type: tutorial topic: create-l2-rollup-setup @@ -15,9 +15,9 @@ is_imported_content: 'false' import {Callout, Steps, Card, Tabs} from 'nextra/components' -# Spin up op-deployer +# Deploy L1 contracts with op-deployer -Welcome to the first step of creating your own L2 rollup testnet! In this section, you'll install the op-deployer tool and prepare your environment for the deployment. +Welcome to the first step of creating your own L2 rollup testnet! In this section, you'll install the op-deployer tool and deploy the necessary L1 smart contracts for your rollup. **Step 1 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the previous one. @@ -33,22 +33,61 @@ There are a couple of ways to install `op-deployer`: - The recommended way to install `op-deployer`, is to download the latest release from the monorepo's [release page](https://github.com/ethereum-optimism/optimism/releases). - - 1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) - 2. Find the latest release that includes `op-deployer` - 3. Under **assets**, download the binary that matches your operating system: - - * `op-deployer-linux-amd64` for Linux - * `op-deployer-darwin-amd64` or `op-deployer-darwin-arm64` for macOS - * `op-deployer-windows-amd64.exe` for Windows + The recommended way to install `op-deployer` is to download the latest release from the monorepo's [release page](https://github.com/ethereum-optimism/optimism/releases). + + + ### Download the correct binary + + 1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) + 2. Find the latest release that includes `op-deployer` + 3. Under **assets**, download the binary that matches your system: + + - For Linux: `op-deployer-linux-amd64` + - For macOS: + - Apple Silicon (M1/M2): `op-deployer-darwin-arm64` + - Intel processors: `op-deployer-darwin-amd64` + - For Windows: `op-deployer-windows-amd64.exe` + + + Not sure which macOS version to use? + - Open Terminal and run `uname -m` + - If it shows `arm64`, use the arm64 version + - If it shows `x86_64`, use the amd64 version + + + ### Install the binary + + 1. Rename the downloaded file to `op-deployer` + 2. Make it executable: + ```bash + chmod +x op-deployer + ``` + + 3. Move it to a directory in your system PATH: + ```bash + # Create a bin directory if it doesn't exist + mkdir -p ~/bin + + # Move the binary + mv op-deployer ~/bin/ + + # Add to PATH if not already added (add this to your ~/.bashrc or ~/.zshrc) + export PATH=$PATH:~/bin + ``` + + + **For macOS Users**: If you get a security warning about "unidentified developer": + ```bash + # Run this command to allow the binary + xattr -d com.apple.quarantine ~/bin/op-deployer + ``` + - 4. Extract the binary to a location on your system PATH - 5. Verify installation, run this command to verify that you have it installed. + ### Verify installation - ```bash - op-deployer --version - ``` + ```bash + op-deployer --version + ``` @@ -61,282 +100,215 @@ There are a couple of ways to install `op-deployer`: just build cp ./bin/op-deployer /usr/local/bin/op-deployer # or any other directory in your $PATH - # Verify installation, run this command to verify that you have it installed. + # Verify installation op-deployer --version ``` - - #### Working with artifacts - - When building from source, you'll need to work with contract artifacts. These are the outputs generated by `op-deployer` when configuring a chain deployment. - They typically include compiled contract binaries, deployment metadata, and chain configuration files (like genesis, or rollup).\ - These files serve as the source of truth for deploying, upgrading, or verifying an OP Stack chain. - We'll cover how to generate and retrieve artifacts later in this tutorial. - - The `artifacts-locator` parameter specifies where the contract deployment artifacts are located. - There are several ways to provide artifacts: - - - - To use local artifacts (recommended for production or if you're experiencing issues with remote artifacts): - - 1. Clone the contracts repository: - - ```bash - git clone https://github.com/ethereum-optimism/optimism.git - cd optimism - git checkout v1.8.0-rc.4 # Use the desired version - ``` - - 2. Build the contract artifacts: - - ```bash - cd packages/contracts-bedrock - just build - ``` - - 3. Use the local path in your command, referencing the artifacts from:\ - `/packages/contracts-bedrock/forge-artifacts` - - - - For development or testing, you can try using tagged artifacts: - - ```bash - --artifacts-locator tag://op-contracts/v1.8.0-rc.4 - ``` - - If you encounter the error `Application failed: failed to parse artifacts URL: unsupported tag`, you'll need to use the local files method described above. - If you use an invalid tag, the command will display all valid options. - - - - #### Contract locator schemes - - When building from source, you'll need to understand contract locators. These are used to find contract artifacts for deployment. - The `l1ContractsLocator` and `l2ContractsLocator` fields in your intent file support several URL schemes: - - * `tag://` - References a specific tagged release (e.g., `tag://op-contracts/v1.8.0-rc.4`). Downloads bytecode from a fixed bundle on GCS. - * `file://` - Points to local artifacts directory, useful when building from source. - Example: `file:///packages/contracts-bedrock/forge-artifacts` - * `http://` or `https://` - Points to a remote artifacts directory containing `forge-artifacts`. - - - When using `file://`, `http://`, or `https://` schemes, set `configType` to either `custom` or `standard-overrides` in your intent file. - - - For example: - - ```toml - # When using tag:// scheme (recommended for binary installation) - configType = "standard-overrides" - l1ContractsLocator = "tag://op-contracts/v1.8.0-rc.4" - l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" - - # When building from source (using file://, http://, https://) - configType = "custom" # or "standard-overrides" - l1ContractsLocator = "file:///path/to/local/op-contracts/v1.8.0-rc.4/forge-artifacts" - l2ContractsLocator = "" - ``` -## Deployment usage +## L1 Network Requirements - - Deploying an OP Stack chain involves deploying multiple contracts, which can consume a substantial amount of gas. On testnets like Sepolia, costs may fluctuate significantly depending on network congestion. We recommend ensuring your deployer wallet has a buffer of **at least 1.5 to 3.5 ETH** , depending on gas prices and configuration. Always check current gas estimates before deploying. - +Before deploying your L1 contracts, you'll need: -The base use case for `op-deployer` is deploying new OP Chains. This process is broken down into three steps: +1. **L1 RPC URL**: An Ethereum RPC endpoint for your chosen L1 network + ```bash + # Examples: + # Sepolia (recommended for testing) + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR-PROJECT-ID + # or https://eth-sepolia.g.alchemy.com/v2/YOUR-API-KEY + + # Local network + L1_RPC_URL=http://localhost:8545 + ``` - - op-deployer uses a declarative intent file to determine how a new chain should be configured. - Then, it runs through a deployment pipeline to actually deploy the chain. - - - - ### `init`: configure your chain - - To get started with `op-deployer`, create an intent file that defines your desired chain configuration. Use the built-in `op-deployer` utility to generate this file: - - ```bash - op-deployer init \ - --l1-chain-id 11155111 \ - --l2-chain-ids \ - --workdir .deployer \ - --intent-type - ``` - - * Replace `` with the exact value. - * The `--workdir` flag specifies the output directory for the generated intent file and related configs. You can name this directory anything you like. - - This command will create a directory called `.deployer` in your current working directory containing the intent file and an empty `state.json` file. `state.json` is populated with the results of your deployment, and never needs to be edited directly. - - Your intent file will need to be modified to your parameters, but it will initially look something like this: - - - Do not use the default addresses in the intent for a production chain! They are generated from the `test... junk` - mnemonic. **Any funds they hold will be stolen on a live chain.** - - - ```toml - deploymentStrategy = "live" - configType = "standard-overrides" - l1ChainID = 11155111# The chain ID of Sepolia (L1) you'll be deploying to. - fundDevAccounts = true# Whether or not to fund dev accounts using the test... junk mnemonic on L2. - l1ContractsLocator = "tag://op-contracts/v1.8.0-rc.4"# L1 smart contracts versions - l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts"# L2 smart contracts versions# Delete this table if you are using the shared Superchain contracts on the L1# If you are deploying your own SuperchainConfig and ProtocolVersions contracts, fill in these details - [superchainRoles] - proxyAdminOwner = "0x1eb2ffc903729a0f03966b917003800b145f56e2" - protocolVersionsOwner = "0x79add5713b383daa0a138d3c4780c7a1804a8090" - guardian = "0x7a50f00e8d05b95f98fe38d8bee366a7324dcf7e" - - # List of L2s to deploy. op-deployer can deploy multiple L2s at once - [[chains]] - # Your chain's ID, encoded as a 32-byte hex string - id = "0x00000000000000000000000000000000000000000000000000000a25406f3e60" - # Update the fee recipient contract - baseFeeVaultRecipient = "0x100f829718B5Be38013CC7b29c5c62a08D00f1ff" - l1FeeVaultRecipient = "0xbAEaf33e883068937aB4a50871f2FD52e241013A" - sequencerFeeVaultRecipient = "0xd0D5D18F0ebb07B7d728b14AAE014eedA814d6BD" - eip1559DenominatorCanyon = 250 - eip1559Denominator = 50 - eip1559Elasticity = 6 - # Various ownership roles for your chain. When you use op-deployer init, these roles are generated using the# test... junk mnemonic. You should replace these with your own addresses for production chains. - [chains.roles] - l1ProxyAdminOwner = "0xdf5a644aed1b5d6cE0DA2aDd778bc5f39d97Ac88" - l2ProxyAdminOwner = "0xC40445CD88dDa2A410F86F6eF8E00fd52D8381FD" - systemConfigOwner = "0xB32296E6929F2507dB8153A64b036D175Ac6E89e" - unsafeBlockSigner = "0xA53526b516df4eEe3791734CE85311569e0eAD78" - batcher = "0x8680d36811420359093fd321ED386a6e76BE2AF3" - proposer = "0x41b3B204099771aDf857F826015703A1030b6675" - challenger = "0x7B51A480dAeE699CA3a4F68F9AAA434452112eF7" - ``` - - - Before you can use your intent file for a deployment, you will need to update all zero values to whatever is appropriate for your chain. - For dev environments, it is ok to use all EOAs/hot-wallets. - - - **Production setup** - - In production environments, you should use a more secure setup with cold-wallet multisigs (e.g. Gnosis Safes) for the following: - - * `baseFeeVaultRecipient` - * `l1FeeVaultRecipient` - * `sequencerFeeVaultRecipient` - * \`systemConfigOwn\`\` - - HSMs (hardware security modules) are recommended for the following hot-wallets: - - * `unsafeBlockSigner` - * `batcher` - * `proposer` - - #### Understanding the intent.toml fields - -
- Here's an explanation of the key fields in the intent file: - - **Global configuration:** - - * `deploymentStrategy`: Used to deploy both to live chains and L1 genesis files. Valid values are `live` and `genesis`. - * `configType`: Type of configuration to use ("standard-overrides" is most common) - * `l1ChainID`: The chain ID of the L1 network you're deploying to - * `fundDevAccounts`: Whether to fund development accounts on L2 (set to false for production) - * `l1ContractsLocator`: The version of L1 contracts to deploy - * `l2ContractsLocator`: The version of L2 contracts to deploy - - **Superchain roles:** - - * `proxyAdminOwner`: Address that can upgrade Superchain-wide contracts - * `protocolVersionsOwner`: Address that can update protocol versions - * `guardian`: Address authorized to pause L1 withdrawals from contracts, blacklist dispute games, and set the respected game type in the `OptimismPortal` - - **Chain-specific configuration:** + + For testing, we recommend using Sepolia testnet. You can get free RPC access from: + - [Infura](https://infura.io) (create account, get API key) + - [Alchemy](https://alchemy.com) (create account, get API key) + - [Ankr](https://ankr.com) (create account, get API key) + - * `id`: Unique identifier for your chain - * `baseFeeVaultRecipient`: Address that represents the recipient of fees accumulated in the `BaseFeeVault` - * `l1FeeVaultRecipient`: Address that represents the recipient of fees accumulated in the `L1FeeVault` - * `sequencerFeeVaultRecipient`: Address that receives sequencer fees - * `eip1559DenominatorCanyon`, `eip1559Denominator`, `eip1559Elasticity`: Parameters for fee calculation - - **Chain roles:** +2. **Deployer Account**: An Ethereum account with sufficient ETH + - For Sepolia: 1.5-3.5 ETH recommended + - Get test ETH from [Sepolia Faucet](https://sepoliafaucet.com) - * `l1ProxyAdminOwner`: Address authorized to update the L1 Proxy Admin - * `l2ProxyAdminOwner`: Address authorized to upgrade protocol contracts via calls to the `ProxyAdmin`. This is the aliased L1 ProxyAdmin owner address. - * `systemConfigOwner`: Address authorized to change values in the `SystemConfig` contract. All configuration is stored on L1 and picked up by L2 as part of the [derivation](https://specs.optimism.io/protocol/derivation.html) of the L2 chain - * `unsafeBlockSigner`: Address which authenticates the unsafe/pre-submitted blocks for a chain at the P2P layer - * `batcher`: Address that batches transactions from L2 to L1 - * `proposer`: Address which can create and interact with [permissioned dispute games](https://specs.optimism.io/fault-proof/stage-one/bridge-integration.html#permissioned-faultdisputegame) on L1. - * `challenger`: Address Account which can interact with existing permissioned dispute games -
+## Generate Deployment Keys - By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html?utm_source=op-docs\&utm_medium=docs). You can override these default settings by adding them to your intent file using the table below: +Your rollup needs several key pairs for different roles. Let's generate them first: - ```toml - [globalDeployOverrides] - l2BlockTime = 1# 1s L2blockTime is also standard, op-deployer defaults to 2s - ``` - - You can also do chain by chain configurations in the `chains` table. - - ### `apply`: deploy your chain - - - Hardware wallets are not supported, but you can use ephemeral hot wallets since this deployer key has no privileges. - - - Now that you've created your intent file, you can apply it to your chain to deploy the L1 smart contracts: - - ```bash - op-deployer apply --workdir .deployer --l1-rpc-url --private-key - ``` - - * Replace `` with your `L1_RPC_URL` and `` with your private key + +### Create keys directory +```bash +mkdir -p keys +cd keys +``` + +### Generate keys for each role +```bash +# Generate 7 new Ethereum accounts +for role in admin system_config unsafe_block_signer batcher proposer challenger fee_recipient; do + cast wallet new --password "" > $role.txt +done +``` + +### Save addresses for your intent file +```bash +# Extract addresses to a summary file +echo "Generated addresses for your intent file:" > addresses.txt +for role in admin system_config unsafe_block_signer batcher proposer challenger fee_recipient; do + echo "$role: $(grep "Address:" $role.txt | cut -d' ' -f2)" >> addresses.txt +done +cat addresses.txt +``` + + + **Important**: + - Save these keys securely - you'll need them to operate your chain + - The private keys are in the "Private Key:" field of each file + - For production, use proper key management solutions (HSMs, multisigs) + + - This command will deploy the OP Stack to L1. It will deploy all L1 contracts for each L2 specified in the intent file. +## Create and configure intent file - Superchain configuration will be set to the Superchain-wide defaults - i.e., your chain will be opted into the [Superchain pause](https://specs.optimism.io/protocol/superchain-config.html#pausability) and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) address as other chains on the Superchain. - You will need to specify additional arguments depending on what you're trying to do. - See below for a reference of each supported CLI arg: +The intent file defines your chain's configuration. Here's how to set it up: - * Deployment targets: + +### Initialize intent file + +```bash +op-deployer init \ + --l1-chain-id 11155111 \ + --l2-chain-ids 42069 \ + --workdir .deployer \ + --intent-type standard-overrides +``` + +
+Understanding intent types + +`op-deployer` supports three intent types: +- `standard`: Uses default OP Stack configuration, minimal customization +- `standard-overrides`: Recommended. Uses defaults but allows overriding specific values +- `custom`: Full customization, requires manual configuration of all values + +For most users, `standard-overrides` provides the best balance of simplicity and flexibility. +
+ +### Update the intent file + +Edit `.deployer/intent.toml` with your generated addresses: + +```toml +configType = "standard-overrides" +l1ChainID = 11155111 # Sepolia +fundDevAccounts = false # Set to false for production/testnet +useInterop = false +l1ContractsLocator = "tag://op-contracts/v2.0.0" +l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" + +[superchainRoles] + proxyAdminOwner = "0x..." # admin address + protocolVersionsOwner = "0x..." # admin address + guardian = "0x..." # admin address + +[[chains]] + id = "0x000000000000000000000000000000000000000000000000000000000016de8d" + baseFeeVaultRecipient = "0x..." # fee_recipient address + l1FeeVaultRecipient = "0x..." # fee_recipient address + sequencerFeeVaultRecipient = "0x..." # fee_recipient address + eip1559DenominatorCanyon = 250 + eip1559Denominator = 50 + eip1559Elasticity = 6 + [chains.roles] + l1ProxyAdminOwner = "0x..." # admin address + l2ProxyAdminOwner = "0x..." # admin address + systemConfigOwner = "0x..." # system_config address + unsafeBlockSigner = "0x..." # unsafe_block_signer address + batcher = "0x..." # batcher address + proposer = "0x..." # proposer address + challenger = "0x..." # challenger address +``` + +
+Understanding the configuration values + +**Global Settings:** +- `l1ChainID`: The L1 network ID (11155111 for Sepolia) +- `fundDevAccounts`: Creates test accounts with ETH if true +- `useInterop`: Enable interoperability features +- `l1ContractsLocator`: Version of L1 contracts to deploy +- `l2ContractsLocator`: Version of L2 contracts to deploy + +**Superchain Roles:** +- `proxyAdminOwner`: Can upgrade Superchain-wide contracts +- `protocolVersionsOwner`: Can update protocol versions +- `guardian`: Can pause withdrawals and manage disputes + +**Chain Configuration:** +- `id`: Unique identifier for your chain +- `*FeeVaultRecipient`: Addresses receiving various fees +- `eip1559*`: Parameters for gas price calculation + +**Chain Roles:** +- `l1ProxyAdminOwner`: Updates L1 contract implementations +- `l2ProxyAdminOwner`: Updates L2 contract implementations +- `systemConfigOwner`: Manages system configuration +- `unsafeBlockSigner`: Signs pre-confirmation blocks +- `batcher`: Submits L2 transactions to L1 +- `proposer`: Submits L2 state roots to L1 +- `challenger`: Monitors and challenges invalid states +
+ + + Replace all `0x...` with actual addresses from your `addresses.txt` file. + Never use the default test mnemonic addresses in production or public testnets! + +
- The `--deployment-target` flag specifies where to deploy: +## Deploy L1 Contracts - * `live`(default): Deploys directly to a live L1 network. Requires `-l1-rpc-url` and `-private-key`. - * `genesis`: Generates an L1 genesis file for local testing or development. - * `calldata`: Produces calldata for multisig wallets, enabling offline deployment. - * `noop`: Performs a dry-run without actual deployment, useful for testing configurations. +Now that your intent file is configured, let's deploy the L1 contracts: - Choose the deployment target that best fits your use case. +```bash +op-deployer apply \ + --workdir .deployer \ + --l1-rpc-url $L1_RPC_URL \ + --private-key $PRIVATE_KEY +``` - ### `inspect`: generate genesis files and chain information +This will: +1. Deploy all required L1 contracts +2. Configure them according to your intent file +3. Save deployment information to `.deployer/state.json` - - To add your chain to the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry) you will need to provide the chain artifacts. To get these chain artifacts, you will need to write the output of these commands to new files. - + + The deployment can take 10-15 minutes and requires multiple transactions. + - Inspect the `state.json` file by navigating to your working directory. With the contracts deployed, generate the genesis and rollup configuration files by running the following commands: +## Generate chain configuration - ```bash - op-deployer inspect genesis --workdir .deployer > .deployer/genesis.json - op-deployer inspect rollup --workdir .deployer > .deployer/rollup.json - ``` +After successful deployment, generate your chain configuration files: - Now that you have your `genesis.json` and `rollup.json` you can spin up a node on your network. You can also use the following inspect subcommands to get additional chain artifacts: +```bash +# Generate genesis and rollup configs +op-deployer inspect genesis --workdir .deployer 42069 > .deployer/genesis.json +op-deployer inspect rollup --workdir .deployer 42069 > .deployer/rollup.json - ```bash - op-deployer inspect l1 --workdir .deployer # outputs all L1 contract addresses for an L2 chain - op-deployer inspect deploy-config --workdir .deployer # outputs the deploy config for an L2 chain - op-deployer inspect l2-semvers --workdir .deployer # outputs the semvers for all L2 chains - ``` -
+# Get L1 contract addresses (save these!) +op-deployer inspect l1 --workdir .deployer 42069 > .deployer/l1-contracts.json +``` ## What's Next? -Great! You now have `op-deployer` installed and ready to use. -Since op-deployer handles L1 smart contract deployment automatically, you can now move on to spin up the sequencer for your rollup. +Great! You've successfully: +1. Installed `op-deployer` +2. Generated necessary key pairs +3. Created and configured your intent file +4. Deployed L1 smart contracts +5. Generated chain configuration files + +Now you can move on to setting up your sequencer node. **Next**: Set up op-geth and op-node, essential building blocks of the execution and consensus layers in your rollup. @@ -348,4 +320,4 @@ Since op-deployer handles L1 smart contract deployment automatically, you can no * **Community Support**: Join the [Optimism Discord](https://discord.gg/optimism) * **op-deployer Repository**: [GitHub](https://github.com/ethereum-optimism/optimism/tree/develop/op-deployer/cmd/op-deployer) -* **OPCM Documentation**: [OP Contracts Manager](/stack/opcm) +* **OPCM Documentation**: [OP Contracts Manager](/stack/opcm) \ No newline at end of file From cc8c5eda37a2383230df29750d48a3bde863305b Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 16:54:11 +0100 Subject: [PATCH 53/92] Refine L2 Rollup tutorials: improve clarity in op-batcher and op-deployer setup instructions, enhance formatting for better readability, and standardize steps for key generation and intent file configuration. --- .../create-l2-rollup/op-batcher-setup.mdx | 27 +- .../create-l2-rollup/op-deployer-setup.mdx | 338 +++++++++--------- .../create-l2-rollup/op-proposer-setup.mdx | 65 ++-- words.txt | 234 ++++++------ 4 files changed, 341 insertions(+), 323 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index d1a664a68..ad7c5099b 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -26,7 +26,6 @@ After you have spun up your sequencer, you need to configure a batcher to submit **Step 3 of 5**: This tutorial is designed to be followed step-by-step. Each step builds on the [previous one](/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup).
- ## Understanding the batcher's role The batcher (`op-batcher`) serves as a crucial component that bridges your L2 chain data to L1. Its primary responsibilities include: @@ -69,8 +68,7 @@ Look for the latest `op-batcher/v*` release that's compatible with your sequence For setting up the batcher, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available for more advanced users. - - + If you prefer containerized deployment, you can use the official Docker images and do the following: @@ -237,7 +235,6 @@ For setting up the batcher, we recommend using Docker as it provides a consisten ``` - ## Configuration setup @@ -249,12 +246,13 @@ For setting up the batcher, we recommend using Docker as it provides a consisten For advanced configuration options and fine-tuning your batcher, including: - - Batch submission policies - - Channel duration settings - - Data availability types (blobs vs calldata) - - Transaction throttling - - Network timeouts - + + * Batch submission policies + * Channel duration settings + * Data availability types (blobs vs calldata) + * Transaction throttling + * Network timeouts + Check out the [Batcher Configuration Reference](/operators/chain-operators/configuration/batcher). This will help you optimize your batcher's performance and cost-efficiency. @@ -469,10 +467,11 @@ Your batcher is now operational and will continuously submit L2 transaction batc **Understanding common startup messages** When starting your batcher, you might see various log messages: - - `Added L2 block to local state`: Normal operation, shows the batcher processing blocks - - `SetMaxDASize RPC method unavailable`: Expected if the `op-geth` version used doesn't support this method. - - `context canceled` errors during shutdown: Normal cleanup messages - - `Failed to query L1 tip`: Can occur during graceful shutdowns + + * `Added L2 block to local state`: Normal operation, shows the batcher processing blocks + * `SetMaxDASize RPC method unavailable`: Expected if the `op-geth` version used doesn't support this method. + * `context canceled` errors during shutdown: Normal cleanup messages + * `Failed to query L1 tip`: Can occur during graceful shutdowns Most of these messages are part of normal operation. For detailed explanations of configuration options and troubleshooting, see the [Batcher configuration reference](/operators/chain-operators/configuration/batcher). diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 9068270f7..fee3db157 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -38,45 +38,49 @@ There are a couple of ways to install `op-deployer`: ### Download the correct binary - 1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) - 2. Find the latest release that includes `op-deployer` - 3. Under **assets**, download the binary that matches your system: + 1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) + 2. Find the latest release that includes `op-deployer` + 3. Under **assets**, download the binary that matches your system: - - For Linux: `op-deployer-linux-amd64` - - For macOS: - - Apple Silicon (M1/M2): `op-deployer-darwin-arm64` - - Intel processors: `op-deployer-darwin-amd64` - - For Windows: `op-deployer-windows-amd64.exe` + * For Linux: `op-deployer-linux-amd64` + * For macOS: + * Apple Silicon (M1/M2): `op-deployer-darwin-arm64` + * Intel processors: `op-deployer-darwin-amd64` + * For Windows: `op-deployer-windows-amd64.exe` Not sure which macOS version to use? - - Open Terminal and run `uname -m` - - If it shows `arm64`, use the arm64 version - - If it shows `x86_64`, use the amd64 version + + * Open Terminal and run `uname -m` + * If it shows `arm64`, use the arm64 version + * If it shows `x86_64`, use the amd64 version ### Install the binary - 1. Rename the downloaded file to `op-deployer` - 2. Make it executable: + 1. Rename the downloaded file to `op-deployer` + 2. Make it executable: + ```bash chmod +x op-deployer ``` - 3. Move it to a directory in your system PATH: + 3. Move it to a directory in your system PATH: + ```bash # Create a bin directory if it doesn't exist mkdir -p ~/bin - + # Move the binary mv op-deployer ~/bin/ - + # Add to PATH if not already added (add this to your ~/.bashrc or ~/.zshrc) export PATH=$PATH:~/bin ``` **For macOS Users**: If you get a security warning about "unidentified developer": + ```bash # Run this command to allow the binary xattr -d com.apple.quarantine ~/bin/op-deployer @@ -88,6 +92,7 @@ There are a couple of ways to install `op-deployer`: ```bash op-deployer --version ``` + @@ -110,161 +115,172 @@ There are a couple of ways to install `op-deployer`: Before deploying your L1 contracts, you'll need: -1. **L1 RPC URL**: An Ethereum RPC endpoint for your chosen L1 network - ```bash - # Examples: - # Sepolia (recommended for testing) - L1_RPC_URL=https://sepolia.infura.io/v3/YOUR-PROJECT-ID - # or https://eth-sepolia.g.alchemy.com/v2/YOUR-API-KEY - - # Local network - L1_RPC_URL=http://localhost:8545 - ``` - - - For testing, we recommend using Sepolia testnet. You can get free RPC access from: - - [Infura](https://infura.io) (create account, get API key) - - [Alchemy](https://alchemy.com) (create account, get API key) - - [Ankr](https://ankr.com) (create account, get API key) - - -2. **Deployer Account**: An Ethereum account with sufficient ETH - - For Sepolia: 1.5-3.5 ETH recommended - - Get test ETH from [Sepolia Faucet](https://sepoliafaucet.com) +1. **L1 RPC URL**: An Ethereum RPC endpoint for your chosen L1 network + + ```bash + # Examples: + # Sepolia (recommended for testing) + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR-PROJECT-ID + # or https://eth-sepolia.g.alchemy.com/v2/YOUR-API-KEY + + # Local network + L1_RPC_URL=http://localhost:8545 + ``` + + + For testing, we recommend using Sepolia testnet. You can get free RPC access from: + + * [Infura](https://infura.io) (create account, get API key) + * [Alchemy](https://alchemy.com) (create account, get API key) + * [Ankr](https://ankr.com) (create account, get API key) + + +2. **Deployer Account**: An Ethereum account with sufficient ETH + * For Sepolia: 1.5-3.5 ETH recommended + * Get test ETH from [Sepolia Faucet](https://sepoliafaucet.com) ## Generate Deployment Keys Your rollup needs several key pairs for different roles. Let's generate them first: -### Create keys directory -```bash -mkdir -p keys -cd keys -``` - -### Generate keys for each role -```bash -# Generate 7 new Ethereum accounts -for role in admin system_config unsafe_block_signer batcher proposer challenger fee_recipient; do - cast wallet new --password "" > $role.txt -done -``` - -### Save addresses for your intent file -```bash -# Extract addresses to a summary file -echo "Generated addresses for your intent file:" > addresses.txt -for role in admin system_config unsafe_block_signer batcher proposer challenger fee_recipient; do - echo "$role: $(grep "Address:" $role.txt | cut -d' ' -f2)" >> addresses.txt -done -cat addresses.txt -``` + ### Create keys directory + + ```bash + mkdir -p keys + cd keys + ``` + + ### Generate keys for each role + + ```bash + # Generate 7 new Ethereum accounts + for role in admin system_config unsafe_block_signer batcher proposer challenger fee_recipient; do + cast wallet new --password "" > $role.txt + done + ``` + + ### Save addresses for your intent file + + ```bash + # Extract addresses to a summary file + echo "Generated addresses for your intent file:" > addresses.txt + for role in admin system_config unsafe_block_signer batcher proposer challenger fee_recipient; do + echo "$role: $(grep "Address:" $role.txt | cut -d' ' -f2)" >> addresses.txt + done + cat addresses.txt + ``` + - **Important**: - - Save these keys securely - you'll need them to operate your chain - - The private keys are in the "Private Key:" field of each file - - For production, use proper key management solutions (HSMs, multisigs) + **Important**: + + * Save these keys securely - you'll need them to operate your chain + * The private keys are in the "Private Key:" field of each file + * For production, use proper key management solutions (HSMs, multisigs) -
## Create and configure intent file The intent file defines your chain's configuration. Here's how to set it up: -### Initialize intent file - -```bash -op-deployer init \ - --l1-chain-id 11155111 \ - --l2-chain-ids 42069 \ - --workdir .deployer \ - --intent-type standard-overrides -``` - -
-Understanding intent types - -`op-deployer` supports three intent types: -- `standard`: Uses default OP Stack configuration, minimal customization -- `standard-overrides`: Recommended. Uses defaults but allows overriding specific values -- `custom`: Full customization, requires manual configuration of all values - -For most users, `standard-overrides` provides the best balance of simplicity and flexibility. -
- -### Update the intent file - -Edit `.deployer/intent.toml` with your generated addresses: - -```toml -configType = "standard-overrides" -l1ChainID = 11155111 # Sepolia -fundDevAccounts = false # Set to false for production/testnet -useInterop = false -l1ContractsLocator = "tag://op-contracts/v2.0.0" -l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" - -[superchainRoles] - proxyAdminOwner = "0x..." # admin address - protocolVersionsOwner = "0x..." # admin address - guardian = "0x..." # admin address - -[[chains]] - id = "0x000000000000000000000000000000000000000000000000000000000016de8d" - baseFeeVaultRecipient = "0x..." # fee_recipient address - l1FeeVaultRecipient = "0x..." # fee_recipient address - sequencerFeeVaultRecipient = "0x..." # fee_recipient address - eip1559DenominatorCanyon = 250 - eip1559Denominator = 50 - eip1559Elasticity = 6 - [chains.roles] - l1ProxyAdminOwner = "0x..." # admin address - l2ProxyAdminOwner = "0x..." # admin address - systemConfigOwner = "0x..." # system_config address - unsafeBlockSigner = "0x..." # unsafe_block_signer address - batcher = "0x..." # batcher address - proposer = "0x..." # proposer address - challenger = "0x..." # challenger address -``` - -
-Understanding the configuration values - -**Global Settings:** -- `l1ChainID`: The L1 network ID (11155111 for Sepolia) -- `fundDevAccounts`: Creates test accounts with ETH if true -- `useInterop`: Enable interoperability features -- `l1ContractsLocator`: Version of L1 contracts to deploy -- `l2ContractsLocator`: Version of L2 contracts to deploy - -**Superchain Roles:** -- `proxyAdminOwner`: Can upgrade Superchain-wide contracts -- `protocolVersionsOwner`: Can update protocol versions -- `guardian`: Can pause withdrawals and manage disputes - -**Chain Configuration:** -- `id`: Unique identifier for your chain -- `*FeeVaultRecipient`: Addresses receiving various fees -- `eip1559*`: Parameters for gas price calculation - -**Chain Roles:** -- `l1ProxyAdminOwner`: Updates L1 contract implementations -- `l2ProxyAdminOwner`: Updates L2 contract implementations -- `systemConfigOwner`: Manages system configuration -- `unsafeBlockSigner`: Signs pre-confirmation blocks -- `batcher`: Submits L2 transactions to L1 -- `proposer`: Submits L2 state roots to L1 -- `challenger`: Monitors and challenges invalid states -
+ ### Initialize intent file + + ```bash + op-deployer init \ + --l1-chain-id 11155111 \ + --l2-chain-ids 42069 \ + --workdir .deployer \ + --intent-type standard-overrides + ``` + +
+ Understanding intent types + + `op-deployer` supports three intent types: + + * `standard`: Uses default OP Stack configuration, minimal customization + * `standard-overrides`: Recommended. Uses defaults but allows overriding specific values + * `custom`: Full customization, requires manual configuration of all values + + For most users, `standard-overrides` provides the best balance of simplicity and flexibility. +
+ + ### Update the intent file + + Edit `.deployer/intent.toml` with your generated addresses: + + ```toml + configType = "standard-overrides" + l1ChainID = 11155111 # Sepolia + fundDevAccounts = false # Set to false for production/testnet + useInterop = false + l1ContractsLocator = "tag://op-contracts/v2.0.0" + l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" + + [superchainRoles] + proxyAdminOwner = "0x..." # admin address + protocolVersionsOwner = "0x..." # admin address + guardian = "0x..." # admin address + + [[chains]] + id = "0x000000000000000000000000000000000000000000000000000000000016de8d" + baseFeeVaultRecipient = "0x..." # fee_recipient address + l1FeeVaultRecipient = "0x..." # fee_recipient address + sequencerFeeVaultRecipient = "0x..." # fee_recipient address + eip1559DenominatorCanyon = 250 + eip1559Denominator = 50 + eip1559Elasticity = 6 + [chains.roles] + l1ProxyAdminOwner = "0x..." # admin address + l2ProxyAdminOwner = "0x..." # admin address + systemConfigOwner = "0x..." # system_config address + unsafeBlockSigner = "0x..." # unsafe_block_signer address + batcher = "0x..." # batcher address + proposer = "0x..." # proposer address + challenger = "0x..." # challenger address + ``` + +
+ Understanding the configuration values + + **Global Settings:** + + * `l1ChainID`: The L1 network ID (11155111 for Sepolia) + * `fundDevAccounts`: Creates test accounts with ETH if true + * `useInterop`: Enable interoperability features + * `l1ContractsLocator`: Version of L1 contracts to deploy + * `l2ContractsLocator`: Version of L2 contracts to deploy + + **Superchain Roles:** + + * `proxyAdminOwner`: Can upgrade Superchain-wide contracts + * `protocolVersionsOwner`: Can update protocol versions + * `guardian`: Can pause withdrawals and manage disputes + + **Chain Configuration:** + + * `id`: Unique identifier for your chain + * `*FeeVaultRecipient`: Addresses receiving various fees + * `eip1559*`: Parameters for gas price calculation + + **Chain Roles:** + + * `l1ProxyAdminOwner`: Updates L1 contract implementations + * `l2ProxyAdminOwner`: Updates L2 contract implementations + * `systemConfigOwner`: Manages system configuration + * `unsafeBlockSigner`: Signs pre-confirmation blocks + * `batcher`: Submits L2 transactions to L1 + * `proposer`: Submits L2 state roots to L1 + * `challenger`: Monitors and challenges invalid states +
+
Replace all `0x...` with actual addresses from your `addresses.txt` file. Never use the default test mnemonic addresses in production or public testnets! - ## Deploy L1 Contracts @@ -278,9 +294,10 @@ op-deployer apply \ ``` This will: -1. Deploy all required L1 contracts -2. Configure them according to your intent file -3. Save deployment information to `.deployer/state.json` + +1. Deploy all required L1 contracts +2. Configure them according to your intent file +3. Save deployment information to `.deployer/state.json` The deployment can take 10-15 minutes and requires multiple transactions. @@ -302,11 +319,12 @@ op-deployer inspect l1 --workdir .deployer 42069 > .deployer/l1-contracts.json ## What's Next? Great! You've successfully: -1. Installed `op-deployer` -2. Generated necessary key pairs -3. Created and configured your intent file -4. Deployed L1 smart contracts -5. Generated chain configuration files + +1. Installed `op-deployer` +2. Generated necessary key pairs +3. Created and configured your intent file +4. Deployed L1 smart contracts +5. Generated chain configuration files Now you can move on to setting up your sequencer node. @@ -320,4 +338,4 @@ Now you can move on to setting up your sequencer node. * **Community Support**: Join the [Optimism Discord](https://discord.gg/optimism) * **op-deployer Repository**: [GitHub](https://github.com/ethereum-optimism/optimism/tree/develop/op-deployer/cmd/op-deployer) -* **OPCM Documentation**: [OP Contracts Manager](/stack/opcm) \ No newline at end of file +* **OPCM Documentation**: [OP Contracts Manager](/stack/opcm) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index b8f68f397..34c6a1b10 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -67,38 +67,8 @@ Look for the latest `op-proposer/v*` release that's compatible with your sequenc For setting up the proposer, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available for more advanced users. - - Building from source gives you full control over the binaries. - - - ### Clone and build op-proposer - - ```bash - # If you don't already have the optimism repository from the sequencer setup - git clone https://github.com/ethereum-optimism/optimism.git - cd optimism - - # Checkout the latest release tag - git checkout op-proposer/v1.10.0 - # Build op-proposer - cd op-proposer - just - - # Binary will be available at ./bin/op-proposer - ``` - - ### Verify installation - - Run this command to verify the installation: - - ```bash - ./bin/op-proposer --version - ``` - - - - + If you prefer containerized deployment, you can use the official Docker images and do the following: @@ -156,7 +126,6 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ```yaml - ' services: op-proposer: @@ -229,6 +198,38 @@ For setting up the proposer, we recommend using Docker as it provides a consiste Your proposer is now operational and will continuously submit state roots to L1! + + + Building from source gives you full control over the binaries. + + + ### Clone and build op-proposer + + ```bash + # If you don't already have the optimism repository from the sequencer setup + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism + + # Checkout the latest release tag + git checkout op-proposer/v1.10.0 + + # Build op-proposer + cd op-proposer + just + + # Binary will be available at ./bin/op-proposer + ``` + + ### Verify installation + + Run this command to verify the installation: + + ```bash + ./bin/op-proposer --version + ``` + + +
## Configuration setup diff --git a/words.txt b/words.txt index d20533f57..65eb75e8f 100644 --- a/words.txt +++ b/words.txt @@ -1,7 +1,7 @@ -accountqueue ACCOUNTQUEUE -accountslots +accountqueue ACCOUNTSLOTS +accountslots ACDC ADDI ADDIU @@ -9,58 +9,58 @@ ADDU airgap Allnodes allocs -alphanet Alphanet -alphanets +alphanet Alphanets +alphanets altda ANDI Ankr Apeworx Arweave authrpc -autorelay Autorelay +autorelay autorelayer basefee bcde -betanet Betanet -betanets +betanet Betanets +betanets BGEZ BGTZ Biconomy BLEZ -blobpool BLOBPOOL +blobpool blobspace Blockdaemon blockhash blocklists -blocklogs BLOCKLOGS -blockprofilerate +blocklogs BLOCKPROFILERATE +blockprofilerate Blockscout -blockspace Blockspace +blockspace blocktime -blocktimes Blocktimes -bloomfilter +blocktimes BLOOMFILTER +bloomfilter BLTZ Bootcamp bootnode -bootnodes -Bootnodes BOOTNODES +Bootnodes +bootnodes bottlenecked -brotli Brotli -callouts +brotli Callouts +callouts CCIP cdef Celestia @@ -73,71 +73,71 @@ chaosnet Chugsplash Clabby codebases -collateralized Collateralized +collateralized compr Comprensive -computependingblock COMPUTEPENDINGBLOCK +computependingblock confs corsdomain counterfactually -crosschain Crosschain +crosschain Crossmint daserver -datacap DATACAP -datadir +datacap DATADIR +datadir Defi Defillama's delegatecall -devnet Devnet -devnets +devnet Devnets +devnets devs direnv -disabletxpoolgossip DISABLETXPOOLGOSSIP -discv +disabletxpoolgossip Discv +discv DIVU Drand dripcheck Drippie Eigen EIPs -enabledeprecatedpersonal ENABLEDEPRECATEDPERSONAL +enabledeprecatedpersonal enginekind -erigon Erigon -etherbase +erigon ETHERBASE +etherbase Ethernity Ethernow -ethstats ETHSTATS -evmtimeout +ethstats EVMTIMEOUT +evmtimeout executability exfiltrate -exitwhensynced EXITWHENSYNCED +exitwhensynced extensibly -extradata EXTRADATA +extradata Farcaster Faultproof -fdlimit FDLIMIT +fdlimit flashblock flashblock's -flashblocks -Flashblocks FLASHBLOCKS +Flashblocks +flashblocks Flashbots forkable forkchoice @@ -145,51 +145,51 @@ FPVM FPVMs Fraxtal Funct -gascap GASCAP +gascap gaslessly -gcmode GCMODE +gcmode Gelato gifs -globalqueue GLOBALQUEUE -globalslots +globalqueue GLOBALSLOTS +globalslots gokzg growthepie hardfork hardforks -healthcheck HEALTHCHECK +healthcheck healthchecks -historicalrpc HISTORICALRPC -historicalrpctimeout +historicalrpc HISTORICALRPCTIMEOUT -holesky -Holesky +historicalrpctimeout HOLESKY +Holesky +holesky IERC -ignoreprice IGNOREPRICE +ignoreprice Immunefi -inator Inator -influxdbv +inator INFLUXDBV +influxdbv initcode -ipcdisable IPCDISABLE +ipcdisable ipcfile -ipcpath IPCPATH +ipcpath IPFS JALR -journalremotes JOURNALREMOTES -jspath +journalremotes JSPATH +jspath jwtsecret Keccak leveldb @@ -198,34 +198,34 @@ Lisk logfile logfmt Mainnets -maxage MAXAGE -maxbackups +maxage MAXBACKUPS -maxpeers +maxbackups MAXPEERS -maxpendpeers +maxpeers MAXPENDPEERS -maxprice +maxpendpeers MAXPRICE -memprofilerate +maxprice MEMPROFILERATE -merkle +memprofilerate Merkle +merkle MFHI MFLO Mgas Minato -minfreedisk MINFREEDISK -minsuggestedpriorityfee +minfreedisk MINSUGGESTEDPRIORITYFEE +minsuggestedpriorityfee Mintable Mintplex MIPSEVM Mitigations -monitorism Monitorism +monitorism Moralis Mordor MOVN @@ -234,145 +234,145 @@ MTHI MTLO MULT multiaddr -multichain Multichain +multichain multiclient multisigs MULTU Nethermind -netrestrict NETRESTRICT -networkid +netrestrict NETWORKID -newpayload +networkid NEWPAYLOAD +newpayload nextra -nocompaction NOCOMPACTION -nodekey +nocompaction NODEKEY -nodekeyhex +nodekey NODEKEYHEX +nodekeyhex nodename Nodies -nodiscover NODISCOVER -nolocals +nodiscover NOLOCALS -noprefetch +nolocals NOPREFETCH -nopruning +noprefetch NOPRUNING -nosyncserve +nopruning NOSYNCSERVE +nosyncserve Numba NVME -offchain Offchain +offchain onlyreqtostatic opchaina opchainb -opcm OPCM +opcm Openfort oplabs opnode's outfile outperformance pcscdpath -pectra Pectra +pectra Pectra's -peerstore Peerstore +peerstore peerstores -permissioned Permissioned +permissioned permissioning -permissionless Permissionless +permissionless permissionlessly Perps Peta Pimlico POAP POAPs -pprof PPROF -precommitments +pprof Precommitments +precommitments preconfigured predeploy -predeployed Predeployed -predeploys +predeployed Predeploys +predeploys prefunded -preimage Preimage -preimages +preimage PREIMAGES +preimages preinstall -preinstalls Preinstalls -prestate +preinstalls Prestate +prestate prestates PREVRANDAO -pricebump PRICEBUMP -pricelimit +pricebump PRICELIMIT +pricelimit productionize productionized Protip Proxied -proxyd Proxyd +proxyd Pyth Pyth's QRNG -quicknode Quicknode +quicknode quickstarts rebalancing reemit Reemitting -regenesis Regenesis +regenesis Reimagine -rejournal REJOURNAL -remotedb +rejournal REMOTEDB +remotedb Reown Reown's replayability replayor reposts reproven -requiredblocks REQUIREDBLOCKS +requiredblocks rollouts -rollups Rollups +rollups Routescan rpckind -rpcprefix RPCPREFIX +rpcprefix rpcs RPGF -runbooks Runbooks +runbooks RWAs safedb Schnorr -sepolia -Sepolia SEPOLIA +Sepolia +sepolia seqnr -sequencerhttp SEQUENCERHTTP +sequencerhttp serv signup SLLV @@ -381,16 +381,16 @@ SLTIU SLTU smartcard snapshotlog -snapsync Snapsync +snapsync Solana Soneium soyboy Spearbit SRAV SRLV -stablecoins Stablecoins +stablecoins statefulset structs subcomponents @@ -399,21 +399,21 @@ subheaders subsecond SUBU Sunnyside -superchain -Superchain SUPERCHAIN +Superchain +superchain Superchain's superchainerc Superlend Superloans Superscan Superseed -supersim Supersim -syncmode +supersim SYNCMODE -synctarget +syncmode SYNCTARGET +synctarget syscalls SYSCON thirdweb @@ -427,8 +427,8 @@ Twei txfeecap txmgr txns -txpool TXPOOL +txpool txproxy txproxyd uncensorable @@ -438,21 +438,21 @@ Unichain Unprotect unsubmitted UPNP -verkle VERKLE -vhosts +verkle VHOSTS -viem +vhosts Viem -viem's +viem Viem's -vmdebug +viem's VMDEBUG -vmodule +vmdebug VMODULE +vmodule xlarge XORI ZKPs ZKVM -zora Zora +zora From 2ee8ecfc142e4101e27219ba37adcff1916f86e1 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 16:58:58 +0100 Subject: [PATCH 54/92] Remove unnecessary single quotes from YAML code blocks in op-challenger and spin-batcher documentation for improved clarity and formatting consistency. --- pages/operators/chain-operators/deploy/op-challenger.mdx | 1 - pages/operators/chain-operators/deploy/spin-batcher.mdx | 1 - 2 files changed, 2 deletions(-) diff --git a/pages/operators/chain-operators/deploy/op-challenger.mdx b/pages/operators/chain-operators/deploy/op-challenger.mdx index 7b084909d..a28d24a48 100644 --- a/pages/operators/chain-operators/deploy/op-challenger.mdx +++ b/pages/operators/chain-operators/deploy/op-challenger.mdx @@ -569,7 +569,6 @@ All governance approved releases use a tagged version of `op-program`. These can Create a `docker-compose.yml` file that defines the challenger service: ```yaml -' services: challenger: diff --git a/pages/operators/chain-operators/deploy/spin-batcher.mdx b/pages/operators/chain-operators/deploy/spin-batcher.mdx index 6c0947a32..25da7f6de 100644 --- a/pages/operators/chain-operators/deploy/spin-batcher.mdx +++ b/pages/operators/chain-operators/deploy/spin-batcher.mdx @@ -158,7 +158,6 @@ If you prefer containerized deployment, you can use the official Docker images. ```yaml - ' services: op-batcher: From 3c31ed15c42e767d9999c02c811f282016a6fbc3 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 17:08:12 +0100 Subject: [PATCH 55/92] Update L2 Rollup tutorials: change L2 and Rollup RPC URLs from sequencer-node to op-geth and op-node for consistency across documentation. --- .../operators/chain-operators/deploy/spin-batcher.mdx | 4 ++-- .../tutorials/create-l2-rollup/op-batcher-setup.mdx | 4 ++-- .../tutorials/create-l2-rollup/op-proposer-setup.mdx | 11 ++++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pages/operators/chain-operators/deploy/spin-batcher.mdx b/pages/operators/chain-operators/deploy/spin-batcher.mdx index 25da7f6de..adbc646b1 100644 --- a/pages/operators/chain-operators/deploy/spin-batcher.mdx +++ b/pages/operators/chain-operators/deploy/spin-batcher.mdx @@ -126,8 +126,8 @@ If you prefer containerized deployment, you can use the official Docker images. L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY # L2 Configuration - Should match your sequencer setup - L2_RPC_URL=http://sequencer-node:8545 - ROLLUP_RPC_URL=http://sequencer-node:8547 + L2_RPC_URL=http://op-geth:8545 + ROLLUP_RPC_URL=http://op-node:8547 # Contract addresses - Extract from your op-deployer output BATCH_INBOX_ADDRESS=YOUR_ACTUAL_BATCH_INBOX_ADDRESS diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index ad7c5099b..456ffe5eb 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -97,8 +97,8 @@ For setting up the batcher, we recommend using Docker as it provides a consisten L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY # L2 Configuration - Should match your sequencer setup - L2_RPC_URL=http://sequencer-node:8545 - ROLLUP_RPC_URL=http://sequencer-node:8547 + L2_RPC_URL=http://op-geth:8545 + ROLLUP_RPC_URL=http://op-node:8547 # Contract addresses - Extract from your op-deployer output BATCH_INBOX_ADDRESS=YOUR_ACTUAL_BATCH_INBOX_ADDRESS diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index 34c6a1b10..ec80518c4 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -97,8 +97,8 @@ For setting up the proposer, we recommend using Docker as it provides a consiste L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY # L2 Configuration - Should match your sequencer setup - L2_RPC_URL=http://sequencer-node:8545 - ROLLUP_RPC_URL=http://sequencer-node:8547 + L2_RPC_URL=http://op-geth:8545 + ROLLUP_RPC_URL=http://op-node:8547 # Contract addresses - Extract from your op-deployer output GAME_FACTORY_ADDRESS=YOUR_ACTUAL_GAME_FACTORY_ADDRESS @@ -154,11 +154,12 @@ For setting up the proposer, we recommend using Docker as it provides a consiste - "--log.level=info" restart: unless-stopped networks: - - op-stack - + - sequencer-node_default + networks: - op-stack: + sequencer-node_default: external: true + ``` ### Start the proposer service From 0258a0ccfc0a4ef980fe3d984558917f7149cfcc Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 17:21:26 +0100 Subject: [PATCH 56/92] Enhance op-proposer setup documentation: improve formatting in Docker setup instructions, add detailed information on proposer startup logs, and clarify expected log messages during initialization and syncing. --- .../create-l2-rollup/op-proposer-setup.mdx | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index ec80518c4..c20cddb02 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -67,8 +67,7 @@ Look for the latest `op-proposer/v*` release that's compatible with your sequenc For setting up the proposer, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available for more advanced users. - - + If you prefer containerized deployment, you can use the official Docker images and do the following: @@ -155,7 +154,7 @@ For setting up the proposer, we recommend using Docker as it provides a consiste restart: unless-stopped networks: - sequencer-node_default - + networks: sequencer-node_default: external: true @@ -199,7 +198,7 @@ For setting up the proposer, we recommend using Docker as it provides a consiste Your proposer is now operational and will continuously submit state roots to L1! - + Building from source gives you full control over the binaries. @@ -230,7 +229,6 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ``` - ## Configuration setup @@ -428,6 +426,32 @@ Your final directory structure should look like: Your proposer is now operational! + + **Understanding proposer startup logs** + + When you first start your proposer, you'll see several types of log messages: + + 1. **Initialization messages** (normal): + ``` + lvl=info msg="Initializing L2Output Submitter" + lvl=info msg="Connected to DisputeGameFactory" + lvl=info msg="Starting JSON-RPC server" + ``` + + 2. **Sync status messages** (expected during startup): + ``` + msg="rollup current L1 block still behind target, retrying" + current_l1=...:9094035 target_l1=9132815 + ``` + This is normal! It means: + * Your rollup is still syncing with L1 (e.g., Sepolia) + * The proposer is waiting until sync is closer to L1 tip + * You'll see the `current_l1` number increasing as it catches up + * Once caught up, the proposer will start submitting proposals + + Don't worry about the "retrying" messages - they show healthy progress as your rollup catches up to the latest L1 blocks. + + ## What's Next? Perfect! Your proposer is submitting state roots to L1. The final step is to set up the challenger to monitor and respond to disputes. From 29e18a4209a35cfe14b98248238e1658c68a8a29 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 17:25:03 +0100 Subject: [PATCH 57/92] Standardize section headings in op-deployer setup documentation: change "L1 Network Requirements" to "L1 network requirements" and "Generate Deployment Keys" to "Generate deployment keys" for consistency and improved readability. --- .../tutorials/create-l2-rollup/op-deployer-setup.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index fee3db157..8219d0c81 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -111,7 +111,7 @@ There are a couple of ways to install `op-deployer`: -## L1 Network Requirements +## L1 network requirements Before deploying your L1 contracts, you'll need: @@ -139,7 +139,7 @@ Before deploying your L1 contracts, you'll need: * For Sepolia: 1.5-3.5 ETH recommended * Get test ETH from [Sepolia Faucet](https://sepoliafaucet.com) -## Generate Deployment Keys +## Generate deployment keys Your rollup needs several key pairs for different roles. Let's generate them first: From d7f9054b72508a0c8dee76eede3b2d84f64f9105 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 17:25:44 +0100 Subject: [PATCH 58/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../tutorials/create-l2-rollup/op-geth-setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 71282e85c..b439548ec 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -24,7 +24,7 @@ Now that you have op-deployer configured, it's time to spin up the sequencer for **Step 2 of 5**: This tutorial builds on [Spin up op-deployer](./op-deployer-setup). Make sure you've completed that first. -## What You'll Set Up +## What you'll set up The sequencer node consists of two core components: From 5bfc94e5d589a36c871d52413749324f58ba6bd0 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 17:26:46 +0100 Subject: [PATCH 59/92] Update op-geth setup documentation: add a link to the latest op-node release for clarity and remove unnecessary formatting elements for improved readability. --- .../tutorials/create-l2-rollup/op-geth-setup.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index b439548ec..4dff355bd 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -41,11 +41,9 @@ The sequencer is responsible for: To ensure you're using the latest compatible versions of OP Stack components, always check the official [release page](https://github.com/ethereum-optimism/optimism/releases). -*** - The main components you'll need for sequencer deployment are: -* `op-node`: Look for the latest `op-node/v*` release +* `op-node`: Look for the latest `op-node/v*` [release](https://github.com/ethereum-optimism/optimism/releases) * `op-geth`: Look for the latest `op-geth/v*` [release](https://github.com/ethereum-optimism/op-geth/releases) From 398927a97eb44d7db86c176579a78547b7bade60 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 17:29:58 +0100 Subject: [PATCH 60/92] Improve op-proposer setup documentation: add troubleshooting tips for Docker networking issues, including common fixes for connectivity errors between proposer and sequencer. --- .../tutorials/create-l2-rollup/op-proposer-setup.mdx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index c20cddb02..1d4702c20 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -120,8 +120,12 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ### Create docker-compose.yml - This configuration assumes your sequencer is running in a Docker container named `sequencer-node` on the same `op-stack` network. - Make sure your sequencer is running before starting the proposer. + **Docker Networking**: If you get "failed to dial address" errors, ensure your proposer is in the same Docker network as your sequencer. + + Common fixes: + * Add `networks: - sequencer-node_default` to your proposer's docker-compose.yml + * Use service names like `op-geth:8545` and `op-node:8547` in your `.env` file + * Verify your sequencer network name with `docker network ls` ```yaml From a851f1c514456f83367f7a789472f0ad2c2d8dfd Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 18:14:32 +0100 Subject: [PATCH 61/92] Enhance op-proposer setup documentation: improve formatting and clarity in workspace organization, environment variable setup, and proposer startup instructions. Add detailed explanations for log messages during proposer initialization and syncing, along with troubleshooting tips for common connectivity issues. --- .../create-l2-rollup/op-proposer-setup.mdx | 379 +++++++++--------- 1 file changed, 183 insertions(+), 196 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index 1d4702c20..9e18689a8 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -120,12 +120,13 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ### Create docker-compose.yml - **Docker Networking**: If you get "failed to dial address" errors, ensure your proposer is in the same Docker network as your sequencer. + If you get "failed to dial address" errors, ensure your proposer is in the same Docker network as your sequencer. - Common fixes: - * Add `networks: - sequencer-node_default` to your proposer's docker-compose.yml - * Use service names like `op-geth:8545` and `op-node:8547` in your `.env` file - * Verify your sequencer network name with `docker network ls` + Common fixes: + + * Add `networks: - sequencer-node_default` to your proposer's docker-compose.yml + * Use service names like `op-geth:8545` and `op-node:8547` in your `.env` file + * Verify your sequencer network name with `docker network ls` ```yaml @@ -181,11 +182,6 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ### Verify proposer is running ```bash - # Check proposer RPC is responding - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"optimism_outputAtBlock","params":["latest"],"id":1}' \ - http://localhost:8560 - # Check container status docker-compose ps ``` @@ -200,7 +196,44 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ``` +
+ Understanding proposer startup logs + + When you first start your proposer, you'll see several types of log messages: + + 1. **Initialization messages** (normal): + ``` + lvl=info msg="Initializing L2Output Submitter" + lvl=info msg="Connected to DisputeGameFactory" + lvl=info msg="Starting JSON-RPC server" + ``` + + 2. **Sync status messages** (expected during startup): + ``` + msg="rollup current L1 block still behind target, retrying" + current_l1=...:9094035 target_l1=9132815 + ``` + This is normal! It means: + * Your rollup is still syncing with L1 (e.g., Sepolia) + * The proposer is waiting until sync is closer to L1 tip + * You'll see the `current_l1` number increasing as it catches up + * Once caught up, the proposer will start submitting proposals + + Don't worry about the "retrying" messages - they show healthy progress as your rollup catches up to the latest L1 blocks. + + **Common log patterns:** + + * Startup: You'll see initialization messages as services start + * Sync: "block still behind target" messages while catching up + * Normal operation: Regular proposal submissions once synced + * Network: Connection messages to L1/L2 endpoints + + If you see errors about "failed to dial" or connection issues: + * For source build: Verify your localhost ports and services +
+ Your proposer is now operational and will continuously submit state roots to L1! + @@ -232,229 +265,183 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ./bin/op-proposer --version ``` - - - -## Configuration setup - - The rest of this guide assumes you're using the **build-from-source** approach. - If you chose Docker, all the necessary configuration was covered in the Docker tab above. - - - - ### Organize your workspace + ## Configuration setup - Create your proposer working directory at the same level as your sequencer: + + The rest of this guide assumes you're using the **build-from-source** approach. + If you chose Docker, all the necessary configuration was covered in the Docker tab above. + - ```bash - # Create proposer directory at the same level as your sequencer - mkdir proposer-node - cd proposer-node - - # Create scripts directory - mkdir scripts - ``` + + ### Organize your workspace - ### Extract DisputeGameFactory address + Create your proposer working directory at the same level as your sequencer: - Extract the `DisputeGameFactory` contract address from your op-deployer output: + ```bash + # Create proposer directory at the same level as your sequencer + mkdir proposer-node + cd proposer-node - ```bash - # Navigate to proposer directory - cd proposer-node + # Create scripts directory + mkdir scripts + ``` - # Copy the state.json from .deployer directory created while using op-deployer - # Update the path if your .deployer directory is located elsewhere - cp ../.deployer/state.json . + ### Extract DisputeGameFactory address - # Extract the DisputeGameFactory address - GAME_FACTORY_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].disputeGameFactoryProxyAddress') - echo "DisputeGameFactory Address: $GAME_FACTORY_ADDRESS" - ``` + Extract the `DisputeGameFactory` contract address from your op-deployer output: - - The proposer only needs the `DisputeGameFactory` address to submit proposals. - The `GAME_TYPE=0` represents the standard fault proof game type. - + ```bash + # Navigate to proposer directory + cd proposer-node - ### Set up environment variables + # Copy the state.json from .deployer directory created while using op-deployer + # Update the path if your .deployer directory is located elsewhere + cp ../.deployer/state.json . - Create your `.env` file with the actual values: + # Extract the DisputeGameFactory address + GAME_FACTORY_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].disputeGameFactoryProxyAddress') + echo "DisputeGameFactory Address: $GAME_FACTORY_ADDRESS" + ``` - ```bash - # Create .env file with your actual values - # L1 Configuration - Replace with your actual RPC URL - L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + + The proposer only needs the `DisputeGameFactory` address to submit proposals. + The `GAME_TYPE=0` represents the standard fault proof game type. + - # L2 Configuration - Should match your sequencer setup - L2_RPC_URL=http://localhost:8545 - ROLLUP_RPC_URL=http://localhost:8547 + ### Set up environment variables - # Contract addresses - Extract from your op-deployer output - GAME_FACTORY_ADDRESS=YOUR_ACTUAL_GAME_FACTORY_ADDRESS + Create your `.env` file with the actual values: - # Private key - Replace with your actual private key - PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + ```bash + # Create .env file with your actual values + # L1 Configuration - Replace with your actual RPC URL + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY - # Proposer configuration - PROPOSAL_INTERVAL=3600s - GAME_TYPE=0 - POLL_INTERVAL=20s + # L2 Configuration - Should match your sequencer setup + L2_RPC_URL=http://localhost:8545 + ROLLUP_RPC_URL=http://localhost:8547 - # RPC configuration - PROPOSER_RPC_PORT=8560 - ``` + # Contract addresses - Extract from your op-deployer output + GAME_FACTORY_ADDRESS=YOUR_ACTUAL_GAME_FACTORY_ADDRESS - **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values! + # Private key - Replace with your actual private key + PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY - ### Get your private key + # Proposer configuration + PROPOSAL_INTERVAL=3600s + GAME_TYPE=0 + POLL_INTERVAL=20s - Get a private key from your wallet that will be used for submitting proposals to L1. This account needs sufficient ETH to pay for L1 gas costs. + # RPC configuration + PROPOSER_RPC_PORT=8560 + ``` - - The proposer account needs to be funded with ETH on L1 to pay for proposal submission transactions. Monitor this account's balance regularly as it will consume ETH for each proposal submission. - - + **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values! -## Proposer configuration + ### Get your private key -Create `scripts/start-proposer.sh`: + Get a private key from your wallet that will be used for submitting proposals to L1. This account needs sufficient ETH to pay for L1 gas costs. -```bash -#!/bin/bash + + The proposer account needs to be funded with ETH on L1 to pay for proposal submission transactions. Monitor this account's balance regularly as it will consume ETH for each proposal submission. + + -source .env + ## Proposer configuration + + Create `scripts/start-proposer.sh`: + + ```bash + #!/bin/bash + + source .env + + # Path to the op-proposer binary we built + ../optimism/op-proposer/bin/op-proposer \ + --poll-interval=$POLL_INTERVAL \ + --rpc.port=$PROPOSER_RPC_PORT \ + --rpc.enable-admin \ + --rollup-rpc=$ROLLUP_RPC_URL \ + --l1-eth-rpc=$L1_RPC_URL \ + --private-key=$PRIVATE_KEY \ + --game-factory-address=$GAME_FACTORY_ADDRESS \ + --game-type=$GAME_TYPE \ + --proposal-interval=$PROPOSAL_INTERVAL \ + --num-confirmations=1 \ + --resubmission-timeout=30s \ + --wait-node-sync=true \ + --log.level=info + ``` + + Your final directory structure should look like: + + ```bash + ~/ + ├── optimism/ # Contains op-proposer binary + ├── sequencer-node/ # Your sequencer setup + ├── .deployer/ # From op-deployer + │ └── state.json + └── proposer-node/ # Your proposer working directory + ├── state.json # Copied from .deployer + ├── .env + └── scripts/ + └── start-proposer.sh + ``` + + ## Starting the proposer -# Path to the op-proposer binary we built -../optimism/op-proposer/bin/op-proposer \ - --poll-interval=$POLL_INTERVAL \ - --rpc.port=$PROPOSER_RPC_PORT \ - --rpc.enable-admin \ - --rollup-rpc=$ROLLUP_RPC_URL \ - --l1-eth-rpc=$L1_RPC_URL \ - --private-key=$PRIVATE_KEY \ - --game-factory-address=$GAME_FACTORY_ADDRESS \ - --game-type=$GAME_TYPE \ - --proposal-interval=$PROPOSAL_INTERVAL \ - --num-confirmations=1 \ - --resubmission-timeout=30s \ - --wait-node-sync=true \ - --log.level=info -``` + + ### Start the proposer -Your final directory structure should look like: + ```bash + # Make the script executable + chmod +x scripts/start-proposer.sh -```bash -~/ -├── optimism/ # Contains op-proposer binary -├── sequencer-node/ # Your sequencer setup -├── .deployer/ # From op-deployer -│ └── state.json -└── proposer-node/ # Your proposer working directory - ├── state.json # Copied from .deployer - ├── .env - └── scripts/ - └── start-proposer.sh -``` + # Start the proposer + ./scripts/start-proposer.sh + ``` + -## Starting the proposer +
+ Understanding proposer startup logs - - ### Verify prerequisites - - Ensure your sequencer and op-node are running: - - ```bash - # Test L1 connectivity - # Note: Make sure you have exported these environment variables to your current shell session: - # export L1_RPC_URL="https://sepolia.infura.io/v3/YOUR_KEY" - # export L2_RPC_URL="http://localhost:8545" - # export ROLLUP_RPC_URL="http://localhost:8547" + When you first start your proposer, you'll see several types of log messages: - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - $L1_RPC_URL + 1. **Initialization messages** (normal): + ``` + lvl=info msg="Initializing L2Output Submitter" + lvl=info msg="Connected to DisputeGameFactory" + lvl=info msg="Starting JSON-RPC server" + ``` - # Test L2 connectivity - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - $L2_RPC_URL - - # Test rollup node connectivity - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' \ - $ROLLUP_RPC_URL - ``` - - ### Start the proposer - - ```bash - # Make the script executable - chmod +x scripts/start-proposer.sh - - # Start the proposer - ./scripts/start-proposer.sh - ``` - - -## Verification - - - ### Check proposer status - - Verify your proposer is working correctly: - - ```bash - # Monitor proposal activity - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"optimism_outputAtBlock","params":["latest"],"id":1}' \ - http://localhost:8560 - - # Check if your proposer address has enough ETH for gas - # (Replace with your actual proposer address) - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xYOUR_PROPOSER_ADDRESS","latest"],"id":1}' \ - $L1_RPC_URL - ``` - - ### Verify proposer RPC - - ```bash - # Check proposer RPC is responding - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"optimism_outputAtBlock","params":["latest"],"id":1}' \ - http://localhost:8560 - ``` - - -Your proposer is now operational! + 2. **Sync status messages** (expected during startup): + ``` + msg="rollup current L1 block still behind target, retrying" + current_l1=...:9094035 target_l1=9132815 + ``` + This is normal! It means: + * Your rollup is still syncing with L1 (e.g., Sepolia) + * The proposer is waiting until sync is closer to L1 tip + * You'll see the `current_l1` number increasing as it catches up + * Once caught up, the proposer will start submitting proposals - - **Understanding proposer startup logs** + Don't worry about the "retrying" messages - they show healthy progress as your rollup catches up to the latest L1 blocks. - When you first start your proposer, you'll see several types of log messages: + **Common log patterns:** - 1. **Initialization messages** (normal): - ``` - lvl=info msg="Initializing L2Output Submitter" - lvl=info msg="Connected to DisputeGameFactory" - lvl=info msg="Starting JSON-RPC server" - ``` + * Startup: You'll see initialization messages as services start + * Sync: "block still behind target" messages while catching up + * Normal operation: Regular proposal submissions once synced + * Network: Connection messages to L1/L2 endpoints - 2. **Sync status messages** (expected during startup): - ``` - msg="rollup current L1 block still behind target, retrying" - current_l1=...:9094035 target_l1=9132815 - ``` - This is normal! It means: - * Your rollup is still syncing with L1 (e.g., Sepolia) - * The proposer is waiting until sync is closer to L1 tip - * You'll see the `current_l1` number increasing as it catches up - * Once caught up, the proposer will start submitting proposals + If you see errors about "failed to dial" or connection issues: - Don't worry about the "retrying" messages - they show healthy progress as your rollup catches up to the latest L1 blocks. - + * For Docker: Check your network configuration and service names +
+ Your proposer is now operational! + + ## What's Next? From 885a86c485581c28b3070b8dabe003bcc208de85 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 18:36:21 +0100 Subject: [PATCH 62/92] Update op-challenger setup documentation: rename L2 genesis file for consistency, add detailed Docker setup instructions, and streamline environment variable configuration steps for improved clarity. --- .../create-l2-rollup/op-challenger-setup.mdx | 180 +++++++++--------- 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 4deaf122f..a66719319 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -58,7 +58,7 @@ Before configuring your challenger, complete the following steps: * `prestate.json` - The absolute prestate file generated in step 1 * `rollup.json` - Rollup configuration file from the `op-deployer` guide - * `genesis-l2.json` - L2 genesis file from the `op-deployer` guide + * `genesis.json` - L2 genesis file from the `op-deployer` guide ### Finding the current stable releases @@ -76,6 +76,95 @@ Always check the release notes to ensure you're using compatible versions with y For challenger deployment, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available for more advanced users. + + + ### Docker Setup + + The Docker setup provides a containerized environment for running the challenger. This method uses the official Docker image that includes embedded `op-program` server and Cannon executable. + + + ### Create environment file + + First, create a `.env` file with your configuration values. This file will be used by Docker Compose to set up the environment variables: + + ```bash + # Create .env file with your actual values + cat > .env << 'EOF' + # L1 Configuration - Replace with your actual RPC URLs + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + L1_BEACON=http://sepolia-cl-1:5051 + + # L2 Configuration - Replace with your actual node endpoints + L2_RPC_URL=http://localhost:8545 + ROLLUP_RPC_URL=http://localhost:8547 + + # Wallet configuration - Choose either mnemonic + HD path OR private key + MNEMONIC="test test test test test test test test test test test junk" + HD_PATH="m/44'/60'/0'/0/0" + + # Network configuration + NETWORK=op-sepolia + GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS + EOF + ``` + + **Important:** Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. + + ### Set up Docker Compose + + Create a `docker-compose.yml` file that defines the challenger service: + + ```yaml + + services: + challenger: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.5.0 + user: "1000" + volumes: + - ./challenger-data:/data + - ./rollup.json:/workspace/rollup.json:ro + - ./genesis-l2.json:/workspace/genesis-l2.json:ro + environment: + - L1_RPC_URL=${L1_RPC_URL} + - L1_BEACON=${L1_BEACON} + - L2_RPC_URL=${L2_RPC_URL} + - ROLLUP_RPC_URL=${ROLLUP_RPC_URL} + - MNEMONIC=${MNEMONIC} + - HD_PATH=${HD_PATH} + - NETWORK=${NETWORK} + - GAME_FACTORY_ADDRESS=${GAME_FACTORY_ADDRESS} + command: + - "op-challenger" + - "--l1-eth-rpc=${L1_RPC_URL}" + - "--l1-beacon=${L1_BEACON}" + - "--l2-eth-rpc=${L2_RPC_URL}" + - "--rollup-rpc=${ROLLUP_RPC_URL}" + - "--selective-claim-resolution" + - "--mnemonic=${MNEMONIC}" + - "--hd-path=${HD_PATH}" + - "--network=${NETWORK}" + - "--game-factory-address=${GAME_FACTORY_ADDRESS}" + - "--datadir=/data" + - "--cannon-prestate=/workspace/prestate-proof.json" + restart: unless-stopped + ports: + - "8548:8548" # If challenger exposes metrics endpoint + ``` + + ### Launch the challenger + + Start the challenger service and monitor its logs: + + ```bash + # Start the challenger service + docker-compose up -d + + # View logs + docker-compose logs -f challenger + ``` + + + ### Build and Configure @@ -369,95 +458,6 @@ For challenger deployment, we recommend using Docker as it provides a consistent --hd-path "$HD_PATH" ``` - - - ### Docker Setup - - The Docker setup provides a containerized environment for running the challenger. This method uses the official Docker image that includes embedded `op-program` server and Cannon executable. - - - ### Create environment file - - First, create a `.env` file with your configuration values. This file will be used by Docker Compose to set up the environment variables: - - ```bash - # Create .env file with your actual values - cat > .env << 'EOF' - # L1 Configuration - Replace with your actual RPC URLs - L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY - L1_BEACON=http://sepolia-cl-1:5051 - - # L2 Configuration - Replace with your actual node endpoints - L2_RPC_URL=http://localhost:8545 - ROLLUP_RPC_URL=http://localhost:8547 - - # Wallet configuration - Choose either mnemonic + HD path OR private key - MNEMONIC="test test test test test test test test test test test junk" - HD_PATH="m/44'/60'/0'/0/0" - - # Network configuration - NETWORK=op-sepolia - GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS - EOF - ``` - - **Important:** Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. - - ### Set up Docker Compose - - Create a `docker-compose.yml` file that defines the challenger service: - - ```yaml - ' - - services: - challenger: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.5.0 - user: "1000" - volumes: - - ./challenger-data:/data - - ./rollup.json:/workspace/rollup.json:ro - - ./genesis-l2.json:/workspace/genesis-l2.json:ro - environment: - - L1_RPC_URL=${L1_RPC_URL} - - L1_BEACON=${L1_BEACON} - - L2_RPC_URL=${L2_RPC_URL} - - ROLLUP_RPC_URL=${ROLLUP_RPC_URL} - - MNEMONIC=${MNEMONIC} - - HD_PATH=${HD_PATH} - - NETWORK=${NETWORK} - - GAME_FACTORY_ADDRESS=${GAME_FACTORY_ADDRESS} - command: - - "op-challenger" - - "--l1-eth-rpc=${L1_RPC_URL}" - - "--l1-beacon=${L1_BEACON}" - - "--l2-eth-rpc=${L2_RPC_URL}" - - "--rollup-rpc=${ROLLUP_RPC_URL}" - - "--selective-claim-resolution" - - "--mnemonic=${MNEMONIC}" - - "--hd-path=${HD_PATH}" - - "--network=${NETWORK}" - - "--game-factory-address=${GAME_FACTORY_ADDRESS}" - - "--datadir=/data" - - "--cannon-prestate=/workspace/prestate-proof.json" - restart: unless-stopped - ports: - - "8548:8548" # If challenger exposes metrics endpoint - ``` - - ### Launch the challenger - - Start the challenger service and monitor its logs: - - ```bash - # Start the challenger service - docker-compose up -d - - # View logs - docker-compose logs -f challenger - ``` - - ## Initializing and starting the challenger From fb8fc4d9d83bca90ab47cd75cbd3c2ca6530ecf3 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 19:03:52 +0100 Subject: [PATCH 63/92] Enhance op-challenger and op-proposer setup documentation: streamline absolute prestate generation instructions, add detailed steps for generating prestate, and improve formatting for clarity and consistency. --- .../create-l2-rollup/op-challenger-setup.mdx | 5 +-- .../create-l2-rollup/op-proposer-setup.mdx | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index a66719319..83d4edd51 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -46,8 +46,7 @@ Before configuring your challenger, complete the following steps: ### Deploy OP Stack chain with fault proofs enabled - * L1 contracts [deployed with dispute game factory](/operators/chain-operators/tutorials/dispute-games) - * [Generate an absolute prestate](/operators/chain-operators/tutorials/absolute-prestate#generating-the-absolute-prestate) for your network version - This is critical as the challenger will refuse to interact with games if it doesn't have the matching prestate +* [Generate an absolute prestate](/operators/chain-operators/tutorials/absolute-prestate#generating-the-absolute-prestate) for your network version - This is critical as the challenger will refuse to interact with games if it doesn't have the matching prestate ### Set up required infrastructure access @@ -115,7 +114,7 @@ For challenger deployment, we recommend using Docker as it provides a consistent Create a `docker-compose.yml` file that defines the challenger service: ```yaml - + services: challenger: image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.5.0 diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index 9e18689a8..d49f65d70 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -53,6 +53,51 @@ Before setting up your proposer, ensure you have: * Your L2 chain ID and network configuration * L1 network details (chain ID, RPC endpoints) +
+Generate absolute prestate (Required) + +The challenger needs the absolute prestate to participate in dispute games. Here's how to generate it: + +1. **Clone and checkout the correct version**: + ```bash + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism + git checkout op-program/v1.6.1 # Use the latest stable version + git submodule update --init --recursive + ``` + +2. **Copy your chain configuration**: + ```bash + # Replace 67865 with your L2 chain ID + cp /path/to/rollup.json op-program/chainconfig/configs/67865-rollup.json + cp /path/to/genesis.json op-program/chainconfig/configs/67865-genesis.json + ``` + +3. **Generate the prestate**: + ```bash + make reproducible-prestate + ``` + You'll see output like: + ```bash + -------------------- Production Prestates -------------------- + Cannon64 Absolute prestate hash: + 0x03eb07101fbdeaf3f04d9fb76526362c1eea2824e4c6e970bdb19675b72e4fc8 + ``` + +4. **Prepare the preimage file**: + ```bash + cd op-program/bin + mv prestate-mt64.bin.gz 0x[CANNON64_PRESTATE_HASH].bin.gz + ``` + Replace `[CANNON64_PRESTATE_HASH]` with the actual hash from step 3. + + + - Use the `Cannon64` hash for production + - Keep this file accessible - you'll need it for the challenger setup + - For Superchain registry chains, you can find official prestates in the [registry](https://github.com/ethereum-optimism/superchain-registry/blob/main/validation/standard/standard-prestates.toml) + +
+ ### Finding the current stable releases To ensure you're using the latest compatible versions of OP Stack components, always check the official [releases page](https://github.com/ethereum-optimism/optimism/releases). From ebabda2e8e2a71ea779ea398c18baa73df4e7c98 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 19:04:33 +0100 Subject: [PATCH 64/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../create-l2-rollup/op-proposer-setup.mdx | 87 ++++++++++--------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index d49f65d70..b643b92fa 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -54,48 +54,48 @@ Before setting up your proposer, ensure you have: * L1 network details (chain ID, RPC endpoints)
-Generate absolute prestate (Required) - -The challenger needs the absolute prestate to participate in dispute games. Here's how to generate it: - -1. **Clone and checkout the correct version**: - ```bash - git clone https://github.com/ethereum-optimism/optimism.git - cd optimism - git checkout op-program/v1.6.1 # Use the latest stable version - git submodule update --init --recursive - ``` - -2. **Copy your chain configuration**: - ```bash - # Replace 67865 with your L2 chain ID - cp /path/to/rollup.json op-program/chainconfig/configs/67865-rollup.json - cp /path/to/genesis.json op-program/chainconfig/configs/67865-genesis.json - ``` - -3. **Generate the prestate**: - ```bash - make reproducible-prestate - ``` - You'll see output like: - ```bash - -------------------- Production Prestates -------------------- - Cannon64 Absolute prestate hash: - 0x03eb07101fbdeaf3f04d9fb76526362c1eea2824e4c6e970bdb19675b72e4fc8 - ``` - -4. **Prepare the preimage file**: - ```bash - cd op-program/bin - mv prestate-mt64.bin.gz 0x[CANNON64_PRESTATE_HASH].bin.gz - ``` - Replace `[CANNON64_PRESTATE_HASH]` with the actual hash from step 3. + Generate absolute prestate (Required) - - - Use the `Cannon64` hash for production - - Keep this file accessible - you'll need it for the challenger setup - - For Superchain registry chains, you can find official prestates in the [registry](https://github.com/ethereum-optimism/superchain-registry/blob/main/validation/standard/standard-prestates.toml) - + The challenger needs the absolute prestate to participate in dispute games. Here's how to generate it: + + 1. **Clone and checkout the correct version**: + ```bash + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism + git checkout op-program/v1.6.1 # Use the latest stable version + git submodule update --init --recursive + ``` + + 2. **Copy your chain configuration**: + ```bash + # Replace 67865 with your L2 chain ID + cp /path/to/rollup.json op-program/chainconfig/configs/67865-rollup.json + cp /path/to/genesis.json op-program/chainconfig/configs/67865-genesis.json + ``` + + 3. **Generate the prestate**: + ```bash + make reproducible-prestate + ``` + You'll see output like: + ```bash + -------------------- Production Prestates -------------------- + Cannon64 Absolute prestate hash: + 0x03eb07101fbdeaf3f04d9fb76526362c1eea2824e4c6e970bdb19675b72e4fc8 + ``` + + 4. **Prepare the preimage file**: + ```bash + cd op-program/bin + mv prestate-mt64.bin.gz 0x[CANNON64_PRESTATE_HASH].bin.gz + ``` + Replace `[CANNON64_PRESTATE_HASH]` with the actual hash from step 3. + + + * Use the `Cannon64` hash for production + * Keep this file accessible - you'll need it for the challenger setup + * For Superchain registry chains, you can find official prestates in the [registry](https://github.com/ethereum-optimism/superchain-registry/blob/main/validation/standard/standard-prestates.toml) +
### Finding the current stable releases @@ -165,7 +165,7 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ### Create docker-compose.yml - If you get "failed to dial address" errors, ensure your proposer is in the same Docker network as your sequencer. + If you get "failed to dial address" errors, ensure your proposer is in the same Docker network as your sequencer. Common fixes: @@ -274,11 +274,11 @@ For setting up the proposer, we recommend using Docker as it provides a consiste * Network: Connection messages to L1/L2 endpoints If you see errors about "failed to dial" or connection issues: + * For source build: Verify your localhost ports and services Your proposer is now operational and will continuously submit state roots to L1! - @@ -484,6 +484,7 @@ For setting up the proposer, we recommend using Docker as it provides a consiste * For Docker: Check your network configuration and service names + Your proposer is now operational! From b3b8aedb8265bbbdc112270da868b1f4bfed742b Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 19:10:26 +0100 Subject: [PATCH 65/92] Enhance op-challenger setup documentation: add detailed steps for generating the absolute prestate, including commands and explanations, to improve clarity and usability for users. --- .../create-l2-rollup/op-challenger-setup.mdx | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 83d4edd51..ec2b9455a 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -46,8 +46,50 @@ Before configuring your challenger, complete the following steps: ### Deploy OP Stack chain with fault proofs enabled -* [Generate an absolute prestate](/operators/chain-operators/tutorials/absolute-prestate#generating-the-absolute-prestate) for your network version - This is critical as the challenger will refuse to interact with games if it doesn't have the matching prestate - +
+ Generate absolute prestate (Required) + + The challenger needs the absolute prestate to participate in dispute games. Here's how to generate it: + + 1. **Clone and checkout the correct version**: + ```bash + git clone https://github.com/ethereum-optimism/optimism.git + cd optimism + git checkout op-program/v1.6.1 # Use the latest stable version + git submodule update --init --recursive + ``` + + 2. **Copy your chain configuration**: + ```bash + # Replace 67865 with your L2 chain ID + cp /path/to/rollup.json op-program/chainconfig/configs/67865-rollup.json + cp /path/to/genesis.json op-program/chainconfig/configs/67865-genesis.json + ``` + + 3. **Generate the prestate**: + ```bash + make reproducible-prestate + ``` + You'll see output like: + ```bash + -------------------- Production Prestates -------------------- + Cannon64 Absolute prestate hash: + 0x03eb07101fbdeaf3f04d9fb76526362c1eea2824e4c6e970bdb19675b72e4fc8 + ``` + + 4. **Prepare the preimage file**: + ```bash + cd op-program/bin + mv prestate-mt64.bin.gz 0x[CANNON64_PRESTATE_HASH].bin.gz + ``` + Replace `[CANNON64_PRESTATE_HASH]` with the actual hash from step 3. + + + * Use the `Cannon64` hash for production + * Keep this file accessible - you'll need it for the challenger setup + * For Superchain registry chains, you can find official prestates in the [registry](https://github.com/ethereum-optimism/superchain-registry/blob/main/validation/standard/standard-prestates.toml) + +
### Set up required infrastructure access * L1 RPC endpoint (Ethereum, Sepolia, etc.) From 377b23599a2b0f5e897ed36cbd73bc5dd6013c09 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 20:48:00 +0100 Subject: [PATCH 66/92] Update L2 rollup tutorial: add Docker installation requirements, enhance challenger setup instructions with detailed steps for directory creation and environment configuration, and clarify Sepolia ETH acquisition methods for improved user guidance. --- .../tutorials/create-l2-rollup.mdx | 25 +++++- .../create-l2-rollup/op-challenger-setup.mdx | 81 ++++++++++++------- .../create-l2-rollup/op-deployer-setup.mdx | 23 ++---- 3 files changed, 80 insertions(+), 49 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index 636c8f4ac..2f6b91921 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -49,6 +49,7 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with: | [make](https://linux.die.net/man/1/make) | `^3` | `make --version` | | [jq](https://github.com/jqlang/jq) | `^1.6` | `jq --version` | | [direnv](https://direnv.net) | `^2` | `direnv --version` | +| [docker](https://docs.docker.com/get-docker/) | `^24` | `docker --version` | ### Notes on specific dependencies @@ -88,6 +89,22 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with:
+
+ docker + + Docker is used extensively in this tutorial for running various OP Stack components.\ + Make sure you have both Docker and Docker Compose installed and running on your system.\ + On Linux, you may need to [configure Docker to run without sudo](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user). + + + If you're using Docker Desktop, ensure it's running before starting the tutorial.\ + You can verify your installation with: + ```bash + docker run hello-world + ``` + +
+ ### Get access to a sepolia node Since you're deploying your OP Stack chain to Sepolia, you'll need to have access to a Sepolia node. @@ -95,7 +112,13 @@ You can either use a node provider like [Alchemy](https://www.alchemy.com/) (eas ### Required Resources -* **Sepolia ETH** - Get from [Superchain Faucet](https://console.optimism.io/faucet) (\~2-3 ETH recommended) +* **Sepolia ETH** - You'll need about 2-3 ETH: + * Start with [Superchain Faucet](https://console.optimism.io/faucet) (gives 0.05 ETH) + * Get more from: + * [Alchemy Faucet](https://sepoliafaucet.com/) + * [Infura Faucet](https://www.infura.io/faucet/sepolia) + * [Paradigm Faucet](https://faucet.paradigm.xyz/) + * Or ask in [Optimism Discord](https://discord.gg/optimism) * **Private Keys** - You'll need 5 separate keys for different roles (we'll generate these in the first step) * **L1 RPC URL** - An RPC endpoint to connect to the Sepolia network. You can get this from node providers like [Alchemy](https://www.alchemy.com/), [Infura](https://www.infura.io/). This is required so `op-deployer` and other services can read from and send transactions to L1. * **L1 Beacon URL** - A consensus-layer endpoint for Sepolia. This comes from your node provider or your own beacon node. It allows components like `op-node` to verify the L1 chain's consensus state. diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index ec2b9455a..bb05df8c3 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -124,6 +124,13 @@ For challenger deployment, we recommend using Docker as it provides a consistent The Docker setup provides a containerized environment for running the challenger. This method uses the official Docker image that includes embedded `op-program` server and Cannon executable. + ### Create challenger directory + + ```bash + # Create and enter the challenger directory + mkdir challenger-node && cd challenger-node + ``` + ### Create environment file First, create a `.env` file with your configuration values. This file will be used by Docker Compose to set up the environment variables: @@ -133,11 +140,11 @@ For challenger deployment, we recommend using Docker as it provides a consistent cat > .env << 'EOF' # L1 Configuration - Replace with your actual RPC URLs L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY - L1_BEACON=http://sepolia-cl-1:5051 - + L1_BEACON=https://ethereum-sepolia-beacon-api.publicnode.com + # L2 Configuration - Replace with your actual node endpoints - L2_RPC_URL=http://localhost:8545 - ROLLUP_RPC_URL=http://localhost:8547 + L2_RPC_URL=http://op-geth:8545 + ROLLUP_RPC_URL=http://op-node:8547 # Wallet configuration - Choose either mnemonic + HD path OR private key MNEMONIC="test test test test test test test test test test test junk" @@ -146,6 +153,9 @@ For challenger deployment, we recommend using Docker as it provides a consistent # Network configuration NETWORK=op-sepolia GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS + + # Prestate configuration + PRESTATE_HASH=YOUR_PRESTATE_HASH EOF ``` @@ -165,6 +175,8 @@ For challenger deployment, we recommend using Docker as it provides a consistent - ./challenger-data:/data - ./rollup.json:/workspace/rollup.json:ro - ./genesis-l2.json:/workspace/genesis-l2.json:ro + - ./prestate-proof-mt64.json:/workspace/prestate-proof.json:ro + - ./${PRESTATE_HASH}.bin.gz:/workspace/${PRESTATE_HASH}.bin.gz:ro environment: - L1_RPC_URL=${L1_RPC_URL} - L1_BEACON=${L1_BEACON} @@ -176,6 +188,7 @@ For challenger deployment, we recommend using Docker as it provides a consistent - GAME_FACTORY_ADDRESS=${GAME_FACTORY_ADDRESS} command: - "op-challenger" + - "--trace-type=cannon,asterisc-kona" - "--l1-eth-rpc=${L1_RPC_URL}" - "--l1-beacon=${L1_BEACON}" - "--l2-eth-rpc=${L2_RPC_URL}" @@ -187,9 +200,17 @@ For challenger deployment, we recommend using Docker as it provides a consistent - "--game-factory-address=${GAME_FACTORY_ADDRESS}" - "--datadir=/data" - "--cannon-prestate=/workspace/prestate-proof.json" + - "--cannon-bin=/workspace/${PRESTATE_HASH}.bin.gz" + - "--asterisc-kona-prestate=/workspace/prestate-proof.json" restart: unless-stopped - ports: - - "8548:8548" # If challenger exposes metrics endpoint + networks: + - sequencer-node_default + + networks: + sequencer-node_default: + external: true + + ``` ### Launch the challenger @@ -498,40 +519,38 @@ For challenger deployment, we recommend using Docker as it provides a consistent --mnemonic "$MNEMONIC" \ --hd-path "$HD_PATH" ``` - - - -## Initializing and starting the challenger + ### Start the challenger -### Start the challenger + ```bash + # Make sure you're in the challenger-node directory + cd challenger-node -```bash -# Make sure you're in the challenger-node directory -cd challenger-node + # Make script executable + chmod +x scripts/start-challenger.sh -# Make script executable -chmod +x scripts/start-challenger.sh + # Start challenger + ./scripts/start-challenger.sh + ``` -# Start challenger -./scripts/start-challenger.sh -``` + ### Verify challenger is running -### Verify challenger is running + Monitor challenger logs to ensure it's operating correctly: -Monitor challenger logs to ensure it's operating correctly: + ```bash + # Check challenger logs + tail -f challenger-data/challenger.log -```bash -# Check challenger logs -tail -f challenger-data/challenger.log + # Or if running in foreground, monitor the output + ``` -# Or if running in foreground, monitor the output -``` + The challenger should show logs indicating: -The challenger should show logs indicating: + * Successful connection to L1 and L2 nodes + * Loading of prestates and configuration + * Monitoring of dispute games + + -* Successful connection to L1 and L2 nodes -* Loading of prestates and configuration -* Monitoring of dispute games ### Monitoring with op-dispute-mon @@ -549,7 +568,7 @@ You've successfully completed the entire L2 rollup testnet tutorial! Your rollup * **Sequencer** - Processing transactions * **Batcher** - Publishing data to L1 * **Proposer** - Submitting state roots -* *Challenger** - Monitoring disputes +* **Challenger** - Monitoring disputes ## Connect your wallet to your chain diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 8219d0c81..89870be3c 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -135,10 +135,6 @@ Before deploying your L1 contracts, you'll need: * [Ankr](https://ankr.com) (create account, get API key)
-2. **Deployer Account**: An Ethereum account with sufficient ETH - * For Sepolia: 1.5-3.5 ETH recommended - * Get test ETH from [Sepolia Faucet](https://sepoliafaucet.com) - ## Generate deployment keys Your rollup needs several key pairs for different roles. Let's generate them first: @@ -155,21 +151,14 @@ Your rollup needs several key pairs for different roles. Let's generate them fir ```bash # Generate 7 new Ethereum accounts - for role in admin system_config unsafe_block_signer batcher proposer challenger fee_recipient; do - cast wallet new --password "" > $role.txt + for role in admin system_config unsafe_block_signer batcher proposer fee_recipient; do + wallet_output=$(cast wallet new) + echo "$wallet_output" | grep "Address:" | awk '{print $2}' > ${role}_address.txt + echo "Created wallet for $role" done ``` + Save addresses for your intent file - ### Save addresses for your intent file - - ```bash - # Extract addresses to a summary file - echo "Generated addresses for your intent file:" > addresses.txt - for role in admin system_config unsafe_block_signer batcher proposer challenger fee_recipient; do - echo "$role: $(grep "Address:" $role.txt | cut -d' ' -f2)" >> addresses.txt - done - cat addresses.txt - ``` @@ -300,7 +289,7 @@ This will: 3. Save deployment information to `.deployer/state.json` - The deployment can take 10-15 minutes and requires multiple transactions. + The deployment can take 10-15 seconds and requires multiple transactions. ## Generate chain configuration From 2e75b1ad24a1a47c12c0309bc7ab59af7130dd03 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 20:53:08 +0100 Subject: [PATCH 67/92] updated the docs --- .../chain-operators/tutorials/create-l2-rollup.mdx | 8 +++----- .../tutorials/create-l2-rollup/op-deployer-setup.mdx | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index 2f6b91921..378d58008 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -49,7 +49,7 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with: | [make](https://linux.die.net/man/1/make) | `^3` | `make --version` | | [jq](https://github.com/jqlang/jq) | `^1.6` | `jq --version` | | [direnv](https://direnv.net) | `^2` | `direnv --version` | -| [docker](https://docs.docker.com/get-docker/) | `^24` | `docker --version` | +| [Docker](https://docs.docker.com/get-docker/) | `^24` | `docker --version` | ### Notes on specific dependencies @@ -68,9 +68,7 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with:
foundry - It's recommended to use the scripts in the monorepo's `package.json` for managing `foundry` to ensure you're always working with the correct version.\ - This approach simplifies the installation, update, and version checking process.\ - Make sure to clone the monorepo locally before proceeding. + We will use cast to generate wallet addresses in this guide.
@@ -90,7 +88,7 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with:
- docker + Docker Docker is used extensively in this tutorial for running various OP Stack components.\ Make sure you have both Docker and Docker Compose installed and running on your system.\ diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 89870be3c..b37e0043a 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -157,7 +157,7 @@ Your rollup needs several key pairs for different roles. Let's generate them fir echo "Created wallet for $role" done ``` - Save addresses for your intent file + Save the addresses for your intent file From 153294f450d3fb41e02e9a56950554223ba9d378 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 4 Sep 2025 20:53:49 +0100 Subject: [PATCH 68/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../chain-operators/tutorials/create-l2-rollup.mdx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index 378d58008..e30cfcb1d 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -97,6 +97,7 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with: If you're using Docker Desktop, ensure it's running before starting the tutorial.\ You can verify your installation with: + ```bash docker run hello-world ``` @@ -111,12 +112,12 @@ You can either use a node provider like [Alchemy](https://www.alchemy.com/) (eas ### Required Resources * **Sepolia ETH** - You'll need about 2-3 ETH: - * Start with [Superchain Faucet](https://console.optimism.io/faucet) (gives 0.05 ETH) - * Get more from: - * [Alchemy Faucet](https://sepoliafaucet.com/) - * [Infura Faucet](https://www.infura.io/faucet/sepolia) - * [Paradigm Faucet](https://faucet.paradigm.xyz/) - * Or ask in [Optimism Discord](https://discord.gg/optimism) + * Start with [Superchain Faucet](https://console.optimism.io/faucet) (gives 0.05 ETH) + * Get more from: + * [Alchemy Faucet](https://sepoliafaucet.com/) + * [Infura Faucet](https://www.infura.io/faucet/sepolia) + * [Paradigm Faucet](https://faucet.paradigm.xyz/) + * Or ask in [Optimism Discord](https://discord.gg/optimism) * **Private Keys** - You'll need 5 separate keys for different roles (we'll generate these in the first step) * **L1 RPC URL** - An RPC endpoint to connect to the Sepolia network. You can get this from node providers like [Alchemy](https://www.alchemy.com/), [Infura](https://www.infura.io/). This is required so `op-deployer` and other services can read from and send transactions to L1. * **L1 Beacon URL** - A consensus-layer endpoint for Sepolia. This comes from your node provider or your own beacon node. It allows components like `op-node` to verify the L1 chain's consensus state. From e946128a8acc2924e9603e6128f4ccfdfab9650c Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 9 Sep 2025 15:57:26 +0100 Subject: [PATCH 69/92] Refine L2 rollup tutorial: streamline instructions for environment setup, clarify key generation steps, and enhance compatibility checks for OP Stack components across various setup guides. --- .../tutorials/create-l2-rollup.mdx | 4 +- .../create-l2-rollup/op-batcher-setup.mdx | 24 ++--- .../create-l2-rollup/op-challenger-setup.mdx | 20 ++-- .../create-l2-rollup/op-deployer-setup.mdx | 98 +++++++++++++------ .../create-l2-rollup/op-geth-setup.mdx | 32 +++--- 5 files changed, 101 insertions(+), 77 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index e30cfcb1d..e1042786a 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -118,12 +118,10 @@ You can either use a node provider like [Alchemy](https://www.alchemy.com/) (eas * [Infura Faucet](https://www.infura.io/faucet/sepolia) * [Paradigm Faucet](https://faucet.paradigm.xyz/) * Or ask in [Optimism Discord](https://discord.gg/optimism) -* **Private Keys** - You'll need 5 separate keys for different roles (we'll generate these in the first step) * **L1 RPC URL** - An RPC endpoint to connect to the Sepolia network. You can get this from node providers like [Alchemy](https://www.alchemy.com/), [Infura](https://www.infura.io/). This is required so `op-deployer` and other services can read from and send transactions to L1. -* **L1 Beacon URL** - A consensus-layer endpoint for Sepolia. This comes from your node provider or your own beacon node. It allows components like `op-node` to verify the L1 chain's consensus state. - **Testnet Only**: This guide is for **testnet deployment only**. Never use the generated keys or configurations in production environments. + **Testnet Only**: This guide is for **testnet deployment only**. diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index 456ffe5eb..b416442f7 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -52,19 +52,6 @@ Before setting up your batcher, ensure you have: * L1 network details (chain ID, RPC endpoints) * `BatchInbox` contract address from your deployment -## Software installation - -### Finding the current stable releases - -To ensure you're using the latest compatible versions of OP Stack components, always check the official [releases page](https://github.com/ethereum-optimism/optimism/releases). - -Look for the latest `op-batcher/v*` release that's compatible with your sequencer setup. - - - This guide uses `op-batcher/v1.13.2` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.1 from the sequencer setup. - Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information. - - For setting up the batcher, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available for more advanced users. @@ -129,7 +116,6 @@ For setting up the batcher, we recommend using Docker as it provides a consisten ```yaml - ' services: op-batcher: @@ -206,7 +192,15 @@ For setting up the batcher, we recommend using Docker as it provides a consisten - Building from source gives you full control over the binaries. + + To ensure you're using the latest compatible versions of OP Stack components, always check the official [releases page](https://github.com/ethereum-optimism/optimism/releases). + + Look for the latest `op-batcher/v*` release that's compatible with your sequencer setup. + + + This guide uses `op-batcher/v1.13.2` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.1 from the sequencer setup. + Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information. + ### Clone and build op-batcher diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index bb05df8c3..97f9bfc64 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -99,19 +99,8 @@ Before configuring your challenger, complete the following steps: * `prestate.json` - The absolute prestate file generated in step 1 * `rollup.json` - Rollup configuration file from the `op-deployer` guide - * `genesis.json` - L2 genesis file from the `op-deployer` guide -### Finding the current stable releases - -To ensure you're using the latest compatible versions of OP Stack components, always check the official releases page: - -[OP Stack releases page](https://github.com/ethereum-optimism/optimism/releases) - -Look for the latest `op-challenger/v*` release. The challenger version used in this guide (op-challenger/v1.5.0) is a verified stable version. - -Always check the release notes to ensure you're using compatible versions with your chain's deployment. - ## Software installation For challenger deployment, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available for more advanced users. @@ -228,6 +217,15 @@ For challenger deployment, we recommend using Docker as it provides a consistent + + To ensure you're using the latest compatible versions of OP Stack components, always check the official releases page: + + [OP Stack releases page](https://github.com/ethereum-optimism/optimism/releases) + + Look for the latest `op-challenger/v*` release. The challenger version used in this guide (op-challenger/v1.5.0) is a verified stable version. + + Always check the release notes to ensure you're using compatible versions with your chain's deployment. + ### Build and Configure Building from source gives you full control over the binaries. diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index b37e0043a..4a01bc949 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -25,7 +25,7 @@ Welcome to the first step of creating your own L2 rollup testnet! In this sectio ## About op-deployer -`op-deployer` simplifies the process of deploying the OP Stack. It works similarly to [Terraform](https://www.terraform.io/) - you define a declarative config file called an "**intent**," then run a command to apply it. `op-deployer` compares your chain's current state against the intent and makes the necessary changes to match. +`op-deployer` simplifies the process of deploying the OP Stack. You define a declarative config file called an "**intent**," then run a command to apply it. `op-deployer` compares your chain's current state against the intent and makes the necessary changes to match. ## Installation @@ -38,8 +38,8 @@ There are a couple of ways to install `op-deployer`: ### Download the correct binary - 1. Go to [https://github.com/ethereum-optimism/optimism/releases](https://github.com/ethereum-optimism/optimism/releases) - 2. Find the latest release that includes `op-deployer` + 1. Go to the [release page](https://github.com/ethereum-optimism/optimism/releases) + 2. Use the search bar to find the latest release that includes `op-deployer`. 3. Under **assets**, download the binary that matches your system: * For Linux: `op-deployer-linux-amd64` @@ -56,30 +56,39 @@ There are a couple of ways to install `op-deployer`: * If it shows `x86_64`, use the amd64 version - ### Install the binary + ### Create deployer directory and install binary - 1. Rename the downloaded file to `op-deployer` - 2. Make it executable: + 1. Create and enter a directory for op-deployer: ```bash - chmod +x op-deployer + # Create and enter the deployer directory + mkdir deployer && cd deployer ``` - 3. Move it to a directory in your system PATH: + 2. Move and rename the downloaded binary: - ```bash - # Create a bin directory if it doesn't exist - mkdir -p ~/bin + + The downloaded file is likely in your Downloads folder: + - macOS/Linux: `/Users/YOUR_USERNAME/Downloads` + - Windows WSL: `/mnt/c/Users/YOUR_USERNAME/Downloads` + - # Move the binary - mv op-deployer ~/bin/ + ```bash + # Move the downloaded file (replace USERNAME with your username) + mv /Users/USERNAME/Downloads/op-deployer-0.2.6-darwin-arm64.tar.gz* op-deployer - # Add to PATH if not already added (add this to your ~/.bashrc or ~/.zshrc) - export PATH=$PATH:~/bin + # Create a bin directory if it doesn't exist + mkdir -p ~/bin + + # Move the binary + mv op-deployer ~/bin/ + + # Add to PATH if not already added (add this to your ~/.bashrc or ~/.zshrc) + export PATH=$PATH:~/bin ``` - **For macOS Users**: If you get a security warning about "unidentified developer": + **For macOS Users**: If you get a security warning from your OS: ```bash # Run this command to allow the binary @@ -151,7 +160,7 @@ Your rollup needs several key pairs for different roles. Let's generate them fir ```bash # Generate 7 new Ethereum accounts - for role in admin system_config unsafe_block_signer batcher proposer fee_recipient; do + for role in base_Fee_Vault_Recipient l1_Fee_Vault_Recipient sequencer_Fee_Vault_Recipient system_config unsafe_block_signer batcher proposer ; do wallet_output=$(cast wallet new) echo "$wallet_output" | grep "Address:" | awk '{print $2}' > ${role}_address.txt echo "Created wallet for $role" @@ -165,21 +174,22 @@ Your rollup needs several key pairs for different roles. Let's generate them fir **Important**: * Save these keys securely - you'll need them to operate your chain - * The private keys are in the "Private Key:" field of each file * For production, use proper key management solutions (HSMs, multisigs) ## Create and configure intent file -The intent file defines your chain's configuration. Here's how to set it up: +The intent file defines your chain's configuration. ### Initialize intent file + Inside the `deployer` folder, run this command: ```bash + #You can use a 2-7 digit random number for your `` op-deployer init \ --l1-chain-id 11155111 \ - --l2-chain-ids 42069 \ + --l2-chain-ids \ --workdir .deployer \ --intent-type standard-overrides ``` @@ -215,20 +225,20 @@ The intent file defines your chain's configuration. Here's how to set it up: [[chains]] id = "0x000000000000000000000000000000000000000000000000000000000016de8d" - baseFeeVaultRecipient = "0x..." # fee_recipient address - l1FeeVaultRecipient = "0x..." # fee_recipient address - sequencerFeeVaultRecipient = "0x..." # fee_recipient address + baseFeeVaultRecipient = "0x..." # base_Fee_Vault_Recipient address + l1FeeVaultRecipient = "0x..." # l1_Fee_Vault_Recipient address + sequencerFeeVaultRecipient = "0x..." # sequencer_Fee_Vault_Recipient address eip1559DenominatorCanyon = 250 eip1559Denominator = 50 eip1559Elasticity = 6 [chains.roles] - l1ProxyAdminOwner = "0x..." # admin address - l2ProxyAdminOwner = "0x..." # admin address + l1ProxyAdminOwner = "0x1eb2ffc903729a0f03966b917003800b145f56e2" + l2ProxyAdminOwner = "0x2fc3ffc903729a0f03966b917003800b145f67f3" systemConfigOwner = "0x..." # system_config address unsafeBlockSigner = "0x..." # unsafe_block_signer address batcher = "0x..." # batcher address proposer = "0x..." # proposer address - challenger = "0x..." # challenger address + challenger = "0xfd1d2e729ae8eee2e146c033bf4400fe75284301" ```
@@ -271,9 +281,37 @@ The intent file defines your chain's configuration. Here's how to set it up: Never use the default test mnemonic addresses in production or public testnets! +## Create environment file + +Before deploying, create a `.env` file in your `deployer` directory to store your sensitive configuration: + +```bash +# Create .env file +cat << 'EOF' > .env +# Your L1 RPC URL (e.g., from Alchemy, Infura) +L1_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY + +# Private key for deployment. +# Get this from your self-custody wallet, like Metamask. +PRIVATE_KEY= WALLET_PRIVATE_KEY +EOF +``` + + + Never commit your `.env` file to version control. Add it to your `.gitignore`: + ```bash + echo ".env" >> .gitignore + ``` + + +Load the environment variables: +```bash +source .env +``` + ## Deploy L1 Contracts -Now that your intent file is configured, let's deploy the L1 contracts: +Now that your intent file and environment variables are configured, let's deploy the L1 contracts: ```bash op-deployer apply \ @@ -298,11 +336,11 @@ After successful deployment, generate your chain configuration files: ```bash # Generate genesis and rollup configs -op-deployer inspect genesis --workdir .deployer 42069 > .deployer/genesis.json -op-deployer inspect rollup --workdir .deployer 42069 > .deployer/rollup.json +op-deployer inspect genesis --workdir .deployer > .deployer/genesis.json +op-deployer inspect rollup --workdir .deployer > .deployer/rollup.json # Get L1 contract addresses (save these!) -op-deployer inspect l1 --workdir .deployer 42069 > .deployer/l1-contracts.json +op-deployer inspect l1 --workdir .deployer > .deployer/l1-contracts.json ``` ## What's Next? diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 4dff355bd..266d2b352 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -37,29 +37,13 @@ The sequencer is responsible for: * Building L2 blocks * Signing blocks on the P2P network -### Finding the current stable releases - -To ensure you're using the latest compatible versions of OP Stack components, always check the official [release page](https://github.com/ethereum-optimism/optimism/releases). - -The main components you'll need for sequencer deployment are: - -* `op-node`: Look for the latest `op-node/v*` [release](https://github.com/ethereum-optimism/optimism/releases) -* `op-geth`: Look for the latest `op-geth/v*` [release](https://github.com/ethereum-optimism/op-geth/releases) - - - The versions used in this guide (**op-node/v1.13.5** and **op-geth/v1.101511.1**) are verified compatible versions. - - According to the **op-node v1.13.5** [release notes](https://github.com/ethereum-optimism/optimism/releases), this op-node version specifically corresponds to **op-geth v1.101511.1**. - Always check the release notes to ensure you're using compatible versions. - - ## Software installation For spinning up a sequencer, we recommend using Docker, as it provides a simpler setup and consistent environment. In this guide, building from source is also provided as an alternative for those who need more control and easier debugging. - + If you prefer containerized deployment, you can use the official Docker images, and do the following: @@ -107,7 +91,6 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler Create a `docker-compose.yml` file in the same directory ```yaml - ' services: op-geth: @@ -226,6 +209,19 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler + To ensure you're using the latest compatible versions of OP Stack components, always check the official [release page](https://github.com/ethereum-optimism/optimism/releases). + + The main components you'll need for sequencer deployment are: + + * `op-node`: Look for the latest `op-node/v*` [release](https://github.com/ethereum-optimism/optimism/releases) + * `op-geth`: Look for the latest `op-geth/v*` [release](https://github.com/ethereum-optimism/op-geth/releases) + + + The versions used in this guide (**op-node/v1.13.5** and **op-geth/v1.101511.1**) are verified compatible versions. + + According to the **op-node v1.13.5** [release notes](https://github.com/ethereum-optimism/optimism/releases), this op-node version specifically corresponds to **op-geth v1.101511.1**. + Always check the release notes to ensure you're using compatible versions. + Building from source gives you full control over the binaries. From 9ad5c8756ed7bd30247f7680b391cdb2f3f6aa6a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 9 Sep 2025 15:57:56 +0100 Subject: [PATCH 70/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../create-l2-rollup/op-deployer-setup.mdx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 4a01bc949..aa44edaf3 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -58,19 +58,20 @@ There are a couple of ways to install `op-deployer`: ### Create deployer directory and install binary - 1. Create and enter a directory for op-deployer: + 1. Create and enter a directory for op-deployer: ```bash # Create and enter the deployer directory mkdir deployer && cd deployer ``` - 2. Move and rename the downloaded binary: + 2. Move and rename the downloaded binary: The downloaded file is likely in your Downloads folder: - - macOS/Linux: `/Users/YOUR_USERNAME/Downloads` - - Windows WSL: `/mnt/c/Users/YOUR_USERNAME/Downloads` + + * macOS/Linux: `/Users/YOUR_USERNAME/Downloads` + * Windows WSL: `/mnt/c/Users/YOUR_USERNAME/Downloads` ```bash @@ -166,8 +167,8 @@ Your rollup needs several key pairs for different roles. Let's generate them fir echo "Created wallet for $role" done ``` - Save the addresses for your intent file + Save the addresses for your intent file @@ -183,6 +184,7 @@ The intent file defines your chain's configuration. ### Initialize intent file + Inside the `deployer` folder, run this command: ```bash @@ -299,12 +301,14 @@ EOF Never commit your `.env` file to version control. Add it to your `.gitignore`: + ```bash echo ".env" >> .gitignore ``` Load the environment variables: + ```bash source .env ``` From e8469b934f9fbbb49fc3cc4d18c99a790238d292 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 9 Sep 2025 16:02:06 +0100 Subject: [PATCH 71/92] Refactor L2 rollup setup instructions: standardize directory paths by removing home directory references, update configuration file paths to reflect local directory structure, and enhance clarity in workspace organization across batcher, sequencer, and proposer setup guides. --- .../create-l2-rollup/op-batcher-setup.mdx | 14 +++---- .../create-l2-rollup/op-geth-setup.mdx | 38 +++++++++---------- .../create-l2-rollup/op-proposer-setup.mdx | 12 +++--- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index b416442f7..b39674932 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -63,12 +63,12 @@ For setting up the batcher, we recommend using Docker as it provides a consisten ```bash # Create your batcher working directory - mkdir ~/batcher-node - cd ~/batcher-node + mkdir batcher-node + cd batcher-node # Copy configuration files from op-deployer output # Note: Adjust the path if your .deployer directory is located elsewhere - cp ~/.deployer/state.json . + cp .deployer/state.json . # Extract the BatchInbox address BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].systemConfigProxyAddress') @@ -181,8 +181,8 @@ For setting up the batcher, we recommend using Docker as it provides a consisten ### Final directory structure ```bash - ~/batcher-node/ - ├── state.json # Copied from ~/.deployer/ + batcher-node/ + ├── state.json # Copied from .deployer/ ├── .env # Environment variables └── docker-compose.yml # Docker configuration ``` @@ -268,7 +268,7 @@ For setting up the batcher, we recommend using Docker as it provides a consisten Your final directory structure should look like: ```bash - ~/ + ├── optimism/ # Contains op-batcher binary ├── sequencer-node/ # Your sequencer setup ├── proposer-node/ # Your proposer setup @@ -287,7 +287,7 @@ For setting up the batcher, we recommend using Docker as it provides a consisten ```bash # Navigate to batcher directory - cd ~/batcher-node + cd batcher-node # Copy the deployment state file from op-deployer # Update the path if your .deployer directory is located elsewhere diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 266d2b352..b1b4f6f44 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -52,13 +52,13 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ```bash # Create your sequencer working directory - mkdir ~/sequencer-node - cd ~/sequencer-node + mkdir sequencer-node + cd sequencer-node # Copy configuration files from op-deployer output # Note: Adjust the path if your .deployer directory is located elsewhere - cp ~/.deployer/genesis.json . - cp ~/.deployer/rollup.json . + cp .deployer/genesis.json . + cp .deployer/rollup.json . # Generate JWT secret openssl rand -hex 32 > jwt.txt @@ -169,7 +169,7 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ```bash # Make sure you're in the sequencer-node directory with all files copied - cd ~/sequencer-node + cd sequencer-node # Initialize op-geth using Docker docker run --rm \ @@ -192,10 +192,10 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ### Final directory structure ```bash - ~/sequencer-node/ + sequencer-node/ ├── jwt.txt # Generated JWT secret - ├── genesis.json # Copied from ~/.deployer/ - ├── rollup.json # Copied from ~/.deployer/ + ├── genesis.json # Copied from .deployer/ + ├── rollup.json # Copied from .deployer/ ├── .env # Environment variables ├── docker-compose.yml # Docker configuration └── op-geth-data/ # Created by Docker during initialization @@ -277,7 +277,7 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler After building the binaries, you should have the following directory structure: ``` - ~/ + ├── optimism/ # Optimism monorepo │ └── op-node/ │ └── bin/ @@ -295,8 +295,8 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ```bash # Create sequencer directory at the root level - mkdir ~/sequencer-node - cd ~/sequencer-node + mkdir /sequencer-node + cd sequencer-node ```
@@ -305,9 +305,9 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler If you prefer to keep binaries close to your configuration, you can copy them: ```bash - mkdir ~/sequencer-node/bin - cp ~/optimism/op-node/bin/op-node ~/sequencer-node/bin/ - cp ~/op-geth/build/bin/geth ~/sequencer-node/bin/ + mkdir sequencer-node/bin + cp optimism/op-node/bin/op-node sequencer-node/bin/ + cp op-geth/build/bin/geth sequencer-node/bin/ # Then update scripts to use: # ./bin/geth @@ -334,14 +334,14 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler mkdir scripts # Copy configuration files from op-deployer - cp ~/.deployer/genesis.json . - cp ~/.deployer/rollup.json . + cp .deployer/genesis.json . + cp .deployer/rollup.json . ``` Your final directory structure should look like: ```bash - ~/sequencer-node/ + sequencer-node/ ├── jwt.txt ├── genesis.json ├── rollup.json @@ -502,7 +502,7 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ```bash # Make sure you're in the sequencer-node directory - cd ~/sequencer-node + cd sequencer-node # Initialize op-geth with your genesis file ../op-geth/build/bin/geth init --datadir=./op-geth-data --state.scheme=hash ./genesis.json @@ -525,7 +525,7 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ```bash # In a separate terminal, navigate to the sequencer directory - cd ~/sequencer-node + cd sequencer-node # Start op-node ./scripts/start-op-node.sh diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index b643b92fa..b8e106ed2 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -120,12 +120,12 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ```bash # Create your proposer working directory - mkdir ~/proposer-node - cd ~/proposer-node + mkdir proposer-node + cd proposer-node # Copy configuration files from op-deployer output # Note: Adjust the path if your .deployer directory is located elsewhere - cp ~/.deployer/state.json . + cp .deployer/state.json . # Extract the DisputeGameFactory address GAME_FACTORY_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].DisputeGameFactoryProxy') @@ -234,8 +234,8 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ### Final directory structure ```bash - ~/proposer-node/ - ├── state.json # Copied from ~/.deployer/ + proposer-node/ + ├── state.json # Copied from .deployer/ ├── .env # Environment variables └── docker-compose.yml # Docker configuration ``` @@ -422,7 +422,7 @@ For setting up the proposer, we recommend using Docker as it provides a consiste Your final directory structure should look like: ```bash - ~/ + ├── optimism/ # Contains op-proposer binary ├── sequencer-node/ # Your sequencer setup ├── .deployer/ # From op-deployer From ded2d3ddec2aa6c81ac6894dc4ed0dbd5fb69d27 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 10 Sep 2025 13:47:29 +0100 Subject: [PATCH 72/92] Revise L2 rollup batcher setup documentation: streamline configuration setup instructions, enhance clarity on workspace organization, and update environment variable setup for improved user experience. Include additional details on batcher parameters and verification steps to ensure operational readiness. --- .../chain-operators/deploy/spin-batcher.mdx | 206 ----------- .../create-l2-rollup/op-batcher-setup.mdx | 339 +++++++----------- .../create-l2-rollup/op-deployer-setup.mdx | 20 +- 3 files changed, 147 insertions(+), 418 deletions(-) diff --git a/pages/operators/chain-operators/deploy/spin-batcher.mdx b/pages/operators/chain-operators/deploy/spin-batcher.mdx index adbc646b1..ad7525019 100644 --- a/pages/operators/chain-operators/deploy/spin-batcher.mdx +++ b/pages/operators/chain-operators/deploy/spin-batcher.mdx @@ -231,212 +231,6 @@ services: If you chose Docker, refer to the collapsible section. -## Configuration setup - -### 1. Organize your workspace - -Create your batcher working directory: - -```bash -# Create batcher directory at the same level as your sequencer -mkdir batcher-node -cd batcher-node - -# Create scripts directory -mkdir scripts -``` - -Your final directory structure should look like: - -```bash -~/ -├── optimism/ # Contains op-batcher binary -├── sequencer-node/ # Your sequencer setup -├── proposer-node/ # Your proposer setup -├── .deployer/ # From op-deployer -│ └── state.json -└── batcher-node/ # Your batcher working directory - ├── state.json # Copied from .deployer - ├── .env - └── scripts/ - └── start-batcher.sh -``` - -### 2. Extract `BatchInbox` address - -Extract the `BatchInbox` contract address from your op-deployer output: - -```bash -# Navigate to batcher directory -cd ~/batcher-node - -# Copy the deployment state file from op-deployer -# Update the path if your .deployer directory is located elsewhere -cp ../.deployer/state.json . - -# Extract the BatchInbox address -BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].SystemConfigProxy') -echo "BatchInbox Address: $BATCH_INBOX_ADDRESS" -``` - - - The batcher submits transaction batches to the `BatchInbox` contract on L1. This contract is responsible for accepting and storing L2 transaction data. - - -### 3. Set up environment variables - -Create your `.env` file with the actual values: - -```bash -# Create .env file with your actual values -# L1 Configuration - Replace with your actual RPC URL -L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY - -# L2 Configuration - Should match your sequencer setup -L2_RPC_URL=http://localhost:8545 -ROLLUP_RPC_URL=http://localhost:8547 - -# Contract addresses - Extract from your op-deployer output -BATCH_INBOX_ADDRESS=YOUR_ACTUAL_BATCH_INBOX_ADDRESS - -# Private key - Replace with your actual private key -BATCHER_PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY - -# Batcher configuration -POLL_INTERVAL=1s -SUB_SAFETY_MARGIN=6 -NUM_CONFIRMATIONS=1 -SAFE_ABORT_NONCE_TOO_LOW_COUNT=3 -RESUBMISSION_TIMEOUT=30s -MAX_CHANNEL_DURATION=25 - -# RPC configuration -BATCHER_RPC_PORT=8548 -``` - -**Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values! - -### 4. Get your private key - -Get a private key from your wallet that will be used for submitting batches to L1. This account needs sufficient ETH to pay for L1 gas costs. - - - The batcher account needs to be funded with ETH on L1 to pay for batch submission transactions. Monitor this account's balance regularly as it will consume ETH for each batch submission. - - -## Batcher configuration - -Create `scripts/start-batcher.sh`: - -```bash -#!/bin/bash - -source .env - -# Path to the op-batcher binary we built -../optimism/op-batcher/bin/op-batcher \ - --l2-eth-rpc=$L2_RPC_URL \ - --rollup-rpc=$ROLLUP_RPC_URL \ - --poll-interval=$POLL_INTERVAL \ - --sub-safety-margin=$SUB_SAFETY_MARGIN \ - --num-confirmations=$NUM_CONFIRMATIONS \ - --safe-abort-nonce-too-low-count=$SAFE_ABORT_NONCE_TOO_LOW_COUNT \ - --resubmission-timeout=$RESUBMISSION_TIMEOUT \ - --rpc.addr=0.0.0.0 \ - --rpc.port=$BATCHER_RPC_PORT \ - --rpc.enable-admin \ - --max-channel-duration=$MAX_CHANNEL_DURATION \ - --l1-eth-rpc=$L1_RPC_URL \ - --private-key=$BATCHER_PRIVATE_KEY \ - --batch-type=1 \ - --data-availability-type=blobs \ - --compress \ - --log.level=info -``` - -### Batcher parameters explained - -* **`--poll-interval`**: How frequently the batcher checks for new L2 blocks to batch -* **`--sub-safety-margin`**: Number of confirmations to wait before considering L1 transactions safe -* **`--max-channel-duration`**: Maximum time (in L1 blocks) to keep a channel open -* **`--batch-type`**: Type of batch encoding (1 for span batches, 0 for singular batches) -* **`--data-availability-type`**: Whether to use blobs or calldata for data availability -* **`--compress`**: Enable compression to reduce L1 data costs - -## Starting the batcher - -### 1. Verify prerequisites - -Ensure your sequencer and rollup node are running: - - - ### Test L1 connectivity - - ```bash - # Note: Make sure you have exported these environment variables to your current shell session: - # export L1_RPC_URL="https://sepolia.infura.io/v3/YOUR_KEY" - # export L2_RPC_URL="http://localhost:8545" - # export ROLLUP_RPC_URL="http://localhost:8547" - - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - $L1_RPC_URL - ``` - - ### Test L2 connectivity - - ```bash - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - $L2_RPC_URL - ``` - - ### Test rollup node connectivity - - ```bash - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' \ - $ROLLUP_RPC_URL - ``` - - -### 2. Start the batcher - -```bash -# Make the script executable -chmod +x scripts/start-batcher.sh - -# Start the batcher -./scripts/start-batcher.sh -``` - -## Verification - -Verify your batcher is working correctly: - -### Check batcher status - -```bash -# Check batcher RPC is responding -curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"admin_startBatcher","params":[],"id":1}' \ - http://localhost:8548 - -# Monitor batch submission activity (check L1 for recent transactions from your batcher address) -# Replace with your actual batcher address -curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0xYOUR_BATCHER_ADDRESS","latest"],"id":1}' \ - $L1_RPC_URL - -# Check if your batcher address has enough ETH for gas -curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xYOUR_BATCHER_ADDRESS","latest"],"id":1}' \ - $L1_RPC_URL -``` - - - For detailed cost analysis and optimization strategies, refer to the [Fee calculation tools](/operators/chain-operators/tools/fee-calculator). - ## Next steps diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index b39674932..063d128c1 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -227,235 +227,172 @@ For setting up the batcher, we recommend using Docker as it provides a consisten ```bash ./bin/op-batcher --version ``` - - - + ### Configuration setup -## Configuration setup + + For advanced configuration options and fine-tuning your batcher, including: - - The rest of this guide assumes you're using the **build-from-source** approach. - If you chose Docker, all the necessary configuration was covered in the Docker tab above. - + * Batch submission policies + * Channel duration settings + * Data availability types (blobs vs calldata) + * Transaction throttling + * Network timeouts - - For advanced configuration options and fine-tuning your batcher, including: + Check out the [Batcher Configuration Reference](/operators/chain-operators/configuration/batcher). + This will help you optimize your batcher's performance and cost-efficiency. + - * Batch submission policies - * Channel duration settings - * Data availability types (blobs vs calldata) - * Transaction throttling - * Network timeouts + + ### Organize your workspace - Check out the [Batcher Configuration Reference](/operators/chain-operators/configuration/batcher). - This will help you optimize your batcher's performance and cost-efficiency. - + Create your batcher working directory: - - ### Organize your workspace + ```bash + # Create batcher directory at the same level as your sequencer + mkdir batcher-node + cd batcher-node - Create your batcher working directory: + # Create scripts directory + mkdir scripts + ``` - ```bash - # Create batcher directory at the same level as your sequencer - mkdir batcher-node - cd batcher-node + Your final directory structure should look like: - # Create scripts directory - mkdir scripts - ``` + ```bash + + ├── optimism/ # Contains op-batcher binary + ├── sequencer-node/ # Your sequencer setup + ├── proposer-node/ # Your proposer setup + ├── .deployer/ # From op-deployer + │ └── state.json + └── batcher-node/ # Your batcher working directory + ├── state.json # Copied from .deployer + ├── .env + └── scripts/ + └── start-batcher.sh + ``` - Your final directory structure should look like: + ### Extract BatchInbox address - ```bash - - ├── optimism/ # Contains op-batcher binary - ├── sequencer-node/ # Your sequencer setup - ├── proposer-node/ # Your proposer setup - ├── .deployer/ # From op-deployer - │ └── state.json - └── batcher-node/ # Your batcher working directory - ├── state.json # Copied from .deployer - ├── .env - └── scripts/ - └── start-batcher.sh - ``` + Extract the `BatchInbox` contract address from your op-deployer output: - ### Extract BatchInbox address + ```bash + # Navigate to batcher directory + cd batcher-node - Extract the `BatchInbox` contract address from your op-deployer output: + # Copy the deployment state file from op-deployer + # Update the path if your .deployer directory is located elsewhere + cp ../.deployer/state.json . - ```bash - # Navigate to batcher directory - cd batcher-node + # Extract the BatchInbox address + BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].systemConfigProxyAddress') + echo "BatchInbox Address: $BATCH_INBOX_ADDRESS" + ``` - # Copy the deployment state file from op-deployer - # Update the path if your .deployer directory is located elsewhere - cp ../.deployer/state.json . + + The batcher submits transaction batches to the `BatchInbox` contract on L1. This contract is responsible for accepting and storing L2 transaction data. + - # Extract the BatchInbox address - BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].systemConfigProxyAddress') - echo "BatchInbox Address: $BATCH_INBOX_ADDRESS" - ``` + ### Set up environment variables - - The batcher submits transaction batches to the `BatchInbox` contract on L1. This contract is responsible for accepting and storing L2 transaction data. - + Create your `.env` file with the actual values: - ### Set up environment variables + ```bash + # Create .env file with your actual values + # L1 Configuration - Replace with your actual RPC URL + L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY - Create your `.env` file with the actual values: + # L2 Configuration - Should match your sequencer setup + L2_RPC_URL=http://op-geth:8545 + ROLLUP_RPC_URL=http://op-node:8547 - ```bash - # Create .env file with your actual values - # L1 Configuration - Replace with your actual RPC URL - L1_RPC_URL=https://sepolia.infura.io/v3/YOUR_ACTUAL_INFURA_KEY + # Contract addresses - Extract from your op-deployer output + BATCH_INBOX_ADDRESS=YOUR_ACTUAL_BATCH_INBOX_ADDRESS - # L2 Configuration - Should match your sequencer setup - L2_RPC_URL=http://op-geth:8545 - ROLLUP_RPC_URL=http://op-node:8547 - - # Contract addresses - Extract from your op-deployer output - BATCH_INBOX_ADDRESS=YOUR_ACTUAL_BATCH_INBOX_ADDRESS - - # Private key - Replace with your actual private key - BATCHER_PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY - - # Batcher configuration - POLL_INTERVAL=1s - SUB_SAFETY_MARGIN=6 - NUM_CONFIRMATIONS=1 - SAFE_ABORT_NONCE_TOO_LOW_COUNT=3 - RESUBMISSION_TIMEOUT=30s - MAX_CHANNEL_DURATION=25 + # Private key - Replace with your actual private key + BATCHER_PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY - # RPC configuration - BATCHER_RPC_PORT=8548 - ``` - - **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values! + # Batcher configuration + POLL_INTERVAL=1s + SUB_SAFETY_MARGIN=6 + NUM_CONFIRMATIONS=1 + SAFE_ABORT_NONCE_TOO_LOW_COUNT=3 + RESUBMISSION_TIMEOUT=30s + MAX_CHANNEL_DURATION=25 - ### Get your private key + # RPC configuration + BATCHER_RPC_PORT=8548 + ``` - Get a private key from your wallet that will be used for submitting batches to L1. This account needs sufficient ETH to pay for L1 gas costs. + **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values! - - The batcher account needs to be funded with ETH on L1 to pay for batch submission transactions. Monitor this account's balance regularly as it will consume ETH for each batch submission. - - + ### Get your private key -## Batcher configuration - -Create `scripts/start-batcher.sh`: - -```bash -#!/bin/bash - -source .env - -# Path to the op-batcher binary we built -../optimism/op-batcher/bin/op-batcher \ - --l2-eth-rpc=$L2_RPC_URL \ - --rollup-rpc=$ROLLUP_RPC_URL \ - --poll-interval=$POLL_INTERVAL \ - --sub-safety-margin=$SUB_SAFETY_MARGIN \ - --num-confirmations=$NUM_CONFIRMATIONS \ - --safe-abort-nonce-too-low-count=$SAFE_ABORT_NONCE_TOO_LOW_COUNT \ - --resubmission-timeout=$RESUBMISSION_TIMEOUT \ - --rpc.addr=0.0.0.0 \ - --rpc.port=$BATCHER_RPC_PORT \ - --rpc.enable-admin \ - --max-channel-duration=$MAX_CHANNEL_DURATION \ - --l1-eth-rpc=$L1_RPC_URL \ - --private-key=$BATCHER_PRIVATE_KEY \ - --batch-type=1 \ - --data-availability-type=blobs \ - --log.level=info -``` - -### Batcher parameters explained - -* **`--poll-interval`**: How frequently the batcher checks for new L2 blocks to batch -* **`--sub-safety-margin`**: Number of confirmations to wait before considering L1 transactions safe -* **`--max-channel-duration`**: Maximum time (in L1 blocks) to keep a channel open -* **`--batch-type`**: Type of batch encoding (1 for span batches, 0 for singular batches) -* **`--data-availability-type`**: Whether to use blobs or calldata for data availability - -## Starting the batcher - - - ### Verify prerequisites - - Ensure your sequencer and rollup node are running: - - ```bash - # Test L1 connectivity - # Note: Make sure you have exported these environment variables to your current shell session: - # export L1_RPC_URL="https://sepolia.infura.io/v3/YOUR_KEY" - # export L2_RPC_URL="http://localhost:8545" - # export ROLLUP_RPC_URL="http://localhost:8547" - - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - $L1_RPC_URL - - # Test L2 connectivity - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ - $L2_RPC_URL - - # Test rollup node connectivity - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"optimism_syncStatus","params":[],"id":1}' \ - $ROLLUP_RPC_URL - ``` - - ### Start the batcher - - ```bash - # Make the script executable - chmod +x scripts/start-batcher.sh - - # Start the batcher - ./scripts/start-batcher.sh - ``` - - -## Verification - - - ### Check batcher status - - Verify your batcher is working correctly: - - ```bash - # Check batcher RPC is responding - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"admin_startBatcher","params":[],"id":1}' \ - http://localhost:8548 - ``` - - ### Monitor batch submission activity - - ```bash - # Monitor batch submission activity (check L1 for recent transactions from your batcher address) - # Replace with your actual batcher address - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0xYOUR_BATCHER_ADDRESS","latest"],"id":1}' \ - $L1_RPC_URL - - # Check if your batcher address has enough ETH for gas - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xYOUR_BATCHER_ADDRESS","latest"],"id":1}' \ - $L1_RPC_URL - ``` - + Get a private key from your wallet that will be used for submitting batches to L1. This account needs sufficient ETH to pay for L1 gas costs. - - For detailed cost analysis and optimization strategies, refer to the [Fee calculation tools](/operators/chain-operators/tools/fee-calculator). - + + The batcher account needs to be funded with ETH on L1 to pay for batch submission transactions. Monitor this account's balance regularly as it will consume ETH for each batch submission. + + + + ### Batcher configuration + + Create `scripts/start-batcher.sh` in the same directory: + + ```bash + #!/bin/bash + + source .env + + # Path to the op-batcher binary we built + ../optimism/op-batcher/bin/op-batcher \ + --l2-eth-rpc=$L2_RPC_URL \ + --rollup-rpc=$ROLLUP_RPC_URL \ + --poll-interval=$POLL_INTERVAL \ + --sub-safety-margin=$SUB_SAFETY_MARGIN \ + --num-confirmations=$NUM_CONFIRMATIONS \ + --safe-abort-nonce-too-low-count=$SAFE_ABORT_NONCE_TOO_LOW_COUNT \ + --resubmission-timeout=$RESUBMISSION_TIMEOUT \ + --rpc.addr=0.0.0.0 \ + --rpc.port=$BATCHER_RPC_PORT \ + --rpc.enable-admin \ + --max-channel-duration=$MAX_CHANNEL_DURATION \ + --l1-eth-rpc=$L1_RPC_URL \ + --private-key=$BATCHER_PRIVATE_KEY \ + --batch-type=1 \ + --data-availability-type=blobs \ + --log.level=info + ``` -Your batcher is now operational and will continuously submit L2 transaction batches to L1! + ### Batcher parameters explained + + * **`--poll-interval`**: How frequently the batcher checks for new L2 blocks to batch + * **`--sub-safety-margin`**: Number of confirmations to wait before considering L1 transactions safe + * **`--max-channel-duration`**: Maximum time (in L1 blocks) to keep a channel open + * **`--batch-type`**: Type of batch encoding (1 for span batches, 0 for singular batches) + * **`--data-availability-type`**: Whether to use blobs or calldata for data availability + + ### Starting the batcher + + ### Start the batcher + + ```bash + # Make the script executable + chmod +x scripts/start-batcher.sh + + # Start the batcher + ./scripts/start-batcher.sh + ``` + + + For detailed cost analysis and optimization strategies, refer to the [Fee calculation tools](/operators/chain-operators/tools/fee-calculator). + + + Your batcher is now operational and will continuously submit L2 transaction batches to L1! + + + + **Understanding common startup messages** diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index aa44edaf3..3022b4ed0 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -75,17 +75,15 @@ There are a couple of ways to install `op-deployer`: ```bash - # Move the downloaded file (replace USERNAME with your username) - mv /Users/USERNAME/Downloads/op-deployer-0.2.6-darwin-arm64.tar.gz* op-deployer - - # Create a bin directory if it doesn't exist - mkdir -p ~/bin - - # Move the binary - mv op-deployer ~/bin/ - - # Add to PATH if not already added (add this to your ~/.bashrc or ~/.zshrc) - export PATH=$PATH:~/bin + # Change directory to the Downloads folder + cd ~/Downloads + + # Extract the compressed tar.gz archive (x = extract, v = verbose, z = gzip, f = file) + tar -xvzf op-deployer-0.2.6-darwin-arm64.tar.gz + + # Move the extracted file to /usr/local/bin so it can be run globally as a command + # (Note: right now this command is moving the archive itself, not the extracted binary) + sudo mv op-deployer-0.2.6-darwin-arm64.tar.gz /usr/local/bin/ ``` From cc085f6c56dd743423f20dd7e3f30de23f5291d9 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 10 Sep 2025 13:50:10 +0100 Subject: [PATCH 73/92] Clarify op-deployer setup instructions: remove outdated comment regarding file movement and enhance clarity on installation steps for improved user understanding. --- .../tutorials/create-l2-rollup/op-deployer-setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 3022b4ed0..8a52f23ef 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -82,7 +82,6 @@ There are a couple of ways to install `op-deployer`: tar -xvzf op-deployer-0.2.6-darwin-arm64.tar.gz # Move the extracted file to /usr/local/bin so it can be run globally as a command - # (Note: right now this command is moving the archive itself, not the extracted binary) sudo mv op-deployer-0.2.6-darwin-arm64.tar.gz /usr/local/bin/ ``` @@ -151,6 +150,7 @@ Your rollup needs several key pairs for different roles. Let's generate them fir ### Create keys directory ```bash + #Create a directory inside the deployer's directory mkdir -p keys cd keys ``` From 3c8d83334dd6ac2e9fdd126769fd6d3b7a60a352 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 10 Sep 2025 14:01:42 +0100 Subject: [PATCH 74/92] Enhance op-deployer setup instructions: break down installation steps into clear, sequential actions, improve clarity on file movement and permissions, and provide verification step to ensure successful installation. --- .../create-l2-rollup/op-deployer-setup.mdx | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 8a52f23ef..0939d4de5 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -75,24 +75,28 @@ There are a couple of ways to install `op-deployer`: ```bash - # Change directory to the Downloads folder - cd ~/Downloads + # Step 1: Go to the Downloads folder (where your file is saved) + cd ~/Downloads - # Extract the compressed tar.gz archive (x = extract, v = verbose, z = gzip, f = file) - tar -xvzf op-deployer-0.2.6-darwin-arm64.tar.gz + # Step 2: Extract the tar.gz archive (x = extract, v = verbose, z = gzip, f = file) + tar -xvzf op-deployer-0.2.6-darwin-arm64.tar.gz - # Move the extracted file to /usr/local/bin so it can be run globally as a command - sudo mv op-deployer-0.2.6-darwin-arm64.tar.gz /usr/local/bin/ - ``` + # Step 3: Move into the extracted folder (adjust if folder name differs) + cd op-deployer-0.2.6-darwin-arm64 - - **For macOS Users**: If you get a security warning from your OS: + # Step 4: Make the binary executable + chmod +x op-deployer - ```bash - # Run this command to allow the binary - xattr -d com.apple.quarantine ~/bin/op-deployer - ``` - + # Step 5: Remove macOS quarantine attribute (fixes "can't be opened" warning) + sudo xattr -dr com.apple.quarantine op-deployer + + # Step 6: Move the binary into /usr/local/bin (Intel Macs) + # For Apple Silicon Macs, you may prefer /opt/homebrew/bin instead + sudo mv op-deployer /usr/local/bin/ + + # Step 7: Verify installation (should print version info) + op-deployer --version + ``` ### Verify installation From 7f823c662d4f7c059b33c9330b48883aa83a870e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 10 Sep 2025 14:18:56 +0100 Subject: [PATCH 75/92] Remove outdated RPC check command from L2 rollup batcher setup documentation to streamline instructions and improve clarity for users. --- .../tutorials/create-l2-rollup/op-batcher-setup.mdx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index 063d128c1..a1ef70bc5 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -169,11 +169,6 @@ For setting up the batcher, we recommend using Docker as it provides a consisten ### Verify batcher is running ```bash - # Check batcher RPC is responding - curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"admin_startBatcher","params":[],"id":1}' \ - http://localhost:8548 - # Check container status docker-compose ps ``` From e37643c47a4d5b38fdaf8de9222e734f8ea67040 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 10 Sep 2025 14:44:05 +0100 Subject: [PATCH 76/92] Update op-proposer setup documentation: correct the variable name for DisputeGameFactory address extraction to ensure accuracy in setup instructions. --- .../tutorials/create-l2-rollup/op-proposer-setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index b8e106ed2..48e090751 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -128,7 +128,7 @@ For setting up the proposer, we recommend using Docker as it provides a consiste cp .deployer/state.json . # Extract the DisputeGameFactory address - GAME_FACTORY_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].DisputeGameFactoryProxy') + GAME_FACTORY_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].disputeGameFactoryProxyAddress') echo "DisputeGameFactory Address: $GAME_FACTORY_ADDRESS" ``` From 61c0ff00359296e1ae7e5c4a64aa7118dfc9b4be Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 10 Sep 2025 16:43:39 +0100 Subject: [PATCH 77/92] Add prerequisites section to L2 rollup tutorial: specify required experience level and familiarity with Ethereum development concepts to better prepare users for the tutorial. --- .../operators/chain-operators/tutorials/create-l2-rollup.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index e1042786a..b5d1f9789 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -24,6 +24,10 @@ import { Callout, Card, Steps } from 'nextra/components' Welcome to the complete guide for deploying your own OP Stack L2 rollup testnet. This multi-part tutorial will walk you through each component step-by-step, from initial setup to a fully functioning rollup. + + **Prerequisites**: This tutorial requires **intermediate-level experience with Ethereum development**. You should be comfortable with concepts like smart contracts, private keys, RPC endpoints, gas fees, and command-line operations. Basic familiarity with Docker and blockchain infrastructure is also recommended. + + ## What You'll Build By the end of this tutorial, you'll have a complete OP Stack testnet with: From 1cd19465092700b50dccea6f2baaa77d86cbf1e4 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 15 Sep 2025 22:25:20 +0100 Subject: [PATCH 78/92] Enhance L2 rollup tutorial: introduce a directory structure section for better organization, clarify setup instructions for op-deployer and sequencer, and ensure consistency in file paths across the documentation. --- .../tutorials/create-l2-rollup.mdx | 19 ++++ .../create-l2-rollup/op-deployer-setup.mdx | 62 ++++++++--- .../create-l2-rollup/op-geth-setup.mdx | 104 ++++++++++-------- 3 files changed, 123 insertions(+), 62 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index b5d1f9789..094d556e4 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -132,6 +132,25 @@ You can either use a node provider like [Alchemy](https://www.alchemy.com/) (eas **Follow in Order**: Each step builds on the previous one. Start with spinning up op-deployer and complete them sequentially for the best experience. +## Directory Structure + +To keep your rollup deployment organized, we'll create a dedicated directory structure. All components will be set up within this structure: + +```bash +rollup/ +├── deployer/ # op-deployer files and contracts +├── sequencer/ # op-geth and op-node +├── batcher/ # op-batcher configuration +├── proposer/ # op-proposer setup +└── challenger/ # op-challenger files +``` + +Each component's documentation will show you how the directory structure evolves as you add files and configurations. + + + Throughout this tutorial, all file paths will be relative to this `rollup` directory structure. Make sure to adjust any commands if you use different directory names. + + ## Tutorial Overview This tutorial is organized into sequential steps that build upon each other: diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 0939d4de5..4d6a7bd44 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -58,13 +58,22 @@ There are a couple of ways to install `op-deployer`: ### Create deployer directory and install binary - 1. Create and enter a directory for op-deployer: + 1. Create the rollup directory structure and enter the deployer directory: ```bash + # Create main rollup directory + mkdir rollup && cd rollup + # Create and enter the deployer directory mkdir deployer && cd deployer ``` + Your directory structure will now look like this: + ```bash + rollup/ + └── deployer/ # You are here + ``` + 2. Move and rename the downloaded binary: @@ -75,24 +84,21 @@ There are a couple of ways to install `op-deployer`: ```bash - # Step 1: Go to the Downloads folder (where your file is saved) - cd ~/Downloads - - # Step 2: Extract the tar.gz archive (x = extract, v = verbose, z = gzip, f = file) - tar -xvzf op-deployer-0.2.6-darwin-arm64.tar.gz - - # Step 3: Move into the extracted folder (adjust if folder name differs) - cd op-deployer-0.2.6-darwin-arm64 + # Step 1: Extract the tar.gz archive in the deployer directory + # Replace USERNAME with your username and adjust the version/arch if needed + tar -xvzf /Users/USERNAME/Downloads/op-deployer-0.2.6-darwin-arm64.tar.gz - # Step 4: Make the binary executable + # Step 2: Make the binary executable chmod +x op-deployer - # Step 5: Remove macOS quarantine attribute (fixes "can't be opened" warning) + # Step 3: Remove macOS quarantine attribute (fixes "can't be opened" warning) sudo xattr -dr com.apple.quarantine op-deployer - # Step 6: Move the binary into /usr/local/bin (Intel Macs) - # For Apple Silicon Macs, you may prefer /opt/homebrew/bin instead + # Step 4: Move the binary to your PATH + # For Intel Macs: sudo mv op-deployer /usr/local/bin/ + # For Apple Silicon Macs: + # sudo mv op-deployer /opt/homebrew/bin/ # Step 7: Verify installation (should print version info) op-deployer --version @@ -154,11 +160,18 @@ Your rollup needs several key pairs for different roles. Let's generate them fir ### Create keys directory ```bash - #Create a directory inside the deployer's directory + # Create a keys directory inside the deployer directory mkdir -p keys cd keys ``` + Your directory structure will now look like this: + ```bash + rollup/ + └── deployer/ + └── keys/ # You are here + ``` + ### Generate keys for each role ```bash @@ -359,6 +372,27 @@ Great! You've successfully: 4. Deployed L1 smart contracts 5. Generated chain configuration files +Your final directory structure should look like this: +```bash +rollup/ +└── deployer/ + ├── .deployer/ # Contains deployment state and configs + │ ├── genesis.json # L2 genesis configuration + │ ├── intent.toml # Your chain configuration + │ ├── l1-contracts.json # Deployed contract addresses + │ ├── rollup.json # Rollup configuration + │ └── state.json # Deployment state + ├── .env # Environment variables + └── keys/ # Generated key pairs + ├── base_Fee_Vault_Recipient_address.txt + ├── batcher_address.txt + ├── l1_Fee_Vault_Recipient_address.txt + ├── proposer_address.txt + ├── sequencer_Fee_Vault_Recipient_address.txt + ├── system_config_address.txt + └── unsafe_block_signer_address.txt +``` + Now you can move on to setting up your sequencer node. diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index b1b4f6f44..0f605b429 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -51,14 +51,14 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ### Set up directory structure and copy configuration files ```bash - # Create your sequencer working directory - mkdir sequencer-node - cd sequencer-node + # Create your sequencer directory inside rollup + cd ../ # Go back to rollup directory if you're in deployer + mkdir sequencer + cd sequencer - # Copy configuration files from op-deployer output - # Note: Adjust the path if your .deployer directory is located elsewhere - cp .deployer/genesis.json . - cp .deployer/rollup.json . + # Copy configuration files from deployer + cp ../deployer/.deployer/genesis.json . + cp ../deployer/.deployer/rollup.json . # Generate JWT secret openssl rand -hex 32 > jwt.txt @@ -168,8 +168,8 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ### Initialize op-geth with Docker ```bash - # Make sure you're in the sequencer-node directory with all files copied - cd sequencer-node + # Make sure you're in the rollup/sequencer directory with all files copied + cd rollup/sequencer # Initialize op-geth using Docker docker run --rm \ @@ -192,15 +192,18 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ### Final directory structure ```bash - sequencer-node/ - ├── jwt.txt # Generated JWT secret - ├── genesis.json # Copied from .deployer/ - ├── rollup.json # Copied from .deployer/ - ├── .env # Environment variables - ├── docker-compose.yml # Docker configuration - └── op-geth-data/ # Created by Docker during initialization - ├── geth/ # Geth data - └── keystore/ # Key files + rollup/ + ├── deployer/ # From previous step + │ └── .deployer/ # Contains genesis.json and rollup.json + └── sequencer/ # You are here + ├── jwt.txt # Generated JWT secret + ├── genesis.json # Copied from deployer + ├── rollup.json # Copied from deployer + ├── .env # Environment variables + ├── docker-compose.yml # Docker configuration + └── op-geth-data/ # Created by Docker during initialization + ├── geth/ # Geth data + └── keystore/ # Key files ``` Your sequencer node is now operational and ready to process transactions. @@ -276,27 +279,27 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler After building the binaries, you should have the following directory structure: - ``` - - ├── optimism/ # Optimism monorepo + ```bash + rollup/ + ├── deployer/ # From previous step + │ └── .deployer/ # Contains genesis.json and rollup.json + ├── optimism/ # Optimism monorepo │ └── op-node/ │ └── bin/ - │ └── op-node # Built binary - ├── op-geth/ # OP-Geth repository - │ └── build/ - │ └── bin/ - │ └── geth # Built binary - └── .deployer/ # From op-deployer - ├── genesis.json - └── rollup.json + │ └── op-node # Built binary + └── op-geth/ # OP-Geth repository + └── build/ + └── bin/ + └── geth # Built binary ``` Now create your sequencer working directory. We recommend creating it at the same level for easy path references: ```bash - # Create sequencer directory at the root level - mkdir /sequencer-node - cd sequencer-node + # Create sequencer directory inside rollup + cd ../ # Go back to rollup directory + mkdir sequencer + cd sequencer ```
@@ -333,21 +336,26 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler # Create scripts directory mkdir scripts - # Copy configuration files from op-deployer - cp .deployer/genesis.json . - cp .deployer/rollup.json . + # Copy configuration files from deployer + cp ../deployer/.deployer/genesis.json . + cp ../deployer/.deployer/rollup.json . ``` Your final directory structure should look like: ```bash - sequencer-node/ - ├── jwt.txt - ├── genesis.json - ├── rollup.json - └── scripts/ - ├── start-op-geth.sh # (to be created) - └── start-op-node.sh # (to be created) + rollup/ + ├── deployer/ # From previous step + │ └── .deployer/ # Contains genesis.json and rollup.json + ├── optimism/ # Contains op-node binary + ├── op-geth/ # Contains op-geth binary + └── sequencer/ # You are here + ├── jwt.txt # Generated JWT secret + ├── genesis.json # Copied from deployer + ├── rollup.json # Copied from deployer + └── scripts/ # Startup scripts + ├── start-op-geth.sh + └── start-op-node.sh ``` ### Environment variables @@ -438,7 +446,7 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler source .env # Path to the op-geth binary we built - ../op-geth/build/bin/geth \ + ../../op-geth/build/bin/geth \ --datadir=./op-geth-data \ --http \ --http.addr=0.0.0.0 \ @@ -471,7 +479,7 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler source .env # Path to the op-node binary we built - ../optimism/op-node/bin/op-node \ + ../../optimism/op-node/bin/op-node \ --l1=$L1_RPC_URL \ --l1.beacon=$L1_BEACON_URL \ --l2=http://localhost:$OP_GETH_AUTH_PORT \ @@ -501,11 +509,11 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ### Initialize op-geth with your genesis file ```bash - # Make sure you're in the sequencer-node directory - cd sequencer-node + # Make sure you're in the rollup/sequencer directory + cd rollup/sequencer # Initialize op-geth with your genesis file - ../op-geth/build/bin/geth init --datadir=./op-geth-data --state.scheme=hash ./genesis.json + ../../op-geth/build/bin/geth init --datadir=./op-geth-data --state.scheme=hash ./genesis.json ``` ### Start op-geth @@ -525,7 +533,7 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ```bash # In a separate terminal, navigate to the sequencer directory - cd sequencer-node + cd rollup/sequencer # Start op-node ./scripts/start-op-node.sh From f38ac91d7e0094efceb561ca49b1cf6b86e302ec Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 15 Sep 2025 22:25:47 +0100 Subject: [PATCH 79/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- words.txt | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/words.txt b/words.txt index 65eb75e8f..6336f5d77 100644 --- a/words.txt +++ b/words.txt @@ -8,14 +8,12 @@ ADDIU ADDU airgap Allnodes -allocs Alphanet alphanet Alphanets alphanets altda ANDI -Ankr Apeworx Arweave authrpc @@ -57,10 +55,6 @@ BOOTNODES Bootnodes bootnodes bottlenecked -Brotli -brotli -Callouts -callouts CCIP cdef Celestia @@ -72,7 +66,6 @@ Chainstack chaosnet Chugsplash Clabby -codebases Collateralized collateralized compr @@ -88,8 +81,6 @@ Crossmint daserver DATACAP datacap -DATADIR -datadir Defi Defillama's delegatecall @@ -97,7 +88,6 @@ Devnet devnet Devnets devnets -devs direnv DISABLETXPOOLGOSSIP disabletxpoolgossip @@ -108,7 +98,6 @@ Drand dripcheck Drippie Eigen -EIPs ENABLEDEPRECATEDPERSONAL enabledeprecatedpersonal enginekind @@ -123,7 +112,6 @@ ethstats EVMTIMEOUT evmtimeout executability -exfiltrate EXITWHENSYNCED exitwhensynced extensibly @@ -173,7 +161,6 @@ holesky IERC IGNOREPRICE ignoreprice -Immunefi Inator inator INFLUXDBV @@ -223,7 +210,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism monitorism Moralis @@ -246,7 +232,6 @@ NETWORKID networkid NEWPAYLOAD newpayload -nextra NOCOMPACTION nocompaction NODEKEY @@ -277,7 +262,6 @@ opcm Openfort oplabs opnode's -outfile outperformance pcscdpath Pectra @@ -312,7 +296,6 @@ Preimage preimage PREIMAGES preimages -preinstall Preinstalls preinstalls Prestate @@ -326,21 +309,16 @@ pricelimit productionize productionized Protip -Proxied Proxyd proxyd -Pyth -Pyth's QRNG Quicknode quicknode quickstarts -rebalancing reemit Reemitting Regenesis regenesis -Reimagine REJOURNAL rejournal REMOTEDB @@ -360,21 +338,15 @@ Routescan rpckind RPCPREFIX rpcprefix -rpcs RPGF Runbooks runbooks -RWAs safedb Schnorr -SEPOLIA -Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp serv -signup SLLV SLTI SLTIU @@ -392,7 +364,6 @@ SRLV Stablecoins stablecoins statefulset -structs subcomponents subgame subheaders @@ -418,8 +389,6 @@ syscalls SYSCON thirdweb threadcreate -timeseries -topline triggerable trustlessly trustrpc @@ -435,7 +404,6 @@ uncensorable uncountered undercollateralize Unichain -Unprotect unsubmitted UPNP VERKLE @@ -452,7 +420,6 @@ VMODULE vmodule xlarge XORI -ZKPs ZKVM Zora zora From 089481d7f9359850ab2e42b5239bfa388ab651c4 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 16 Sep 2025 17:13:44 +0100 Subject: [PATCH 80/92] Refactor L2 rollup setup documentation: standardize directory structure for batcher, proposer, and challenger setups, ensuring all directories are created within the rollup directory. Update configuration file paths for clarity and consistency across tutorials. --- .../create-l2-rollup/op-batcher-setup.mdx | 61 +++++++++--------- .../create-l2-rollup/op-challenger-setup.mdx | 36 ++++++----- .../create-l2-rollup/op-deployer-setup.mdx | 33 +++++----- .../create-l2-rollup/op-proposer-setup.mdx | 62 ++++++++++--------- 4 files changed, 103 insertions(+), 89 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index a1ef70bc5..7fb57a27f 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -62,13 +62,13 @@ For setting up the batcher, we recommend using Docker as it provides a consisten ### Set up directory structure and copy configuration files ```bash - # Create your batcher working directory - mkdir batcher-node - cd batcher-node + # Create your batcher directory inside rollup + cd ../ # Go back to rollup directory if you're in sequencer + mkdir batcher + cd batcher - # Copy configuration files from op-deployer output - # Note: Adjust the path if your .deployer directory is located elsewhere - cp .deployer/state.json . + # Copy configuration files from deployer + cp ../deployer/.deployer/state.json . # Extract the BatchInbox address BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].systemConfigProxyAddress') @@ -176,10 +176,14 @@ For setting up the batcher, we recommend using Docker as it provides a consisten ### Final directory structure ```bash - batcher-node/ - ├── state.json # Copied from .deployer/ - ├── .env # Environment variables - └── docker-compose.yml # Docker configuration + rollup/ + ├── deployer/ # From previous step + │ └── .deployer/ # Contains genesis.json and rollup.json + ├── sequencer/ # From previous step + └── batcher/ # You are here + ├── state.json # Copied from deployer + ├── .env # Environment variables + └── docker-compose.yml # Docker configuration ``` @@ -243,9 +247,10 @@ For setting up the batcher, we recommend using Docker as it provides a consisten Create your batcher working directory: ```bash - # Create batcher directory at the same level as your sequencer - mkdir batcher-node - cd batcher-node + # Create batcher directory inside rollup + cd ../ # Go back to rollup directory + mkdir batcher + cd batcher # Create scripts directory mkdir scripts @@ -254,16 +259,15 @@ For setting up the batcher, we recommend using Docker as it provides a consisten Your final directory structure should look like: ```bash - - ├── optimism/ # Contains op-batcher binary - ├── sequencer-node/ # Your sequencer setup - ├── proposer-node/ # Your proposer setup - ├── .deployer/ # From op-deployer - │ └── state.json - └── batcher-node/ # Your batcher working directory - ├── state.json # Copied from .deployer - ├── .env - └── scripts/ + rollup/ + ├── deployer/ # From previous step + │ └── .deployer/ # Contains state.json + ├── optimism/ # Contains op-batcher binary + ├── sequencer/ # From previous step + └── batcher/ # You are here + ├── state.json # Copied from deployer + ├── .env # Environment variables + └── scripts/ # Startup scripts └── start-batcher.sh ``` @@ -272,12 +276,11 @@ For setting up the batcher, we recommend using Docker as it provides a consisten Extract the `BatchInbox` contract address from your op-deployer output: ```bash - # Navigate to batcher directory - cd batcher-node + # Make sure you're in the rollup/batcher directory + cd rollup/batcher - # Copy the deployment state file from op-deployer - # Update the path if your .deployer directory is located elsewhere - cp ../.deployer/state.json . + # Copy the deployment state file from deployer + cp ../deployer/.deployer/state.json . # Extract the BatchInbox address BATCH_INBOX_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].systemConfigProxyAddress') @@ -340,7 +343,7 @@ For setting up the batcher, we recommend using Docker as it provides a consisten source .env # Path to the op-batcher binary we built - ../optimism/op-batcher/bin/op-batcher \ + ../../optimism/op-batcher/bin/op-batcher \ --l2-eth-rpc=$L2_RPC_URL \ --rollup-rpc=$ROLLUP_RPC_URL \ --poll-interval=$POLL_INTERVAL \ diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 97f9bfc64..c1833aba7 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -116,8 +116,10 @@ For challenger deployment, we recommend using Docker as it provides a consistent ### Create challenger directory ```bash - # Create and enter the challenger directory - mkdir challenger-node && cd challenger-node + # Create your challenger directory inside rollup + cd ../ # Go back to rollup directory if you're in proposer + mkdir challenger + cd challenger ``` ### Create environment file @@ -143,8 +145,8 @@ For challenger deployment, we recommend using Docker as it provides a consistent NETWORK=op-sepolia GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS - # Prestate configuration - PRESTATE_HASH=YOUR_PRESTATE_HASH + # Prestate configuration - Replace with the hash from 'make reproducible-prestate' + PRESTATE_HASH=0x03eb07101fbdeaf3f04d9fb76526362c1eea2824e4c6e970bdb19675b72e4fc8 EOF ``` @@ -270,9 +272,10 @@ For challenger deployment, we recommend using Docker as it provides a consistent After building the binaries, create your challenger working directory: ```bash - # Create challenger directory (this should be at the same level as optimism directory) - mkdir challenger-node - cd challenger-node + # Create challenger directory inside rollup + cd ../ # Go back to rollup directory + mkdir challenger + cd challenger # Create necessary subdirectories mkdir scripts @@ -280,8 +283,13 @@ For challenger deployment, we recommend using Docker as it provides a consistent # Verify the optimism directory is accessible # Directory structure should look like: - # /optimism/ (contains the built binaries) - # /challenger-node/ (your working directory) + # rollup/ + # ├── deployer/ (from previous step) + # ├── optimism/ (contains the built binaries) + # ├── sequencer/ (from previous step) + # ├── batcher/ (from previous step) + # ├── proposer/ (from previous step) + # └── challenger/ (you are here) ``` ### Copy configuration files @@ -354,8 +362,8 @@ For challenger deployment, we recommend using Docker as it provides a consistent # The Cannon binary is a specific hash file that matches your deployment CANNON_BIN=./0x.bin.gz # The op-program server binary is built when you run 'just op-challenger' - CANNON_SERVER=../optimism/op-program/bin/op-program - CANNON_PRESTATE=../optimism/op-program/bin/prestate.json + CANNON_SERVER=../../optimism/op-program/bin/op-program + CANNON_PRESTATE=../../optimism/op-program/bin/prestate.json EOF ``` @@ -501,7 +509,7 @@ For challenger deployment, we recommend using Docker as it provides a consistent source .env # Path to the challenger binary - ../optimism/op-challenger/bin/op-challenger \ + ../../optimism/op-challenger/bin/op-challenger \ --trace-type permissioned,cannon \ --l1-eth-rpc=$L1_RPC_URL \ --l2-eth-rpc=$L2_RPC_URL \ @@ -520,8 +528,8 @@ For challenger deployment, we recommend using Docker as it provides a consistent ### Start the challenger ```bash - # Make sure you're in the challenger-node directory - cd challenger-node + # Make sure you're in the rollup/challenger directory + cd rollup/challenger # Make script executable chmod +x scripts/start-challenger.sh diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 4d6a7bd44..58ad2a8ef 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -103,12 +103,6 @@ There are a couple of ways to install `op-deployer`: # Step 7: Verify installation (should print version info) op-deployer --version ``` - - ### Verify installation - - ```bash - op-deployer --version - ``` @@ -132,7 +126,7 @@ There are a couple of ways to install `op-deployer`: Before deploying your L1 contracts, you'll need: -1. **L1 RPC URL**: An Ethereum RPC endpoint for your chosen L1 network +**L1 RPC URL**: An Ethereum RPC endpoint for your chosen L1 network ```bash # Examples: @@ -152,31 +146,31 @@ Before deploying your L1 contracts, you'll need: * [Ankr](https://ankr.com) (create account, get API key) -## Generate deployment keys +## Generate deployment addresses Your rollup needs several key pairs for different roles. Let's generate them first: - ### Create keys directory + ### Create address directory ```bash - # Create a keys directory inside the deployer directory - mkdir -p keys - cd keys + # Create a address directory inside the deployer directory + mkdir -p address + cd address ``` Your directory structure will now look like this: ```bash rollup/ └── deployer/ - └── keys/ # You are here + └── address/ # You are here ``` - ### Generate keys for each role + ### Generate address for each role ```bash # Generate 7 new Ethereum accounts - for role in base_Fee_Vault_Recipient l1_Fee_Vault_Recipient sequencer_Fee_Vault_Recipient system_config unsafe_block_signer batcher proposer ; do + for role in admin base_Fee_Vault_Recipient l1_Fee_Vault_Recipient sequencer_Fee_Vault_Recipient system_config unsafe_block_signer batcher proposer ; do wallet_output=$(cast wallet new) echo "$wallet_output" | grep "Address:" | awk '{print $2}' > ${role}_address.txt echo "Created wallet for $role" @@ -189,8 +183,9 @@ Your rollup needs several key pairs for different roles. Let's generate them fir **Important**: - * Save these keys securely - you'll need them to operate your chain - * For production, use proper key management solutions (HSMs, multisigs) + * Save these address - you'll need them to operate your chain + * You can use any address for the purpose of testing, for production, use proper key management solutions (HSMs, multisigs addresses) + ## Create and configure intent file @@ -383,7 +378,7 @@ rollup/ │ ├── rollup.json # Rollup configuration │ └── state.json # Deployment state ├── .env # Environment variables - └── keys/ # Generated key pairs + └── address/ # Generated address pairs ├── base_Fee_Vault_Recipient_address.txt ├── batcher_address.txt ├── l1_Fee_Vault_Recipient_address.txt @@ -391,6 +386,8 @@ rollup/ ├── sequencer_Fee_Vault_Recipient_address.txt ├── system_config_address.txt └── unsafe_block_signer_address.txt + └── admin.txt + ``` Now you can move on to setting up your sequencer node. diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index 48e090751..f51793793 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -119,13 +119,13 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ### Set up directory structure and copy configuration files ```bash - # Create your proposer working directory - mkdir proposer-node - cd proposer-node + # Create your proposer directory inside rollup + cd ../ # Go back to rollup directory if you're in batcher + mkdir proposer + cd proposer - # Copy configuration files from op-deployer output - # Note: Adjust the path if your .deployer directory is located elsewhere - cp .deployer/state.json . + # Copy configuration files from deployer + cp ../deployer/.deployer/state.json . # Extract the DisputeGameFactory address GAME_FACTORY_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].disputeGameFactoryProxyAddress') @@ -234,10 +234,15 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ### Final directory structure ```bash - proposer-node/ - ├── state.json # Copied from .deployer/ - ├── .env # Environment variables - └── docker-compose.yml # Docker configuration + rollup/ + ├── deployer/ # From previous step + │ └── .deployer/ # Contains state.json + ├── sequencer/ # From previous step + ├── batcher/ # From previous step + └── proposer/ # You are here + ├── state.json # Copied from deployer + ├── .env # Environment variables + └── docker-compose.yml # Docker configuration ``` @@ -324,9 +329,10 @@ For setting up the proposer, we recommend using Docker as it provides a consiste Create your proposer working directory at the same level as your sequencer: ```bash - # Create proposer directory at the same level as your sequencer - mkdir proposer-node - cd proposer-node + # Create proposer directory inside rollup + cd ../ # Go back to rollup directory + mkdir proposer + cd proposer # Create scripts directory mkdir scripts @@ -337,12 +343,11 @@ For setting up the proposer, we recommend using Docker as it provides a consiste Extract the `DisputeGameFactory` contract address from your op-deployer output: ```bash - # Navigate to proposer directory - cd proposer-node + # Make sure you're in the rollup/proposer directory + cd rollup/proposer - # Copy the state.json from .deployer directory created while using op-deployer - # Update the path if your .deployer directory is located elsewhere - cp ../.deployer/state.json . + # Copy the state.json from deployer + cp ../deployer/.deployer/state.json . # Extract the DisputeGameFactory address GAME_FACTORY_ADDRESS=$(cat state.json | jq -r '.opChainDeployments[0].disputeGameFactoryProxyAddress') @@ -403,7 +408,7 @@ For setting up the proposer, we recommend using Docker as it provides a consiste source .env # Path to the op-proposer binary we built - ../optimism/op-proposer/bin/op-proposer \ + ../../optimism/op-proposer/bin/op-proposer \ --poll-interval=$POLL_INTERVAL \ --rpc.port=$PROPOSER_RPC_PORT \ --rpc.enable-admin \ @@ -422,15 +427,16 @@ For setting up the proposer, we recommend using Docker as it provides a consiste Your final directory structure should look like: ```bash - - ├── optimism/ # Contains op-proposer binary - ├── sequencer-node/ # Your sequencer setup - ├── .deployer/ # From op-deployer - │ └── state.json - └── proposer-node/ # Your proposer working directory - ├── state.json # Copied from .deployer - ├── .env - └── scripts/ + rollup/ + ├── deployer/ # From previous step + │ └── .deployer/ # Contains state.json + ├── optimism/ # Contains op-proposer binary + ├── sequencer/ # From previous step + ├── batcher/ # From previous step + └── proposer/ # You are here + ├── state.json # Copied from deployer + ├── .env # Environment variables + └── scripts/ # Startup scripts └── start-proposer.sh ``` From 75607a3d067bd5f7dcf847c802c842dc8f3e4e94 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 16 Sep 2025 17:19:45 +0100 Subject: [PATCH 81/92] Update L2 rollup challenger setup documentation: clarify configuration file paths by replacing hardcoded chain ID with a placeholder, and enhance directory structure explanation for improved user understanding. --- .../create-l2-rollup/op-challenger-setup.mdx | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index c1833aba7..ef2f787b8 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -61,9 +61,23 @@ Before configuring your challenger, complete the following steps: 2. **Copy your chain configuration**: ```bash - # Replace 67865 with your L2 chain ID - cp /path/to/rollup.json op-program/chainconfig/configs/67865-rollup.json - cp /path/to/genesis.json op-program/chainconfig/configs/67865-genesis.json + # Assuming you're in rollup/optimism directory + # Replace with your actual L2 chain ID + cp ../deployer/.deployer/rollup.json op-program/chainconfig/configs/-rollup.json + cp ../deployer/.deployer/genesis.json op-program/chainconfig/configs/-genesis.json + + # Your directory structure should look like: + # rollup/ + # ├── deployer/ + # │ └── .deployer/ + # │ ├── rollup.json # Source file + # │ └── genesis.json # Source file + # └── optimism/ # You are here + # └── op-program/ + # └── chainconfig/ + # └── configs/ + # ├── -rollup.json # Destination + # └── -genesis.json # Destination ``` 3. **Generate the prestate**: From ffd4af378e3614f3c97508644aa6cef6670c821d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 16 Sep 2025 17:20:09 +0100 Subject: [PATCH 82/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../create-l2-rollup/op-challenger-setup.mdx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index ef2f787b8..30b220ada 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -171,17 +171,21 @@ For challenger deployment, we recommend using Docker as it provides a consistent Create a `docker-compose.yml` file that defines the challenger service: ```yaml - + # Define the challenger service configuration services: challenger: + # Use the official OP Stack challenger image image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.5.0 + # Run as non-root user for security user: "1000" volumes: + # Persistent storage for challenger data - ./challenger-data:/data - - ./rollup.json:/workspace/rollup.json:ro - - ./genesis-l2.json:/workspace/genesis-l2.json:ro - - ./prestate-proof-mt64.json:/workspace/prestate-proof.json:ro - - ./${PRESTATE_HASH}.bin.gz:/workspace/${PRESTATE_HASH}.bin.gz:ro + # Mount configuration files from your deployment + - ./rollup.json:/workspace/rollup.json:ro # Rollup configuration + - ./genesis-l2.json:/workspace/genesis-l2.json:ro # L2 genesis state + - ./prestate-proof-mt64.json:/workspace/prestate-proof.json:ro # Cannon prestate proof + - ./${PRESTATE_HASH}.bin.gz:/workspace/${PRESTATE_HASH}.bin.gz:ro # Cannon binary for the specific prestate environment: - L1_RPC_URL=${L1_RPC_URL} - L1_BEACON=${L1_BEACON} From cead84017e4dc5923823bee4dee9500b439a1099 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 16 Sep 2025 17:26:03 +0100 Subject: [PATCH 83/92] Update L2 rollup challenger setup documentation: enhance clarity by specifying the importance of prestate files in the Docker Compose setup and streamline the service configuration section for better user comprehension. --- .../create-l2-rollup/op-challenger-setup.mdx | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 30b220ada..3a2b84d5c 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -168,24 +168,21 @@ For challenger deployment, we recommend using Docker as it provides a consistent ### Set up Docker Compose - Create a `docker-compose.yml` file that defines the challenger service: + Create a `docker-compose.yml` file that defines the challenger service. The file mounts several important files: + * `prestate-proof-mt64.json` and `${PRESTATE_HASH}.bin.gz`: Prestate files required for dispute games (the PRESTATE_HASH comes from running `make reproducible-prestate`) ```yaml - # Define the challenger service configuration + services: challenger: - # Use the official OP Stack challenger image image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.5.0 - # Run as non-root user for security user: "1000" volumes: - # Persistent storage for challenger data - ./challenger-data:/data - # Mount configuration files from your deployment - - ./rollup.json:/workspace/rollup.json:ro # Rollup configuration - - ./genesis-l2.json:/workspace/genesis-l2.json:ro # L2 genesis state - - ./prestate-proof-mt64.json:/workspace/prestate-proof.json:ro # Cannon prestate proof - - ./${PRESTATE_HASH}.bin.gz:/workspace/${PRESTATE_HASH}.bin.gz:ro # Cannon binary for the specific prestate + - ./rollup.json:/workspace/rollup.json:ro + - ./genesis-l2.json:/workspace/genesis-l2.json:ro + - ./prestate-proof-mt64.json:/workspace/prestate-proof.json:ro + - ./${PRESTATE_HASH}.bin.gz:/workspace/${PRESTATE_HASH}.bin.gz:ro environment: - L1_RPC_URL=${L1_RPC_URL} - L1_BEACON=${L1_BEACON} From 2e67945b8d4a31e3de44fab5d2ba0c2eb0d886d6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 16 Sep 2025 17:28:14 +0100 Subject: [PATCH 84/92] update text --- .../tutorials/create-l2-rollup/op-challenger-setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index 3a2b84d5c..fc7650b21 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -169,7 +169,7 @@ For challenger deployment, we recommend using Docker as it provides a consistent ### Set up Docker Compose Create a `docker-compose.yml` file that defines the challenger service. The file mounts several important files: - * `prestate-proof-mt64.json` and `${PRESTATE_HASH}.bin.gz`: Prestate files required for dispute games (the PRESTATE_HASH comes from running `make reproducible-prestate`) + * `prestate-proof-mt64.json` and `${PRESTATE_HASH}.bin.gz`: Prestate files required for dispute games (the PRESTATE_HASH comes from running `make reproducible-prestate`), replace `PRESTATE_HASH` with the actual hash ```yaml From 585d58f0165ef1012e9d695b8a3ce56b39574f27 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 16 Sep 2025 17:37:12 +0100 Subject: [PATCH 85/92] Add new words to dictionary: include 'asterisc', 'asterisc-kona', and 'prestate-proof-mt64' for enhanced vocabulary support. --- words.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/words.txt b/words.txt index 6336f5d77..0995f0178 100644 --- a/words.txt +++ b/words.txt @@ -16,6 +16,8 @@ altda ANDI Apeworx Arweave +asterisc +asterisc-kona authrpc Autorelay autorelay @@ -300,6 +302,7 @@ Preinstalls preinstalls Prestate prestate +prestate-proof-mt64 prestates PREVRANDAO PRICEBUMP From 54a74110c0bb1da6467067d54d8bfd737f361a3a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 16 Sep 2025 17:38:32 +0100 Subject: [PATCH 86/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- words.txt | 247 +++++++++++++++++++++++------------------------------- 1 file changed, 103 insertions(+), 144 deletions(-) diff --git a/words.txt b/words.txt index 2be4ee60a..830fb3158 100644 --- a/words.txt +++ b/words.txt @@ -1,7 +1,7 @@ -accountqueue ACCOUNTQUEUE -accountslots +accountqueue ACCOUNTSLOTS +accountslots ACDC ADDI ADDIU @@ -9,60 +9,52 @@ ADDU airgap Allnodes Alphanet -allocs alphanet -Alphanet -alphanets Alphanets +alphanets altda ANDI Apeworx Arweave -asterisc -asterisc-kona authrpc -autorelay Autorelay +autorelay autorelayer basefee bcde -betanet Betanet -betanets +betanet Betanets +betanets BGEZ BGTZ Biconomy BLEZ -blobpool BLOBPOOL +blobpool blobspace Blockdaemon blockhash blocklists -blocklogs BLOCKLOGS -blockprofilerate +blocklogs BLOCKPROFILERATE +blockprofilerate Blockscout -blockspace Blockspace +blockspace blocktime -blocktimes Blocktimes -bloomfilter +blocktimes BLOOMFILTER +bloomfilter BLTZ Bootcamp bootnode -bootnodes -Bootnodes BOOTNODES +Bootnodes +bootnodes bottlenecked -brotli -Brotli -callouts -Callouts CCIP cdef Celestia @@ -75,74 +67,65 @@ chaosnet Chugsplash Clabby Collateralized -codebases collateralized -Collateralized compr Comprensive -computependingblock COMPUTEPENDINGBLOCK +computependingblock confs corsdomain counterfactually -crosschain Crosschain +crosschain Crossmint daserver -datacap DATACAP -datadir -DATADIR +datacap Defi Defillama's delegatecall -devnet Devnet -devnets +devnet Devnets -devs +devnets direnv -disabletxpoolgossip DISABLETXPOOLGOSSIP -discv +disabletxpoolgossip Discv +discv DIVU Drand dripcheck Drippie Eigen ENABLEDEPRECATEDPERSONAL -EIPs enabledeprecatedpersonal -ENABLEDEPRECATEDPERSONAL enginekind -erigon Erigon -etherbase +erigon ETHERBASE +etherbase Ethernity Ethernow -ethstats ETHSTATS -evmtimeout +ethstats EVMTIMEOUT +evmtimeout executability EXITWHENSYNCED -exfiltrate exitwhensynced -EXITWHENSYNCED extensibly -extradata EXTRADATA +extradata Farcaster Faultproof -fdlimit FDLIMIT +fdlimit flashblock flashblock's -flashblocks -Flashblocks FLASHBLOCKS +Flashblocks +flashblocks Flashbots forkable forkchoice @@ -150,52 +133,50 @@ FPVM FPVMs Fraxtal Funct -gascap GASCAP +gascap gaslessly -gcmode GCMODE +gcmode Gelato gifs -globalqueue GLOBALQUEUE -globalslots +globalqueue GLOBALSLOTS +globalslots gokzg growthepie hardfork hardforks -healthcheck HEALTHCHECK +healthcheck healthchecks -historicalrpc HISTORICALRPC -historicalrpctimeout +historicalrpc HISTORICALRPCTIMEOUT -holesky -Holesky +historicalrpctimeout HOLESKY +Holesky +holesky IERC +IGNOREPRICE ignoreprice Inator -IGNOREPRICE -Immunefi inator -Inator -influxdbv INFLUXDBV +influxdbv initcode -ipcdisable IPCDISABLE +ipcdisable ipcfile -ipcpath IPCPATH +ipcpath IPFS JALR -journalremotes JOURNALREMOTES -jspath +journalremotes JSPATH +jspath jwtsecret Keccak leveldb @@ -204,35 +185,33 @@ Lisk logfile logfmt Mainnets -maxage MAXAGE -maxbackups +maxage MAXBACKUPS -maxpeers +maxbackups MAXPEERS -maxpendpeers +maxpeers MAXPENDPEERS -maxprice +maxpendpeers MAXPRICE -memprofilerate +maxprice MEMPROFILERATE -merkle +memprofilerate Merkle +merkle MFHI MFLO Mgas Minato -minfreedisk MINFREEDISK -minsuggestedpriorityfee +minfreedisk MINSUGGESTEDPRIORITYFEE +minsuggestedpriorityfee Mintable Mintplex MIPSEVM Monitorism -Mitigations monitorism -Monitorism Moralis Mordor MOVN @@ -241,152 +220,132 @@ MTHI MTLO MULT multiaddr -multichain Multichain +multichain multiclient multisigs MULTU Nethermind -netrestrict NETRESTRICT -networkid +netrestrict NETWORKID +networkid +NEWPAYLOAD newpayload NOCOMPACTION -NEWPAYLOAD -nextra nocompaction -NOCOMPACTION -nodekey NODEKEY -nodekeyhex +nodekey NODEKEYHEX +nodekeyhex nodename Nodies -nodiscover NODISCOVER -nolocals +nodiscover NOLOCALS -noprefetch +nolocals NOPREFETCH -nopruning +noprefetch NOPRUNING -nosyncserve +nopruning NOSYNCSERVE +nosyncserve Numba NVME -offchain Offchain +offchain onlyreqtostatic opchaina opchainb -opcm OPCM +opcm Openfort oplabs opnode's outperformance pcscdpath -pectra Pectra +pectra Pectra's -peerstore Peerstore +peerstore peerstores -permissioned Permissioned +permissioned permissioning -permissionless Permissionless +permissionless permissionlessly Perps Peta Pimlico POAP POAPs -pprof PPROF -precommitments +pprof Precommitments +precommitments preconfigured predeploy -predeployed Predeployed -predeploys +predeployed Predeploys +predeploys prefunded -preimage Preimage +preimage +PREIMAGES preimages Preinstalls -PREIMAGES -preinstall preinstalls -Preinstalls -prestate -prestate-proof-mt64 Prestate +prestate prestates PREVRANDAO -pricebump PRICEBUMP -pricelimit +pricebump PRICELIMIT +pricelimit productionize productionized Protip Proxyd proxyd -proxied -Proxied -proxyd -Proxyd -Pyth -Pyth's QRNG -quicknode Quicknode +quicknode quickstarts reemit Reemitting +Regenesis regenesis REJOURNAL -Regenesis -Reimagine rejournal -REJOURNAL -remotedb REMOTEDB +remotedb Reown Reown's replayability replayor reposts reproven -requiredblocks REQUIREDBLOCKS +requiredblocks rollouts -rollups Rollups +rollups Routescan rpckind -rpcprefix RPCPREFIX -rpcs +rpcprefix RPGF -runbooks -safedb -Schnorr Runbooks -RWAs +runbooks safedb Schnorr -sepolia -Sepolia -SEPOLIA seqnr -sequencerhttp SEQUENCERHTTP +sequencerhttp serv SLLV SLTI @@ -394,8 +353,8 @@ SLTIU SLTU smartcard snapshotlog -snapsync Snapsync +snapsync solady Solana Soneium @@ -403,8 +362,8 @@ soyboy Spearbit SRAV SRLV -stablecoins Stablecoins +stablecoins statefulset subcomponents subgame @@ -412,21 +371,21 @@ subheaders subsecond SUBU Sunnyside -superchain -Superchain SUPERCHAIN -superchainerc +Superchain +superchain Superchain's +superchainerc Superlend Superloans Superscan Superseed -supersim Supersim -syncmode +supersim SYNCMODE -synctarget +syncmode SYNCTARGET +synctarget syscalls SYSCON thirdweb @@ -438,8 +397,8 @@ Twei txfeecap txmgr txns -txpool TXPOOL +txpool txproxy txproxyd uncensorable @@ -448,20 +407,20 @@ undercollateralize Unichain unsubmitted UPNP -verkle VERKLE -vhosts +verkle VHOSTS -viem +vhosts Viem -viem's +viem Viem's -vmdebug +viem's VMDEBUG -vmodule +vmdebug VMODULE +vmodule xlarge XORI ZKVM -zora Zora +zora From 026ca7a9e2ac752c7c23100983b5cd6b1e38a4b2 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 19 Sep 2025 16:07:28 +0100 Subject: [PATCH 87/92] Standardize private key configuration across deployment guides: remove '0x' prefix from private key placeholders in multiple files for consistency. Update tutorial content to enhance clarity and improve directory structure explanations. --- .../chain-operators/deploy/op-challenger.mdx | 2 +- .../deploy/proposer-setup-guide.mdx | 2 +- .../chain-operators/deploy/sequencer-node.mdx | 4 +-- .../chain-operators/deploy/spin-batcher.mdx | 2 +- .../tutorials/create-l2-rollup.mdx | 16 +++++----- .../create-l2-rollup/op-batcher-setup.mdx | 6 ++-- .../create-l2-rollup/op-challenger-setup.mdx | 4 +-- .../create-l2-rollup/op-deployer-setup.mdx | 29 ++++++++----------- .../create-l2-rollup/op-geth-setup.mdx | 10 ++++--- .../create-l2-rollup/op-proposer-setup.mdx | 16 +++++----- 10 files changed, 45 insertions(+), 46 deletions(-) diff --git a/pages/operators/chain-operators/deploy/op-challenger.mdx b/pages/operators/chain-operators/deploy/op-challenger.mdx index a28d24a48..9ad43579c 100644 --- a/pages/operators/chain-operators/deploy/op-challenger.mdx +++ b/pages/operators/chain-operators/deploy/op-challenger.mdx @@ -182,7 +182,7 @@ L1_BEACON=http://sepolia-cl-1:5051 # Wallet configuration - Choose either mnemonic + HD path OR private key MNEMONIC="test test test test test test test test test test test junk" HD_PATH="m/44'/60'/0'/0/0" -# PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY # Alternative to mnemonic +# PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # Alternative to mnemonic # Network configuration NETWORK=op-sepolia diff --git a/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx b/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx index 39bea4cea..9304936e1 100644 --- a/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx +++ b/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx @@ -137,7 +137,7 @@ ROLLUP_RPC_URL=http://localhost:8547 GAME_FACTORY_ADDRESS=YOUR_ACTUAL_GAME_FACTORY_ADDRESS # Private key - Replace with your actual private key -PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY +PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # Proposer configuration PROPOSAL_INTERVAL=3600s diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 0cc99166b..bcf586a52 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -273,7 +273,7 @@ In this guide Docker alternative is also provided. SEQUENCER_STOPPED=false # Private keys - PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # P2P configuration - Replace with your actual public IP P2P_LISTEN_PORT=9222 @@ -447,7 +447,7 @@ In this guide Docker alternative is also provided. L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com # Private keys - Replace with your actual private key - PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # (Run `curl ifconfig.me` in a separate shell to obtain the value, then paste it below) diff --git a/pages/operators/chain-operators/deploy/spin-batcher.mdx b/pages/operators/chain-operators/deploy/spin-batcher.mdx index ad7525019..2e499319f 100644 --- a/pages/operators/chain-operators/deploy/spin-batcher.mdx +++ b/pages/operators/chain-operators/deploy/spin-batcher.mdx @@ -133,7 +133,7 @@ If you prefer containerized deployment, you can use the official Docker images. BATCH_INBOX_ADDRESS=YOUR_ACTUAL_BATCH_INBOX_ADDRESS # Private key - Replace with your actual private key - BATCHER_PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + BATCHER_PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # Batcher configuration POLL_INTERVAL=1s diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx index 094d556e4..a840a2819 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup.mdx @@ -24,11 +24,13 @@ import { Callout, Card, Steps } from 'nextra/components' Welcome to the complete guide for deploying your own OP Stack L2 rollup testnet. This multi-part tutorial will walk you through each component step-by-step, from initial setup to a fully functioning rollup. - - **Prerequisites**: This tutorial requires **intermediate-level experience with Ethereum development**. You should be comfortable with concepts like smart contracts, private keys, RPC endpoints, gas fees, and command-line operations. Basic familiarity with Docker and blockchain infrastructure is also recommended. + + This tutorial requires **intermediate-level experience working with EVM chains**. + You should be comfortable with concepts like smart contracts, private keys, RPC endpoints, gas fees, and command-line operations. + Basic familiarity with Docker is also recommended. -## What You'll Build +## What you'll build By the end of this tutorial, you'll have a complete OP Stack testnet with: @@ -43,7 +45,7 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with: ### Software dependencies -| Dependency | Version | Version Check Command | +| Dependency | Version | Version check command | | ------------------------------------------------------------- | -------- | --------------------- | | [git](https://git-scm.com/) | `^2` | `git --version` | | [go](https://go.dev/) | `^1.21` | `go version` | @@ -113,7 +115,7 @@ By the end of this tutorial, you'll have a complete OP Stack testnet with: Since you're deploying your OP Stack chain to Sepolia, you'll need to have access to a Sepolia node. You can either use a node provider like [Alchemy](https://www.alchemy.com/) (easier) or run your own Sepolia node (harder). -### Required Resources +### Required resources * **Sepolia ETH** - You'll need about 2-3 ETH: * Start with [Superchain Faucet](https://console.optimism.io/faucet) (gives 0.05 ETH) @@ -132,7 +134,7 @@ You can either use a node provider like [Alchemy](https://www.alchemy.com/) (eas **Follow in Order**: Each step builds on the previous one. Start with spinning up op-deployer and complete them sequentially for the best experience. -## Directory Structure +## Directory structure To keep your rollup deployment organized, we'll create a dedicated directory structure. All components will be set up within this structure: @@ -151,7 +153,7 @@ Each component's documentation will show you how the directory structure evolves Throughout this tutorial, all file paths will be relative to this `rollup` directory structure. Make sure to adjust any commands if you use different directory names. -## Tutorial Overview +## Tutorial overview This tutorial is organized into sequential steps that build upon each other: diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx index 7fb57a27f..c3015cd20 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-batcher-setup.mdx @@ -91,7 +91,7 @@ For setting up the batcher, we recommend using Docker as it provides a consisten BATCH_INBOX_ADDRESS=YOUR_ACTUAL_BATCH_INBOX_ADDRESS # Private key - Replace with your actual private key - BATCHER_PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + BATCHER_PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # Batcher configuration POLL_INTERVAL=1s @@ -152,7 +152,7 @@ For setting up the batcher, we recommend using Docker as it provides a consisten networks: sequencer-node_default: - external: true + external: false ``` ### Start the batcher service @@ -308,7 +308,7 @@ For setting up the batcher, we recommend using Docker as it provides a consisten BATCH_INBOX_ADDRESS=YOUR_ACTUAL_BATCH_INBOX_ADDRESS # Private key - Replace with your actual private key - BATCHER_PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + BATCHER_PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # Batcher configuration POLL_INTERVAL=1s diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index fc7650b21..b4300f4e1 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -214,7 +214,7 @@ For challenger deployment, we recommend using Docker as it provides a consistent networks: sequencer-node_default: - external: true + external: false ``` @@ -355,7 +355,7 @@ For challenger deployment, we recommend using Docker as it provides a consistent # Wallet configuration - Choose either mnemonic + HD path OR private key MNEMONIC="test test test test test test test test test test test junk" HD_PATH="m/44'/60'/0'/0/0" - # PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY # Alternative to mnemonic + # PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # Alternative to mnemonic # Network configuration NETWORK=op-sepolia diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx index 58ad2a8ef..6ec9958eb 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-deployer-setup.mdx @@ -89,16 +89,16 @@ There are a couple of ways to install `op-deployer`: tar -xvzf /Users/USERNAME/Downloads/op-deployer-0.2.6-darwin-arm64.tar.gz # Step 2: Make the binary executable - chmod +x op-deployer + chmod +x op-deployer-0.2.6-darwin-arm64 # Step 3: Remove macOS quarantine attribute (fixes "can't be opened" warning) - sudo xattr -dr com.apple.quarantine op-deployer + sudo xattr -dr com.apple.quarantine op-deployer-0.2.6-darwin-arm64 # Step 4: Move the binary to your PATH # For Intel Macs: - sudo mv op-deployer /usr/local/bin/ + sudo mv op-deployer-0.2.6-darwin-arm64 /usr/local/bin/ # For Apple Silicon Macs: - # sudo mv op-deployer /opt/homebrew/bin/ + # sudo mv op-deployer-0.2.6-darwin-arm64 /opt/homebrew/bin/ # Step 7: Verify installation (should print version info) op-deployer --version @@ -148,7 +148,7 @@ Before deploying your L1 contracts, you'll need: ## Generate deployment addresses -Your rollup needs several key pairs for different roles. Let's generate them first: +Your rollup needs several addresses for different roles. Let's generate them first: ### Create address directory @@ -169,7 +169,7 @@ Your rollup needs several key pairs for different roles. Let's generate them fir ### Generate address for each role ```bash - # Generate 7 new Ethereum accounts + # Generate 8 new wallet addresses for role in admin base_Fee_Vault_Recipient l1_Fee_Vault_Recipient sequencer_Fee_Vault_Recipient system_config unsafe_block_signer batcher proposer ; do wallet_output=$(cast wallet new) echo "$wallet_output" | grep "Address:" | awk '{print $2}' > ${role}_address.txt @@ -295,7 +295,7 @@ The intent file defines your chain's configuration. ## Create environment file -Before deploying, create a `.env` file in your `deployer` directory to store your sensitive configuration: +Before deploying, create a `.env` file in your `deployer` directory to store your environment variables: ```bash # Create .env file @@ -305,7 +305,7 @@ L1_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY # Private key for deployment. # Get this from your self-custody wallet, like Metamask. -PRIVATE_KEY= WALLET_PRIVATE_KEY +PRIVATE_KEY=WALLET_PRIVATE_KEY EOF ``` @@ -352,20 +352,16 @@ After successful deployment, generate your chain configuration files: # Generate genesis and rollup configs op-deployer inspect genesis --workdir .deployer > .deployer/genesis.json op-deployer inspect rollup --workdir .deployer > .deployer/rollup.json - -# Get L1 contract addresses (save these!) -op-deployer inspect l1 --workdir .deployer > .deployer/l1-contracts.json ``` ## What's Next? Great! You've successfully: -1. Installed `op-deployer` -2. Generated necessary key pairs -3. Created and configured your intent file -4. Deployed L1 smart contracts -5. Generated chain configuration files +1. Installed `op-deployer` using the `init` and `apply` command. +2. Created and configured your intent file +3. Deployed L1 smart contracts +4. Generated chain artifacts Your final directory structure should look like this: ```bash @@ -374,7 +370,6 @@ rollup/ ├── .deployer/ # Contains deployment state and configs │ ├── genesis.json # L2 genesis configuration │ ├── intent.toml # Your chain configuration - │ ├── l1-contracts.json # Deployed contract addresses │ ├── rollup.json # Rollup configuration │ └── state.json # Deployment state ├── .env # Environment variables diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx index 0f605b429..9b91c4441 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-geth-setup.mdx @@ -75,11 +75,10 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com # Private keys - Replace with your actual private key - PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY - - # (Run `curl ifconfig.me` in a separate shell to obtain the value, then paste it below) + PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # P2P configuration - Replace with your actual public IP + # Run `curl ifconfig.me` in a separate shell to obtain the value, then paste it below P2P_ADVERTISE_IP=YOUR_ACTUAL_PUBLIC_IP EOF @@ -201,6 +200,8 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler ├── rollup.json # Copied from deployer ├── .env # Environment variables ├── docker-compose.yml # Docker configuration + └── opnode_discovery_db/ # Created by Docker during initialization + └── opnode_peerstore_db/ # Created by Docker during initialization └── op-geth-data/ # Created by Docker during initialization ├── geth/ # Geth data └── keystore/ # Key files @@ -417,9 +418,10 @@ For spinning up a sequencer, we recommend using Docker, as it provides a simpler SEQUENCER_STOPPED=false # Private keys - PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # P2P configuration - Replace with your actual public IP + # Run `curl ifconfig.me` in a separate shell to obtain the value, then paste it below P2P_LISTEN_PORT=9222 P2P_ADVERTISE_IP=YOUR_ACTUAL_PUBLIC_IP diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index f51793793..bf752ea12 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -60,6 +60,10 @@ Before setting up your proposer, ensure you have: 1. **Clone and checkout the correct version**: ```bash + # Create your proposer directory inside rollup + cd ../ # Go back to rollup directory if you're in batcher + mkdir proposer + cd proposer git clone https://github.com/ethereum-optimism/optimism.git cd optimism git checkout op-program/v1.6.1 # Use the latest stable version @@ -119,11 +123,7 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ### Set up directory structure and copy configuration files ```bash - # Create your proposer directory inside rollup - cd ../ # Go back to rollup directory if you're in batcher - mkdir proposer - cd proposer - + # inside the proposer directory, copy the state.json file from the op-deployer setup # Copy configuration files from deployer cp ../deployer/.deployer/state.json . @@ -148,7 +148,7 @@ For setting up the proposer, we recommend using Docker as it provides a consiste GAME_FACTORY_ADDRESS=YOUR_ACTUAL_GAME_FACTORY_ADDRESS # Private key - Replace with your actual private key - PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # Proposer configuration PROPOSAL_INTERVAL=3600s @@ -207,7 +207,7 @@ For setting up the proposer, we recommend using Docker as it provides a consiste networks: sequencer-node_default: - external: true + external: false ``` @@ -376,7 +376,7 @@ For setting up the proposer, we recommend using Docker as it provides a consiste GAME_FACTORY_ADDRESS=YOUR_ACTUAL_GAME_FACTORY_ADDRESS # Private key - Replace with your actual private key - PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # Proposer configuration PROPOSAL_INTERVAL=3600s From b1c92e9c3e72fa13ad14b22acd58852a4120fa8f Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 19 Sep 2025 16:36:29 +0100 Subject: [PATCH 88/92] Refine L2 rollup setup documentation: standardize configuration file paths by removing '0x' prefix from GAME_FACTORY_ADDRESS placeholders, clarify directory structure in tutorials, and update instructions for copying prestate files to enhance user understanding. --- .../chain-operators/deploy/op-challenger.mdx | 4 +- .../tutorials/absolute-prestate.mdx | 4 +- .../create-l2-rollup/op-challenger-setup.mdx | 29 +++---- .../create-l2-rollup/op-proposer-setup.mdx | 77 ++++--------------- 4 files changed, 31 insertions(+), 83 deletions(-) diff --git a/pages/operators/chain-operators/deploy/op-challenger.mdx b/pages/operators/chain-operators/deploy/op-challenger.mdx index 9ad43579c..7c83d6cc6 100644 --- a/pages/operators/chain-operators/deploy/op-challenger.mdx +++ b/pages/operators/chain-operators/deploy/op-challenger.mdx @@ -186,7 +186,7 @@ HD_PATH="m/44'/60'/0'/0/0" # Network configuration NETWORK=op-sepolia -GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS +GAME_FACTORY_ADDRESS=YOUR_GAME_FACTORY_ADDRESS # Trace configuration TRACE_TYPE=permissioned,cannon @@ -428,7 +428,7 @@ HD_PATH="m/44'/60'/0'/0/0" # Network configuration NETWORK=op-sepolia -GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS +GAME_FACTORY_ADDRESS=YOUR_GAME_FACTORY_ADDRESS EOF ``` **Important:** Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values. diff --git a/pages/operators/chain-operators/tutorials/absolute-prestate.mdx b/pages/operators/chain-operators/tutorials/absolute-prestate.mdx index 6e1d988f0..d42781828 100644 --- a/pages/operators/chain-operators/tutorials/absolute-prestate.mdx +++ b/pages/operators/chain-operators/tutorials/absolute-prestate.mdx @@ -162,8 +162,8 @@ For these cases, follow these additional steps: ```bash # Replace 67865 with your actual chain ID - cp /path/to/rollup.json op-program/chainconfig/configs/67865-rollup.json - cp /path/to/genesis.json op-program/chainconfig/configs/67865-genesis-l2.json + cp ../deployer/.deployer/rollup.json op-program/chainconfig/configs/67865-rollup.json + cp ../deployer/.deployer/genesis.json op-program/chainconfig/configs/67865-genesis-l2.json ``` Note: The naming format is critical - the files must be named as: diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx index b4300f4e1..312ad4c33 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-challenger-setup.mdx @@ -61,7 +61,7 @@ Before configuring your challenger, complete the following steps: 2. **Copy your chain configuration**: ```bash - # Assuming you're in rollup/optimism directory + # Assuming you're in rollup/challenger/optimism directory # Replace with your actual L2 chain ID cp ../deployer/.deployer/rollup.json op-program/chainconfig/configs/-rollup.json cp ../deployer/.deployer/genesis.json op-program/chainconfig/configs/-genesis.json @@ -151,16 +151,15 @@ For challenger deployment, we recommend using Docker as it provides a consistent L2_RPC_URL=http://op-geth:8545 ROLLUP_RPC_URL=http://op-node:8547 - # Wallet configuration - Choose either mnemonic + HD path OR private key - MNEMONIC="test test test test test test test test test test test junk" - HD_PATH="m/44'/60'/0'/0/0" + # Private key - Replace with your actual private key + PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # Network configuration NETWORK=op-sepolia - GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS + GAME_FACTORY_ADDRESS=YOUR_GAME_FACTORY_ADDRESS # Prestate configuration - Replace with the hash from 'make reproducible-prestate' - PRESTATE_HASH=0x03eb07101fbdeaf3f04d9fb76526362c1eea2824e4c6e970bdb19675b72e4fc8 + PRESTATE_HASH=YOUR_PRESTATE_HASH EOF ``` @@ -188,8 +187,7 @@ For challenger deployment, we recommend using Docker as it provides a consistent - L1_BEACON=${L1_BEACON} - L2_RPC_URL=${L2_RPC_URL} - ROLLUP_RPC_URL=${ROLLUP_RPC_URL} - - MNEMONIC=${MNEMONIC} - - HD_PATH=${HD_PATH} + - PRIVATE_KEY=${PRIVATE_KEY} - NETWORK=${NETWORK} - GAME_FACTORY_ADDRESS=${GAME_FACTORY_ADDRESS} command: @@ -200,9 +198,7 @@ For challenger deployment, we recommend using Docker as it provides a consistent - "--l2-eth-rpc=${L2_RPC_URL}" - "--rollup-rpc=${ROLLUP_RPC_URL}" - "--selective-claim-resolution" - - "--mnemonic=${MNEMONIC}" - - "--hd-path=${HD_PATH}" - - "--network=${NETWORK}" + - "--private-key=${PRIVATE_KEY}" - "--game-factory-address=${GAME_FACTORY_ADDRESS}" - "--datadir=/data" - "--cannon-prestate=/workspace/prestate-proof.json" @@ -352,14 +348,12 @@ For challenger deployment, we recommend using Docker as it provides a consistent ROLLUP_RPC_URL=http://localhost:8547 L1_BEACON=http://sepolia-cl-1:5051 - # Wallet configuration - Choose either mnemonic + HD path OR private key - MNEMONIC="test test test test test test test test test test test junk" - HD_PATH="m/44'/60'/0'/0/0" - # PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # Alternative to mnemonic + # Private key - Replace with your actual private key + PRIVATE_KEY=YOUR_ACTUAL_PRIVATE_KEY # Network configuration NETWORK=op-sepolia - GAME_FACTORY_ADDRESS=0xYOUR_GAME_FACTORY_ADDRESS + GAME_FACTORY_ADDRESS=YOUR_GAME_FACTORY_ADDRESS # Trace configuration TRACE_TYPE=permissioned,cannon @@ -537,8 +531,7 @@ For challenger deployment, we recommend using Docker as it provides a consistent --cannon-l2-genesis=$CANNON_L2_GENESIS \ --cannon-server=$CANNON_SERVER \ --cannon-prestate=$CANNON_PRESTATE \ - --mnemonic "$MNEMONIC" \ - --hd-path "$HD_PATH" + --private-key="$PRIVATE_KEY" ``` ### Start the challenger diff --git a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx index bf752ea12..23b0bdd08 100644 --- a/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx +++ b/pages/operators/chain-operators/tutorials/create-l2-rollup/op-proposer-setup.mdx @@ -53,67 +53,7 @@ Before setting up your proposer, ensure you have: * Your L2 chain ID and network configuration * L1 network details (chain ID, RPC endpoints) -
- Generate absolute prestate (Required) - - The challenger needs the absolute prestate to participate in dispute games. Here's how to generate it: - - 1. **Clone and checkout the correct version**: - ```bash - # Create your proposer directory inside rollup - cd ../ # Go back to rollup directory if you're in batcher - mkdir proposer - cd proposer - git clone https://github.com/ethereum-optimism/optimism.git - cd optimism - git checkout op-program/v1.6.1 # Use the latest stable version - git submodule update --init --recursive - ``` - - 2. **Copy your chain configuration**: - ```bash - # Replace 67865 with your L2 chain ID - cp /path/to/rollup.json op-program/chainconfig/configs/67865-rollup.json - cp /path/to/genesis.json op-program/chainconfig/configs/67865-genesis.json - ``` - - 3. **Generate the prestate**: - ```bash - make reproducible-prestate - ``` - You'll see output like: - ```bash - -------------------- Production Prestates -------------------- - Cannon64 Absolute prestate hash: - 0x03eb07101fbdeaf3f04d9fb76526362c1eea2824e4c6e970bdb19675b72e4fc8 - ``` - - 4. **Prepare the preimage file**: - ```bash - cd op-program/bin - mv prestate-mt64.bin.gz 0x[CANNON64_PRESTATE_HASH].bin.gz - ``` - Replace `[CANNON64_PRESTATE_HASH]` with the actual hash from step 3. - - - * Use the `Cannon64` hash for production - * Keep this file accessible - you'll need it for the challenger setup - * For Superchain registry chains, you can find official prestates in the [registry](https://github.com/ethereum-optimism/superchain-registry/blob/main/validation/standard/standard-prestates.toml) - -
- -### Finding the current stable releases - -To ensure you're using the latest compatible versions of OP Stack components, always check the official [releases page](https://github.com/ethereum-optimism/optimism/releases). - -Look for the latest `op-proposer/v*` release that's compatible with your sequencer setup. - - - This guide uses `op-proposer/v1.10.0` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.1 from the sequencer setup. - Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information. - - -For setting up the proposer, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available for more advanced users. +For setting up the proposer, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available as an option. @@ -123,6 +63,10 @@ For setting up the proposer, we recommend using Docker as it provides a consiste ### Set up directory structure and copy configuration files ```bash + # Create a proposer directory inside rollup + cd ../ # Go back to rollup directory if you're in batcher + mkdir proposer + cd proposer # inside the proposer directory, copy the state.json file from the op-deployer setup # Copy configuration files from deployer cp ../deployer/.deployer/state.json . @@ -287,6 +231,17 @@ For setting up the proposer, we recommend using Docker as it provides a consiste + + ### Finding the current stable releases + + To ensure you're using the latest compatible versions of OP Stack components, always check the official [releases page](https://github.com/ethereum-optimism/optimism/releases). + + Look for the latest `op-proposer/v*` release that's compatible with your sequencer setup. + + + This guide uses `op-proposer/v1.10.0` which is compatible with op-node/v1.13.3 and op-geth/v1.101511.1 from the sequencer setup. + Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility information. + Building from source gives you full control over the binaries. From ea64d3907a9cd96b9691ebc9f6867d4efccfd36e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 19 Sep 2025 16:37:02 +0100 Subject: [PATCH 89/92] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- words.txt | 260 ++++++++++++++++++++++++------------------------------ 1 file changed, 113 insertions(+), 147 deletions(-) diff --git a/words.txt b/words.txt index 55af6d53a..830fb3158 100644 --- a/words.txt +++ b/words.txt @@ -1,66 +1,60 @@ -accountqueue ACCOUNTQUEUE -accountslots +accountqueue ACCOUNTSLOTS +accountslots ACDC ADDI ADDIU ADDU airgap Allnodes -allocs -alphanet Alphanet -alphanets +alphanet Alphanets +alphanets altda ANDI -Ankr Apeworx Arweave authrpc -autorelay Autorelay +autorelay autorelayer basefee bcde -betanet Betanet -betanets +betanet Betanets +betanets BGEZ BGTZ Biconomy BLEZ -blobpool BLOBPOOL +blobpool blobspace Blockdaemon blockhash blocklists -blocklogs BLOCKLOGS -blockprofilerate +blocklogs BLOCKPROFILERATE +blockprofilerate Blockscout -blockspace Blockspace +blockspace blocktime -blocktimes Blocktimes -bloomfilter +blocktimes BLOOMFILTER +bloomfilter BLTZ Bootcamp bootnode -bootnodes -Bootnodes BOOTNODES +Bootnodes +bootnodes bottlenecked -brotli -Brotli -callouts -Callouts CCIP cdef Celestia @@ -72,72 +66,66 @@ Chainstack chaosnet Chugsplash Clabby -codebases -collateralized Collateralized +collateralized compr Comprensive -computependingblock COMPUTEPENDINGBLOCK +computependingblock confs corsdomain counterfactually -crosschain Crosschain +crosschain Crossmint daserver -datacap DATACAP -datadir -DATADIR +datacap Defi Defillama's delegatecall -devnet Devnet -devnets +devnet Devnets -devs +devnets direnv -disabletxpoolgossip DISABLETXPOOLGOSSIP -discv +disabletxpoolgossip Discv +discv DIVU Drand dripcheck Drippie Eigen -EIPs -enabledeprecatedpersonal ENABLEDEPRECATEDPERSONAL +enabledeprecatedpersonal enginekind -erigon Erigon -etherbase +erigon ETHERBASE +etherbase Ethernity Ethernow -ethstats ETHSTATS -evmtimeout +ethstats EVMTIMEOUT +evmtimeout executability -exfiltrate -exitwhensynced EXITWHENSYNCED +exitwhensynced extensibly -extradata EXTRADATA +extradata Farcaster Faultproof -fdlimit FDLIMIT +fdlimit flashblock flashblock's -flashblocks -Flashblocks FLASHBLOCKS +Flashblocks +flashblocks Flashbots forkable forkchoice @@ -145,51 +133,50 @@ FPVM FPVMs Fraxtal Funct -gascap GASCAP +gascap gaslessly -gcmode GCMODE +gcmode Gelato gifs -globalqueue GLOBALQUEUE -globalslots +globalqueue GLOBALSLOTS +globalslots gokzg growthepie hardfork hardforks -healthcheck HEALTHCHECK +healthcheck healthchecks -historicalrpc HISTORICALRPC -historicalrpctimeout +historicalrpc HISTORICALRPCTIMEOUT -holesky -Holesky +historicalrpctimeout HOLESKY +Holesky +holesky IERC -ignoreprice IGNOREPRICE -Immunefi -inator +ignoreprice Inator -influxdbv +inator INFLUXDBV +influxdbv initcode -ipcdisable IPCDISABLE +ipcdisable ipcfile -ipcpath IPCPATH +ipcpath IPFS JALR -journalremotes JOURNALREMOTES -jspath +journalremotes JSPATH +jspath jwtsecret Keccak leveldb @@ -198,34 +185,33 @@ Lisk logfile logfmt Mainnets -maxage MAXAGE -maxbackups +maxage MAXBACKUPS -maxpeers +maxbackups MAXPEERS -maxpendpeers +maxpeers MAXPENDPEERS -maxprice +maxpendpeers MAXPRICE -memprofilerate +maxprice MEMPROFILERATE -merkle +memprofilerate Merkle +merkle MFHI MFLO Mgas Minato -minfreedisk MINFREEDISK -minsuggestedpriorityfee +minfreedisk MINSUGGESTEDPRIORITYFEE +minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations -monitorism Monitorism +monitorism Moralis Mordor MOVN @@ -234,156 +220,141 @@ MTHI MTLO MULT multiaddr -multichain Multichain +multichain multiclient multisigs MULTU Nethermind -netrestrict NETRESTRICT -networkid +netrestrict NETWORKID -newpayload +networkid NEWPAYLOAD -nextra -nocompaction +newpayload NOCOMPACTION -nodekey +nocompaction NODEKEY -nodekeyhex +nodekey NODEKEYHEX +nodekeyhex nodename Nodies -nodiscover NODISCOVER -nolocals +nodiscover NOLOCALS -noprefetch +nolocals NOPREFETCH -nopruning +noprefetch NOPRUNING -nosyncserve +nopruning NOSYNCSERVE +nosyncserve Numba NVME -offchain Offchain +offchain onlyreqtostatic opchaina opchainb -opcm OPCM +opcm Openfort oplabs opnode's -outfile outperformance pcscdpath -pectra Pectra +pectra Pectra's -peerstore Peerstore +peerstore peerstores -permissioned Permissioned +permissioned permissioning -permissionless Permissionless +permissionless permissionlessly Perps Peta Pimlico POAP POAPs -pprof PPROF -precommitments +pprof Precommitments +precommitments preconfigured predeploy -predeployed Predeployed -predeploys +predeployed Predeploys +predeploys prefunded -preimage Preimage -preimages +preimage PREIMAGES -preinstall -preinstalls +preimages Preinstalls -prestate +preinstalls Prestate +prestate prestates PREVRANDAO -pricebump PRICEBUMP -pricelimit +pricebump PRICELIMIT +pricelimit productionize productionized Protip -proxied -Proxied -proxyd Proxyd -Pyth -Pyth's +proxyd QRNG -quicknode Quicknode +quicknode quickstarts -rebalancing reemit Reemitting -regenesis Regenesis -Reimagine -rejournal +regenesis REJOURNAL -remotedb +rejournal REMOTEDB +remotedb Reown Reown's replayability replayor reposts reproven -requiredblocks REQUIREDBLOCKS +requiredblocks rollouts -rollups Rollups +rollups Routescan rpckind -rpcprefix RPCPREFIX -rpcs +rpcprefix RPGF -runbooks Runbooks -RWAs +runbooks safedb Schnorr -sepolia -Sepolia -SEPOLIA seqnr -sequencerhttp SEQUENCERHTTP +sequencerhttp serv -signup SLLV SLTI SLTIU SLTU smartcard snapshotlog -snapsync Snapsync +snapsync solady Solana Soneium @@ -391,37 +362,34 @@ soyboy Spearbit SRAV SRLV -stablecoins Stablecoins +stablecoins statefulset -structs subcomponents subgame subheaders subsecond SUBU Sunnyside -superchain -Superchain SUPERCHAIN -superchainerc +Superchain +superchain Superchain's +superchainerc Superlend Superloans Superscan Superseed -supersim Supersim -syncmode +supersim SYNCMODE -synctarget +syncmode SYNCTARGET +synctarget syscalls SYSCON thirdweb threadcreate -timeseries -topline triggerable trustlessly trustrpc @@ -429,32 +397,30 @@ Twei txfeecap txmgr txns -txpool TXPOOL +txpool txproxy txproxyd uncensorable uncountered undercollateralize Unichain -Unprotect unsubmitted UPNP -verkle VERKLE -vhosts +verkle VHOSTS -viem +vhosts Viem -viem's +viem Viem's -vmdebug +viem's VMDEBUG -vmodule +vmdebug VMODULE +vmodule xlarge XORI -ZKPs ZKVM -zora Zora +zora From cbadae74fb4a90f0c470daaa01490074980ae191 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 19 Sep 2025 16:47:50 +0100 Subject: [PATCH 90/92] Merge branch 'main' into update-l2-testnet-tut From b25d38901bd31dc8cca5954bfd0840a705eb6fc7 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 19 Sep 2025 13:23:51 -0700 Subject: [PATCH 91/92] Rerun linter --- pages/notices/upgrade-15.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/notices/upgrade-15.mdx b/pages/notices/upgrade-15.mdx index cec3d8073..686f9c83a 100644 --- a/pages/notices/upgrade-15.mdx +++ b/pages/notices/upgrade-15.mdx @@ -17,7 +17,7 @@ is_imported_content: 'false' import { Steps, Callout } from 'nextra/components' -# Upgrade 15: Isthmus Hard Fork +# Upgrade 15: Isthmus Hard Fork This page outlines breaking changes related to the Isthmus network upgrade for chain operators and node operators. The upgrade proposal is available [here](https://gov.optimism.io/t/upgrade-proposal-15-isthmus-hard-fork/9804) and the governance vote is available [here](https://gov.optimism.io/t/proposal-preview-implement-prague-features-on-the-op-stack/9703). From 40dad7c585e66e54f711e40dc34f07f66e9a0431 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 19 Sep 2025 13:24:38 -0700 Subject: [PATCH 92/92] Fix words --- words.txt | 258 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 146 insertions(+), 112 deletions(-) diff --git a/words.txt b/words.txt index 830fb3158..78a281d30 100644 --- a/words.txt +++ b/words.txt @@ -1,60 +1,66 @@ -ACCOUNTQUEUE accountqueue -ACCOUNTSLOTS +ACCOUNTQUEUE accountslots +ACCOUNTSLOTS ACDC ADDI ADDIU ADDU airgap Allnodes -Alphanet +allocs alphanet -Alphanets +Alphanet alphanets +Alphanets altda ANDI +Ankr Apeworx Arweave authrpc -Autorelay autorelay +Autorelay autorelayer basefee bcde -Betanet betanet -Betanets +Betanet betanets +Betanets BGEZ BGTZ Biconomy BLEZ -BLOBPOOL blobpool +BLOBPOOL blobspace Blockdaemon blockhash blocklists -BLOCKLOGS blocklogs -BLOCKPROFILERATE +BLOCKLOGS blockprofilerate +BLOCKPROFILERATE Blockscout -Blockspace blockspace +Blockspace blocktime -Blocktimes blocktimes -BLOOMFILTER +Blocktimes bloomfilter +BLOOMFILTER BLTZ Bootcamp bootnode -BOOTNODES -Bootnodes bootnodes +Bootnodes +BOOTNODES bottlenecked +brotli +Brotli +callouts +Callouts CCIP cdef Celestia @@ -66,66 +72,72 @@ Chainstack chaosnet Chugsplash Clabby -Collateralized +codebases collateralized +Collateralized compr Comprensive -COMPUTEPENDINGBLOCK computependingblock +COMPUTEPENDINGBLOCK confs corsdomain counterfactually -Crosschain crosschain +Crosschain Crossmint daserver -DATACAP datacap +DATACAP +datadir +DATADIR Defi Defillama's delegatecall -Devnet devnet -Devnets +Devnet devnets +Devnets +devs direnv -DISABLETXPOOLGOSSIP disabletxpoolgossip -Discv +DISABLETXPOOLGOSSIP discv +Discv DIVU Drand dripcheck Drippie Eigen -ENABLEDEPRECATEDPERSONAL +EIPs enabledeprecatedpersonal +ENABLEDEPRECATEDPERSONAL enginekind -Erigon erigon -ETHERBASE +Erigon etherbase +ETHERBASE Ethernity Ethernow -ETHSTATS ethstats -EVMTIMEOUT +ETHSTATS evmtimeout +EVMTIMEOUT executability -EXITWHENSYNCED +exfiltrate exitwhensynced +EXITWHENSYNCED extensibly -EXTRADATA extradata +EXTRADATA Farcaster Faultproof -FDLIMIT fdlimit +FDLIMIT flashblock flashblock's -FLASHBLOCKS -Flashblocks flashblocks +Flashblocks +FLASHBLOCKS Flashbots forkable forkchoice @@ -133,50 +145,51 @@ FPVM FPVMs Fraxtal Funct -GASCAP gascap +GASCAP gaslessly -GCMODE gcmode +GCMODE Gelato gifs -GLOBALQUEUE globalqueue -GLOBALSLOTS +GLOBALQUEUE globalslots +GLOBALSLOTS gokzg growthepie hardfork hardforks -HEALTHCHECK healthcheck +HEALTHCHECK healthchecks -HISTORICALRPC historicalrpc -HISTORICALRPCTIMEOUT +HISTORICALRPC historicalrpctimeout -HOLESKY -Holesky +HISTORICALRPCTIMEOUT holesky +Holesky +HOLESKY IERC -IGNOREPRICE ignoreprice -Inator +IGNOREPRICE +Immunefi inator -INFLUXDBV +Inator influxdbv +INFLUXDBV initcode -IPCDISABLE ipcdisable +IPCDISABLE ipcfile -IPCPATH ipcpath +IPCPATH IPFS JALR -JOURNALREMOTES journalremotes -JSPATH +JOURNALREMOTES jspath +JSPATH jwtsecret Keccak leveldb @@ -185,33 +198,34 @@ Lisk logfile logfmt Mainnets -MAXAGE maxage -MAXBACKUPS +MAXAGE maxbackups -MAXPEERS +MAXBACKUPS maxpeers -MAXPENDPEERS +MAXPEERS maxpendpeers -MAXPRICE +MAXPENDPEERS maxprice -MEMPROFILERATE +MAXPRICE memprofilerate -Merkle +MEMPROFILERATE merkle +Merkle MFHI MFLO Mgas Minato -MINFREEDISK minfreedisk -MINSUGGESTEDPRIORITYFEE +MINFREEDISK minsuggestedpriorityfee +MINSUGGESTEDPRIORITYFEE Mintable Mintplex MIPSEVM -Monitorism +Mitigations monitorism +Monitorism Moralis Mordor MOVN @@ -220,141 +234,156 @@ MTHI MTLO MULT multiaddr -Multichain multichain +Multichain multiclient multisigs MULTU Nethermind -NETRESTRICT netrestrict -NETWORKID +NETRESTRICT networkid -NEWPAYLOAD +NETWORKID newpayload -NOCOMPACTION +NEWPAYLOAD +nextra nocompaction -NODEKEY +NOCOMPACTION nodekey -NODEKEYHEX +NODEKEY nodekeyhex +NODEKEYHEX nodename Nodies -NODISCOVER nodiscover -NOLOCALS +NODISCOVER nolocals -NOPREFETCH +NOLOCALS noprefetch -NOPRUNING +NOPREFETCH nopruning -NOSYNCSERVE +NOPRUNING nosyncserve +NOSYNCSERVE Numba NVME -Offchain offchain +Offchain onlyreqtostatic opchaina opchainb -OPCM opcm +OPCM Openfort oplabs opnode's +outfile outperformance pcscdpath -Pectra pectra +Pectra Pectra's -Peerstore peerstore +Peerstore peerstores -Permissioned permissioned +Permissioned permissioning -Permissionless permissionless +Permissionless permissionlessly Perps Peta Pimlico POAP POAPs -PPROF pprof -Precommitments +PPROF precommitments +Precommitments preconfigured predeploy -Predeployed predeployed -Predeploys +Predeployed predeploys +Predeploys prefunded -Preimage preimage -PREIMAGES +Preimage preimages -Preinstalls +PREIMAGES +preinstall preinstalls -Prestate +Preinstalls prestate +Prestate prestates PREVRANDAO -PRICEBUMP pricebump -PRICELIMIT +PRICEBUMP pricelimit +PRICELIMIT productionize productionized Protip -Proxyd +proxied +Proxied proxyd +Proxyd +Pyth +Pyth's QRNG -Quicknode quicknode +Quicknode quickstarts +rebalancing reemit Reemitting -Regenesis regenesis -REJOURNAL +Regenesis +Reimagine rejournal -REMOTEDB +REJOURNAL remotedb +REMOTEDB Reown Reown's replayability replayor reposts reproven -REQUIREDBLOCKS requiredblocks +REQUIREDBLOCKS rollouts -Rollups rollups +Rollups Routescan rpckind -RPCPREFIX rpcprefix +RPCPREFIX +rpcs RPGF -Runbooks runbooks +Runbooks +RWAs safedb Schnorr +sepolia +Sepolia +SEPOLIA seqnr -SEQUENCERHTTP sequencerhttp +SEQUENCERHTTP serv +signup SLLV SLTI SLTIU SLTU smartcard snapshotlog -Snapsync snapsync +Snapsync solady Solana Soneium @@ -362,34 +391,37 @@ soyboy Spearbit SRAV SRLV -Stablecoins stablecoins +Stablecoins statefulset +structs subcomponents subgame subheaders subsecond SUBU Sunnyside -SUPERCHAIN -Superchain superchain +Superchain +SUPERCHAIN Superchain's superchainerc Superlend Superloans Superscan Superseed -Supersim supersim -SYNCMODE +Supersim syncmode -SYNCTARGET +SYNCMODE synctarget +SYNCTARGET syscalls SYSCON thirdweb threadcreate +timeseries +topline triggerable trustlessly trustrpc @@ -397,30 +429,32 @@ Twei txfeecap txmgr txns -TXPOOL txpool +TXPOOL txproxy txproxyd uncensorable uncountered undercollateralize Unichain +Unprotect unsubmitted UPNP -VERKLE verkle -VHOSTS +VERKLE vhosts -Viem +VHOSTS viem -Viem's +Viem viem's -VMDEBUG +Viem's vmdebug -VMODULE +VMDEBUG vmodule +VMODULE xlarge XORI +ZKPs ZKVM -Zora zora +Zora