# Arbitrum vs Optimism vs Base — Comparaison de l'Expérience Développeur
Trois L2. Trois approches. Un seul gagnant pour votre use case.
Vue d'Ensemble
Arbitrum : Nitro stack, fraud proofs interactifs, écosystème DeFi mature
Optimism : OP Stack Bedrock, fraud proofs 1-round, focus governance
Base : OP Stack fork, backed by Coinbase, focus mass adoption
Différences Techniques
1. Fraud Proofs
// Arbitrum : multi-round interactive proving
// Si dispute :
// 1. Challenger dit "état X est faux"
// 2. Bisection : découper en N segments
// 3. Challenger pointe le segment faux
// 4. Répéter jusqu'à 1 opcode
// 5. Exécuter cet opcode on-chain pour prouver
// Avantage : gas efficient (seulement 1 opcode on-chain)
// Inconvénient : challenge period long (7j)
// Optimism/Base : 1-round fault proof (post-Bedrock)
// 1. Challenger soumet proof en 1 shot
// 2. EVM on-chain vérifie
// 3. Settle en quelques heures
// Avantage : finality plus rapide
// Inconvénient : gas plus cher (toute la trace on-chain)
2. Précompilés Custom
// Arbitrum : précompilés custom pour gas savings
contract ArbSys {
// Pas disponible sur OP/Base
function arbBlockNumber() external view returns (uint256);
}
// Usage
import {ArbSys} from "arbitrum/precompiles/ArbSys.sol";
function getL2BlockNumber() public view returns (uint256) {
return ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber();
}
// ⚠️ Non-portable ! Code cassera sur OP/Base
3. Opcodes Différents
// block.number behavior
// Arbitrum : L2 block number (rapide, ~0.25s)
// OP/Base : L1 block number (lent, ~12s) [avant Bedrock]
// L2 block number [post Bedrock]
// ⚠️ Si votre code assume block.number = temps réel :
function isExpired(uint256 deadline) public view returns (bool) {
return block.number > deadline;
}
// Sur pre-Bedrock OP :
// - Deadline en L2 blocks (rapide)
// - block.number = L1 blocks (lent)
// → timing complètement cassé
// Fix : utiliser block.timestamp (universel)
function isExpired(uint256 deadline) public view returns (bool) {
return block.timestamp > deadline;
}
Outillage Dev
RPCs
# Arbitrum
https://arb1.arbitrum.io/rpc # Public, rate-limited
https://arbitrum-mainnet.infura.io # Infura (stable)
# Optimism
https://mainnet.optimism.io # Public
https://optimism-mainnet.infura.io
# Base
https://mainnet.base.org # Public (Coinbase-backed, excellent uptime)
https://base-mainnet.g.alchemy.com
Verdict : Base a le meilleur uptime (Coinbase infra). Arbitrum public RPC souvent surchargé.
Explorers
Arbitrum : arbiscan.io (Etherscan-based, excellent)
Optimism : optimistic.etherscan.io (bon)
Base : basescan.org (Etherscan, très bon)
Feature : internal txs, token transfers, contract verification.
Tous trois = excellents. Arbitrum a le plus de tooling tiers (Dune dashboards, etc.).
Debug Trace
# Test debug_traceTransaction sur chaque L2
# Arbitrum
curl https://arb1.arbitrum.io/rpc -X POST -H "Content-Type: application/json" \
--data '{"method":"debug_traceTransaction","params":["0x..."],"id":1,"jsonrpc":"2.0"}'
# ✅ Supporté
# Optimism
curl https://mainnet.optimism.io -X POST -H "Content-Type: application/json" \
--data '{"method":"debug_traceTransaction","params":["0x..."],"id":1,"jsonrpc":"2.0"}'
# ✅ Supporté (post-Bedrock)
# Base
# ✅ Supporté via Alchemy/QuickNode
Verdict : Tous supportent debug traces. Arbitrum a le meilleur support historique (archives nodes publics).
Écosystème
Projets Natifs
Arbitrum :
- GMX (perps #1)
- Camelot (DEX)
- Radiant (lending)
- Treasure DAO (gaming)
→ Écosystème le plus mature
Optimism :
- Velodrome (DEX)
- Synthetix (derivatives)
- Exactly (lending)
→ Focus governance/RetroPGF
Base :
- Aerodrome (Velodrome fork)
- friend.tech (SocialFi)
- Onchain Summer (NFTs)
→ Focus consumer apps
Verdict : Arbitrum pour DeFi, Base pour consumer, OP pour governance nerds.
Bridges
// Tous trois : native bridges ~7j withdrawal
// Arbitrum native bridge
interface IArbBridge {
function outboundTransfer(
address token,
address to,
uint256 amount,
bytes calldata data
) external;
}
// Optimism native bridge
interface IOPBridge {
function depositERC20To(
address l1Token,
address l2Token,
address to,
uint256 amount,
uint32 l2Gas,
bytes calldata data
) external;
}
// Base = identique à OP (OP Stack fork)
// Fast bridges (tiers) :
// - Across : supporte tous trois
// - Hop : supporte tous trois
// - Stargate : supporte tous trois
Pas de différence majeure. Utilisez un fast bridge.
Économie Gas Post-4844
EIP-4844 (blobs) a changé l'économie L2.
Avant 4844 (calldata) :
Arbitrum : $0.10 - $0.50 per tx
Optimism : $0.15 - $0.60
Base : $0.12 - $0.50
Après 4844 (blobs, Mar 2024) :
Arbitrum : $0.01 - $0.05
Optimism : $0.01 - $0.04
Base : $0.01 - $0.03
Tous trois = quasi-identiques maintenant (blobs = commodity)
Verdict : Gas n'est plus un différentiateur. Tous trois dirt cheap post-4844.
Pièges de Déploiement
1. create2 Address Differences
// Si vous déployez via create2 (même salt, même bytecode) :
// Adresses PEUVENT différer entre chains si :
// - Chain ID embedded dans constructor args
// - Précompilés appelés dans constructor
// Fix : hardcode l'adresse attendue et check
address constant EXPECTED = 0x1234...;
require(address(myContract) == EXPECTED, "Wrong address");
2. Arbitrum Retryable Tickets
// Arbitrum : L1→L2 messages peuvent fail et nécessiter retry
// Autres L2 : messages garantis (ou revert)
// Si vous gérez des L1→L2 deposits :
interface IArbRetryable {
function redeem(bytes32 txnHash) external;
}
// User doit manuellement redeem si le ticket échoue
// ⚠️ UX trap : funds "stuck" en L1 jusqu'à redeem
3. Base Specifics
// Base = OP Stack mais avec customizations Coinbase
// - Pas de governance token (pour l'instant)
// - Sequencer centralisé (Coinbase)
// - Upgrades suivent OP mais avec lag
// ⚠️ Assumptions sur OP peuvent ne pas tenir sur Base
// Toujours tester sur Base testnet séparément
Déploiement Multi-Chain
// Strategy : utiliser le même code, tester sur chaque L2
// 1. Foundry script
contract DeployScript is Script {
function run() external {
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
vm.startBroadcast(deployerPrivateKey);
MyContract c = new MyContract();
vm.stopBroadcast();
console.log("Deployed to:", address(c));
}
}
// 2. Deploy sur chaque chain
forge script DeployScript --rpc-url $ARBITRUM_RPC --broadcast --verify
forge script DeployScript --rpc-url $OPTIMISM_RPC --broadcast --verify
forge script DeployScript --rpc-url $BASE_RPC --broadcast --verify
// 3. Vérifier adresses identiques (si create2)
# arbitrum: 0xABC...
# optimism: 0xABC...
# base: 0xABC...
Verdict par Use Case
DeFi Protocol
Arbitrum
- Liquidité la plus profonde
- Écosystème integrations (GMX, Camelot, etc.)
- Tooling mature
Consumer App
Base
- Coinbase users onramp (fiat → Base direct)
- Marketing support (Onchain Summer, etc.)
- Sequencer uptime 99.99%
Governance Experiment
Optimism
- RetroPGF funding
- Governance-native (OP token)
- Standards leadership (OP Stack = référence)
Maximum Reach
Tous trois
- Déployer partout
- Utilisez un relayer cross-chain (Gelato, Chainlink)
- State sync via LayerZero/Axelar
Conclusion
En 2026, les L2 ont convergé techniquement (post-4844, tous cheap). Le choix dépend de l'écosystème et la distribution.
Arbitrum = DeFi. Base = consumer. OP = governance.
Ou déployez partout et laissez le marché décider.