Overview
Commitment levels in Solana represent different stages of transaction and block confirmation. Yellowstone gRPC allows you to specify which commitment level you want to receive updates for, letting you choose between speed and certainty.Commitment Levels
Yellowstone gRPC supports three commitment levels defined in the protocol:Processed
Fastest, Least CertainThe transaction has been processed by a validator and added to a block, but the block may not be confirmed or finalized. This is the fastest way to see updates but carries the highest risk of reorgs.Use when: You need real-time updates and can handle potential rollbacks
Confirmed
Balanced Speed & SafetyThe block containing the transaction has been confirmed by the cluster (66%+ stake agreement). This is the recommended level for most applications.Use when: You need reliable updates without waiting for full finality
Finalized
Slowest, Most CertainThe block has been finalized by the cluster and is extremely unlikely to be rolled back. This provides the highest level of certainty.Use when: You need absolute certainty and can tolerate delays
Setting Commitment Level
- Rust
- TypeScript
- Command Line
Commitment Level Behavior
The commitment level affects all subscription types in your request:- Accounts - Updates are sent when the account is modified at the specified commitment level
- Transactions - Transactions are sent when they reach the specified commitment level
- Blocks - Blocks are sent when they reach the specified commitment level
- Slots - Slots can be filtered by commitment level using
filter_by_commitment
Slot Commitment Filtering
Slots are special because they progress through multiple commitment levels. You can control whether you want all slot updates or only updates at your specified commitment level:filter_by_commitment: true:
- You only receive slot updates when they reach your specified commitment level
- Example: With
confirmedcommitment, you only get slots when they’re confirmed
filter_by_commitment: false (or None):
- You receive slot updates at all commitment levels
- You’ll see slots progress from processed → confirmed → finalized
Slot Status vs Commitment Level
Slot updates include astatus field that indicates the slot’s current state:
Timing Expectations
Typical timing for commitment levels on Solana:| Commitment Level | Approximate Time | Reorg Risk |
|---|---|---|
| Processed | ~400-600ms | High - blocks may be orphaned |
| Confirmed | ~1-2 seconds | Low - requires 66%+ stake to reorg |
| Finalized | ~12-32 seconds | Very Low - requires 66%+ stake over 31+ slots |
These times are approximate and depend on network conditions. Mainnet-beta typically has faster confirmation times than testnet.
Use Cases by Commitment Level
- Processed
- Confirmed
- Finalized
Best for:Not recommended for:
- Real-time price feeds
- UI updates that can be corrected
- Activity monitoring dashboards
- Early detection of events
- Financial transactions
- Permanent state changes
- Critical business logic
Monitoring All Commitment Levels
You can create multiple subscriptions with different commitment levels if you need to track progression:Commitment Level with Other Features
Commitment + Data Slicing
Commitment + Filters
Best Practices
Use Confirmed by Default
Unless you have specific requirements, use
confirmed commitment for the best balance of speed and safety.Match Your Use Case
Choose processed for real-time UIs, confirmed for most apps, finalized for critical operations.
Handle Reorgs
If using processed commitment, implement logic to handle potential rollbacks.
Consider Latency
Higher commitment levels = more certainty but also more latency. Plan accordingly.
Troubleshooting
Why am I not receiving updates?
Why am I not receiving updates?
- Check that your commitment level matches the activity you’re monitoring
- Verify that the accounts/transactions you’re filtering for are active at that commitment level
- Try lowering to
processedto see if updates appear faster
Updates seem delayed
Updates seem delayed
- This is expected with higher commitment levels
finalizedcan take 12-32 seconds- Consider using
confirmedif the delay is too long
I'm seeing duplicate updates
I'm seeing duplicate updates
- This can happen if you’re not using
filter_by_commitmentwith slots - Or if you’ve subscribed multiple times with different filters
- Check the
filtersfield in updates to identify the source
Processed updates keep changing
Processed updates keep changing
- This is normal - processed blocks can be orphaned
- Use
confirmedorfinalizedif you need stable data - Implement rollback logic if you must use processed
Next Steps
- Learn about Subscribing to different update types
- Explore Filtering to narrow down updates
- Implement Ping/Pong to keep your connection alive