Skip to main content
After you have spun up your sequencer and batcher, you need to attach a proposer to post your L2 state roots data back onto L1 so we can prove withdrawal validity. The proposer is a critical component that enables trustless L2-to-L1 messaging and creates the authoritative view of L2 state from L1’s perspective.
Step 4 of 5: This tutorial is designed to be followed step-by-step. Each step builds on the previous one.
Automated Setup AvailableFor a complete working setup with all components, check out the automated approach in the code directory.
This guide assumes you already have a functioning sequencer, batcher, and the necessary L1 contracts deployed using 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
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)
For setting up the proposer, we recommend using Docker as it provides a consistent and isolated environment. Building from source is also available as an option.
If you prefer containerized deployment, you can use the official Docker images and do the following:
1

Set up directory structure and copy configuration files

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.
Important: Replace ALL placeholder values (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_default to your proposer’s docker-compose.yml
  • Use service names like op-geth:8545 and op-node:8547 in your .env file
  • Verify your sequencer network name with docker network ls
4

Start the proposer service

5

Verify proposer is running

6

Final directory structure

Your proposer is now operational and will continuously submit state roots to L1!

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?