From df432367b5070f6804249160d1b8150ea5edbb47 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 27 May 2025 18:11:22 +0100 Subject: [PATCH 01/47] added the sequencer node docs --- .../chain-operators/tutorials/_meta.json | 1 + .../tutorials/sequncer-node.mdx | 453 ++++++++++++++++++ 2 files changed, 454 insertions(+) create mode 100644 pages/operators/chain-operators/tutorials/sequncer-node.mdx diff --git a/pages/operators/chain-operators/tutorials/_meta.json b/pages/operators/chain-operators/tutorials/_meta.json index 9168131fe..213b3d1e1 100644 --- a/pages/operators/chain-operators/tutorials/_meta.json +++ b/pages/operators/chain-operators/tutorials/_meta.json @@ -4,6 +4,7 @@ "adding-precompiles": "Adding a precompile", "modifying-predeploys": "Modifying predeployed contracts", "integrating-da-layer": "Integrating a new DA layer", + "sequncer-node": "Setting up an Optimism sequencer node", "migrating-permissionless": "Migrating to permissionless fault proofs on OP Stack", "dispute-games":"Deploying new dispute games with OPCM", "absolute-prestate":"Generating absolute prestate and preimage files", diff --git a/pages/operators/chain-operators/tutorials/sequncer-node.mdx b/pages/operators/chain-operators/tutorials/sequncer-node.mdx new file mode 100644 index 000000000..aa14ab400 --- /dev/null +++ b/pages/operators/chain-operators/tutorials/sequncer-node.mdx @@ -0,0 +1,453 @@ +--- +title: Setting up an Optimism sequencer node +lang: en-US +description: Learn how to spin up a single sequencer node for your OP Stack chain after verifying L1 smart contract deployment. Includes latest releases, configuration, expected logs, and troubleshooting. +content_type: tutorial +topic: sequencer-deployment +personas: + - chain-operator + - node-operator + - protocol-developer +categories: + - chain-operation + - chain-deployment + - node-management + - sequencer-configuration + - op-stack +is_imported_content: 'false' +--- + +## Overview + +This guide provides step-by-step instructions for spinning up a single sequencer node after verifying your L1 smart contract deployment. A sequencer node is responsible for ordering transactions, building L2 blocks, and submitting batches to the L1 chain. + +**Important**: This guide is for **custom OP Stack chain operators** who deploy their own L2 chains using the OP Stack. When you deploy your own OP Stack chain, you run your own sequencer node. This is different from OP Mainnet, where the sequencer is currently operated only by OP Labs PBC. + +**For Custom OP Stack Chains**: Chain operators can and do run their own sequencer nodes as part of deploying their custom L2 chains. + +**For OP Mainnet**: Currently only OP Labs PBC operates the sequencer, though this may become decentralized in the future. + +## Prerequisites + +### Hardware requirements +- **CPU**: 8+ cores (16+ recommended for production) +- **RAM**: 32GB minimum (64GB+ recommended for production) +- **Storage**: 2TB+ NVMe SSD (5TB+ for archive nodes) +- **Network**: Stable internet connection with low latency to Ethereum L1 +- **Bandwidth**: 1Gbps recommended + +### Software requirements +- Linux (Ubuntu 20.04+ or similar) +- Docker and Docker Compose (optional but recommended) +- Go 1.23+ (if building from source) +- Git +- OpenSSL + +## Latest release information + +### Current stable releases (May 2025) + +**op-node**: v1.13.2 (required for Mainnet Superchain by May 9, 2025 for Isthmus fork) + +**op-geth**: v1.101503.3 (Isthmus release for Mainnet Superchain, mandatory upgrade by May 9, 2025) + +**op-batcher**: v1.12.0 (required before activating Isthmus on chains) + +### Version naming convention +op-geth embeds upstream geth's version inside its own version as follows: vMAJOR.GETH_MAJOR GETH_MINOR GETH_PATCH.PATCH. For example, if geth is at v1.12.0, the corresponding op-geth version would be v1.101200.0. + +## Network flags and superchain registry + +### Using network flags +The Superchain configs are stored in a minimal form and embedded in downstream OP-Stack software (op-node and op-geth). This means that after a chain has been added to the registry and the dependency on the registry updates in the downstream software, it is possible to start an op-node instance using the --network flag (and also an op-geth instance using the --op-network tag). + +### Supported networks +For the latest supported networks, check the `--help` output for the `--op-network` option in op-geth and `--network` option in op-node. + +Common networks include: +- `op-mainnet` - OP Mainnet +- `op-sepolia` - OP Sepolia testnet +- `base` - Base mainnet +- `base-sepolia` - Base Sepolia testnet + +## Installation options + +### Option 1: Docker-based Setup (Recommended) + +#### 1. Download latest docker images + +```bash +# Pull latest op-node image +docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 + +# Pull latest op-geth image +docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.3 +``` + +### Option 2: building from source + +#### 1. 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.2 + +# Build op-node +cd op-node +make op-node + +# Binary will be available at ./bin/op-node +``` + +#### 2. Clone and build op-geth + +```bash +# Clone op-geth repository +git clone https://github.com/ethereum-optimism/op-geth.git +cd op-geth + +# Checkout the latest release tag +git checkout v1.101503.3 + +# Build op-geth +make geth + +# Binary will be available at ./build/bin/geth +``` + +## Configuration setup + +### 1. Generate JWT secret + +To communicate with op-node and enable the Engine API, you'll also need to generate a JWT secret file and enable Geth's authenticated RPC endpoint. + +```bash +# Generate JWT secret +openssl rand -hex 32 > jwt.txt + +# Set appropriate permissions +chmod 600 jwt.txt +``` + +### 2. Directory structure + +Create the following directory structure: + +``` +sequencer-node/ +├── jwt.txt +├── data/ +│ ├── op-geth/ +│ └── op-node/ +├── configs/ +│ ├── rollup.json (if not using network flags) +│ └── genesis.json (if not using network flags) +└── scripts/ + ├── start-op-geth.sh + └── start-op-node.sh +``` + +### 3. Environment variables + +Create a `.env` file: + +```bash +# L1 Configuration +L1_RPC_URL=https://mainnet.infura.io/v3/YOUR_INFURA_KEY +L1_BEACON_URL=https://beacon-nd-123-456-789.p2pify.com/YOUR_BEACON_KEY + +# Network configuration +NETWORK=op-mainnet # or your target network +OP_NETWORK=op-mainnet + +# Sequencer configuration +SEQUENCER_ENABLED=true +SEQUENCER_STOPPED=false + +# P2P configuration +P2P_LISTEN_PORT=9222 +P2P_ADVERTISE_IP=YOUR_PUBLIC_IP + +# RPC configuration +OP_NODE_RPC_PORT=8547 +OP_GETH_HTTP_PORT=8545 +OP_GETH_WS_PORT=8546 +OP_GETH_AUTH_PORT=8551 + +# Data directories +DATA_DIR=./data +JWT_SECRET=./jwt.txt +``` + +## Sequencer specific configuration + +### op-geth configuration for sequencer + +Create `scripts/start-op-geth.sh`: + +```bash +#!/bin/bash +source .env + +./build/bin/geth \ + --datadir=$DATA_DIR/op-geth \ + --http \ + --http.addr=0.0.0.0 \ + --http.port=$OP_GETH_HTTP_PORT \ + --http.vhosts="*" \ + --http.corsdomain="*" \ + --http.api=eth,net,web3,debug,txpool \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port=$OP_GETH_WS_PORT \ + --ws.origins="*" \ + --ws.api=eth,net,web3,debug,txpool \ + --authrpc.addr=0.0.0.0 \ + --authrpc.port=$OP_GETH_AUTH_PORT \ + --authrpc.vhosts="*" \ + --authrpc.jwtsecret=$JWT_SECRET \ + --op-network=$OP_NETWORK \ + --rollup.disabletxpoolgossip=false \ + --rollup.sequencerhttp=http://localhost:$OP_GETH_HTTP_PORT \ + --miner.gaslimit=30000000 \ + --verbosity=3 +``` + +### op-node configuration for sequencer + +The sequencer can be initialized in a stopped state using the sequencer.stopped flag. The sequencer can be started using the admin_startSequencer RPC. + +Create `scripts/start-op-node.sh`: + +```bash +#!/bin/bash +source .env + +./bin/op-node \ + --l1=$L1_RPC_URL \ + --l1.beacon=$L1_BEACON_URL \ + --l2=http://localhost:$OP_GETH_AUTH_PORT \ + --l2.jwt-secret=$JWT_SECRET \ + --network=$NETWORK \ + --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.bootnodes="$(op-node p2p discover --network=$NETWORK)" \ + --rpc.addr=0.0.0.0 \ + --rpc.port=$OP_NODE_RPC_PORT \ + --log.level=info \ + --log.format=json +``` + +## Expected logs and monitoring + +### op-geth expected logs + +**Initialization:** +``` +INFO [timestamp] Starting Geth on Optimism optimism=bedrock +INFO [timestamp] Maximum peer count ETH=50 LES=0 total=50 +INFO [timestamp] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory" +INFO [timestamp] Set global gas cap cap=50,000,000 +``` + +**Block Building (Sequencer Mode):** +``` +INFO [timestamp] Commit new sealing work number=12345 sealhash=0x1234... uncles=0 txs=5 gas=210,000 fees=0.005 elapsed=5.123ms +INFO [timestamp] Successfully sealed new block number=12345 sealhash=0x1234... hash=0x5678... elapsed=12.345ms +``` + +**Forkchoice updates:** +``` +INFO [timestamp] Forkchoice requested sync to new head number=12345 hash=0x1234... +``` + +### op-node expected logs + +**Startup:** +```json +{"level":"info","ts":"timestamp","msg":"Initializing Rollup Node","version":"v1.13.2"} +{"level":"info","ts":"timestamp","msg":"Starting JSON-RPC server","addr":"0.0.0.0:8547"} +``` + +**Sequencer mode:** +```json +{"level":"info","ts":"timestamp","msg":"Sequencer enabled"} +{"level":"info","ts":"timestamp","msg":"Sequencing new L2 block","l2_block":12345,"l1_origin":"0x1234"} +``` + +**P2P networking:** +```json +{"level":"info","ts":"timestamp","msg":"Started P2P networking","self":"16Uiu2HAm...","listen_addr":"/ip4/0.0.0.0/tcp/9222"} +{"level":"info","ts":"timestamp","msg":"Connected to peer","peer":"16Uiu2HAm...","direction":"outbound"} +``` + +**Block Ddrivation:** +```json +{"level":"info","ts":"timestamp","msg":"Advancing derivation","l1_block":18500000,"l2_block":12345} +{"level":"info","ts":"timestamp","msg":"Generated attributes in payload queue","txs":5,"timestamp":1683123456} +``` + +### Warning and error logs to monitor + +**Critical Warnings:** +- `"Sequencer drift detected"` - Clock synchronization issues +- `"Failed to submit batch to L1"` - L1 connectivity problems +- `"Block building interrupted"` - Resource constraints +- `"Unsafe reorg detected"` - Chain reorganization + +**P2P issues:** +- `"no configured p2p sequencer address, ignoring gossiped block"` - P2P configuration issue requiring sequencer address configuration + +## Starting the sequencer + +### 1. Initialize op-geth (if using network flags) + +```bash +# For networks using the superchain registry (recommended) +cd sequencer-node +chmod +x scripts/start-op-geth.sh +./scripts/start-op-geth.sh +``` + +### 2. Start op-node + +```bash +# In a separate terminal +chmod +x scripts/start-op-node.sh +./scripts/start-op-node.sh +``` + +### 3. Enable sequencing (if started in stopped state) + +```bash +# Use the admin RPC to start sequencing +curl -X POST http://localhost:8547 \ + -H "Content-Type: application/json" \ + -d '{"method":"admin_startSequencer","params":[],"id":1,"jsonrpc":"2.0"}' +``` + +## Verification and health checks + +### 1. Check node status + +```bash +# Check op-geth sync status +curl -X POST http://localhost:8545 \ + -H "Content-Type: application/json" \ + -d '{"method":"eth_syncing","params":[],"id":1,"jsonrpc":"2.0"}' + +# Check current block number +curl -X POST http://localhost:8545 \ + -H "Content-Type: application/json" \ + -d '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}' +``` + +### 2. Monitor P2P connectivity + +```bash +# Check peer count +curl -X POST http://localhost:8545 \ + -H "Content-Type: application/json" \ + -d '{"method":"net_peerCount","params":[],"id":1,"jsonrpc":"2.0"}' +``` + +### 3. Verify sequencer status + +```bash +# Check if sequencer is active +curl -X POST http://localhost:8547 \ + -H "Content-Type: application/json" \ + -d '{"method":"optimism_sequencerActive","params":[],"id":1,"jsonrpc":"2.0"}' +``` + +## Security considerations + +### 1. Network Security +- Configure firewall to allow only necessary ports +- Use VPN or private networks when possible +- Regular security updates + +### 2. Key Management +- Secure JWT secret file with appropriate permissions +- Regular rotation of authentication secrets +- Hardware security modules for production + +### 3. Monitoring +- Set up alerting for sequencer downtime +- Monitor L1 connectivity +- Track block production metrics + +## Troubleshooting + +### Common Issues + +**Sequencer Not Starting:** +- Verify L1 RPC connectivity +- Check JWT secret configuration +- Ensure proper network flags + +**P2P Connection Issues:** +- Verify firewall settings for port 9222 +- Check public IP configuration +- Validate bootnode connectivity + +**Block Building Failures:** +- Monitor resource usage (CPU, memory) +- Check L1 gas prices and availability +- Verify execution engine connectivity + +### Log Analysis + +Node log levels determine the verbosity of log messages. The log levels for the op-node are: Silent (0), Error (1), Warn (2), Info (3), Debug (4). Info (3) is the default level and provides a balanced view of the node's operations. + +For debugging, increase verbosity: +```bash +# For op-geth +--verbosity=4 + +# For op-node +--log.level=debug +``` + +## Production Considerations + +### 1. High Availability +- Implement redundant sequencer setups +- Use load balancers for RPC endpoints +- Regular backup procedures + +### 2. Performance Optimization +- SSD storage with high IOPS +- Adequate CPU and memory allocation +- Network optimization for low latency + +### 3. Monitoring and Alerting +- Prometheus metrics collection +- Grafana dashboards +- PagerDuty or similar alerting systems + +## Resources + +- [Optimism Documentation](https://docs.optimism.io) +- [OP Stack Specifications](https://github.com/ethereum-optimism/specs) +- [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry) +- [Node Software Releases](https://docs.optimism.io/builders/node-operators/releases) +- [Developer Forum](https://github.com/ethereum-optimism/developers/discussions) + +## Conclusion + +This guide provides the foundation for setting up an Optimism sequencer node. Remember that currently only OP Labs PBC can run sequencer nodes, but this is expected to change in the future as the network becomes more decentralized. Always use the latest releases and monitor the official documentation for updates and changes to the setup process. + +For production deployments, thorough testing in a staging environment and comprehensive monitoring are essential for reliable operation. \ No newline at end of file From bd584d002823b2398320d10498bb05edee3133b2 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 27 May 2025 18:11:46 +0100 Subject: [PATCH 02/47] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../tutorials/sequncer-node.mdx | 135 +++++----- words.txt | 233 +++++++++--------- 2 files changed, 198 insertions(+), 170 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/sequncer-node.mdx b/pages/operators/chain-operators/tutorials/sequncer-node.mdx index aa14ab400..68f25f515 100644 --- a/pages/operators/chain-operators/tutorials/sequncer-node.mdx +++ b/pages/operators/chain-operators/tutorials/sequncer-node.mdx @@ -21,7 +21,7 @@ is_imported_content: 'false' This guide provides step-by-step instructions for spinning up a single sequencer node after verifying your L1 smart contract deployment. A sequencer node is responsible for ordering transactions, building L2 blocks, and submitting batches to the L1 chain. -**Important**: This guide is for **custom OP Stack chain operators** who deploy their own L2 chains using the OP Stack. When you deploy your own OP Stack chain, you run your own sequencer node. This is different from OP Mainnet, where the sequencer is currently operated only by OP Labs PBC. +**Important**: This guide is for **custom OP Stack chain operators** who deploy their own L2 chains using the OP Stack. When you deploy your own OP Stack chain, you run your own sequencer node. This is different from OP Mainnet, where the sequencer is currently operated only by OP Labs PBC. **For Custom OP Stack Chains**: Chain operators can and do run their own sequencer nodes as part of deploying their custom L2 chains. @@ -30,18 +30,20 @@ This guide provides step-by-step instructions for spinning up a single sequencer ## Prerequisites ### Hardware requirements -- **CPU**: 8+ cores (16+ recommended for production) -- **RAM**: 32GB minimum (64GB+ recommended for production) -- **Storage**: 2TB+ NVMe SSD (5TB+ for archive nodes) -- **Network**: Stable internet connection with low latency to Ethereum L1 -- **Bandwidth**: 1Gbps recommended + +* **CPU**: 8+ cores (16+ recommended for production) +* **RAM**: 32GB minimum (64GB+ recommended for production) +* **Storage**: 2TB+ NVMe SSD (5TB+ for archive nodes) +* **Network**: Stable internet connection with low latency to Ethereum L1 +* **Bandwidth**: 1Gbps recommended ### Software requirements -- Linux (Ubuntu 20.04+ or similar) -- Docker and Docker Compose (optional but recommended) -- Go 1.23+ (if building from source) -- Git -- OpenSSL + +* Linux (Ubuntu 20.04+ or similar) +* Docker and Docker Compose (optional but recommended) +* Go 1.23+ (if building from source) +* Git +* OpenSSL ## Latest release information @@ -54,21 +56,25 @@ This guide provides step-by-step instructions for spinning up a single sequencer **op-batcher**: v1.12.0 (required before activating Isthmus on chains) ### Version naming convention -op-geth embeds upstream geth's version inside its own version as follows: vMAJOR.GETH_MAJOR GETH_MINOR GETH_PATCH.PATCH. For example, if geth is at v1.12.0, the corresponding op-geth version would be v1.101200.0. + +op-geth embeds upstream geth's version inside its own version as follows: vMAJOR.GETH\_MAJOR GETH\_MINOR GETH\_PATCH.PATCH. For example, if geth is at v1.12.0, the corresponding op-geth version would be v1.101200.0. ## Network flags and superchain registry ### Using network flags + The Superchain configs are stored in a minimal form and embedded in downstream OP-Stack software (op-node and op-geth). This means that after a chain has been added to the registry and the dependency on the registry updates in the downstream software, it is possible to start an op-node instance using the --network flag (and also an op-geth instance using the --op-network tag). ### Supported networks + For the latest supported networks, check the `--help` output for the `--op-network` option in op-geth and `--network` option in op-node. Common networks include: -- `op-mainnet` - OP Mainnet -- `op-sepolia` - OP Sepolia testnet -- `base` - Base mainnet -- `base-sepolia` - Base Sepolia testnet + +* `op-mainnet` - OP Mainnet +* `op-sepolia` - OP Sepolia testnet +* `base` - Base mainnet +* `base-sepolia` - Base Sepolia testnet ## Installation options @@ -219,7 +225,7 @@ source .env ### op-node configuration for sequencer -The sequencer can be initialized in a stopped state using the sequencer.stopped flag. The sequencer can be started using the admin_startSequencer RPC. +The sequencer can be initialized in a stopped state using the sequencer.stopped flag. The sequencer can be started using the admin\_startSequencer RPC. Create `scripts/start-op-node.sh`: @@ -255,6 +261,7 @@ source .env ### op-geth expected logs **Initialization:** + ``` INFO [timestamp] Starting Geth on Optimism optimism=bedrock INFO [timestamp] Maximum peer count ETH=50 LES=0 total=50 @@ -263,12 +270,14 @@ INFO [timestamp] Set global gas cap cap=50,000,000 ``` **Block Building (Sequencer Mode):** + ``` INFO [timestamp] Commit new sealing work number=12345 sealhash=0x1234... uncles=0 txs=5 gas=210,000 fees=0.005 elapsed=5.123ms INFO [timestamp] Successfully sealed new block number=12345 sealhash=0x1234... hash=0x5678... elapsed=12.345ms ``` **Forkchoice updates:** + ``` INFO [timestamp] Forkchoice requested sync to new head number=12345 hash=0x1234... ``` @@ -276,24 +285,28 @@ INFO [timestamp] Forkchoice requested sync to new head number=12345 hash=0x12 ### op-node expected logs **Startup:** + ```json {"level":"info","ts":"timestamp","msg":"Initializing Rollup Node","version":"v1.13.2"} {"level":"info","ts":"timestamp","msg":"Starting JSON-RPC server","addr":"0.0.0.0:8547"} ``` **Sequencer mode:** + ```json {"level":"info","ts":"timestamp","msg":"Sequencer enabled"} {"level":"info","ts":"timestamp","msg":"Sequencing new L2 block","l2_block":12345,"l1_origin":"0x1234"} ``` **P2P networking:** + ```json {"level":"info","ts":"timestamp","msg":"Started P2P networking","self":"16Uiu2HAm...","listen_addr":"/ip4/0.0.0.0/tcp/9222"} {"level":"info","ts":"timestamp","msg":"Connected to peer","peer":"16Uiu2HAm...","direction":"outbound"} ``` **Block Ddrivation:** + ```json {"level":"info","ts":"timestamp","msg":"Advancing derivation","l1_block":18500000,"l2_block":12345} {"level":"info","ts":"timestamp","msg":"Generated attributes in payload queue","txs":5,"timestamp":1683123456} @@ -302,13 +315,15 @@ INFO [timestamp] Forkchoice requested sync to new head number=12345 hash=0x12 ### Warning and error logs to monitor **Critical Warnings:** -- `"Sequencer drift detected"` - Clock synchronization issues -- `"Failed to submit batch to L1"` - L1 connectivity problems -- `"Block building interrupted"` - Resource constraints -- `"Unsafe reorg detected"` - Chain reorganization + +* `"Sequencer drift detected"` - Clock synchronization issues +* `"Failed to submit batch to L1"` - L1 connectivity problems +* `"Block building interrupted"` - Resource constraints +* `"Unsafe reorg detected"` - Chain reorganization **P2P issues:** -- `"no configured p2p sequencer address, ignoring gossiped block"` - P2P configuration issue requiring sequencer address configuration + +* `"no configured p2p sequencer address, ignoring gossiped block"` - P2P configuration issue requiring sequencer address configuration ## Starting the sequencer @@ -375,44 +390,51 @@ curl -X POST http://localhost:8547 \ ## Security considerations ### 1. Network Security -- Configure firewall to allow only necessary ports -- Use VPN or private networks when possible -- Regular security updates + +* Configure firewall to allow only necessary ports +* Use VPN or private networks when possible +* Regular security updates ### 2. Key Management -- Secure JWT secret file with appropriate permissions -- Regular rotation of authentication secrets -- Hardware security modules for production + +* Secure JWT secret file with appropriate permissions +* Regular rotation of authentication secrets +* Hardware security modules for production ### 3. Monitoring -- Set up alerting for sequencer downtime -- Monitor L1 connectivity -- Track block production metrics + +* Set up alerting for sequencer downtime +* Monitor L1 connectivity +* Track block production metrics ## Troubleshooting ### Common Issues **Sequencer Not Starting:** -- Verify L1 RPC connectivity -- Check JWT secret configuration -- Ensure proper network flags + +* Verify L1 RPC connectivity +* Check JWT secret configuration +* Ensure proper network flags **P2P Connection Issues:** -- Verify firewall settings for port 9222 -- Check public IP configuration -- Validate bootnode connectivity + +* Verify firewall settings for port 9222 +* Check public IP configuration +* Validate bootnode connectivity **Block Building Failures:** -- Monitor resource usage (CPU, memory) -- Check L1 gas prices and availability -- Verify execution engine connectivity + +* Monitor resource usage (CPU, memory) +* Check L1 gas prices and availability +* Verify execution engine connectivity ### Log Analysis Node log levels determine the verbosity of log messages. The log levels for the op-node are: Silent (0), Error (1), Warn (2), Info (3), Debug (4). Info (3) is the default level and provides a balanced view of the node's operations. For debugging, increase verbosity: + ```bash # For op-geth --verbosity=4 @@ -424,30 +446,33 @@ For debugging, increase verbosity: ## Production Considerations ### 1. High Availability -- Implement redundant sequencer setups -- Use load balancers for RPC endpoints -- Regular backup procedures + +* Implement redundant sequencer setups +* Use load balancers for RPC endpoints +* Regular backup procedures ### 2. Performance Optimization -- SSD storage with high IOPS -- Adequate CPU and memory allocation -- Network optimization for low latency + +* SSD storage with high IOPS +* Adequate CPU and memory allocation +* Network optimization for low latency ### 3. Monitoring and Alerting -- Prometheus metrics collection -- Grafana dashboards -- PagerDuty or similar alerting systems + +* Prometheus metrics collection +* Grafana dashboards +* PagerDuty or similar alerting systems ## Resources -- [Optimism Documentation](https://docs.optimism.io) -- [OP Stack Specifications](https://github.com/ethereum-optimism/specs) -- [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry) -- [Node Software Releases](https://docs.optimism.io/builders/node-operators/releases) -- [Developer Forum](https://github.com/ethereum-optimism/developers/discussions) +* [Optimism Documentation](https://docs.optimism.io) +* [OP Stack Specifications](https://github.com/ethereum-optimism/specs) +* [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry) +* [Node Software Releases](https://docs.optimism.io/builders/node-operators/releases) +* [Developer Forum](https://github.com/ethereum-optimism/developers/discussions) ## Conclusion This guide provides the foundation for setting up an Optimism sequencer node. Remember that currently only OP Labs PBC can run sequencer nodes, but this is expected to change in the future as the network becomes more decentralized. Always use the latest releases and monitor the official documentation for updates and changes to the setup process. -For production deployments, thorough testing in a staging environment and comprehensive monitoring are essential for reliable operation. \ No newline at end of file +For production deployments, thorough testing in a staging environment and comprehensive monitoring are essential for reliable operation. diff --git a/words.txt b/words.txt index 3f965af1c..f12b9bb1e 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 @@ -72,119 +72,122 @@ chaosnet Chugsplash Clabby codebases -collateralized Collateralized +collateralized compr Comprensive -computependingblock COMPUTEPENDINGBLOCK +computependingblock confs Consen corsdomain counterfactually -crosschain Crosschain +crosschain Crossmint Dapphub daserver -datacap DATACAP -datadir +datacap DATADIR +datadir +Ddrivation devdocs -devnet Devnet -devnets +devnet Devnets +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 excercise executability exfiltrate -exitwhensynced EXITWHENSYNCED -extradata +exitwhensynced EXTRADATA +extradata Farcaster Faultproof -fdlimit FDLIMIT +fdlimit Flashblocks Flashbots forkable +Forkchoice forkchoice FPVM FPVMs Fraxtal funcationality Funct -gascap GASCAP +gascap gaslessly -gcmode +Gbps 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 +196,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 mountpoint @@ -230,142 +233,142 @@ 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 -offchain Offchain +offchain opchaina opchainb -opcm OPCM +opcm Openfort oplabs opnode's outfile Pausability pcscdpath -pectra Pectra +pectra Pectra's -peerstore Peerstore +peerstore peerstores -permissioned Permissioned -permissionless +permissioned 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 @@ -374,16 +377,16 @@ SLTIU SLTU smartcard snapshotlog -snapsync Snapsync +snapsync Solana Soneium soyboy Spearbit SRAV SRLV -stablecoins Stablecoins +stablecoins statefulset structs subcomponents @@ -392,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 @@ -419,8 +422,8 @@ Twei txfeecap txmgr txns -txpool TXPOOL +txpool txproxy txproxyd uncensorable @@ -431,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 c9d5a3350b43192e5d65ca69a85f837ab3e0ce71 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 27 May 2025 18:29:06 +0100 Subject: [PATCH 03/47] added breadcrumbs --- pages/operators/chain-operators/tutorials.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pages/operators/chain-operators/tutorials.mdx b/pages/operators/chain-operators/tutorials.mdx index e18dc82c9..7f1aa50b8 100644 --- a/pages/operators/chain-operators/tutorials.mdx +++ b/pages/operators/chain-operators/tutorials.mdx @@ -43,6 +43,8 @@ This section provides information on adding attributes to the derivation functio + + From a34b80bcfdd4951f3f9508e45da7c2747ffaab13 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 27 May 2025 18:29:25 +0100 Subject: [PATCH 04/47] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- pages/operators/chain-operators/tutorials.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials.mdx b/pages/operators/chain-operators/tutorials.mdx index 7f1aa50b8..4b155d114 100644 --- a/pages/operators/chain-operators/tutorials.mdx +++ b/pages/operators/chain-operators/tutorials.mdx @@ -44,7 +44,7 @@ This section provides information on adding attributes to the derivation functio - + From 05673f1bfb21a27883df89705751838c58a40719 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 27 May 2025 18:30:33 +0100 Subject: [PATCH 05/47] updated title --- pages/operators/chain-operators/tutorials.mdx | 2 +- pages/operators/chain-operators/tutorials/_meta.json | 2 +- pages/operators/chain-operators/tutorials/sequncer-node.mdx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/operators/chain-operators/tutorials.mdx b/pages/operators/chain-operators/tutorials.mdx index 4b155d114..4e18adfa3 100644 --- a/pages/operators/chain-operators/tutorials.mdx +++ b/pages/operators/chain-operators/tutorials.mdx @@ -44,7 +44,7 @@ This section provides information on adding attributes to the derivation functio - + diff --git a/pages/operators/chain-operators/tutorials/_meta.json b/pages/operators/chain-operators/tutorials/_meta.json index 213b3d1e1..c6b3961e6 100644 --- a/pages/operators/chain-operators/tutorials/_meta.json +++ b/pages/operators/chain-operators/tutorials/_meta.json @@ -4,7 +4,7 @@ "adding-precompiles": "Adding a precompile", "modifying-predeploys": "Modifying predeployed contracts", "integrating-da-layer": "Integrating a new DA layer", - "sequncer-node": "Setting up an Optimism sequencer node", + "sequncer-node": "Setting up a sequencer node for custom OP Stack chains", "migrating-permissionless": "Migrating to permissionless fault proofs on OP Stack", "dispute-games":"Deploying new dispute games with OPCM", "absolute-prestate":"Generating absolute prestate and preimage files", diff --git a/pages/operators/chain-operators/tutorials/sequncer-node.mdx b/pages/operators/chain-operators/tutorials/sequncer-node.mdx index 68f25f515..04bc9a877 100644 --- a/pages/operators/chain-operators/tutorials/sequncer-node.mdx +++ b/pages/operators/chain-operators/tutorials/sequncer-node.mdx @@ -1,5 +1,5 @@ --- -title: Setting up an Optimism sequencer node +title: Setting up a sequencer node for custom OP Stack chains lang: en-US description: Learn how to spin up a single sequencer node for your OP Stack chain after verifying L1 smart contract deployment. Includes latest releases, configuration, expected logs, and troubleshooting. content_type: tutorial From c36233e93c321be029c8a3f3b8dfb6d6f101aca6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 27 May 2025 18:30:56 +0100 Subject: [PATCH 06/47] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- pages/operators/chain-operators/tutorials.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials.mdx b/pages/operators/chain-operators/tutorials.mdx index 4e18adfa3..a6dcbfb7c 100644 --- a/pages/operators/chain-operators/tutorials.mdx +++ b/pages/operators/chain-operators/tutorials.mdx @@ -44,7 +44,7 @@ This section provides information on adding attributes to the derivation functio - + From ee062f8aefbffbc32a25f29294e8e5a46db30331 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 27 May 2025 18:31:44 +0100 Subject: [PATCH 07/47] updated lints --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index f12b9bb1e..b67b32327 100644 --- a/words.txt +++ b/words.txt @@ -369,6 +369,7 @@ sepolia seqnr SEQUENCERHTTP sequencerhttp +sequncer serv signup SLLV From 3a877bf57bac0bd43e3743a82b9b3db8678cc984 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 30 May 2025 14:42:37 +0100 Subject: [PATCH 08/47] updated the content --- .../tutorials/sequncer-node.mdx | 152 ++++-------- words.txt | 232 +++++++++--------- 2 files changed, 165 insertions(+), 219 deletions(-) diff --git a/pages/operators/chain-operators/tutorials/sequncer-node.mdx b/pages/operators/chain-operators/tutorials/sequncer-node.mdx index 04bc9a877..0b555c56f 100644 --- a/pages/operators/chain-operators/tutorials/sequncer-node.mdx +++ b/pages/operators/chain-operators/tutorials/sequncer-node.mdx @@ -47,17 +47,27 @@ This guide provides step-by-step instructions for spinning up a single sequencer ## Latest release information -### Current stable releases (May 2025) +### Finding the current stable releases -**op-node**: v1.13.2 (required for Mainnet Superchain by May 9, 2025 for Isthmus fork) +To ensure you're using the latest compatible versions of OP Stack components, always check the official releases page: -**op-geth**: v1.101503.3 (Isthmus release for Mainnet Superchain, mandatory upgrade by May 9, 2025) +**[release page](https://github.com/ethereum-optimism/optimism/releases)** -**op-batcher**: v1.12.0 (required before activating Isthmus on chains) +The main components you'll need for sequencer deployment are: -### Version naming convention +* **op-node**: Look for the latest `op-node/v*` release +* **op-geth**: Look for the latest `op-geth/v*` release (found at [https://github.com/ethereum-optimism/op-geth/releases](https://github.com/ethereum-optimism/op-geth/releases)) +* **op-batcher**: Look for the latest `op-batcher/v*` release -op-geth embeds upstream geth's version inside its own version as follows: vMAJOR.GETH\_MAJOR GETH\_MINOR GETH\_PATCH.PATCH. For example, if geth is at v1.12.0, the corresponding op-geth version would be v1.101200.0. +### Docker images + +Pre-built Docker images are available for all releases at: + +* `us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:[VERSION]` +* `us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:[VERSION]` +* `us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:[VERSION]` + +Replace `[VERSION]` with the specific version tag from the releases page. ## Network flags and superchain registry @@ -78,16 +88,17 @@ Common networks include: ## Installation options -### Option 1: Docker-based Setup (Recommended) - -#### 1. Download latest docker images +### Option 1: Docker-based setup (Recommended) ```bash # Pull latest op-node image docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 -# Pull latest op-geth image -docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.3 +# Pull latest op-geth image +docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.4 + +# Pull latest op-batcher image +docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:v1.13.1 ``` ### Option 2: building from source @@ -125,11 +136,27 @@ make geth # Binary will be available at ./build/bin/geth ``` +#### 3. Clone and build op-batcher + +```bash +# op-batcher is part of the optimism monorepo +cd optimism + +# Checkout the latest release tag (if not already done) +git checkout op-batcher/v1.13.1 + +# Build op-batcher +cd op-batcher +make op-batcher + +# Binary will be available at ./bin/op-batcher +``` + ## Configuration setup ### 1. Generate JWT secret -To communicate with op-node and enable the Engine API, you'll also need to generate a JWT secret file and enable Geth's authenticated RPC endpoint. +To communicate with op-node and enable the Engine API, you'll also need to generate a JWT secret file and enable `op-geth's` authenticated RPC endpoint. ```bash # Generate JWT secret @@ -148,13 +175,15 @@ sequencer-node/ ├── jwt.txt ├── data/ │ ├── op-geth/ -│ └── op-node/ +│ ├── op-node/ +│ └── op-batcher/ ├── configs/ │ ├── rollup.json (if not using network flags) │ └── genesis.json (if not using network flags) └── scripts/ ├── start-op-geth.sh - └── start-op-node.sh + ├── start-op-node.sh + └── start-op-batcher.sh ``` ### 3. Environment variables @@ -164,7 +193,7 @@ Create a `.env` file: ```bash # L1 Configuration L1_RPC_URL=https://mainnet.infura.io/v3/YOUR_INFURA_KEY -L1_BEACON_URL=https://beacon-nd-123-456-789.p2pify.com/YOUR_BEACON_KEY +L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com # Network configuration NETWORK=op-mainnet # or your target network @@ -225,7 +254,7 @@ source .env ### op-node configuration for sequencer -The sequencer can be initialized in a stopped state using the sequencer.stopped flag. The sequencer can be started using the admin\_startSequencer RPC. +The sequencer can be initialized in a stopped state using the sequencer.stopped flag. The sequencer can be started using the `admin\_startSequencer` RPC. Create `scripts/start-op-node.sh`: @@ -387,92 +416,9 @@ curl -X POST http://localhost:8547 \ -d '{"method":"optimism_sequencerActive","params":[],"id":1,"jsonrpc":"2.0"}' ``` -## Security considerations - -### 1. Network Security - -* Configure firewall to allow only necessary ports -* Use VPN or private networks when possible -* Regular security updates - -### 2. Key Management - -* Secure JWT secret file with appropriate permissions -* Regular rotation of authentication secrets -* Hardware security modules for production - -### 3. Monitoring - -* Set up alerting for sequencer downtime -* Monitor L1 connectivity -* Track block production metrics - -## Troubleshooting - -### Common Issues - -**Sequencer Not Starting:** - -* Verify L1 RPC connectivity -* Check JWT secret configuration -* Ensure proper network flags +## Next steps -**P2P Connection Issues:** - -* Verify firewall settings for port 9222 -* Check public IP configuration -* Validate bootnode connectivity - -**Block Building Failures:** - -* Monitor resource usage (CPU, memory) -* Check L1 gas prices and availability -* Verify execution engine connectivity - -### Log Analysis - -Node log levels determine the verbosity of log messages. The log levels for the op-node are: Silent (0), Error (1), Warn (2), Info (3), Debug (4). Info (3) is the default level and provides a balanced view of the node's operations. - -For debugging, increase verbosity: - -```bash -# For op-geth ---verbosity=4 - -# For op-node ---log.level=debug -``` - -## Production Considerations - -### 1. High Availability - -* Implement redundant sequencer setups -* Use load balancers for RPC endpoints -* Regular backup procedures - -### 2. Performance Optimization - -* SSD storage with high IOPS -* Adequate CPU and memory allocation -* Network optimization for low latency - -### 3. Monitoring and Alerting - -* Prometheus metrics collection -* Grafana dashboards -* PagerDuty or similar alerting systems - -## Resources - -* [Optimism Documentation](https://docs.optimism.io) -* [OP Stack Specifications](https://github.com/ethereum-optimism/specs) -* [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry) -* [Node Software Releases](https://docs.optimism.io/builders/node-operators/releases) +* [OP Stack specs](https://github.com/ethereum-optimism/specs) +* [Superchain registry](https://github.com/ethereum-optimism/superchain-registry) +* [Node software releases](/operators/node-operators/releases) * [Developer Forum](https://github.com/ethereum-optimism/developers/discussions) - -## Conclusion - -This guide provides the foundation for setting up an Optimism sequencer node. Remember that currently only OP Labs PBC can run sequencer nodes, but this is expected to change in the future as the network becomes more decentralized. Always use the latest releases and monitor the official documentation for updates and changes to the setup process. - -For production deployments, thorough testing in a staging environment and comprehensive monitoring are essential for reliable operation. diff --git a/words.txt b/words.txt index b67b32327..0ef4a5f41 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 @@ -72,122 +72,122 @@ chaosnet Chugsplash Clabby codebases -Collateralized collateralized +Collateralized compr Comprensive -COMPUTEPENDINGBLOCK computependingblock +COMPUTEPENDINGBLOCK confs Consen corsdomain counterfactually -Crosschain crosschain +Crosschain Crossmint Dapphub daserver -DATACAP datacap -DATADIR +DATACAP datadir +DATADIR Ddrivation devdocs -Devnet devnet -Devnets +Devnet devnets +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 excercise executability exfiltrate -EXITWHENSYNCED exitwhensynced -EXTRADATA +EXITWHENSYNCED extradata +EXTRADATA Farcaster Faultproof -FDLIMIT fdlimit +FDLIMIT Flashblocks Flashbots forkable -Forkchoice forkchoice +Forkchoice FPVM FPVMs Fraxtal funcationality Funct -GASCAP gascap +GASCAP gaslessly Gbps -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 @@ -196,34 +196,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 mountpoint @@ -233,142 +233,142 @@ 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 -Offchain offchain +Offchain opchaina opchainb -OPCM opcm +OPCM Openfort oplabs opnode's outfile Pausability pcscdpath -Pectra pectra +Pectra Pectra's -Peerstore peerstore +Peerstore peerstores -Permissioned permissioned -Permissionless +Permissioned 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 sequncer serv signup @@ -378,16 +378,16 @@ SLTIU SLTU smartcard snapshotlog -Snapsync snapsync +Snapsync Solana Soneium soyboy Spearbit SRAV SRLV -Stablecoins stablecoins +Stablecoins statefulset structs subcomponents @@ -396,21 +396,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 @@ -423,8 +423,8 @@ Twei txfeecap txmgr txns -TXPOOL txpool +TXPOOL txproxy txproxyd uncensorable @@ -435,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 f2cad0196a75872a40ea49b935d88be91f8d40d7 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 30 May 2025 16:37:23 +0100 Subject: [PATCH 09/47] updated text --- pages/operators/chain-operators/tutorials.mdx | 2 +- pages/operators/chain-operators/tutorials/_meta.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/tutorials.mdx b/pages/operators/chain-operators/tutorials.mdx index a6dcbfb7c..4e18adfa3 100644 --- a/pages/operators/chain-operators/tutorials.mdx +++ b/pages/operators/chain-operators/tutorials.mdx @@ -44,7 +44,7 @@ This section provides information on adding attributes to the derivation functio - + diff --git a/pages/operators/chain-operators/tutorials/_meta.json b/pages/operators/chain-operators/tutorials/_meta.json index c6b3961e6..e9aee4825 100644 --- a/pages/operators/chain-operators/tutorials/_meta.json +++ b/pages/operators/chain-operators/tutorials/_meta.json @@ -4,7 +4,7 @@ "adding-precompiles": "Adding a precompile", "modifying-predeploys": "Modifying predeployed contracts", "integrating-da-layer": "Integrating a new DA layer", - "sequncer-node": "Setting up a sequencer node for custom OP Stack chains", + "sequencer-node": "Setting up a sequencer node for custom OP Stack chains", "migrating-permissionless": "Migrating to permissionless fault proofs on OP Stack", "dispute-games":"Deploying new dispute games with OPCM", "absolute-prestate":"Generating absolute prestate and preimage files", From 3bb24080ce63adb278101d93d5fa438593f188a0 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 30 May 2025 16:37:39 +0100 Subject: [PATCH 10/47] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- pages/operators/chain-operators/tutorials.mdx | 2 +- words.txt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/tutorials.mdx b/pages/operators/chain-operators/tutorials.mdx index 4e18adfa3..a6dcbfb7c 100644 --- a/pages/operators/chain-operators/tutorials.mdx +++ b/pages/operators/chain-operators/tutorials.mdx @@ -44,7 +44,7 @@ This section provides information on adding attributes to the derivation functio - + diff --git a/words.txt b/words.txt index 0ef4a5f41..75ef85538 100644 --- a/words.txt +++ b/words.txt @@ -369,7 +369,6 @@ SEPOLIA seqnr sequencerhttp SEQUENCERHTTP -sequncer serv signup SLLV From 694e19c041aa2409093769900e2758741fd77ab3 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 30 May 2025 16:38:40 +0100 Subject: [PATCH 11/47] updated the version --- pages/operators/chain-operators/tutorials/sequncer-node.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/sequncer-node.mdx b/pages/operators/chain-operators/tutorials/sequncer-node.mdx index 0b555c56f..6a3f3e1a9 100644 --- a/pages/operators/chain-operators/tutorials/sequncer-node.mdx +++ b/pages/operators/chain-operators/tutorials/sequncer-node.mdx @@ -128,7 +128,7 @@ git clone https://github.com/ethereum-optimism/op-geth.git cd op-geth # Checkout the latest release tag -git checkout v1.101503.3 +git checkout v1.101503.4 # Build op-geth make geth From 93a919b21c45be4b673a23e53026bb9414289859 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 30 May 2025 16:38:55 +0100 Subject: [PATCH 12/47] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index 75ef85538..0ef4a5f41 100644 --- a/words.txt +++ b/words.txt @@ -369,6 +369,7 @@ SEPOLIA seqnr sequencerhttp SEQUENCERHTTP +sequncer serv signup SLLV From 3f0b7436d94d2087d26cf7fbaeaa5ac447fdb13d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 30 May 2025 09:33:45 -0700 Subject: [PATCH 13/47] Update pages/operators/chain-operators/tutorials/sequncer-node.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/operators/chain-operators/tutorials/sequncer-node.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/tutorials/sequncer-node.mdx b/pages/operators/chain-operators/tutorials/sequncer-node.mdx index 6a3f3e1a9..24757fe80 100644 --- a/pages/operators/chain-operators/tutorials/sequncer-node.mdx +++ b/pages/operators/chain-operators/tutorials/sequncer-node.mdx @@ -334,7 +334,7 @@ INFO [timestamp] Forkchoice requested sync to new head number=12345 hash=0x12 {"level":"info","ts":"timestamp","msg":"Connected to peer","peer":"16Uiu2HAm...","direction":"outbound"} ``` -**Block Ddrivation:** +**Block Derivation:** ```json {"level":"info","ts":"timestamp","msg":"Advancing derivation","l1_block":18500000,"l2_block":12345} From 91ac6353bd49c60ae1b3392fc5bc72525b90bbb4 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 11 Jun 2025 17:10:27 +0100 Subject: [PATCH 14/47] updated docs --- .cursorrules | 91 +++ pages/operators/chain-operators/deploy.mdx | 3 + .../chain-operators/deploy/_meta.json | 1 + .../chain-operators/deploy/sequncer-node.mdx | 579 ++++++++++++++++++ pages/operators/chain-operators/tutorials.mdx | 2 - .../chain-operators/tutorials/_meta.json | 1 - .../tutorials/sequncer-node.mdx | 424 ------------- words.txt | 233 ++++--- 8 files changed, 789 insertions(+), 545 deletions(-) create mode 100644 .cursorrules create mode 100644 pages/operators/chain-operators/deploy/sequncer-node.mdx delete mode 100644 pages/operators/chain-operators/tutorials/sequncer-node.mdx diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 000000000..123e5fe1d --- /dev/null +++ b/.cursorrules @@ -0,0 +1,91 @@ +# Documentation Writing Rules for Optimism Tech Writer + +## Core Principles +- NEVER hallucinate technical details, specifications, or blockchain-specific information +- When uncertain about technical accuracy, create TODO comments for SMEs +- Prioritize accuracy over completeness +- Be transparent about knowledge gaps rather than making assumptions + +## Technical Content Guidelines + +### Blockchain & Optimism-Specific Content +- NEVER invent gas fees, transaction costs, or network parameters +- NEVER create fictional contract addresses, transaction hashes, or block numbers +- NEVER specify exact version numbers, release dates, or deprecation timelines without verification +- For OP Stack, L2 specifications, or protocol details: Use TODO for SME verification + +### Code Examples & Configuration +- Only use verified, tested code examples from existing documentation +- For new code examples, mark with: `` +- NEVER create placeholder contract addresses - use TODO instead +- For configuration values, mark uncertain parameters: `# TODO: SME confirm default value` + +### API & CLI Documentation +- NEVER invent API endpoints, parameters, or response structures +- For CLI commands, only document verified flags and options +- Mark uncertain syntax with: `` +- Use existing examples from official repositories when available + +## TODO Format Guidelines + +### Use these specific TODO formats: +``` + +``` + +``` + +``` + +``` + +``` + +### Examples of good TODOs: +- `` +- `` +- `` + +## What You CAN Write Confidently +- General explanations of blockchain concepts +- Documentation structure and formatting +- User experience flow descriptions +- Clear, accurate rewrites of existing content +- Cross-references to official sources + +## Red Flags - Stop and Add TODO Instead +- Specific version numbers without source +- Exact costs, fees, or limits +- Contract addresses or transaction hashes +- API endpoints not in existing docs +- Deprecation dates or upgrade timelines +- Performance benchmarks or statistics + +## Documentation Structure +- Always include clear headings and navigation +- Add prerequisites and assumptions sections +- Include troubleshooting sections with common issues +- Link to official repositories and sources +- Use consistent formatting and style throughout + +## Review Process +- Mark all TODOs with priority: [HIGH], [MEDIUM], [LOW] +- Group related TODOs to minimize SME review time +- Include context for why SME input is needed +- Reference specific sections of code/docs when available + +## Quality Checks +Before submitting documentation: +1. No placeholder values (0x123..., example.com, etc.) +2. All technical claims have sources or TODOs +3. Code examples are from verified sources +4. No assumed knowledge about internal processes +5. Clear separation between general concepts and Optimism-specific details + +## SME Collaboration +- Be specific about what type of expert is needed (protocol, infrastructure, API, etc.) +- Provide context about the user persona and use case +- Include links to related GitHub issues or PRs when relevant +- Suggest multiple options when uncertain between approaches + +Remember: It's better to have accurate documentation with TODOs than polished documentation with errors. \ No newline at end of file diff --git a/pages/operators/chain-operators/deploy.mdx b/pages/operators/chain-operators/deploy.mdx index 82bfb891b..d0c4c6ac2 100644 --- a/pages/operators/chain-operators/deploy.mdx +++ b/pages/operators/chain-operators/deploy.mdx @@ -31,5 +31,8 @@ This section provides information on OP Stack genesis creation, deployment overv + + + diff --git a/pages/operators/chain-operators/deploy/_meta.json b/pages/operators/chain-operators/deploy/_meta.json index 9921d07e6..d52e0211e 100644 --- a/pages/operators/chain-operators/deploy/_meta.json +++ b/pages/operators/chain-operators/deploy/_meta.json @@ -2,6 +2,7 @@ "overview": "Deployment overview", "smart-contracts": "Smart contract deployment", "validate-deployment": "Validate your contract deployment", + "sequencer-node": "spinning up the sequencer", "genesis": "Chain artifacts creation" } diff --git a/pages/operators/chain-operators/deploy/sequncer-node.mdx b/pages/operators/chain-operators/deploy/sequncer-node.mdx new file mode 100644 index 000000000..4d16ca948 --- /dev/null +++ b/pages/operators/chain-operators/deploy/sequncer-node.mdx @@ -0,0 +1,579 @@ +--- +title: Spinning up the sequencer +lang: en-US +description: Learn how to spin up a single sequencer node for your chain after verifying L1 smart contract deployment. +content_type: tutorial +topic: spinning sequencer +personas: + - chain-operator + - node-operator + - protocol-developer +categories: + - chain-operation + - chain-deployment + - node-management + - sequencer-configuration + - op-stack +is_imported_content: 'false' +--- + +## Overview + +This guide provides step-by-step instructions for spinning up a sequencer node after deploying your L1 smart contracts with [`op-deployer`](/operators/chain-operators/tools/op-deployer). + +A 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 + +This guide assumes you have already: + +* Successfully deployed L1 contracts using `op-deployer apply` +* Generated your `genesis.json` and `rollup.json` configuration files +* Have access to the required private keys for sequencer, batcher, and proposer roles + +## Prerequisites + +### Essential requirements after op-deployer deployment + +Before spinning up your sequencer, ensure you have completed these steps: + +**1. Successful L1 contract deployment:** + +* Deployed L1 contracts using [`op-deployer apply`](/operators/chain-operators/tools/op-deployer#apply-deploy-your-chain) +* 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 + ``` + +**2. 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 + +**3. Essential addresses and keys:** + +* **Sequencer private key** - For signing blocks on the P2P network (does not send transactions to L1) +* **Batcher private key** - For submitting transaction batches to L1 +* **Proposer private key** - For submitting state roots to L1 + +**4. L1 network access:** + +* L1 RPC endpoint (Ethereum, Sepolia, etc.) +* L1 Beacon node endpoint (required for blob data retrieval) + +### 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 (found at [https://github.com/ethereum-optimism/op-geth/releases](https://github.com/ethereum-optimism/op-geth/releases)) + +### Docker images + +Pre-built Docker images are available for all releases at: + +* `us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:[VERSION]` +* `us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:[VERSION]` + +Replace `[VERSION]` with the specific version tag from the releases page. + +## Software installation + +For sequencer deployment, we recommend **building from source** as it provides better control, debugging capabilities, and transparency for production infrastructure. +A Docker alternative is also provided for development or containerized environments. + +### Build from source (Recommended for production) + +Building from source gives you full control over the binaries and is the preferred approach for production sequencer deployments. + +#### 1. 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.2 + +# Build op-node +cd op-node +make op-node + +# Binary will be available at ./bin/op-node +``` + +#### 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 + +# Checkout the latest release tag +git checkout v1.101503.4 + +# Build op-geth +make geth + +# Binary will be available at ./build/bin/geth +``` + +### Docker alternative (For containerized environments) + +If you prefer containerized deployment, you can use the official Docker images. +Note that all subsequent configuration examples will need to be adapted for Docker usage. + +#### Pull the required images + +```bash +# Pull latest op-node image +docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 + +# Pull latest op-geth image +docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.4 +``` + +#### Docker command equivalents + +When following the rest of this guide with Docker, replace the binary commands as follows: + +**Instead of local binary:** + +```bash +./build/bin/geth [arguments] +``` + +**Use Docker:** + +```bash +docker run --rm -v $(pwd):/workspace \ + us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.4 \ + [arguments] +``` + +**Instead of local binary:** + +```bash +./bin/op-node [arguments] +``` + +**Use Docker:** + +```bash +docker run --rm -v $(pwd):/workspace \ + --network host \ + us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 \ + [arguments] +``` + +
+ Complete Docker setup guide + + If you choose the Docker approach, you'll need to: + + 1. **Create a docker-compose.yml** for easier management: + + ```yaml + version: '3.8' + + services: + op-geth: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.4 + volumes: + - ./data/op-geth:/data + - ./genesis.json:/genesis.json + - ./jwt.txt:/jwt.txt + ports: + - "8545:8545" + - "8546:8546" + - "8551:8551" + command: | + --datadir=/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=/jwt.txt + # ... other geth flags + + op-node: + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 + depends_on: + - op-geth + volumes: + - ./rollup.json:/rollup.json + - ./jwt.txt:/jwt.txt + ports: + - "8547:8547" + - "9222:9222" + command: | + --l1=${L1_RPC_URL} + --l2=http://op-geth:8551 + --rollup.config=/rollup.json + --sequencer.enabled=true + # ... other op-node flags + ``` + + 2. **Adapt all subsequent commands** to use `docker-compose` or individual `docker run` commands + + 3. **Handle networking** - containers need to communicate with each other and external services +
+ +### Verify installation + +Regardless of your chosen method, verify your installation: + +**For build-from-source:** + +```bash +./bin/op-node --version +./build/bin/geth version +``` + +**For Docker:** + +```bash +docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 --version +docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.4 version +``` + +**Note:** The rest of this guide assumes you're using the **build-from-source** approach. +If you chose Docker, refer to the command equivalents above or the Docker setup guide in the collapsible section. + +## Configuration setup + +### 1. 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 + ``` +
+ +### 2. Generate JWT secret + +```bash +# Generate JWT secret in the sequencer directory +openssl rand -hex 32 > jwt.txt + +# Set appropriate permissions +chmod 600 jwt.txt +``` + +### 3. Set up directory structure and copy files + +```bash +# Create data directories +mkdir -p data/op-geth data/op-node scripts + +# Copy configuration files from op-deployer +cp ~/.deployer/genesis.json . +cp ~/.deployer/rollup.json . +``` + +Your final directory structure should look like: + +``` +~/sequencer-node/ +├── jwt.txt +├── genesis.json +├── rollup.json +├── data/ +│ ├── op-geth/ +│ └── op-node/ +└── scripts/ + ├── start-op-geth.sh # (to be created) + └── start-op-node.sh # (to be created) +``` + +### 4. Environment variables + +You'll need to gather several pieces of information before creating your configuration. Here's where to get each value: + +#### 4.1. 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**: Sign up at [infura.io](https://infura.io), create a project, get your API key +* **Alchemy**: Sign up at [alchemy.com](https://alchemy.com), create an app, get your API key + +**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) + +#### 4.2. Extract sequencer private key from op-deployer + +The sequencer private key is used for signing blocks on the P2P network. Find it in your op-deployer intent file: + +```bash +# View your intent file to find the sequencer private key +cat ~/.deployer/intent.toml + +# Look for a section like: +# [chains.my-chain.roles.sequencer] +# privateKey = "0x..." +``` + +**Note**: For this basic sequencer setup, you only need the sequencer private key. + +#### 4.3. Get your public IP address + +```bash +# Find your public IP address +curl ifconfig.me +# or +curl ipinfo.io/ip +``` + +#### 4.4. 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 +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 + +# Sequencer configuration +SEQUENCER_ENABLED=true +SEQUENCER_STOPPED=false + +# Private keys - Only sequencer key needed for this setup +SEQUENCER_PRIVATE_KEY=0xYOUR_ACTUAL_SEQUENCER_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 + +# Data directories +DATA_DIR=./data +JWT_SECRET=./jwt.txt +EOF +``` + +**Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values! + +## 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=$DATA_DIR/op-geth \ + --http \ + --http.addr=0.0.0.0 \ + --http.port=$OP_GETH_HTTP_PORT \ + --http.vhosts="*" \ + --http.corsdomain="*" \ + --http.api=eth,net,web3,debug,txpool,miner \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port=$OP_GETH_WS_PORT \ + --ws.origins="*" \ + --ws.api=eth,net,web3,debug,txpool,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=false \ + --rollup.sequencerhttp=http://localhost:$OP_GETH_HTTP_PORT \ + --miner.gaslimit=30000000 \ + --verbosity=3 +``` + +### 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=$SEQUENCER_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 + +### 1. 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=./data/op-geth --state.scheme=hash ./genesis.json +``` + +### 2. Start op-geth + +```bash +chmod +x scripts/start-op-geth.sh +./scripts/start-op-geth.sh +``` + +### 3. Start op-node + +```bash +# In a separate terminal +chmod +x scripts/start-op-node.sh +./scripts/start-op-node.sh +``` + +### 4. Enable sequencing (if started in stopped state) + +```bash +# Use the admin RPC to start sequencing +curl -X POST http://localhost:8547 \ + -H "Content-Type: application/json" \ + -d '{"method":"admin_startSequencer","params":[],"id":1,"jsonrpc":"2.0"}' +``` + +## Verification and health checks + +### 1. Check node status + +```bash +# Check op-geth sync status +curl -X POST http://localhost:8545 \ + -H "Content-Type: application/json" \ + -d '{"method":"eth_syncing","params":[],"id":1,"jsonrpc":"2.0"}' + +# Check current block number +curl -X POST http://localhost:8545 \ + -H "Content-Type: application/json" \ + -d '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}' +``` + +### 2. Monitor P2P connectivity + +```bash +# Check peer count +curl -X POST http://localhost:8545 \ + -H "Content-Type: application/json" \ + -d '{"method":"net_peerCount","params":[],"id":1,"jsonrpc":"2.0"}' +``` + +### 3. Verify sequencer status + +```bash +# Check if sequencer is active +curl -X POST http://localhost:8547 \ + -H "Content-Type: application/json" \ + -d '{"method":"optimism_sequencerActive","params":[],"id":1,"jsonrpc":"2.0"}' +``` + +## When you'll need additional components + +This guide covers spinning up the core sequencer (op-node + op-geth). +For a complete, production-ready chain, you'll eventually need: + +* **op-batcher**: Submits transaction batches to L1 for data availability +* **op-proposer**: Submits state root proposals to L1 for dispute resolution + +These services can be added after your sequencer is running and creating blocks. + +## Next steps(TODO: Update this after other pages have been merged) diff --git a/pages/operators/chain-operators/tutorials.mdx b/pages/operators/chain-operators/tutorials.mdx index a6dcbfb7c..af3ca06b1 100644 --- a/pages/operators/chain-operators/tutorials.mdx +++ b/pages/operators/chain-operators/tutorials.mdx @@ -44,8 +44,6 @@ This section provides information on adding attributes to the derivation functio - - diff --git a/pages/operators/chain-operators/tutorials/_meta.json b/pages/operators/chain-operators/tutorials/_meta.json index e9aee4825..9168131fe 100644 --- a/pages/operators/chain-operators/tutorials/_meta.json +++ b/pages/operators/chain-operators/tutorials/_meta.json @@ -4,7 +4,6 @@ "adding-precompiles": "Adding a precompile", "modifying-predeploys": "Modifying predeployed contracts", "integrating-da-layer": "Integrating a new DA layer", - "sequencer-node": "Setting up a sequencer node for custom OP Stack chains", "migrating-permissionless": "Migrating to permissionless fault proofs on OP Stack", "dispute-games":"Deploying new dispute games with OPCM", "absolute-prestate":"Generating absolute prestate and preimage files", diff --git a/pages/operators/chain-operators/tutorials/sequncer-node.mdx b/pages/operators/chain-operators/tutorials/sequncer-node.mdx deleted file mode 100644 index 24757fe80..000000000 --- a/pages/operators/chain-operators/tutorials/sequncer-node.mdx +++ /dev/null @@ -1,424 +0,0 @@ ---- -title: Setting up a sequencer node for custom OP Stack chains -lang: en-US -description: Learn how to spin up a single sequencer node for your OP Stack chain after verifying L1 smart contract deployment. Includes latest releases, configuration, expected logs, and troubleshooting. -content_type: tutorial -topic: sequencer-deployment -personas: - - chain-operator - - node-operator - - protocol-developer -categories: - - chain-operation - - chain-deployment - - node-management - - sequencer-configuration - - op-stack -is_imported_content: 'false' ---- - -## Overview - -This guide provides step-by-step instructions for spinning up a single sequencer node after verifying your L1 smart contract deployment. A sequencer node is responsible for ordering transactions, building L2 blocks, and submitting batches to the L1 chain. - -**Important**: This guide is for **custom OP Stack chain operators** who deploy their own L2 chains using the OP Stack. When you deploy your own OP Stack chain, you run your own sequencer node. This is different from OP Mainnet, where the sequencer is currently operated only by OP Labs PBC. - -**For Custom OP Stack Chains**: Chain operators can and do run their own sequencer nodes as part of deploying their custom L2 chains. - -**For OP Mainnet**: Currently only OP Labs PBC operates the sequencer, though this may become decentralized in the future. - -## Prerequisites - -### Hardware requirements - -* **CPU**: 8+ cores (16+ recommended for production) -* **RAM**: 32GB minimum (64GB+ recommended for production) -* **Storage**: 2TB+ NVMe SSD (5TB+ for archive nodes) -* **Network**: Stable internet connection with low latency to Ethereum L1 -* **Bandwidth**: 1Gbps recommended - -### Software requirements - -* Linux (Ubuntu 20.04+ or similar) -* Docker and Docker Compose (optional but recommended) -* Go 1.23+ (if building from source) -* Git -* OpenSSL - -## Latest release information - -### 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 (found at [https://github.com/ethereum-optimism/op-geth/releases](https://github.com/ethereum-optimism/op-geth/releases)) -* **op-batcher**: Look for the latest `op-batcher/v*` release - -### Docker images - -Pre-built Docker images are available for all releases at: - -* `us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:[VERSION]` -* `us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:[VERSION]` -* `us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:[VERSION]` - -Replace `[VERSION]` with the specific version tag from the releases page. - -## Network flags and superchain registry - -### Using network flags - -The Superchain configs are stored in a minimal form and embedded in downstream OP-Stack software (op-node and op-geth). This means that after a chain has been added to the registry and the dependency on the registry updates in the downstream software, it is possible to start an op-node instance using the --network flag (and also an op-geth instance using the --op-network tag). - -### Supported networks - -For the latest supported networks, check the `--help` output for the `--op-network` option in op-geth and `--network` option in op-node. - -Common networks include: - -* `op-mainnet` - OP Mainnet -* `op-sepolia` - OP Sepolia testnet -* `base` - Base mainnet -* `base-sepolia` - Base Sepolia testnet - -## Installation options - -### Option 1: Docker-based setup (Recommended) - -```bash -# Pull latest op-node image -docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 - -# Pull latest op-geth image -docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.4 - -# Pull latest op-batcher image -docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:v1.13.1 -``` - -### Option 2: building from source - -#### 1. 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.2 - -# Build op-node -cd op-node -make op-node - -# Binary will be available at ./bin/op-node -``` - -#### 2. Clone and build op-geth - -```bash -# Clone op-geth repository -git clone https://github.com/ethereum-optimism/op-geth.git -cd op-geth - -# Checkout the latest release tag -git checkout v1.101503.4 - -# Build op-geth -make geth - -# Binary will be available at ./build/bin/geth -``` - -#### 3. Clone and build op-batcher - -```bash -# op-batcher is part of the optimism monorepo -cd optimism - -# Checkout the latest release tag (if not already done) -git checkout op-batcher/v1.13.1 - -# Build op-batcher -cd op-batcher -make op-batcher - -# Binary will be available at ./bin/op-batcher -``` - -## Configuration setup - -### 1. Generate JWT secret - -To communicate with op-node and enable the Engine API, you'll also need to generate a JWT secret file and enable `op-geth's` authenticated RPC endpoint. - -```bash -# Generate JWT secret -openssl rand -hex 32 > jwt.txt - -# Set appropriate permissions -chmod 600 jwt.txt -``` - -### 2. Directory structure - -Create the following directory structure: - -``` -sequencer-node/ -├── jwt.txt -├── data/ -│ ├── op-geth/ -│ ├── op-node/ -│ └── op-batcher/ -├── configs/ -│ ├── rollup.json (if not using network flags) -│ └── genesis.json (if not using network flags) -└── scripts/ - ├── start-op-geth.sh - ├── start-op-node.sh - └── start-op-batcher.sh -``` - -### 3. Environment variables - -Create a `.env` file: - -```bash -# L1 Configuration -L1_RPC_URL=https://mainnet.infura.io/v3/YOUR_INFURA_KEY -L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com - -# Network configuration -NETWORK=op-mainnet # or your target network -OP_NETWORK=op-mainnet - -# Sequencer configuration -SEQUENCER_ENABLED=true -SEQUENCER_STOPPED=false - -# P2P configuration -P2P_LISTEN_PORT=9222 -P2P_ADVERTISE_IP=YOUR_PUBLIC_IP - -# RPC configuration -OP_NODE_RPC_PORT=8547 -OP_GETH_HTTP_PORT=8545 -OP_GETH_WS_PORT=8546 -OP_GETH_AUTH_PORT=8551 - -# Data directories -DATA_DIR=./data -JWT_SECRET=./jwt.txt -``` - -## Sequencer specific configuration - -### op-geth configuration for sequencer - -Create `scripts/start-op-geth.sh`: - -```bash -#!/bin/bash -source .env - -./build/bin/geth \ - --datadir=$DATA_DIR/op-geth \ - --http \ - --http.addr=0.0.0.0 \ - --http.port=$OP_GETH_HTTP_PORT \ - --http.vhosts="*" \ - --http.corsdomain="*" \ - --http.api=eth,net,web3,debug,txpool \ - --ws \ - --ws.addr=0.0.0.0 \ - --ws.port=$OP_GETH_WS_PORT \ - --ws.origins="*" \ - --ws.api=eth,net,web3,debug,txpool \ - --authrpc.addr=0.0.0.0 \ - --authrpc.port=$OP_GETH_AUTH_PORT \ - --authrpc.vhosts="*" \ - --authrpc.jwtsecret=$JWT_SECRET \ - --op-network=$OP_NETWORK \ - --rollup.disabletxpoolgossip=false \ - --rollup.sequencerhttp=http://localhost:$OP_GETH_HTTP_PORT \ - --miner.gaslimit=30000000 \ - --verbosity=3 -``` - -### op-node configuration for sequencer - -The sequencer can be initialized in a stopped state using the sequencer.stopped flag. The sequencer can be started using the `admin\_startSequencer` RPC. - -Create `scripts/start-op-node.sh`: - -```bash -#!/bin/bash -source .env - -./bin/op-node \ - --l1=$L1_RPC_URL \ - --l1.beacon=$L1_BEACON_URL \ - --l2=http://localhost:$OP_GETH_AUTH_PORT \ - --l2.jwt-secret=$JWT_SECRET \ - --network=$NETWORK \ - --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.bootnodes="$(op-node p2p discover --network=$NETWORK)" \ - --rpc.addr=0.0.0.0 \ - --rpc.port=$OP_NODE_RPC_PORT \ - --log.level=info \ - --log.format=json -``` - -## Expected logs and monitoring - -### op-geth expected logs - -**Initialization:** - -``` -INFO [timestamp] Starting Geth on Optimism optimism=bedrock -INFO [timestamp] Maximum peer count ETH=50 LES=0 total=50 -INFO [timestamp] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory" -INFO [timestamp] Set global gas cap cap=50,000,000 -``` - -**Block Building (Sequencer Mode):** - -``` -INFO [timestamp] Commit new sealing work number=12345 sealhash=0x1234... uncles=0 txs=5 gas=210,000 fees=0.005 elapsed=5.123ms -INFO [timestamp] Successfully sealed new block number=12345 sealhash=0x1234... hash=0x5678... elapsed=12.345ms -``` - -**Forkchoice updates:** - -``` -INFO [timestamp] Forkchoice requested sync to new head number=12345 hash=0x1234... -``` - -### op-node expected logs - -**Startup:** - -```json -{"level":"info","ts":"timestamp","msg":"Initializing Rollup Node","version":"v1.13.2"} -{"level":"info","ts":"timestamp","msg":"Starting JSON-RPC server","addr":"0.0.0.0:8547"} -``` - -**Sequencer mode:** - -```json -{"level":"info","ts":"timestamp","msg":"Sequencer enabled"} -{"level":"info","ts":"timestamp","msg":"Sequencing new L2 block","l2_block":12345,"l1_origin":"0x1234"} -``` - -**P2P networking:** - -```json -{"level":"info","ts":"timestamp","msg":"Started P2P networking","self":"16Uiu2HAm...","listen_addr":"/ip4/0.0.0.0/tcp/9222"} -{"level":"info","ts":"timestamp","msg":"Connected to peer","peer":"16Uiu2HAm...","direction":"outbound"} -``` - -**Block Derivation:** - -```json -{"level":"info","ts":"timestamp","msg":"Advancing derivation","l1_block":18500000,"l2_block":12345} -{"level":"info","ts":"timestamp","msg":"Generated attributes in payload queue","txs":5,"timestamp":1683123456} -``` - -### Warning and error logs to monitor - -**Critical Warnings:** - -* `"Sequencer drift detected"` - Clock synchronization issues -* `"Failed to submit batch to L1"` - L1 connectivity problems -* `"Block building interrupted"` - Resource constraints -* `"Unsafe reorg detected"` - Chain reorganization - -**P2P issues:** - -* `"no configured p2p sequencer address, ignoring gossiped block"` - P2P configuration issue requiring sequencer address configuration - -## Starting the sequencer - -### 1. Initialize op-geth (if using network flags) - -```bash -# For networks using the superchain registry (recommended) -cd sequencer-node -chmod +x scripts/start-op-geth.sh -./scripts/start-op-geth.sh -``` - -### 2. Start op-node - -```bash -# In a separate terminal -chmod +x scripts/start-op-node.sh -./scripts/start-op-node.sh -``` - -### 3. Enable sequencing (if started in stopped state) - -```bash -# Use the admin RPC to start sequencing -curl -X POST http://localhost:8547 \ - -H "Content-Type: application/json" \ - -d '{"method":"admin_startSequencer","params":[],"id":1,"jsonrpc":"2.0"}' -``` - -## Verification and health checks - -### 1. Check node status - -```bash -# Check op-geth sync status -curl -X POST http://localhost:8545 \ - -H "Content-Type: application/json" \ - -d '{"method":"eth_syncing","params":[],"id":1,"jsonrpc":"2.0"}' - -# Check current block number -curl -X POST http://localhost:8545 \ - -H "Content-Type: application/json" \ - -d '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}' -``` - -### 2. Monitor P2P connectivity - -```bash -# Check peer count -curl -X POST http://localhost:8545 \ - -H "Content-Type: application/json" \ - -d '{"method":"net_peerCount","params":[],"id":1,"jsonrpc":"2.0"}' -``` - -### 3. Verify sequencer status - -```bash -# Check if sequencer is active -curl -X POST http://localhost:8547 \ - -H "Content-Type: application/json" \ - -d '{"method":"optimism_sequencerActive","params":[],"id":1,"jsonrpc":"2.0"}' -``` - -## Next steps - -* [OP Stack specs](https://github.com/ethereum-optimism/specs) -* [Superchain registry](https://github.com/ethereum-optimism/superchain-registry) -* [Node software releases](/operators/node-operators/releases) -* [Developer Forum](https://github.com/ethereum-optimism/developers/discussions) diff --git a/words.txt b/words.txt index 0ef4a5f41..d795aebe1 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 @@ -72,122 +72,119 @@ chaosnet Chugsplash Clabby codebases -collateralized Collateralized +collateralized compr Comprensive -computependingblock COMPUTEPENDINGBLOCK +computependingblock confs Consen corsdomain counterfactually -crosschain Crosschain +crosschain Crossmint Dapphub daserver -datacap DATACAP -datadir +datacap DATADIR -Ddrivation +datadir devdocs -devnet Devnet -devnets +devnet Devnets +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 excercise executability exfiltrate -exitwhensynced EXITWHENSYNCED -extradata +exitwhensynced EXTRADATA +extradata Farcaster Faultproof -fdlimit FDLIMIT +fdlimit Flashblocks Flashbots forkable forkchoice -Forkchoice FPVM FPVMs Fraxtal funcationality Funct -gascap GASCAP +gascap gaslessly -Gbps -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 @@ -196,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 mountpoint @@ -233,142 +230,142 @@ 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 -offchain Offchain +offchain opchaina opchainb -opcm OPCM +opcm Openfort oplabs opnode's outfile Pausability pcscdpath -pectra Pectra +pectra Pectra's -peerstore Peerstore +peerstore peerstores -permissioned Permissioned -permissionless +permissioned 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 sequncer serv signup @@ -378,16 +375,16 @@ SLTIU SLTU smartcard snapshotlog -snapsync Snapsync +snapsync Solana Soneium soyboy Spearbit SRAV SRLV -stablecoins Stablecoins +stablecoins statefulset structs subcomponents @@ -396,21 +393,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 @@ -423,8 +420,8 @@ Twei txfeecap txmgr txns -txpool TXPOOL +txpool txproxy txproxyd uncensorable @@ -435,21 +432,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 564661e57ae93d55fd8fb6b05869e889a37cd137 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 11 Jun 2025 17:11:06 +0100 Subject: [PATCH 15/47] remove files --- .cursorrules | 91 ---------------------------------------------------- 1 file changed, 91 deletions(-) delete mode 100644 .cursorrules diff --git a/.cursorrules b/.cursorrules deleted file mode 100644 index 123e5fe1d..000000000 --- a/.cursorrules +++ /dev/null @@ -1,91 +0,0 @@ -# Documentation Writing Rules for Optimism Tech Writer - -## Core Principles -- NEVER hallucinate technical details, specifications, or blockchain-specific information -- When uncertain about technical accuracy, create TODO comments for SMEs -- Prioritize accuracy over completeness -- Be transparent about knowledge gaps rather than making assumptions - -## Technical Content Guidelines - -### Blockchain & Optimism-Specific Content -- NEVER invent gas fees, transaction costs, or network parameters -- NEVER create fictional contract addresses, transaction hashes, or block numbers -- NEVER specify exact version numbers, release dates, or deprecation timelines without verification -- For OP Stack, L2 specifications, or protocol details: Use TODO for SME verification - -### Code Examples & Configuration -- Only use verified, tested code examples from existing documentation -- For new code examples, mark with: `` -- NEVER create placeholder contract addresses - use TODO instead -- For configuration values, mark uncertain parameters: `# TODO: SME confirm default value` - -### API & CLI Documentation -- NEVER invent API endpoints, parameters, or response structures -- For CLI commands, only document verified flags and options -- Mark uncertain syntax with: `` -- Use existing examples from official repositories when available - -## TODO Format Guidelines - -### Use these specific TODO formats: -``` - -``` - -``` - -``` - -``` - -``` - -### Examples of good TODOs: -- `` -- `` -- `` - -## What You CAN Write Confidently -- General explanations of blockchain concepts -- Documentation structure and formatting -- User experience flow descriptions -- Clear, accurate rewrites of existing content -- Cross-references to official sources - -## Red Flags - Stop and Add TODO Instead -- Specific version numbers without source -- Exact costs, fees, or limits -- Contract addresses or transaction hashes -- API endpoints not in existing docs -- Deprecation dates or upgrade timelines -- Performance benchmarks or statistics - -## Documentation Structure -- Always include clear headings and navigation -- Add prerequisites and assumptions sections -- Include troubleshooting sections with common issues -- Link to official repositories and sources -- Use consistent formatting and style throughout - -## Review Process -- Mark all TODOs with priority: [HIGH], [MEDIUM], [LOW] -- Group related TODOs to minimize SME review time -- Include context for why SME input is needed -- Reference specific sections of code/docs when available - -## Quality Checks -Before submitting documentation: -1. No placeholder values (0x123..., example.com, etc.) -2. All technical claims have sources or TODOs -3. Code examples are from verified sources -4. No assumed knowledge about internal processes -5. Clear separation between general concepts and Optimism-specific details - -## SME Collaboration -- Be specific about what type of expert is needed (protocol, infrastructure, API, etc.) -- Provide context about the user persona and use case -- Include links to related GitHub issues or PRs when relevant -- Suggest multiple options when uncertain between approaches - -Remember: It's better to have accurate documentation with TODOs than polished documentation with errors. \ No newline at end of file From 8234b02f0691a15471a08cf5b095db30e17bbbf7 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 11 Jun 2025 17:25:20 +0100 Subject: [PATCH 16/47] fix filename --- pages/operators/chain-operators/deploy.mdx | 2 +- .../deploy/{sequncer-node.mdx => sequencer-node.mdx} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename pages/operators/chain-operators/deploy/{sequncer-node.mdx => sequencer-node.mdx} (99%) diff --git a/pages/operators/chain-operators/deploy.mdx b/pages/operators/chain-operators/deploy.mdx index d0c4c6ac2..af909456f 100644 --- a/pages/operators/chain-operators/deploy.mdx +++ b/pages/operators/chain-operators/deploy.mdx @@ -32,7 +32,7 @@ This section provides information on OP Stack genesis creation, deployment overv - + diff --git a/pages/operators/chain-operators/deploy/sequncer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx similarity index 99% rename from pages/operators/chain-operators/deploy/sequncer-node.mdx rename to pages/operators/chain-operators/deploy/sequencer-node.mdx index 4d16ca948..ab1b4d353 100644 --- a/pages/operators/chain-operators/deploy/sequncer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -19,7 +19,7 @@ is_imported_content: 'false' ## Overview -This guide provides step-by-step instructions for spinning up a sequencer node after deploying your L1 smart contracts with [`op-deployer`](/operators/chain-operators/tools/op-deployer). +This guide provides step-by-step instructions for spinning up a sequencer node after deploying your L1 smart contracts for your OP Stack chain with [`op-deployer`](/operators/chain-operators/tools/op-deployer). A sequencer node consists of two core components: From c1b5491533483abe855ba9e224475f5ba35ac1ad Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 11 Jun 2025 17:25:41 +0100 Subject: [PATCH 17/47] 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 d795aebe1..248d6a4b5 100644 --- a/words.txt +++ b/words.txt @@ -366,7 +366,6 @@ sepolia seqnr SEQUENCERHTTP sequencerhttp -sequncer serv signup SLLV From c835e5275d987f869dc1886dacd4488189fa4503 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 12 Jun 2025 16:41:08 +0100 Subject: [PATCH 18/47] updated the content --- .../chain-operators/deploy/sequencer-node.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index ab1b4d353..b9f63ef43 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -61,14 +61,14 @@ Before spinning up your sequencer, ensure you have completed these steps: **3. Essential addresses and keys:** -* **Sequencer private key** - For signing blocks on the P2P network (does not send transactions to L1) +* **Sequencer private key** - For signing blocks on the P2P network * **Batcher private key** - For submitting transaction batches to L1 * **Proposer private key** - For submitting state roots to L1 **4. L1 network access:** * L1 RPC endpoint (Ethereum, Sepolia, etc.) -* L1 Beacon node endpoint (required for blob data retrieval) +* L1 Beacon node endpoint ### Software requirements @@ -99,12 +99,12 @@ Replace `[VERSION]` with the specific version tag from the releases page. ## Software installation -For sequencer deployment, we recommend **building from source** as it provides better control, debugging capabilities, and transparency for production infrastructure. +For spinning up a sequencer, we recommend **building from source** as it provides better control, and helps with debugging. A Docker alternative is also provided for development or containerized environments. ### Build from source (Recommended for production) -Building from source gives you full control over the binaries and is the preferred approach for production sequencer deployments. +Building from source gives you full control over the binaries and is the preferred approach for this guide. #### 1. Clone and build op-node @@ -495,7 +495,6 @@ source .env --log.level=info \ --log.format=json ``` - ## Initializing and starting the sequencer ### 1. Initialize op-geth with your genesis file @@ -577,3 +576,4 @@ For a complete, production-ready chain, you'll eventually need: These services can be added after your sequencer is running and creating blocks. ## Next steps(TODO: Update this after other pages have been merged) + From 15274530023cb5ead27e39d60ef2e0afc6186570 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 12 Jun 2025 17:45:27 +0100 Subject: [PATCH 19/47] updating the title --- pages/operators/chain-operators/deploy/_meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/deploy/_meta.json b/pages/operators/chain-operators/deploy/_meta.json index d52e0211e..c7497c1af 100644 --- a/pages/operators/chain-operators/deploy/_meta.json +++ b/pages/operators/chain-operators/deploy/_meta.json @@ -2,7 +2,7 @@ "overview": "Deployment overview", "smart-contracts": "Smart contract deployment", "validate-deployment": "Validate your contract deployment", - "sequencer-node": "spinning up the sequencer", + "sequencer-node": "Spinning up the sequencer", "genesis": "Chain artifacts creation" } From 782900806bb3cb38e038b27299ff8fa4ba72117f Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 13 Jun 2025 14:24:13 +0100 Subject: [PATCH 20/47] fix content --- pages/operators/chain-operators/deploy/sequencer-node.mdx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index b9f63ef43..f30b22b3f 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -457,10 +457,7 @@ source .env --authrpc.jwtsecret=$JWT_SECRET \ --syncmode=full \ --gcmode=archive \ - --rollup.disabletxpoolgossip=false \ - --rollup.sequencerhttp=http://localhost:$OP_GETH_HTTP_PORT \ - --miner.gaslimit=30000000 \ - --verbosity=3 + --rollup.disabletxpoolgossip=true \ ``` ### op-node configuration for sequencer From a6fe33ddea405eb7d03e8cdc88c182b4396e7f6d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 13 Jun 2025 17:04:12 +0100 Subject: [PATCH 21/47] updated the paths --- .../chain-operators/deploy/sequencer-node.mdx | 47 +------------------ 1 file changed, 2 insertions(+), 45 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index f30b22b3f..419472889 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -438,7 +438,7 @@ Create `scripts/start-op-geth.sh`: source .env # Path to the op-geth binary we built -../op-geth/build/bin/geth \ +./data/op-geth/bin/op-geth \ --datadir=$DATA_DIR/op-geth \ --http \ --http.addr=0.0.0.0 \ @@ -469,7 +469,7 @@ Create `scripts/start-op-node.sh`: source .env # Path to the op-node binary we built -../optimism/op-node/bin/op-node \ +./data/op-node/bin/op-node \ --l1=$L1_RPC_URL \ --l1.beacon=$L1_BEACON_URL \ --l2=http://localhost:$OP_GETH_AUTH_PORT \ @@ -528,49 +528,6 @@ curl -X POST http://localhost:8547 \ -d '{"method":"admin_startSequencer","params":[],"id":1,"jsonrpc":"2.0"}' ``` -## Verification and health checks - -### 1. Check node status - -```bash -# Check op-geth sync status -curl -X POST http://localhost:8545 \ - -H "Content-Type: application/json" \ - -d '{"method":"eth_syncing","params":[],"id":1,"jsonrpc":"2.0"}' - -# Check current block number -curl -X POST http://localhost:8545 \ - -H "Content-Type: application/json" \ - -d '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}' -``` - -### 2. Monitor P2P connectivity - -```bash -# Check peer count -curl -X POST http://localhost:8545 \ - -H "Content-Type: application/json" \ - -d '{"method":"net_peerCount","params":[],"id":1,"jsonrpc":"2.0"}' -``` - -### 3. Verify sequencer status - -```bash -# Check if sequencer is active -curl -X POST http://localhost:8547 \ - -H "Content-Type: application/json" \ - -d '{"method":"optimism_sequencerActive","params":[],"id":1,"jsonrpc":"2.0"}' -``` - -## When you'll need additional components - -This guide covers spinning up the core sequencer (op-node + op-geth). -For a complete, production-ready chain, you'll eventually need: - -* **op-batcher**: Submits transaction batches to L1 for data availability -* **op-proposer**: Submits state root proposals to L1 for dispute resolution - -These services can be added after your sequencer is running and creating blocks. ## Next steps(TODO: Update this after other pages have been merged) From bb015469c018c8eafcec64c1c6c8173d41787ed8 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 13 Jun 2025 17:09:23 +0100 Subject: [PATCH 22/47] updated the steps --- .../chain-operators/deploy/sequencer-node.mdx | 55 +++++++++++++++---- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 419472889..f689ee316 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -397,7 +397,6 @@ Now create your `.env` file with the actual values: ```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 @@ -422,7 +421,6 @@ OP_GETH_AUTH_PORT=8551 # Data directories DATA_DIR=./data JWT_SECRET=./jwt.txt -EOF ``` **Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values! @@ -435,22 +433,23 @@ Create `scripts/start-op-geth.sh`: ```bash #!/bin/bash + source .env # Path to the op-geth binary we built -./data/op-geth/bin/op-geth \ +../op-geth/build/bin/geth \ --datadir=$DATA_DIR/op-geth \ --http \ --http.addr=0.0.0.0 \ --http.port=$OP_GETH_HTTP_PORT \ --http.vhosts="*" \ --http.corsdomain="*" \ - --http.api=eth,net,web3,debug,txpool,miner \ + --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,miner \ + --ws.api=eth,net,web3,debug,txpool,admin \ --authrpc.addr=0.0.0.0 \ --authrpc.port=$OP_GETH_AUTH_PORT \ --authrpc.vhosts="*" \ @@ -458,6 +457,7 @@ source .env --syncmode=full \ --gcmode=archive \ --rollup.disabletxpoolgossip=true \ + --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT ``` ### op-node configuration for sequencer @@ -466,10 +466,11 @@ Create `scripts/start-op-node.sh`: ```bash #!/bin/bash + source .env # Path to the op-node binary we built -./data/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 \ @@ -492,6 +493,7 @@ source .env --log.level=info \ --log.format=json ``` + ## Initializing and starting the sequencer ### 1. Initialize op-geth with your genesis file @@ -507,19 +509,50 @@ cd ~/sequencer-node ### 2. 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. + ### 3. Start op-node ```bash -# In a separate terminal -chmod +x scripts/start-op-node.sh +# In a separate terminal, navigate to the sequencer directory +cd ~/sequencer-node + +# Start op-node ./scripts/start-op-node.sh ``` -### 4. Enable sequencing (if started in stopped state) +### 4. Verify sequencer is running + +Once both services are running, verify they're working correctly: + +```bash +# Check op-geth is responding +curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ + http://localhost:8545 + +# Check op-node is responding +curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"optimism_version","params":[],"id":1}' \ + http://localhost:8547 + +# Check sequencer status +curl -X POST -H "Content-Type: application/json" \ + --data '{"jsonrpc":"2.0","method":"admin_sequencerActive","params":[],"id":1}' \ + http://localhost:8547 +``` + +### 5. Enable sequencing (if started in stopped state) + +If you started with `SEQUENCER_STOPPED=true`, enable sequencing: ```bash # Use the admin RPC to start sequencing @@ -528,6 +561,6 @@ curl -X POST http://localhost:8547 \ -d '{"method":"admin_startSequencer","params":[],"id":1,"jsonrpc":"2.0"}' ``` +Your sequencer node is now operational and ready to process transactions. -## Next steps(TODO: Update this after other pages have been merged) - +## Next steps(TODO: Update this after other pages have been merged) \ No newline at end of file From 13ec3036ed652e8d5af34f0a8485aed42ee5fc30 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 13 Jun 2025 17:09:45 +0100 Subject: [PATCH 23/47] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- pages/operators/chain-operators/deploy/sequencer-node.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index f689ee316..c4418c405 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -68,7 +68,7 @@ Before spinning up your sequencer, ensure you have completed these steps: **4. L1 network access:** * L1 RPC endpoint (Ethereum, Sepolia, etc.) -* L1 Beacon node endpoint +* L1 Beacon node endpoint ### Software requirements @@ -563,4 +563,4 @@ curl -X POST http://localhost:8547 \ Your sequencer node is now operational and ready to process transactions. -## Next steps(TODO: Update this after other pages have been merged) \ No newline at end of file +## Next steps(TODO: Update this after other pages have been merged) From 63b709b43406fc8833f5d9a97e823fe19762293a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 16 Jun 2025 18:23:03 +0100 Subject: [PATCH 24/47] updated contents --- .../chain-operators/deploy/sequencer-node.mdx | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index c4418c405..0668f8ea6 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -17,6 +17,8 @@ categories: is_imported_content: 'false' --- +import { Callout } from 'nextra/components' + ## Overview This guide provides step-by-step instructions for spinning up a sequencer node after deploying your L1 smart contracts for your OP Stack chain with [`op-deployer`](/operators/chain-operators/tools/op-deployer). @@ -32,15 +34,9 @@ The sequencer is responsible for: * Building L2 blocks * Signing blocks on the P2P network -This guide assumes you have already: - -* Successfully deployed L1 contracts using `op-deployer apply` -* Generated your `genesis.json` and `rollup.json` configuration files -* Have access to the required private keys for sequencer, batcher, and proposer roles - ## Prerequisites -### Essential requirements after op-deployer deployment +### Essential requirements Before spinning up your sequencer, ensure you have completed these steps: @@ -118,7 +114,7 @@ git checkout op-node/v1.13.2 # Build op-node cd op-node -make op-node +just # Binary will be available at ./bin/op-node ``` @@ -256,10 +252,10 @@ Regardless of your chosen method, verify your installation: docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 --version docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.4 version ``` - -**Note:** The rest of this guide assumes you're using the **build-from-source** approach. + + The rest of this guide assumes you're using the **build-from-source** approach. If you chose Docker, refer to the command equivalents above or the Docker setup guide in the collapsible section. - + ## Configuration setup ### 1. Organize your workspace @@ -503,7 +499,7 @@ source .env cd ~/sequencer-node # Initialize op-geth with your genesis file -../op-geth/build/bin/geth init --datadir=./data/op-geth --state.scheme=hash ./genesis.json +./data/op-geth/build/bin/geth init --datadir=./data/op-geth --state.scheme=hash ./genesis.json ``` ### 2. Start op-geth From 3a8034e991045a48db5731d74d3143b5d9935be7 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 17 Jun 2025 14:20:00 +0100 Subject: [PATCH 25/47] updated contents --- .../chain-operators/deploy/sequencer-node.mdx | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 0668f8ea6..58dfee72b 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -98,7 +98,7 @@ Replace `[VERSION]` with the specific version tag from the releases page. For spinning up a sequencer, we recommend **building from source** as it provides better control, and helps with debugging. A Docker alternative is also provided for development or containerized environments. -### Build from source (Recommended for production) +### Build from source (Recommended) Building from source gives you full control over the binaries and is the preferred approach for this guide. @@ -110,7 +110,7 @@ git clone https://github.com/ethereum-optimism/optimism.git cd optimism # Checkout the latest release tag -git checkout op-node/v1.13.2 +git checkout op-node/v1.13.3 # Build op-node cd op-node @@ -126,8 +126,8 @@ just git clone https://github.com/ethereum-optimism/op-geth.git cd op-geth -# Checkout the latest release tag -git checkout v1.101503.4 +# Checkout to this release tag +git checkout v1.101511.0 # Build op-geth make geth @@ -144,10 +144,10 @@ Note that all subsequent configuration examples will need to be adapted for Dock ```bash # Pull latest op-node image -docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 +docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 # Pull latest op-geth image -docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.4 +docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 ``` #### Docker command equivalents @@ -157,21 +157,21 @@ When following the rest of this guide with Docker, replace the binary commands a **Instead of local binary:** ```bash -./build/bin/geth [arguments] +./build/bin/geth [other other arguments] ``` **Use Docker:** ```bash docker run --rm -v $(pwd):/workspace \ - us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.4 \ - [arguments] + us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 \ + [other arguments] ``` **Instead of local binary:** ```bash -./bin/op-node [arguments] +./bin/op-node [other arguments] ``` **Use Docker:** @@ -179,8 +179,8 @@ docker run --rm -v $(pwd):/workspace \ ```bash docker run --rm -v $(pwd):/workspace \ --network host \ - us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 \ - [arguments] + us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 \ + [other arguments] ```
@@ -195,7 +195,7 @@ docker run --rm -v $(pwd):/workspace \ services: op-geth: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.4 + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 volumes: - ./data/op-geth:/data - ./genesis.json:/genesis.json @@ -210,10 +210,10 @@ docker run --rm -v $(pwd):/workspace \ --ws --ws.addr=0.0.0.0 --ws.port=8546 --authrpc.addr=0.0.0.0 --authrpc.port=8551 --authrpc.jwtsecret=/jwt.txt - # ... other geth flags + # ... other geth flags, see the build-with-source section for all of them op-node: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 depends_on: - op-geth volumes: @@ -227,12 +227,11 @@ docker run --rm -v $(pwd):/workspace \ --l2=http://op-geth:8551 --rollup.config=/rollup.json --sequencer.enabled=true - # ... other op-node flags + # ... other op-node flags, see the build-with-source section for all of them ``` 2. **Adapt all subsequent commands** to use `docker-compose` or individual `docker run` commands - 3. **Handle networking** - containers need to communicate with each other and external services
### Verify installation @@ -249,8 +248,8 @@ Regardless of your chosen method, verify your installation: **For Docker:** ```bash -docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.2 --version -docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101503.4 version +docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 --version +docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 version ``` The rest of this guide assumes you're using the **build-from-source** approach. @@ -324,7 +323,7 @@ cp ~/.deployer/rollup.json . Your final directory structure should look like: -``` +```bash ~/sequencer-node/ ├── jwt.txt ├── genesis.json @@ -357,6 +356,7 @@ You need access to the L1 network (Ethereum mainnet or Sepolia testnet) and its #### 4.2. Extract sequencer private key from op-deployer +For this basic sequencer setup, you only need the sequencer private key. The sequencer private key is used for signing blocks on the P2P network. Find it in your op-deployer intent file: ```bash @@ -368,8 +368,6 @@ cat ~/.deployer/intent.toml # privateKey = "0x..." ``` -**Note**: For this basic sequencer setup, you only need the sequencer private key. - #### 4.3. Get your public IP address ```bash @@ -401,7 +399,7 @@ L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com SEQUENCER_ENABLED=true SEQUENCER_STOPPED=false -# Private keys - Only sequencer key needed for this setup +# Private keys - Only sequencer key needed for this SEQUENCER_PRIVATE_KEY=0xYOUR_ACTUAL_SEQUENCER_PRIVATE_KEY # P2P configuration - Replace with your actual public IP @@ -419,7 +417,7 @@ DATA_DIR=./data 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 From e4b879c853df868715287db76894556ce25b0af5 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 17 Jun 2025 15:18:00 +0100 Subject: [PATCH 26/47] updated paths --- .../chain-operators/deploy/sequencer-node.mdx | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 58dfee72b..b5b70f088 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -84,6 +84,12 @@ 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 (found at [https://github.com/ethereum-optimism/op-geth/releases](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. + + ### Docker images Pre-built Docker images are available for all releases at: @@ -312,9 +318,11 @@ chmod 600 jwt.txt ### 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. + ```bash -# Create data directories -mkdir -p data/op-geth data/op-node scripts +# Create scripts directory +mkdir scripts # Copy configuration files from op-deployer cp ~/.deployer/genesis.json . @@ -328,9 +336,6 @@ Your final directory structure should look like: ├── jwt.txt ├── genesis.json ├── rollup.json -├── data/ -│ ├── op-geth/ -│ └── op-node/ └── scripts/ ├── start-op-geth.sh # (to be created) └── start-op-node.sh # (to be created) @@ -412,8 +417,7 @@ OP_GETH_HTTP_PORT=8545 OP_GETH_WS_PORT=8546 OP_GETH_AUTH_PORT=8551 -# Data directories -DATA_DIR=./data +# JWT secret location JWT_SECRET=./jwt.txt ``` @@ -432,7 +436,7 @@ source .env # Path to the op-geth binary we built ../op-geth/build/bin/geth \ - --datadir=$DATA_DIR/op-geth \ + --datadir=./op-geth-data \ --http \ --http.addr=0.0.0.0 \ --http.port=$OP_GETH_HTTP_PORT \ @@ -497,7 +501,7 @@ source .env cd ~/sequencer-node # Initialize op-geth with your genesis file -./data/op-geth/build/bin/geth init --datadir=./data/op-geth --state.scheme=hash ./genesis.json +../op-geth/build/bin/geth init --datadir=./op-geth-data --state.scheme=hash ./genesis.json ``` ### 2. Start op-geth From 860a42c8f257f4a230f5d420fac23d56cc17961a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 17 Jun 2025 15:49:56 +0100 Subject: [PATCH 27/47] completely updated the docs --- .../chain-operators/deploy/sequencer-node.mdx | 135 ++++++++++++------ 1 file changed, 89 insertions(+), 46 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index b5b70f088..4df104290 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -189,6 +189,24 @@ docker run --rm -v $(pwd):/workspace \ [other arguments] ``` +### Verify installation + +Regardless of your chosen method, verify your installation: + +**For build-from-source:** + +```bash +./bin/op-node --version +./build/bin/geth version +``` + +**For Docker:** + +```bash +docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 --version +docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 version +``` +
Complete Docker setup guide @@ -203,7 +221,7 @@ docker run --rm -v $(pwd):/workspace \ op-geth: image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 volumes: - - ./data/op-geth:/data + - ./op-geth-data:/op-geth-data - ./genesis.json:/genesis.json - ./jwt.txt:/jwt.txt ports: @@ -211,12 +229,21 @@ docker run --rm -v $(pwd):/workspace \ - "8546:8546" - "8551:8551" command: | - --datadir=/data + --datadir=/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=/jwt.txt - # ... other geth flags, see the build-with-source section for all of them + --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 @@ -225,38 +252,76 @@ docker run --rm -v $(pwd):/workspace \ volumes: - ./rollup.json:/rollup.json - ./jwt.txt:/jwt.txt + - ./.env:/.env 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: | --l1=${L1_RPC_URL} + --l1.beacon=${L1_BEACON_URL} --l2=http://op-geth:8551 + --l2.jwt-secret=/jwt.txt --rollup.config=/rollup.json --sequencer.enabled=true - # ... other op-node flags, see the build-with-source section for all of them + --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 ``` - 2. **Adapt all subsequent commands** to use `docker-compose` or individual `docker run` commands + 2. **Initialize op-geth with Docker before starting services:** -
+ ```bash + # Initialize op-geth using Docker + docker run --rm \ + -v $(pwd)/op-geth-data:/op-geth-data \ + -v $(pwd)/genesis.json:/genesis.json \ + us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 \ + init --datadir=/op-geth-data --state.scheme=hash /genesis.json + ``` -### Verify installation + 3. **Start the services:** -Regardless of your chosen method, verify your installation: + ```bash + # Start both services + docker-compose up -d -**For build-from-source:** + # View logs + docker-compose logs -f + ``` -```bash -./bin/op-node --version -./build/bin/geth version -``` + 4. **Directory structure for Docker approach:** -**For Docker:** + ```bash + ~/sequencer-node/ + ├── jwt.txt + ├── genesis.json + ├── rollup.json + ├── .env # Environment variables + ├── docker-compose.yml # Docker configuration + └── op-geth-data/ # Created by Docker during initialization + ├── geth/ # Geth data + └── keystore/ # Key files + ``` + + -```bash -docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 --version -docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 version -``` The rest of this guide assumes you're using the **build-from-source** approach. If you chose Docker, refer to the command equivalents above or the Docker setup guide in the collapsible section. @@ -359,19 +424,9 @@ You need access to the L1 network (Ethereum mainnet or Sepolia testnet) and its * **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) -#### 4.2. Extract sequencer private key from op-deployer - -For this basic sequencer setup, you only need the sequencer private key. -The sequencer private key is used for signing blocks on the P2P network. Find it in your op-deployer intent file: +#### 4.2. Get private key from your wallet -```bash -# View your intent file to find the sequencer private key -cat ~/.deployer/intent.toml - -# Look for a section like: -# [chains.my-chain.roles.sequencer] -# privateKey = "0x..." -``` +For this basic sequencer setup, you only need a private key during op-node initialization. #### 4.3. Get your public IP address @@ -404,8 +459,8 @@ L1_BEACON_URL=https://ethereum-sepolia-beacon-api.publicnode.com SEQUENCER_ENABLED=true SEQUENCER_STOPPED=false -# Private keys - Only sequencer key needed for this -SEQUENCER_PRIVATE_KEY=0xYOUR_ACTUAL_SEQUENCER_PRIVATE_KEY +# Private keys +PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY # P2P configuration - Replace with your actual public IP P2P_LISTEN_PORT=9222 @@ -431,7 +486,6 @@ Create `scripts/start-op-geth.sh`: ```bash #!/bin/bash - source .env # Path to the op-geth binary we built @@ -484,7 +538,7 @@ source .env --p2p.advertise.ip=$P2P_ADVERTISE_IP \ --p2p.advertise.tcp=$P2P_LISTEN_PORT \ --p2p.advertise.udp=$P2P_LISTEN_PORT \ - --p2p.sequencer.key=$SEQUENCER_PRIVATE_KEY \ + --p2p.sequencer.key=$PRIVATE_KEY \ --rpc.addr=0.0.0.0 \ --rpc.port=$OP_NODE_RPC_PORT \ --rpc.enable-admin \ @@ -532,7 +586,7 @@ cd ~/sequencer-node Once both services are running, verify they're working correctly: ```bash -# Check op-geth is responding +# Check op-geth is responding in another terminal curl -X POST -H "Content-Type: application/json" \ --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \ http://localhost:8545 @@ -548,17 +602,6 @@ curl -X POST -H "Content-Type: application/json" \ http://localhost:8547 ``` -### 5. Enable sequencing (if started in stopped state) - -If you started with `SEQUENCER_STOPPED=true`, enable sequencing: - -```bash -# Use the admin RPC to start sequencing -curl -X POST http://localhost:8547 \ - -H "Content-Type: application/json" \ - -d '{"method":"admin_startSequencer","params":[],"id":1,"jsonrpc":"2.0"}' -``` - Your sequencer node is now operational and ready to process transactions. ## Next steps(TODO: Update this after other pages have been merged) From fb2c73446a3b4771ea739e1ea1f51de1df5053e3 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 17 Jun 2025 16:07:59 +0100 Subject: [PATCH 28/47] update the docs --- .../chain-operators/deploy/sequencer-node.mdx | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 4df104290..45faeaa5f 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 } from 'nextra/components' +import { Callout, Steps } from 'nextra/components' ## Overview @@ -409,8 +409,8 @@ Your final directory structure should look like: ### 4. Environment variables You'll need to gather several pieces of information before creating your configuration. Here's where to get each value: - -#### 4.1. Get L1 network access + +### Get L1 network access You need access to the L1 network (Ethereum mainnet or Sepolia testnet) and its beacon node: @@ -424,20 +424,20 @@ You need access to the L1 network (Ethereum mainnet or Sepolia testnet) and its * **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) -#### 4.2. 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. -#### 4.3. Get your public IP address +### Get your public IP address ```bash -# Find your public IP address +# 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 ``` -#### 4.4. Choose your ports +### Choose your ports The default ports are standard but can be changed if needed: @@ -447,6 +447,8 @@ The default ports are standard but can be changed if needed: * `8547`: op-node RPC * `9222`: P2P networking (must be open on firewall) + + Now create your `.env` file with the actual values: ```bash @@ -548,7 +550,9 @@ source .env ## Initializing and starting the sequencer -### 1. Initialize op-geth with your genesis file + + +### Initialize op-geth with your genesis file ```bash # Make sure you're in the sequencer-node directory @@ -558,7 +562,7 @@ cd ~/sequencer-node ../op-geth/build/bin/geth init --datadir=./op-geth-data --state.scheme=hash ./genesis.json ``` -### 2. Start op-geth +### Start op-geth ```bash # Make scripts executable @@ -571,7 +575,7 @@ chmod +x scripts/start-op-node.sh **Note**: You should see output indicating that op-geth is starting and listening on the configured ports. -### 3. Start op-node +### Start op-node ```bash # In a separate terminal, navigate to the sequencer directory @@ -581,27 +585,24 @@ cd ~/sequencer-node ./scripts/start-op-node.sh ``` -### 4. Verify sequencer is running +### Verify sequencer is running Once both services are running, verify they're working correctly: ```bash -# Check op-geth is responding in another terminal +# 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 op-node is responding -curl -X POST -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"optimism_version","params":[],"id":1}' \ - http://localhost:8547 - # 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. ## Next steps(TODO: Update this after other pages have been merged) From a85a3a656b0a8366efb6fce10b71b0af246f8300 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 17 Jun 2025 17:40:11 +0100 Subject: [PATCH 29/47] updated the meta hierachy --- pages/operators/chain-operators/deploy/_meta.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/deploy/_meta.json b/pages/operators/chain-operators/deploy/_meta.json index c7497c1af..28ffeecdd 100644 --- a/pages/operators/chain-operators/deploy/_meta.json +++ b/pages/operators/chain-operators/deploy/_meta.json @@ -2,7 +2,7 @@ "overview": "Deployment overview", "smart-contracts": "Smart contract deployment", "validate-deployment": "Validate your contract deployment", - "sequencer-node": "Spinning up the sequencer", - "genesis": "Chain artifacts creation" + "genesis": "Chain artifacts creation", + "sequencer-node": "Spinning up the sequencer" } From 0b1e08c5f16a8ce03300a910a301f081aad334f6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 17 Jun 2025 17:40:49 +0100 Subject: [PATCH 30/47] updated breadcrumbs --- pages/operators/chain-operators/deploy.mdx | 3 ++- pages/operators/chain-operators/deploy/_meta.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/deploy.mdx b/pages/operators/chain-operators/deploy.mdx index af909456f..0f8eb1de4 100644 --- a/pages/operators/chain-operators/deploy.mdx +++ b/pages/operators/chain-operators/deploy.mdx @@ -24,12 +24,13 @@ import { Card, Cards } from 'nextra/components' This section provides information on OP Stack genesis creation, deployment overview, and smart contract deployment. You'll find guides and overviews to help you understand and work with these topics. - + + diff --git a/pages/operators/chain-operators/deploy/_meta.json b/pages/operators/chain-operators/deploy/_meta.json index 28ffeecdd..ec4a2cbbf 100644 --- a/pages/operators/chain-operators/deploy/_meta.json +++ b/pages/operators/chain-operators/deploy/_meta.json @@ -1,8 +1,8 @@ { "overview": "Deployment overview", "smart-contracts": "Smart contract deployment", - "validate-deployment": "Validate your contract deployment", "genesis": "Chain artifacts creation", + "validate-deployment": "Validate your contract deployment", "sequencer-node": "Spinning up the sequencer" } From 13a8d8261636864fafc8f9ec79e8aaf736711748 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 17 Jun 2025 17:45:49 +0100 Subject: [PATCH 31/47] updated the headers --- pages/operators/chain-operators/deploy/sequencer-node.mdx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 45faeaa5f..b19a9d6e7 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -145,14 +145,15 @@ make geth If you prefer containerized deployment, you can use the official Docker images. Note that all subsequent configuration examples will need to be adapted for Docker usage. +Jump to the [complete docker setup](/operators/chain-operators/deploy/sequencer-node#complete-docker-setup-guide) #### Pull the required images ```bash -# Pull latest op-node image +# Pull this op-node image docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 -# Pull latest op-geth image +# Pull this op-geth image docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 ``` @@ -206,6 +207,7 @@ Regardless of your chosen method, verify your installation: docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 --version docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 version ``` +### Complete Docker setup guide
Complete Docker setup guide From dce9a342934186dce07f305f43751ee6f02df7fe Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 17 Jun 2025 18:39:07 +0100 Subject: [PATCH 32/47] update the version --- pages/operators/chain-operators/deploy/sequencer-node.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index b19a9d6e7..2cf4a22fa 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -172,7 +172,6 @@ When following the rest of this guide with Docker, replace the binary commands a ```bash docker run --rm -v $(pwd):/workspace \ us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 \ - [other arguments] ``` **Instead of local binary:** @@ -187,7 +186,6 @@ docker run --rm -v $(pwd):/workspace \ docker run --rm -v $(pwd):/workspace \ --network host \ us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 \ - [other arguments] ``` ### Verify installation @@ -204,7 +202,7 @@ Regardless of your chosen method, verify your installation: **For Docker:** ```bash -docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 --version +docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 op-node --version docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 version ``` ### Complete Docker setup guide From 28408e8353cb5ab57ea4cf1c9d5f78374eb28058 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 17 Jun 2025 18:45:10 +0100 Subject: [PATCH 33/47] updated the content --- .../chain-operators/deploy/sequencer-node.mdx | 57 ++++++++++++++++++- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 2cf4a22fa..f3b10246a 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -170,8 +170,35 @@ When following the rest of this guide with Docker, replace the binary commands a **Use Docker:** ```bash -docker run --rm -v $(pwd):/workspace \ + +source .env + +docker run --rm \ + -v $(pwd):/workspace \ + -v $(pwd)/op-geth-data:/workspace/op-geth-data \ + --network host \ us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 \ + geth \ + --datadir=/workspace/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=/workspace/$JWT_SECRET \ + --syncmode=full \ + --gcmode=archive \ + --rollup.disabletxpoolgossip=true \ + --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT ``` **Instead of local binary:** @@ -183,9 +210,35 @@ docker run --rm -v $(pwd):/workspace \ **Use Docker:** ```bash -docker run --rm -v $(pwd):/workspace \ +source .env + +docker run --rm \ + -v $(pwd):/workspace \ + -v $(pwd)/.env:/workspace/.env \ --network host \ us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 \ + op-node \ + --l1=$L1_RPC_URL \ + --l1.beacon=$L1_BEACON_URL \ + --l2=http://localhost:$OP_GETH_AUTH_PORT \ + --l2.jwt-secret=/workspace/$JWT_SECRET \ + --rollup.config=/workspace/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 ``` ### Verify installation From 6a7b46a9857eb79b33376be57faa2a7bc8619455 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 17 Jun 2025 18:48:41 +0100 Subject: [PATCH 34/47] updated the contents --- .../chain-operators/deploy/sequencer-node.mdx | 107 ++---------------- 1 file changed, 7 insertions(+), 100 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index f3b10246a..71ac13f11 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -145,101 +145,7 @@ make geth If you prefer containerized deployment, you can use the official Docker images. Note that all subsequent configuration examples will need to be adapted for Docker usage. -Jump to the [complete docker setup](/operators/chain-operators/deploy/sequencer-node#complete-docker-setup-guide) -#### Pull the required images - -```bash -# Pull this op-node image -docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 - -# Pull this op-geth image -docker pull us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 -``` - -#### Docker command equivalents - -When following the rest of this guide with Docker, replace the binary commands as follows: - -**Instead of local binary:** - -```bash -./build/bin/geth [other other arguments] -``` - -**Use Docker:** - -```bash - -source .env - -docker run --rm \ - -v $(pwd):/workspace \ - -v $(pwd)/op-geth-data:/workspace/op-geth-data \ - --network host \ - us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 \ - geth \ - --datadir=/workspace/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=/workspace/$JWT_SECRET \ - --syncmode=full \ - --gcmode=archive \ - --rollup.disabletxpoolgossip=true \ - --rollup.sequencerhttp=http://localhost:$OP_NODE_RPC_PORT -``` - -**Instead of local binary:** - -```bash -./bin/op-node [other arguments] -``` - -**Use Docker:** - -```bash -source .env - -docker run --rm \ - -v $(pwd):/workspace \ - -v $(pwd)/.env:/workspace/.env \ - --network host \ - us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 \ - op-node \ - --l1=$L1_RPC_URL \ - --l1.beacon=$L1_BEACON_URL \ - --l2=http://localhost:$OP_GETH_AUTH_PORT \ - --l2.jwt-secret=/workspace/$JWT_SECRET \ - --rollup.config=/workspace/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 -``` ### Verify installation @@ -252,12 +158,6 @@ Regardless of your chosen method, verify your installation: ./build/bin/geth version ``` -**For Docker:** - -```bash -docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 op-node --version -docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 version -``` ### Complete Docker setup guide
@@ -375,6 +275,13 @@ docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.10151
+**For Docker:** + +```bash +docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 op-node --version +docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 version +``` + The rest of this guide assumes you're using the **build-from-source** approach. If you chose Docker, refer to the command equivalents above or the Docker setup guide in the collapsible section. From cc1e5f80b4605590544b2ad6a048c64cc2b2e553 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 18 Jun 2025 16:58:52 +0100 Subject: [PATCH 35/47] updated the docs --- .../chain-operators/deploy/sequencer-node.mdx | 262 ++++++++++-------- 1 file changed, 141 insertions(+), 121 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 71ac13f11..6a5d87fb9 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -42,7 +42,7 @@ Before spinning up your sequencer, ensure you have completed these steps: **1. Successful L1 contract deployment:** -* Deployed L1 contracts using [`op-deployer apply`](/operators/chain-operators/tools/op-deployer#apply-deploy-your-chain) +* Deployed L1 contracts using [`op-deployer apply`](/operators/chain-operators/tools/op-deployer#apply-deploy-your-chain) commad. * Generated genesis and rollup configuration files using: ```bash op-deployer inspect genesis --workdir .deployer > .deployer/genesis.json @@ -55,13 +55,7 @@ Before spinning up your sequencer, ensure you have completed these steps: * `rollup.json` - Rollup configuration file for op-node * Access to your deployment `state.json` file from op-deployer -**3. Essential addresses and keys:** - -* **Sequencer private key** - For signing blocks on the P2P network -* **Batcher private key** - For submitting transaction batches to L1 -* **Proposer private key** - For submitting state roots to L1 - -**4. L1 network access:** +**3. L1 network access:** * L1 RPC endpoint (Ethereum, Sepolia, etc.) * L1 Beacon node endpoint @@ -82,27 +76,19 @@ To ensure you're using the latest compatible versions of OP Stack components, al 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 (found at [https://github.com/ethereum-optimism/op-geth/releases](https://github.com/ethereum-optimism/op-geth/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.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. +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. -### Docker images - -Pre-built Docker images are available for all releases at: - -* `us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:[VERSION]` -* `us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:[VERSION]` - -Replace `[VERSION]` with the specific version tag from the releases page. - ## Software installation For spinning up a sequencer, we recommend **building from source** as it provides better control, and helps with debugging. -A Docker alternative is also provided for development or containerized environments. +In this guide, a Docker alternative is also provided. ### Build from source (Recommended) @@ -141,23 +127,20 @@ make geth # Binary will be available at ./build/bin/geth ``` -### Docker alternative (For containerized environments) - -If you prefer containerized deployment, you can use the official Docker images. -Note that all subsequent configuration examples will need to be adapted for Docker usage. - - ### Verify installation -Regardless of your chosen method, verify your installation: - -**For build-from-source:** +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 ``` +### Docker alternative (For containerized environments) + +If you prefer containerized deployment, you can use the official Docker images. + ### Complete Docker setup guide
@@ -165,91 +148,135 @@ Regardless of your chosen method, verify your installation: If you choose the Docker approach, you'll need to: - 1. **Create a docker-compose.yml** for easier management: + 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 + + # 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: - - ./op-geth-data:/op-geth-data - - ./genesis.json:/genesis.json - - ./jwt.txt:/jwt.txt - ports: - - "8545:8545" - - "8546:8546" - - "8551:8551" - command: | - --datadir=/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=/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: - - ./rollup.json:/rollup.json - - ./jwt.txt:/jwt.txt - - ./.env:/.env - 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: | - --l1=${L1_RPC_URL} - --l1.beacon=${L1_BEACON_URL} - --l2=http://op-geth:8551 - --l2.jwt-secret=/jwt.txt - --rollup.config=/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 +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" ``` - 2. **Initialize op-geth with Docker before starting services:** + 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)/op-geth-data:/op-geth-data \ - -v $(pwd)/genesis.json:/genesis.json \ + -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 + init --datadir=./op-geth-data --state.scheme=hash ./genesis.json ``` - 3. **Start the services:** + 5. **Start the services:** ```bash # Start both services @@ -259,31 +286,24 @@ Regardless of your chosen method, verify your installation: docker-compose logs -f ``` - 4. **Directory structure for Docker approach:** + 6. **Final directory structure:** ```bash ~/sequencer-node/ - ├── jwt.txt - ├── genesis.json - ├── rollup.json - ├── .env # Environment variables - ├── docker-compose.yml # Docker configuration - └── op-geth-data/ # Created by Docker during initialization - ├── geth/ # Geth data - └── keystore/ # Key files + ├── 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 ```
-**For Docker:** - -```bash -docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.13.3 op-node --version -docker run --rm us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101511.0 version -``` - - The rest of this guide assumes you're using the **build-from-source** approach. +The rest of this guide assumes you're using the **build-from-source** approach. If you chose Docker, refer to the command equivalents above or the Docker setup guide in the collapsible section. ## Configuration setup From 7a172f0b9a86ba2465cd5a90260d3e51f514c883 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 18 Jun 2025 16:59:16 +0100 Subject: [PATCH 36/47] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index 248d6a4b5..66a743117 100644 --- a/words.txt +++ b/words.txt @@ -74,6 +74,7 @@ Clabby codebases Collateralized collateralized +commad compr Comprensive COMPUTEPENDINGBLOCK From 4b454070a0f33d37115ac89ca370d21468c608a4 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 18 Jun 2025 17:02:42 +0100 Subject: [PATCH 37/47] update the intructions --- pages/operators/chain-operators/deploy/sequencer-node.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 6a5d87fb9..59a768892 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -177,8 +177,12 @@ If you prefer containerized deployment, you can use the official Docker images. # Private keys - Replace with your actual private key PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY + # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env + curl ifconfig.me + # P2P configuration - Replace with your actual public IP P2P_ADVERTISE_IP=YOUR_ACTUAL_PUBLIC_IP + EOF ``` From 62c580fdff0b71b650a34034b86922f2b5ae1bfa Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 18 Jun 2025 19:48:37 +0100 Subject: [PATCH 38/47] update content --- pages/operators/chain-operators/deploy/sequencer-node.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 59a768892..c81473800 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -308,7 +308,7 @@ services: The rest of this guide assumes you're using the **build-from-source** approach. -If you chose Docker, refer to the command equivalents above or the Docker setup guide in the collapsible section. +If you chose Docker, refer to the collapsible section. ## Configuration setup From bd44be438be918757652ce2090672c6cf36d2422 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 24 Jun 2025 15:49:29 +0100 Subject: [PATCH 39/47] updated the structure of the docs --- .../chain-operators/deploy/sequencer-node.mdx | 346 +++++++++--------- 1 file changed, 171 insertions(+), 175 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index c81473800..fe1960930 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -137,179 +137,6 @@ Check that you have properly installed the needed components. ./build/bin/geth version ``` -### 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 - - # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env - curl ifconfig.me - - # 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 - ``` - -
- - -The rest of this guide assumes you're using the **build-from-source** approach. -If you chose Docker, refer to the collapsible section. - ## Configuration setup ### 1. Organize your workspace @@ -400,8 +227,8 @@ You need access to the L1 network (Ethereum mainnet or Sepolia testnet) and its **L1 RPC URL options:** -* **Infura**: Sign up at [infura.io](https://infura.io), create a project, get your API key -* **Alchemy**: Sign up at [alchemy.com](https://alchemy.com), create an app, get your API key +* **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:** @@ -589,4 +416,173 @@ curl -X POST -H "Content-Type: application/json" \ 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 + + # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env + curl ifconfig.me + + # 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 + ``` + +
+ ## Next steps(TODO: Update this after other pages have been merged) From c2d0f9c0e01b81708ca05fcf29038f0ba0241a53 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Jun 2025 17:16:48 +0100 Subject: [PATCH 40/47] Fix typos in sequencer node deployment guide --- pages/operators/chain-operators/deploy/sequencer-node.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index fe1960930..14f488045 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -21,7 +21,7 @@ import { Callout, Steps } from 'nextra/components' ## Overview -This guide provides step-by-step instructions for spinning up a sequencer node after deploying your L1 smart contracts for your OP Stack chain with [`op-deployer`](/operators/chain-operators/tools/op-deployer). +This guide provides step-by-step instructions for spinning up a sequencer node after deploying L1 smart contracts for your OP Stack chain with [`op-deployer`](/operators/chain-operators/tools/op-deployer). A sequencer node consists of two core components: @@ -42,7 +42,7 @@ Before spinning up your sequencer, ensure you have completed these steps: **1. Successful L1 contract deployment:** -* Deployed L1 contracts using [`op-deployer apply`](/operators/chain-operators/tools/op-deployer#apply-deploy-your-chain) commad. +* Deployed L1 contracts using [`op-deployer apply`](/operators/chain-operators/tools/op-deployer#apply-deploy-your-chain) command. * Generated genesis and rollup configuration files using: ```bash op-deployer inspect genesis --workdir .deployer > .deployer/genesis.json From ddcfa065a1e77eb451726c23e93156b05fa8e599 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Jun 2025 17:17:09 +0100 Subject: [PATCH 41/47] 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 66a743117..248d6a4b5 100644 --- a/words.txt +++ b/words.txt @@ -74,7 +74,6 @@ Clabby codebases Collateralized collateralized -commad compr Comprensive COMPUTEPENDINGBLOCK From 0f49cf46cb7ec9874e3bdce77f6962ed7581c309 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Jun 2025 17:25:50 +0100 Subject: [PATCH 42/47] Auto-fix: Update breadcrumbs, spelling dictionary and other automated fixes --- .../deploy/proposer-setup-guide.mdx | 263 ++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 pages/operators/chain-operators/deploy/proposer-setup-guide.mdx diff --git a/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx b/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx new file mode 100644 index 000000000..6ec99f71d --- /dev/null +++ b/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx @@ -0,0 +1,263 @@ +--- +title: Spinning up the 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 } from 'nextra/components' + +# Spinning up the proposer + +After you have (spun up your sequencer)\[link-to-sequencer-guide], 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. + +This guide assumes you already have a functioning sequencer and the necessary L1 contracts deployed using [`op-deployer`](/operators/chain-operators/tools/op-deployer). If you haven't set up your sequencer yet, please refer to the \[sequencer guide]\(Todo - Add this link when it's live) first. + +## 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 + +### Build from source + +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 +``` + + + 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]\(Will link to this, when its live). + Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility. + + +### Verify installation + +Run this command to verify the installation. + +```bash +./bin/op-proposer --version +``` + +## Configuration setup + +### 1. Organize your workspace + +at the same level as your sequencer from the \[sequencer tutorial]\(link-to-the sequencer tutorial): + +```bash +# Create proposer directory at the same level as your sequencer +mkdir proposer-node +cd proposer-node + +# Create scripts directory +mkdir scripts +``` + +### 2. 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. + + +### 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 +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 +``` + +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 +``` + +**Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values! + +### 4. Get your private key + +Get a private key from your wallet. + +## 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 +``` + +## Starting the proposer + +### 1. 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 +``` + +### 2. Start the proposer + +```bash +# Make the script executable +chmod +x scripts/start-proposer.sh + +# Start the proposer +./scripts/start-proposer.sh +``` + +## Verification + +Verify your proposer is working correctly: + +### Check proposer status + +```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 +``` + +Your proposer is now operational! + +## Next steps + +* For detailed parameter documentation, see the [proposer configuration reference](/operators/chain-operators/configuration/proposer). +* For more detail on deploying new dispute games with OPCM, [see the docs](/operators/chain-operators/tutorials/dispute-games). +* checkout the [migrating to permissionless fault proofs](/operators/chain-operators/tutorials/migrating-permissionless) guide +* For cost optimization resources, check out the [Fee calculation tools](/operators/chain-operators/tools/fee-calculator). +* TODO: Add sequencer node when it's live From 617b3d7d2a2dc48f5ee7ec9aa324b9c916046e62 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Jun 2025 17:27:31 +0100 Subject: [PATCH 43/47] remove files needed --- .../deploy/proposer-setup-guide.mdx | 263 ------------------ 1 file changed, 263 deletions(-) delete mode 100644 pages/operators/chain-operators/deploy/proposer-setup-guide.mdx diff --git a/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx b/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx deleted file mode 100644 index 6ec99f71d..000000000 --- a/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx +++ /dev/null @@ -1,263 +0,0 @@ ---- -title: Spinning up the 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 } from 'nextra/components' - -# Spinning up the proposer - -After you have (spun up your sequencer)\[link-to-sequencer-guide], 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. - -This guide assumes you already have a functioning sequencer and the necessary L1 contracts deployed using [`op-deployer`](/operators/chain-operators/tools/op-deployer). If you haven't set up your sequencer yet, please refer to the \[sequencer guide]\(Todo - Add this link when it's live) first. - -## 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 - -### Build from source - -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 -``` - - - 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]\(Will link to this, when its live). - Always check the [release notes](https://github.com/ethereum-optimism/optimism/releases) for compatibility. - - -### Verify installation - -Run this command to verify the installation. - -```bash -./bin/op-proposer --version -``` - -## Configuration setup - -### 1. Organize your workspace - -at the same level as your sequencer from the \[sequencer tutorial]\(link-to-the sequencer tutorial): - -```bash -# Create proposer directory at the same level as your sequencer -mkdir proposer-node -cd proposer-node - -# Create scripts directory -mkdir scripts -``` - -### 2. 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. - - -### 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 -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 -``` - -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 -``` - -**Important**: Replace ALL placeholder values (`YOUR_ACTUAL_*`) with your real configuration values! - -### 4. Get your private key - -Get a private key from your wallet. - -## 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 -``` - -## Starting the proposer - -### 1. 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 -``` - -### 2. Start the proposer - -```bash -# Make the script executable -chmod +x scripts/start-proposer.sh - -# Start the proposer -./scripts/start-proposer.sh -``` - -## Verification - -Verify your proposer is working correctly: - -### Check proposer status - -```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 -``` - -Your proposer is now operational! - -## Next steps - -* For detailed parameter documentation, see the [proposer configuration reference](/operators/chain-operators/configuration/proposer). -* For more detail on deploying new dispute games with OPCM, [see the docs](/operators/chain-operators/tutorials/dispute-games). -* checkout the [migrating to permissionless fault proofs](/operators/chain-operators/tutorials/migrating-permissionless) guide -* For cost optimization resources, check out the [Fee calculation tools](/operators/chain-operators/tools/fee-calculator). -* TODO: Add sequencer node when it's live From b07609e0b383d1d5a1e7657f7984af3815e1c2c4 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Jun 2025 17:27:51 +0100 Subject: [PATCH 44/47] 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 7a4b5176f..fb23b2231 100644 --- a/words.txt +++ b/words.txt @@ -121,7 +121,6 @@ ETHSTATS ethstats EVMTIMEOUT evmtimeout -excercise executability exfiltrate EXITWHENSYNCED From 69c0c65a0f41b4264856486e8a6dc805b875c389 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Jun 2025 17:35:03 +0100 Subject: [PATCH 45/47] Enhance sequencer node deployment guide --- .../operators/chain-operators/deploy/sequencer-node.mdx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 14f488045..233af04f4 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -585,4 +585,11 @@ services:
-## Next steps(TODO: Update this after other pages have been merged) +Your sequencer node is now operational and ready to process transactions. + +## Next steps + +* Discover how to [deploy chains with op-deployer](/operators/chain-operators/tools/op-deployer) for standardized OP Stack deployments. +* Learn how to configure and deploy the [batcher](/operators/chain-operators/configuration/batcher) to submit transaction data to L1. +* Set up the [proposer](/operators/chain-operators/configuration/proposer) to submit output roots for withdrawals. +* Explore chain operator [best practices](/operators/chain-operators/management/best-practices) for production deployments. From 7b9ef206fd58ec3eeec94158f7e6c8a32a4f00cd Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Jun 2025 17:39:55 +0100 Subject: [PATCH 46/47] Update pages/operators/chain-operators/deploy/sequencer-node.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/operators/chain-operators/deploy/sequencer-node.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index 233af04f4..b99a68351 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -456,8 +456,7 @@ If you prefer containerized deployment, you can use the official Docker images. # Private keys - Replace with your actual private key PRIVATE_KEY=0xYOUR_ACTUAL_PRIVATE_KEY - # Find your public IP address, once you get it, update the P2P_ADVERTISE_IP in your .env - curl ifconfig.me + # (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 From d1fabf8a65d80a3398f8a558fd1f142c19b8bd07 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 27 Jun 2025 16:35:00 +0100 Subject: [PATCH 47/47] Refine description and wording in sequencer node deployment guide --- pages/operators/chain-operators/deploy/sequencer-node.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/operators/chain-operators/deploy/sequencer-node.mdx b/pages/operators/chain-operators/deploy/sequencer-node.mdx index b99a68351..5aa70cd7f 100644 --- a/pages/operators/chain-operators/deploy/sequencer-node.mdx +++ b/pages/operators/chain-operators/deploy/sequencer-node.mdx @@ -1,7 +1,7 @@ --- title: Spinning up the sequencer lang: en-US -description: Learn how to spin up a single sequencer node for your chain after verifying L1 smart contract deployment. +description: Spin up a single sequencer node after verifying L1 smart-contract deployment. content_type: tutorial topic: spinning sequencer personas: @@ -38,7 +38,7 @@ The sequencer is responsible for: ### Essential requirements -Before spinning up your sequencer, ensure you have completed these steps: +Before spinning up your sequencer, complete the following steps: **1. Successful L1 contract deployment:**