The system uses optimistic proposals by default, with a fallback window where anyone can propose if whitelisted proposers are silent.
How It Works
Propose → Challenge? → Prove? → Resolve
Proposer submits a state root with ETH bond
Anyone can challenge within the window
ZK proof resolves the dispute in one transaction
Winner takes both bonds
Prerequisites
Clone the Repository
Succinct Prover Network
The system uses Succinct's Prover Network to generate ZK proofs. You'll need:
An account funded on the Prover Network
The private key for this account in your configuration
Running a Proposer
1. Create Configuration
Create .env.proposer file in the root of the repository:
To run an L2_NODE_RPC:
Repo: https://github.com/0xFacet/facet-optimism — This is a read-only fork of op-node used to expose auxiliary RPCs (e.g., sync status, output-at-clock) that aren’t yet implemented in facet-node. It’s generally only required for proposers/challengers, not for normal users.
You will need the following in your env:
2. Start the Proposer Service
3. How Proposing Works
The proposer service:
Monitors the anchor block on Rollup.sol
Runs Facet node to compute new state
Submits proposal with bond when needed
Uses Prover Network to generate ZK proof if challenged
Running a Challenger
1. Create Configuration
Create .env.challenger file in the root of the repository:
2. Start the Challenger Service
3. How Challenging Works
The challenger service:
Monitors new proposals on-chain
Validates each proposal independently
Challenges incorrect proposals
Claims bonds when successful
Manual Interaction
Query System Configuration
All parameters are immutable and can be queried from the contract.
Timing parameters:
MAX_CHALLENGE_SECS - Challenge window duration
MAX_PROVE_SECS - Proof deadline after challenge
FALLBACK_TIMEOUT_SECS - When anyone can propose
Bond requirements:
PROPOSER_BOND - ETH required to propose
CHALLENGER_BOND - ETH required to challenge
L2 configuration:
PROPOSAL_INTERVAL - Blocks between proposals
L2_BLOCK_TIME - Seconds per L2 block
L2_START_TIMESTAMP - L2 genesis timestamp
Proof system:
VERIFIER - SP1 verifier contract
ROLLUP_CONFIG_HASH - Chain configuration
AGG_VKEY - Aggregation verification key
RANGE_VKEY_COMMITMENT - Range proof commitment
Example query:
Submit a Proposal
Challenge a Proposal
Submit a Validity Proof (Permissionless)
Anyone can submit a validity proof directly:
Monitoring Your Activity
Check Proposal Status
View Credit Balance
Claim Credits
Economic Model
Bonds
Check current bond amounts using the contract
Both proposer and challenger post equal bonds
Bonds are returned to the winner
Resolution Rules
Valid proposal: Proposer gets both bonds
Successful challenge: Challenger gets both bonds
Invalid parent: Proposal automatically fails
Profitability Considerations
L1 gas costs for transactions
Proof generation costs on Prover Network
Competition from other participants
Risk assessment for challenges
Summary
To participate in Facet's proof system:
Clone the repository and set up your environment
Configure services with .env.proposer or .env.challenger
Fund accounts on both Ethereum and Prover Network
Run services to automatically propose or challenge
Monitor and claim rewards from successful participation
The system ensures honest participation is profitable while maintaining complete immutability - no admin keys can interfere with the propose-challenge-prove cycle.
git clone https://github.com/0xFacet/zk-fault-proofs
cd zk-fault-proofs
# OP Succinct Proposer Service Configuration
# Copy this file to .env.proposer and fill in your actual values
# ===== RPC ENDPOINTS =====
# L1 RPC endpoint for reading Ethereum mainnet/testnet data
L1_RPC=https://your-l1-rpc-endpoint.com
# L2 RPC endpoint for reading OP Stack rollup data
L2_RPC=https://mainnet.facet.org
# L2 node RPC endpoint for accessing op-node specific APIs
L2_NODE_RPC=https://your-l2-node-rpc-endpoint.com
# L1 beacon chain RPC for accessing consensus layer data
L1_BEACON_RPC=https://your-beacon-rpc-endpoint.com
# ===== CONTRACT ADDRESSES =====
# Address of the deployed Rollup.sol contract on L1
ROLLUP_ADDRESS=0x0000000000000000000000000000000000000000
# ===== PRIVATE KEYS =====
# Private key for the proposer account (must be whitelisted on Rollup.sol)
# WARNING: Never commit real private keys to version control
PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000001
# Private key for SP1 network operations (proof generation)
NETWORK_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000002
# Interval for generating range proofs (in L2 blocks)
# Smaller values = more frequent proofs but higher costs
RANGE_PROOF_INTERVAL=1000
# Enable safe database fallback for better reliability
# Recommended: true for production
SAFE_DB_FALLBACK=true
# Mock mode for testing - uses mock proofs instead of real SP1 proofs
# MUST be false for production
MOCK_MODE=false
# ===== SP1 PROOF GENERATION =====
# Maximum cycles allowed for SP1 proof generation
# Higher values allow larger proofs but cost more
SP1_CYCLE_LIMIT=40000000000
# Timeout for SP1 proof generation (in seconds)
# Increase if experiencing timeouts on large proofs
SP1_TIMEOUT=48000
git clone https://github.com/0xFacet/facet-optimism
cd facet-optimism
./init_node.sh