shredstream について
Solanaの実行前トランザクションデータを扱うためのスキルです。Jito、Shyft、Triton経由でshredsを受信し、実行結果が含まれない点を踏まえてトランザクションの意図を解析します。
主な機能
- 01バリデーター実行前のトランザクションデータ受信
- 02Jito、Shyft、Tritonの方式を紹介
- 03UDPまたはgRPCでデータをストリーミング
- 04トランザクションのアカウントと命令を解析
- 05デプロイ要件と解析スクリプトを提供
活用シーン
- 01実行前にトランザクションの意図を検知
- 02低レイテンシのSolana取引監視を構築
- 03実行前シグナルとYellowstoneの確定情報を組み合わせ
- 04shreds内のプログラム命令を調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill shredstreamインストール後、Claude Code で/shredstreamを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/deployment.mdproto_reference.mdproviders_compared.mdscripts/parse_shredstream_entries.pyrabbitstream_monitor.py詳細
ShredStream — 実行前の Solana データ
ShredStream では、バリデーターがブロックを実行する前にトランザクションデータを取得できます。通常、標準の Yellowstone gRPC より100~500ms早く取得できます。確認済みの結果ではなく、トランザクションの意図を確認できます。
時間が重要な取引戦略にとって、Solana データを取得する最速の方法です。
仕組み
Solana バリデーターは、トランザクションを shred(UDP MTU に合わせた約1,228バイトの単位)にシリアライズしてブロックを生成します。Shred は Turbine(Solana のファンアウトプロトコル。2~3ホップ)を通じて伝播します。ShredStream は、Jito の Block Engine 経由でリーダーバリデーターから直接shred を受信することで、Turbine を迂回します。
Leader Validator
│
├── Turbine (standard, 2-3 hops, 200-500ms)
│ └── Your RPC Node → Yellowstone gRPC (post-execution)
│
└── Jito Block Engine (direct)
└── ShredStream Proxy (your server)
├── UDP shreds → Your RPC/Validator (faster block building)
└── gRPC entries → Your Trading Bot (decoded transactions)
取得できるものと取得できないもの
| 取得可能(実行前) | 取得不可(実行が必要) |
|---|---|
| トランザクション署名 | 成功/失敗のステータス |
| アカウントキー(公開鍵) | 残高の変化(実行前/実行後) |
| インストラクション(プログラム、アカウント、データ) | ログメッセージ |
| アドレスルックアップテーブルへの参照 | 内部インストラクション(CPI) |
| スロット番号 | トークン残高の変化 |
| 消費されたコンピュートユニット |
主なトレードオフ:完全性より速度を優先します。これから起きることは確認できますが、実際に成功したかどうかは確認できません。取得したトランザクションの一部は、最終的に失敗します。
実行前データを取得する3つの方法
| プロバイダー | 製品 | レイテンシー | 利用条件 | 費用 |
|---|---|---|---|---|
| Jito | ShredStream Proxy | リーダーから約10~50ms | 申請と認証キーペアが必要 | 無料(ベータ版) |
| Shyft | RabbitStream | gRPC より約15~100ms高速 | Shyft gRPC プラン | 月額199ドルから |
| Triton | Deshred(SubscribeDeshred) | shred から p50 約6.3ms | Triton の顧客 | 月額約2,900ドル以上 |
詳しい比較については、references/providers_compared.mdを参照してください。
方法1:Jito ShredStream Proxy
最も直接的な方法です。Jito のオープンソースプロキシをご自身のサーバーで実行します。
アクセスを取得する
- Solana キーペアを生成します:
solana-keygen new -o shred_auth.json - 公開鍵を添えてJito のフォームから申請します
- 承認を待ちます(お使いのキーペアがホワイトリストに登録されます)
- ステーキング要件はなく、ベータ期間中は無料です
プロキシを実行する
# Clone and build
git clone https://github.com/jito-labs/shredstream-proxy.git --recurse-submodules
cd shredstream-proxy
# Run with gRPC enabled (key flag: --grpc-service-port)
RUST_LOG=info cargo run --release --bin jito-shredstream-proxy -- shredstream \
--block-engine-url https://mainnet.block-engine.jito.wtf \
--auth-keypair /path/to/shred_auth.json \
--desired-regions ny,amsterdam \
--dest-ip-ports 127.0.0.1:8001 \
--grpc-service-port 7777
Docker(UDP にホストネットワークが必要です):
docker run -d --name shredstream-proxy --rm \
--network host \
-e RUST_LOG=info \
-e BLOCK_ENGINE_URL=https://mainnet.block-engine.jito.wtf \
-e AUTH_KEYPAIR=/app/shred_auth.json \
-e DESIRED_REGIONS=ny,amsterdam \
-e DEST_IP_PORTS=127.0.0.1:8001 \
-e GRPC_SERVICE_PORT=7777 \
-v /path/to/shred_auth.json:/app/shred_auth.json \
jitolabs/jito-shredstream-proxy shredstream
設定
| パラメーター | 説明 | 例 |
|---|---|---|
BLOCK_ENGINE_URL | Jito ブロックエンジンのエンドポイント | https://mainnet.block-engine.jito.wtf |
AUTH_KEYPAIR | ホワイトリスト登録済みの Solana キーペアへのパス | shred_auth.json |
DESIRED_REGIONS | 最大2つ、カンマ区切り | ny,amsterdam |
DEST_IP_PORTS | raw shred の転送先(UDP) | 127.0.0.1:8001 |
GRPC_SERVICE_PORT | gRPC エントリーストリーミングを有効化 | 7777 |
SRC_BIND_PORT | shred の受信 UDP ポート | 20000 |
利用可能なリージョン:amsterdam、dublin、frankfurt、london、ny、salt-lake-city、singapore、tokyo
動作を確認する
# Check shreds are arriving via UDP
sudo tcpdump 'udp and dst port 20000'
# Should see many ~1200-byte packets continuously
gRPC 経由で利用する
use jito_protos::shredstream::{
shredstream_proxy_client::ShredstreamProxyClient,
SubscribeEntriesRequest,
};
let mut client = ShredstreamProxyClient::connect("http://127.0.0.1:7777").await?;
let mut stream = client
.subscribe_entries(SubscribeEntriesRequest {})
.await?
.into_inner();
while let Some(entry) = stream.message().await? {
let entries: Vec<solana_entry::entry::Entry> =
bincode::deserialize(&entry.entries)?;
for e in &entries {
for tx in &e.transactions {
let sig = tx.signatures[0];
let msg = tx.message();
// Parse instructions, accounts, etc.
}
}
println!("Slot {}: {} entries, {} transactions",
entry.slot,
entries.len(),
entries.iter().map(|e| e.transactions.len()).sum::<usize>()
);
}
方法2:Shyft RabbitStream
Yellowstone gRPC のそのまま置き換え可能なサービスです。SubscribeRequest形式は同じで、エンドポイントだけが異なります。インフラを運用せずに実行前データを取得する最も簡単な方法です。
export GRPC_ENDPOINT="https://rabbitstream.ny.shyft.to"
export GRPC_TOKEN="your-shyft-x-token"
# Same code as yellowstone-grpc, just different endpoint
import grpc
endpoint = "rabbitstream.ny.shyft.to"
token = os.environ["GRPC_TOKEN"]
# ... standard Yellowstone connection code ...
# Subscribe to transactions — same filter format
request = SubscribeRequest(
transactions={
"pumpfun": SubscribeRequestFilterTransactions(
account_include=["6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"],
vote=False,
failed=False,
)
},
commitment=CommitmentLevel.PROCESSED,
)
制限事項:利用できるのはトランザクションフィルターのみです。アカウント、スロット、ブロックのサブスクリプションはありません。metaフィールドは空です(実行結果は含まれません)。
リージョン別エンドポイント:rabbitstream.{ny,va,ams,fra}.shyft.to
方法3:Triton Deshred
Triton のSubscribeDeshred RPC によって、最も低いレイテンシー(p50 約6.3ms)を実現します。同じ Yellowstone クライアントを使い、メソッドだけが異なります。
// Requires yellowstone-grpc-client with Deshred support
let (mut tx, mut stream) = client.subscribe_deshred().await?;
tx.send(SubscribeDeshredRequest {
deshred_transactions: hashmap!{
"pumpfun".to_string() => SubscribeRequestFilterDeshredTransactions {
vote: Some(false),
account_include: vec!["6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P".into()],
..Default::default()
}
},
..Default::default()
}).await?;
利用条件:Triton の顧客限定、有料ベータ版です。Triton 独自の Agave バリデーターのフォークが必要です。
実行前トランザクションの解析
実行メタデータがないため解析はよりシンプルですが、プログラム固有の知識が必要です。
プログラムを識別する
# From a raw VersionedTransaction (post-deserialization)
account_keys = [str(k) for k in tx.message.account_keys]
for ix in tx.message.instructions:
program_id = account_keys[ix.program_id_index]
if program_id == "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P":
# This is a PumpFun instruction
discriminator = ix.data[:8]
# Decode instruction data per PumpFun IDL
命令識別子
ほとんどの Solana プログラムでは、8 バイトの命令識別子(命令名の Anchor SHA256 ハッシュ)を使用します。各プログラムの既知の値と instruction.data[:8] を照合してください。
# Common approach
PUMPFUN_CREATE = bytes.fromhex("181ec828051c0777")
PUMPFUN_BUY = bytes.fromhex("66063d1201daebea")
PUMPFUN_SELL = bytes.fromhex("33e685a4017f83ad")
disc = ix.data[:8]
if disc == PUMPFUN_BUY:
# Parse buy parameters from remaining bytes
...
警告:識別子の値はプログラムごとに異なり、プログラムのバージョンによって変わることがあります。必ず現在のプログラム IDL と照合してください。PumpFun 固有の解析については、pumpfun-mechanics スキルを参照してください。
一般的なアーキテクチャ:ShredStream + Yellowstone
ほとんどの本番システムでは両方を使用します。
ShredStream (pre-execution) Yellowstone gRPC (post-execution)
│ │
▼ ▼
Intent Detection Confirmation + Reconciliation
"Wallet X is buying token Y" "Buy succeeded, wallet now holds Z"
│ │
▼ ▼
Pre-compute Response Execute / Update State
(route, sign, prepare bundle) (record PnL, update positions)
これにより、シグナル検出には ShredStream の速度を活用しながら、Yellowstone で信頼性の高い状態管理を実現できます。
デプロイ要件
- パブリック IP が必要 — NAT により UDP shred の配信が妨げられます
- ホストネットワークを使用 — Docker のブリッジモードでは shred パケットが破棄されます
- 受信 shred 用に UDP ポート 20000 を開放
- バリデーターの近くに配置 — フランクフルト、ニューヨーク、アムステルダム、ロンドン、東京を推奨
- ベアメタルを推奨 — クラウド VM では、NIC の共有により 1~5ms のジッターが発生します
インフラストラクチャの詳細については、references/deployment.md を参照してください。
ファイル
リファレンス
references/providers_compared.md— Jito ShredStream、Shyft RabbitStream、Triton Deshred の比較references/deployment.md— インフラストラクチャ要件、リージョンの選択、ファイアウォールの設定references/proto_reference.md— ShredStream の protobuf 定義と Entry の解析
スクリプト
scripts/parse_shredstream_entries.py— ShredStream の gRPC エントリーをデコードして分析scripts/rabbitstream_monitor.py— Shyft RabbitStream に接続し、実行前のトランザクションを監視