Step 4 of 5: This tutorial is designed to be followed step-by-step. Each step builds on the previous one.
Automated Setup AvailableFor a complete working setup with all components, check out the automated approach in the code directory.
op-deployer. If you haven’t set up your sequencer and batcher yet, please refer to the sequencer guide and batcher guide first.
To see configuration info for the proposer, check out the configuration page.
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
DisputeGameFactory contract.
Prerequisites
Before setting up your proposer, ensure you have: Running infrastructure:- An operational sequencer node
- Access to a L1 RPC endpoint
- Your L2 chain ID and network configuration
- L1 network details (chain ID, RPC endpoints)
- Use docker
- Build from source
If you prefer containerized deployment, you can use the official Docker images and do the following:Important: Replace ALL placeholder values (
Your proposer is now operational and will continuously submit state roots to L1!
1
Set up directory structure and copy configuration files
2
Create environment variables file
OP Stack Standard VariablesThe proposer uses OP Stack standard environment variables following the OP Stack conventions. These are prefixed with
OP_PROPOSER_ for proposer-specific settings.YOUR_ACTUAL_*) with your real configuration values.3
Create docker-compose.yml
If you get “failed to dial address” errors, ensure your proposer is in the same Docker network as your sequencer.Common fixes:
- Add
networks: - sequencer-node_defaultto your proposer’s docker-compose.yml - Use service names like
op-reth:8545andop-node:8547in your.envfile - Verify your sequencer network name with
docker network ls
4
Start the proposer service
5
Verify proposer is running
6
Final directory structure
Understanding proposer startup logs
Understanding proposer startup logs
When you first start your proposer, you’ll see several types of log messages:
-
Initialization messages (normal):
-
Sync status messages (expected during startup):
This is normal! It means:
- Your rollup is still syncing with L1 (e.g., Sepolia)
- The proposer is waiting until sync is closer to L1 tip
- You’ll see the
current_l1number increasing as it catches up - Once caught up, the proposer will start submitting proposals
- Startup: You’ll see initialization messages as services start
- Sync: “block still behind target” messages while catching up
- Normal operation: Regular proposal submissions once synced
- Network: Connection messages to L1/L2 endpoints
- For source build: Verify your localhost ports and services
What’s Next?
Perfect! Your proposer is submitting state roots to L1. The final step is to set up the challenger to monitor and respond to disputes.Spin up challenger →
Next: Configure and start op-challenger to monitor disputes and maintain your rollup’s security.
Need Help?
- Proposer Configuration: op-proposer Configuration Reference
- Dispute Games: Deploying Dispute Games with OPCM