Benchmarking tool for Solana Geyser gRPC endpoints. Compares two endpoints simultaneously to measure actual performance differences.
cargo build --release- All 6 slot stages: FirstShredReceived, CreatedBank, Completed, Processed, Confirmed, Finalized
- Download time (FirstShredReceived > Completed)
- Replay time (CreatedBank > Processed)
- Account update propagation delays (optional)
- Transaction propagation delays (optional)
thorofare --endpoint1 endpoint1.com:10000 --endpoint2 endpoint2.com:10000Required:
--endpoint1- First endpoint (host:port)--endpoint2- Second endpoint (host:port)
Optional:
--x-token1- Auth token for endpoint1--x-token2- Auth token for endpoint2--slots- Number of slots to collect (default: 1000)--with-accounts- Track account updates--account-owner- Filter by program ID (requires --with-accounts)--with-transactions- Track transaction updates (non-vote)--endpoint1-richat- Use Richat interface for endpoint1--endpoint2-richat- Use Richat interface for endpoint2--config- Config file (default: config.toml)--output- Output file (default: benchmark_results.json)--log-level- Log level (default: info)
With auth tokens:
thorofare \
--endpoint1 endpoint1.com:10000 \
--endpoint2 endpoint2.com:10000 \
--x-token1 YOUR_TOKEN_1 \
--x-token2 YOUR_TOKEN_2Track account updates by program owner:
thorofare \
--endpoint1 endpoint1.com:10000 \
--endpoint2 endpoint2.com:10000 \
--with-accounts \
--account-owner 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8Track transaction propagation:
thorofare \
--endpoint1 endpoint1.com:10000 \
--endpoint2 endpoint2.com:10000 \
--with-transactionsFull benchmark (slots + accounts + transactions):
thorofare \
--endpoint1 endpoint1.com:10000 \
--endpoint2 endpoint2.com:10000 \
--with-accounts \
--account-owner 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 \
--with-transactionsGenerates JSON with:
- Slot timing comparisons
- P50/P90/P99 percentiles for all metrics
- Account update delays with win/loss counts (if
--with-accounts) - Transaction propagation delays with win/loss counts (if
--with-transactions) - Ping latencies
Delay metrics use 0ms for wins (this endpoint was faster) so the percentiles reflect the full population. A p50 of 0.00 means that endpoint was faster more than half the time.
You can visualize here https://thorofare.triton.one/
See config.toml for gRPC tuning options. Most important:
tcp_nodelay = truefor low latencyinitial_connection_window_sizefor heavy subscriptionsinitial_connection_window_sizefor heavy subscriptions (Recommend reading: https://httpwg.org/specs/rfc9113.html#rfc.section.6.9.1, for window size)
PRs welcome. Keep it simple:
- Fork and create a branch
- Make your changes
- Test against at least 2 different endpoints
- Submit PR :D