diff --git a/pages/operators/chain-operators/deploy.mdx b/pages/operators/chain-operators/deploy.mdx index 0f8eb1de4..a707b873d 100644 --- a/pages/operators/chain-operators/deploy.mdx +++ b/pages/operators/chain-operators/deploy.mdx @@ -30,10 +30,11 @@ 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 ec4a2cbbf..0a9c15516 100644 --- a/pages/operators/chain-operators/deploy/_meta.json +++ b/pages/operators/chain-operators/deploy/_meta.json @@ -3,6 +3,7 @@ "smart-contracts": "Smart contract deployment", "genesis": "Chain artifacts creation", "validate-deployment": "Validate your contract deployment", - "sequencer-node": "Spinning up the sequencer" + "sequencer-node": "Spinning up the sequencer", + "proposer-setup-guide": "Spinning up the proposer" } 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..734d9771a --- /dev/null +++ b/pages/operators/chain-operators/deploy/proposer-setup-guide.mdx @@ -0,0 +1,265 @@ +--- +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](/operators/chain-operators/deploy/sequencer-node), 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](/operators/chain-operators/deploy/sequencer-node) first. + +To see configuration info for the proposer, check out the [configuration page](/operators/chain-operators/configuration/proposer). + +## Understanding the proposer's role + +The proposer (`op-proposer`) serves as a crucial bridge between your L2 chain and L1. Its primary responsibilities include: + +* **State commitment**: Proposing L2 state roots to L1 at regular intervals +* **Withdrawal enablement**: Providing the necessary commitments for users to prove and finalize withdrawals + +The proposer creates dispute games via the `DisputeGameFactory` contract. + +## Prerequisites + +Before setting up your proposer, ensure you have: + +**Running infrastructure:** + +* An operational sequencer node +* Access to a L1 RPC endpoint + +**Network information:** + +* Your L2 chain ID and network configuration +* L1 network details (chain ID, RPC endpoints) + +## Software installation + +### 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](/operators/chain-operators/deploy/sequencer-node). + 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 +``` + +**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 +``` + +Your final directory structure should look like: + +```bash +~/ +├── optimism/ # Contains op-proposer binary +├── sequencer-node/ # Your sequencer setup +├── .deployer/ # From op-deployer +│ └── state.json +└── proposer-node/ # Your proposer working directory + ├── state.json # Copied from .deployer + ├── .env + └── scripts/ + └── start-proposer.sh +``` + +## Starting the proposer + +### 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 + +* Learn how to set up the [sequencer node](/operators/chain-operators/deploy/sequencer-node) for your OP Stack chain. +* 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). diff --git a/pages/operators/chain-operators/tutorials/absolute-prestate.mdx b/pages/operators/chain-operators/tutorials/absolute-prestate.mdx index 757e50041..6e1d988f0 100644 --- a/pages/operators/chain-operators/tutorials/absolute-prestate.mdx +++ b/pages/operators/chain-operators/tutorials/absolute-prestate.mdx @@ -277,6 +277,6 @@ After generating the absolute prestate and preimage files, you'll need to: ## Next Steps -* [Deploying new dispute games with OPCM](/operators/chain-operators/tutorials/dispute-games) -* [Migrating to permissionless fault proofs](/operators/chain-operators/tutorials/migrating-permissionless) +* Check out the [migrating to permissionless fault proofs guide](/operators/chain-operators/tutorials/migrating-permissionless). +* Read the [Fault proofs explainer](/stack/fault-proofs/explainer). * [Fault proofs explainer](/stack/fault-proofs/explainer) diff --git a/pages/operators/chain-operators/tutorials/dispute-games.mdx b/pages/operators/chain-operators/tutorials/dispute-games.mdx index bdd017701..6a58e9a28 100644 --- a/pages/operators/chain-operators/tutorials/dispute-games.mdx +++ b/pages/operators/chain-operators/tutorials/dispute-games.mdx @@ -148,3 +148,10 @@ cast send --rpc-url $RPC_URL --private-key $PRIVATE_KEY $OPCM_ADDRESS $CALLDATA 4. Setting the respected game type After deploying the permissionless dispute game, you'll need to update the respectedGameType in the OptimismPortal to start using it. For detailed instructions on setting the respected game type and migrating your chain from permissioned to permissionless fault proofs, refer to the [migrating to permissionless fault proofs guide](/operators/chain-operators/tutorials/migrating-permissionless). + +## Next Steps + +* For more detail on deploying new dispute games with OPCM, [see the docs](/operators/chain-operators/tutorials/dispute-games). +* Learn about [absolute prestate](/operators/chain-operators/tutorials/absolute-prestate) +* checkout the [migrating to permissionless fault proofs](/operators/chain-operators/tutorials/migrating-permissionless) guide +* [Fault proofs explainer](/stack/fault-proofs/explainer) diff --git a/pages/operators/chain-operators/tutorials/migrating-permissionless.mdx b/pages/operators/chain-operators/tutorials/migrating-permissionless.mdx index c05060a33..e22ebcf62 100644 --- a/pages/operators/chain-operators/tutorials/migrating-permissionless.mdx +++ b/pages/operators/chain-operators/tutorials/migrating-permissionless.mdx @@ -382,3 +382,6 @@ OP_PROPOSER_GAME_TYPE=0 ## Next steps * For more detail on deploying new dispute games with OPCM, [see the docs](/operators/chain-operators/tutorials/dispute-games). +* Deploy new dispute games with OPCM via [this tutorial](/operators/chain-operators/tutorials/dispute-games). +* Generate an absolute prestate using the [absolute prestate guide](/operators/chain-operators/tutorials/absolute-prestate). +* Understand fault proofs in the [Fault proofs explainer](/stack/fault-proofs/explainer). diff --git a/words.txt b/words.txt index fb23b2231..4d347dc57 100644 --- a/words.txt +++ b/words.txt @@ -1,7 +1,7 @@ -ACCOUNTQUEUE accountqueue -ACCOUNTSLOTS +ACCOUNTQUEUE accountslots +ACCOUNTSLOTS ACDC ADDI ADDIU @@ -9,58 +9,58 @@ ADDU airgap Allnodes allocs -Alphanet alphanet -Alphanets +Alphanet alphanets +Alphanets altda ANDI Ankr Apeworx Arweave authrpc -Autorelay autorelay +Autorelay autorelayer basefee bcde -Betanet betanet -Betanets +Betanet betanets +Betanets BGEZ BGTZ Biconomy BLEZ -BLOBPOOL blobpool +BLOBPOOL blobspace Blockdaemon blockhash blocklists -BLOCKLOGS blocklogs -BLOCKPROFILERATE +BLOCKLOGS blockprofilerate +BLOCKPROFILERATE Blockscout -Blockspace blockspace +Blockspace blocktime -Blocktimes blocktimes -BLOOMFILTER +Blocktimes bloomfilter +BLOOMFILTER BLTZ Bootcamp bootnode -BOOTNODES -Bootnodes bootnodes +Bootnodes +BOOTNODES bottlenecked -Brotli brotli -Callouts +Brotli callouts +Callouts CCIP cdef Celestia @@ -73,65 +73,65 @@ chaosnet Chugsplash Clabby codebases -Collateralized collateralized +Collateralized compr Comprensive -COMPUTEPENDINGBLOCK computependingblock +COMPUTEPENDINGBLOCK confs corsdomain counterfactually -Crosschain crosschain +Crosschain Crossmint daserver -DATACAP datacap -DATADIR +DATACAP datadir +DATADIR Defi Defillama's -Devnet devnet -Devnets +Devnet devnets +Devnets devs direnv -DISABLETXPOOLGOSSIP disabletxpoolgossip -Discv +DISABLETXPOOLGOSSIP discv +Discv DIVU Drand dripcheck Drippie Eigen EIPs -ENABLEDEPRECATEDPERSONAL enabledeprecatedpersonal +ENABLEDEPRECATEDPERSONAL enginekind -Erigon erigon -ETHERBASE +Erigon etherbase +ETHERBASE Ethernity Ethernow -ETHSTATS ethstats -EVMTIMEOUT +ETHSTATS evmtimeout +EVMTIMEOUT executability exfiltrate -EXITWHENSYNCED exitwhensynced +EXITWHENSYNCED extensibly -EXTRADATA extradata +EXTRADATA Farcaster Faultproof -FDLIMIT fdlimit +FDLIMIT Flashblocks Flashbots forkable @@ -140,51 +140,51 @@ FPVM FPVMs Fraxtal Funct -GASCAP gascap +GASCAP gaslessly -GCMODE gcmode +GCMODE Gelato gifs -GLOBALQUEUE globalqueue -GLOBALSLOTS +GLOBALQUEUE globalslots +GLOBALSLOTS gokzg growthepie hardfork hardforks -HEALTHCHECK healthcheck +HEALTHCHECK healthchecks -HISTORICALRPC historicalrpc -HISTORICALRPCTIMEOUT +HISTORICALRPC historicalrpctimeout -HOLESKY -Holesky +HISTORICALRPCTIMEOUT holesky +Holesky +HOLESKY IERC -IGNOREPRICE ignoreprice +IGNOREPRICE Immunefi -Inator inator -INFLUXDBV +Inator influxdbv +INFLUXDBV initcode -IPCDISABLE ipcdisable +IPCDISABLE ipcfile -IPCPATH ipcpath +IPCPATH IPFS JALR -JOURNALREMOTES journalremotes -JSPATH +JOURNALREMOTES jspath +JSPATH jwtsecret Keccak leveldb @@ -193,34 +193,34 @@ Lisk logfile logfmt Mainnets -MAXAGE maxage -MAXBACKUPS +MAXAGE maxbackups -MAXPEERS +MAXBACKUPS maxpeers -MAXPENDPEERS +MAXPEERS maxpendpeers -MAXPRICE +MAXPENDPEERS maxprice -MEMPROFILERATE +MAXPRICE memprofilerate -Merkle +MEMPROFILERATE merkle +Merkle MFHI MFLO Mgas Minato -MINFREEDISK minfreedisk -MINSUGGESTEDPRIORITYFEE +MINFREEDISK minsuggestedpriorityfee +MINSUGGESTEDPRIORITYFEE Mintable Mintplex MIPSEVM Mitigations -Monitorism monitorism +Monitorism Moralis Mordor mountpoint @@ -230,144 +230,144 @@ MTHI MTLO MULT multiaddr -Multichain multichain +Multichain multiclient multisigs MULTU nethermind -NETRESTRICT netrestrict -NETWORKID +NETRESTRICT networkid -NEWPAYLOAD +NETWORKID newpayload +NEWPAYLOAD nextra -NOCOMPACTION nocompaction -NODEKEY +NOCOMPACTION nodekey -NODEKEYHEX +NODEKEY nodekeyhex +NODEKEYHEX nodename Nodies -NODISCOVER nodiscover -NOLOCALS +NODISCOVER nolocals -NOPREFETCH +NOLOCALS noprefetch -NOPRUNING +NOPREFETCH nopruning -NOSYNCSERVE +NOPRUNING nosyncserve +NOSYNCSERVE Numba NVME -Offchain offchain +Offchain opchaina opchainb -OPCM opcm +OPCM Openfort oplabs opnode's outfile outperformance pcscdpath -Pectra pectra +Pectra Pectra's -Peerstore peerstore +Peerstore peerstores -Permissioned permissioned +Permissioned permissioning -Permissionless permissionless +Permissionless permissionlessly Perps Peta Pimlico POAP POAPs -PPROF pprof -Precommitments +PPROF precommitments +Precommitments preconfigured predeploy -Predeployed predeployed -Predeploys +Predeployed predeploys +Predeploys prefunded -Preimage preimage -PREIMAGES +Preimage preimages +PREIMAGES preinstall -Preinstalls preinstalls -Prestate +Preinstalls prestate +Prestate prestates PREVRANDAO -PRICEBUMP pricebump -PRICELIMIT +PRICEBUMP pricelimit +PRICELIMIT productionize productionized Protip Proxied -Proxyd proxyd +Proxyd Pyth Pyth's QRNG -Quicknode quicknode +Quicknode quickstarts rebalancing reemit Reemitting -Regenesis regenesis +Regenesis Reimagine -REJOURNAL rejournal -REMOTEDB +REJOURNAL remotedb +REMOTEDB Reown Reown's replayability replayor reposts reproven -REQUIREDBLOCKS requiredblocks +REQUIREDBLOCKS rollouts -Rollups rollups +Rollups Routescan rpckind -RPCPREFIX rpcprefix +RPCPREFIX rpcs RPGF -Runbooks runbooks +Runbooks RWAs safedb Schnorr -SEPOLIA -Sepolia sepolia +Sepolia +SEPOLIA seqnr -SEQUENCERHTTP sequencerhttp +SEQUENCERHTTP serv signup SLLV @@ -376,16 +376,16 @@ SLTIU SLTU smartcard snapshotlog -Snapsync snapsync +Snapsync Solana Soneium soyboy Spearbit SRAV SRLV -Stablecoins stablecoins +Stablecoins statefulset structs subcomponents @@ -394,21 +394,21 @@ subheaders subsecond SUBU Sunnyside -SUPERCHAIN -Superchain superchain +Superchain +SUPERCHAIN Superchain's superchainerc Superlend Superloans Superscan Superseed -Supersim supersim -SYNCMODE +Supersim syncmode -SYNCTARGET +SYNCMODE synctarget +SYNCTARGET syscalls SYSCON thirdweb @@ -422,8 +422,8 @@ Twei txfeecap txmgr txns -TXPOOL txpool +TXPOOL txproxy txproxyd uncensorable @@ -434,21 +434,21 @@ Unprotect unsubmitted UPNP upstreaming -VERKLE verkle -VHOSTS +VERKLE vhosts -Viem +VHOSTS viem -Viem's +Viem viem's -VMDEBUG +Viem's vmdebug -VMODULE +VMDEBUG vmodule +VMODULE xlarge XORI ZKPs ZKVM -Zora zora +Zora