Introducing Yellowstone Fumarole ♨️
We are thrilled to unveil Yellowstone Fumarole: a new persistent streaming solution that empowers you to subscribe to geyser events without losing any data, even in the event of network connection errors.
This blog post will go in-depth on why we created Fumarole and why you would use it.
We love streaming ❤️🐉
The Solana ecosystem is filled with streaming solutions that allow developers to listen to blockchain events in real time. At Triton One, one of our most successful services is Yellowstone Dragon’s Mouth, a streaming solution widely used by traders, DEXs, APIs, and DeFi builders.
At Triton One, we strive to offer the best streaming service with the lowest possible latency. Building a gRPC interface on top of Geyser was a key decision, ensuring both high performance and maintainability for our customers.
Under the hood, we’ve gone through multiple iterations to optimise performance. We reduced unnecessary data copies, fine-tuned HTTP/2 settings, and rigorously tested different configurations to deliver the best possible performance.
While Yellowstone Dragon’s Mouth serves many use cases, we’ve noticed that many customers struggle with reliability and data persistence.
- What happens if I get disconnected from Dragon’s Mouth?
- How do I know if I missed data?
- How can I retrieve lost data?
These are all important questions, and, to be frank, answering them isn’t as straightforward as one might think.
High-availability ☁️✅
The new Yellowstone Fumarole service is designed for high availability, not just in terms of multiple endpoints to connect to, but also in how it fundamentally sources its data.
Under the hood, Fumarole aggregates data from multiple RPC nodes, coalescing everything into a single, consistent timeline of events.
This ensures that developers no longer need to worry about low-level redundancy challenges, such as subscribing to multiple RPC nodes or handling global deduplication of events.
Once you’re connected to Fumarole, you’re already receiving a highly available, reliable stream—without the extra complexity.
Persistence ⛰️
Persistence is by far the most important feature of Fumarole—blockchain data is stored in a distributed storage system, allowing our customers to query past events.
With Persistent Subscriber, Fumarole tracks your position in the data stream, ensuring that network issues won’t cause data loss. When you reconnect, you seamlessly resume from where you left off.
Persistent subscribers are cursors/point-in-time pointer of the internal Fumarole log architecture.
This is a feature many of our customers have been waiting for, and we believe it will be a game-changer for years to come.
Delivery guarantee
Fumarole is at-least-once delivery type of service. It’s a best effort to avoid duplicated data.
Block-oriented
One of Fumarole’s key features that simplifies your workflow is this: you always receive the full block data before any slot status updates. If you’ve received a slot status, it means no more data will follow for that block—it’s that simple.
Back in Dragonsmouth, this was a common source of confusion for both the community and many of our customers: How can I tell if I’ve received everything for a block? Did I miss a transaction because of my filters? To answer that, you had to subscribe to additional intra-slot updates and build a state machine to track block reconstruction—a process that many users weren’t even aware they needed.
Fumarole eliminates that complexity. You’ll always receive transactions, accounts, and entries first, followed by the slot status updates (processed, confirmed, finalized). Always in that order.
New approach to public code: SDKs
Fumarole uses gRPC as the transport protocol between your client and the Fumarole servers. While the protobuf service definitions are publicly available, they are considered internal implementation details and are not intended for direct use. These definitions may change at any time without notice.
For stability and forward compatibility, we recommend using the official client libraries, which provide a stable and well-supported interface.
Right now we have rust and python clients.
Fumarole 🤝 Dragon’s mouth
We put a lot of effort into making Fumarole fully compatible with the Dragon’s Mouth API.
Not only does Yellowstone Fumarole output the same data as Dragon’s Mouth, but it also supports the same account and transaction filter APIs.
This ensures that developer integration requires minimal changes to existing code.
Follow the documentation instructions to create a dragonsmouth-like adapter from Fumarole
Getting started 🏃♀️🏃🏽♂️🏃🏿♀️
Start by downloading our Yellowstone fume CLI tool.
This tool lets you manage your account in the Fumarole service and handle the necessary bookkeeping: create or delete persistent subscribers, list metadata, and even stream!
Download using pip:
cargo install yellowstone-fumarole-cliTest it:
fume --versionThe fume CLI is the tool you will use as the control plane for Fumarole.
This tool allows you to:
- Create persistent subscribers
- List/Get persistent subscribers
- Delete persistent subscribers
- Streaming persistent subscribers
For more details, visit crates.io where we host the public Fumarole code.
Configuration file 📜
Fumarole CLI looks for a file in ~/.config/fume/config.yaml By default, you can change the path location by using fume --config <PATH>.
The configuration needed is simple; all you need is an endpoint and a token (contact your customer support channel for a token if you’re already a Triton customer, if not, get in touch over Telegram):
endpoint: https://<FUMAROLE-PUBLIC-ENDPOINT>
x-token: "<YOUR X-TOKEN secret here>"You can test your configuration file with test-config subcommand:
$ fume --config <path/to/config> test-configor with custom config path:
$ fume --config path/to/config.yaml test-configMore details can be found using the --help option:
Yellowstone Fumarole CLI
Usage: fume [OPTIONS] <COMMAND>
Commands:
test-config Test the connection to the fumarole service
get-info Get Persistent Subscriber Info
create Create Persistent Subscriber
delete Delete a Persistent Subscriber
list List all persistent subscribers
delete-all Delete all persistent subscribers
subscribe Subscribe to fumarole events
slot-range Returns the slot range of remote fumarole service
help Print this message or the help of the given subcommand(s)
Options:
--config <CONFIG> Path to the config file. If not specified, the default config file will be used. The default config file is ~/.fumarole/config.yaml. You can also set the FUMAROLE_CONFIG environment variable to specify the config file. If the config file is not found, the program will exit with an error
-v, --verbose... Increase logging verbosity
-q, --quiet... Decrease logging verbosity
-h, --help Print help
-V, --version Print versionYou can also visit the docs.rs page for more examples or our public repository.
Persistent subscriber staleness ⌛
Fumarole is essentially a log of blockchain events that is pruned at every moment to fit at most hours or days' worth of blockchain data.
When you create a persistent subscriber, you actually create a point-in-time cursor over Fumarole’s internal log. If your cursor falls too far behind, it will become stale.
Once a subscriber is stale, you cannot use it anymore and must delete it.
Wrapping up 🖖
Yellowstone Fumarole and Dragon’s Mouth are at the forefront of providing scalable, high-availability streaming solutions for blockchain data.
At Triton One, we are committed to continually enhancing the performance, reliability, and scalability of our services to meet the growing demands of blockchain developers.
We believe that with Fumarole, you now have the tools to ensure high-performance, fault-tolerant data streaming.
Check out other cool stuff Triton has!
Frequently asked questions
What is Yellowstone Fumarole?
Yellowstone Fumarole is a persistent streaming service for Geyser events that lets you subscribe to Solana data without losing information, even if your network connection drops.
Why was Fumarole created if Dragon’s Mouth already exists?
Dragon’s Mouth focuses on ultra-low-latency streaming, but many users struggled with reliability and data persistence after disconnections. Fumarole adds high availability and persistence on top, so you can resume from where you left off and avoid gaps.
How does Fumarole achieve high availability?
Fumarole aggregates data from multiple RPC nodes and merges it into a single, consistent event timeline. This removes the need for you to manage redundancy, multi-node subscriptions, or manual deduplication.
What does persistence mean in Fumarole?
Fumarole stores blockchain data in a distributed storage system and tracks each client’s position in the stream using persistent subscribers. When you reconnect, you continue from the last confirmed position rather than starting over.
What delivery guarantee does Fumarole provide?
Fumarole provides at-least-once delivery. It is designed to minimise duplicates, but its primary guarantee is that you do not miss events, even across transient failures.
What does “block-oriented” behaviour mean?
Fumarole always sends full block data before any slot status updates. Once you receive a slot status for a block, you can be sure no additional data for that block will arrive, which simplifies your ingestion and state reconstruction logic.
Why use the official SDKs instead of protobuf definitions directly?
The protobuf service definitions are considered internal and may change over time. The official Rust and Python SDKs provide a stable, supported interface that shields your integration from low-level protocol changes.
Is Fumarole compatible with existing Dragon’s Mouth integrations?
Yes. Fumarole outputs the same data and supports the same account and transaction filter APIs as Dragon’s Mouth, so you can usually adapt existing Dragon’s Mouth integrations with minimal code changes.
What is the fume CLI and what can I do with it?
fume is the Yellowstone Fumarole CLI tool. It lets you create, list, inspect, delete, and stream persistent subscribers, and run connectivity and configuration checks against the Fumarole service.
How do I configure the Fumarole CLI?
Create a config.yaml (by default in ~/.config/fume/config.yaml) that defines your Fumarole endpoint and X-token. You can then point fume at it with the --config flag and use test-config to validate connectivity.
What does it mean for a persistent subscriber to become stale?
Fumarole only retains a rolling window of recent blockchain data. If a subscriber’s cursor falls behind data that has already been pruned, it becomes stale and can no longer be used. You must delete it and create a new subscriber.