Protobuf スキーマリポジトリ
公式 ChainStream Protobuf スキーマ定義。Go と Python をサポートし、EVM、Solana、TRON のすべてのメッセージタイプを含みます。
サポートマトリクス
| チェーン | dex.trades | tokens | balances | dex.pools | transfers | candlesticks |
|---|---|---|---|---|---|---|
| Ethereum (eth) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| BSC (bsc) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Solana (sol) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| TRON (tron) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
すべてのチェーンで
token-supplies、token-prices、token-holdings、token-market-caps、trade-stats Topic もサポートしています。詳細は完全な Topic リストを参照してください。Kafka Streams vs WebSocket 選択ガイド
Kafka Streams を選ぶべきとき
レイテンシ重視
レイテンシが最重要課題で、アプリケーションがクラウドまたは専用サーバーにデプロイされている場合
メッセージの信頼性
メッセージの欠落が許容できず、耐久性があり信頼性の高いデータ消費が必要な場合
複雑な処理
前処理機能を超える複雑な計算、フィルタリング、フォーマットが必要な場合
水平スケーリング
消費能力のためにマルチインスタンスの水平スケーリングが必要な場合
WebSocket を選ぶべきとき
高速プロトタイピング
プロトタイプの構築で、開発速度が最優先の場合
統一インターフェース
アプリケーションが履歴データとリアルタイムデータの両方を統一されたクエリ・サブスクリプションインターフェースで必要とする場合
ブラウザサイド
アプリケーションがブラウザで直接データを消費する場合(Kafka Streams はサーバーサイドのみサポート)
動的フィルタリング
ページコンテンツに基づいてデータを動的にフィルタリングする必要がある場合
比較まとめ
| 機能 | Kafka Streams | WebSocket |
|---|---|---|
| レイテンシ | 最低 | 低 |
| 信頼性 | 永続的、メッセージ欠落なし | 切断時に欠落の可能性 |
| スケーラビリティ | ネイティブな水平スケーリング | 追加設計が必要 |
| データフィルタリング | クライアント側処理 | サーバー側事前フィルタリング |
| クライアントサポート | サーバーサイドのみ | サーバー + ブラウザ |
| 統合の複雑さ | より高い | より低い |
認証情報の取得
Kafka Streams は独立した認証情報を使用し、ChainStream チームに連絡してアクセスを申請する必要があります。申請連絡
support@chainstream.io にメールを送信して Kafka Streams へのアクセスを申請
接続設定
ブローカーアドレス
ブローカーアドレスは申請承認後に認証情報と一緒に提供されます。未許可のアドレスでの接続は行わないでください。
SASL_SSL 接続設定
- Python
- JavaScript
- Go
Topic 命名規則と完全リスト
命名規則
Topic は以下の命名パターンに従います:{chain} には sol、bsc、eth、tron が含まれます。
メッセージタイプ
| タイプ | 説明 |
|---|---|
dex.trades | DEX 取引イベント |
dex.pools | 流動性プールイベント |
tokens | トークンイベント |
balances | 残高変更イベント |
transfers | 送金イベント |
token-supplies | トークン供給イベント |
token-prices | トークン価格イベント |
token-holdings | トークン保有データ |
token-market-caps | トークン時価総額イベント |
candlesticks | OHLCV ローソク足データ |
trade-stats | 取引統計 |
完全な Topic リスト
- クロスチェーン Topic
- Solana 固有
- EVM 固有
- TRON 固有
以下の Topic はすべてのサポートチェーンに適用されます(
{chain} を sol、bsc、eth に置き換え):消費モードとオフセット管理
Topic をサブスクライブする際に考慮すべき 2 つのコア設定:オフセット戦略の選択
コンシューマーは Kafka に接続後、どこからメッセージの読み取りを開始するかを決定する必要があります。2 つの一般的な戦略:- 最新のみ消費
- 永続的消費
各接続時に現在の最新位置から開始。リアルタイムデータのみを気にするシナリオに適しています。再接続時に過去のメッセージのリプレイはありません。
Group ID ルール
同じ Group ID で複数インスタンスをデプロイすると、フェイルオーバーと負荷分散が可能になります — 同じ Topic のメッセージは Group 内の 1 つのインスタンスのみが消費し、Kafka がインスタンス間でパーティションを自動分配します。クイックスタート:5 分で最初のコンシューマー
以下の例は、eth.dex.trades Topic を消費して DEX 取引データをパースする方法を示しています。
コアデータ構造
すべてのメッセージタイプは以下のベース構造を共有しています(common/common.proto で定義):
ベース構造
- Block
- Transaction
- Instruction
- DApp
ブロック情報:
| フィールド | 型 | 説明 |
|---|---|---|
timestamp | int64 | ブロックタイムスタンプ |
hash | string | ブロックハッシュ |
height | uint64 | ブロック高さ |
slot | uint64 | スロット番号(Solana) |
主要メッセージタイプ
TradeEvent - DEX 取引イベント
TradeEvent - DEX 取引イベント
Topic: Trade コアフィールド:
TradeProcessed 拡張フィールド(processed topic):
{chain}.dex.trades| フィールド | 説明 |
|---|---|
token_a_address / token_b_address | 取引ペアのトークンアドレス |
user_a_amount / user_b_amount | ユーザー取引量 |
pool_address | プールアドレス |
vault_a / vault_b | プールのボールトアドレス |
vault_a_amount / vault_b_amount | ボールト量 |
| フィールド | 説明 |
|---|---|
token_a_price_in_usd / token_b_price_in_usd | USD 価格 |
token_a_price_in_native / token_b_price_in_native | ネイティブ通貨価格 |
is_token_a_price_in_usd_suspect | 価格が不審かどうか |
is_token_a_price_in_usd_suspect_reason | 不審な理由 |
TokenEvent - トークンイベント
TokenEvent - トークンイベント
Topic: Token コアフィールド:
{chain}.tokens、{chain}.tokens.created| フィールド | 説明 |
|---|---|
address | トークンアドレス |
name / symbol | 名前とシンボル |
decimals | 小数桁数 |
uri | メタデータ URI |
metadata_address | メタデータアドレス |
creators | 作成者リスト |
solana_extra | Solana 固有フィールド |
evm_extra | EVM 固有フィールド (token_standard) |
BalanceEvent - 残高変更イベント
BalanceEvent - 残高変更イベント
Topic: Balance コアフィールド:
{chain}.balances| フィールド | 説明 |
|---|---|
token_account_address | トークンアカウントアドレス |
account_owner_address | アカウントオーナーアドレス |
token_address | トークンアドレス |
pre_amount / post_amount | 変更前/後の残高 |
decimals | 小数桁数 |
lifecycle | アカウントライフサイクル (NEW/EXISTING/CLOSED) |
DexPoolEvent - 流動性プールイベント
DexPoolEvent - 流動性プールイベント
Topic: DexPool コアフィールド:
{chain}.dex.pools| フィールド | 説明 |
|---|---|
address | プールアドレス |
token_a_address / token_b_address | トークンアドレス |
token_a_vault_address / token_b_vault_address | ボールトアドレス |
token_a_amount / token_b_amount | トークン量 |
lp_wallet | LP ウォレットアドレス |
CandlestickEvent - ローソク足データ
CandlestickEvent - ローソク足データ
Topic:
{chain}.candlesticks| フィールド | 説明 |
|---|---|
token_address | トークンアドレス |
resolution | 時間解像度 (1m, 5m, 15m, 1h 等) |
timestamp | タイムスタンプ |
open / high / low / close | OHLC 価格 (USD) |
open_in_native / high_in_native / low_in_native / close_in_native | OHLC 価格 (ネイティブ) |
volume / volume_in_usd / volume_in_native | 取引量 |
trades | 取引件数 |
dimension | ディメンションタイプ (TOKEN_ADDRESS/POOL_ADDRESS/PAIR) |
TradeStatEvent - 取引統計
TradeStatEvent - 取引統計
Topic:
{chain}.trade-stats| フィールド | 説明 |
|---|---|
token_address | トークンアドレス |
resolution | 時間解像度 |
buys / sells | 買い/売り件数 |
buyers / sellers | 買い手/売り手数 |
buy_volume / sell_volume | 買い/売り出来高 |
buy_volume_in_usd / sell_volume_in_usd | USD 出来高 |
high_in_usd / low_in_usd | 高値/安値 |
TokenHoldingEvent - 保有統計
TokenHoldingEvent - 保有統計
Topic:
{chain}.token-holdings| フィールドグループ | 説明 |
|---|---|
top10_holders / top10_amount / top10_ratio | トップ 10 保有者統計 |
top50_holders / top50_amount / top50_ratio | トップ 50 保有者統計 |
top100_holders / top100_amount / top100_ratio | トップ 100 保有者統計 |
holders | 総保有者数 |
creators_count / creators_amount / creators_ratio | 作成者保有統計 |
fresh_count / fresh_amount / fresh_ratio | フレッシュウォレット保有統計 |
smart_count / smart_amount / smart_ratio | スマートマネー保有統計 |
sniper_count / sniper_amount / sniper_ratio | スナイパー保有統計 |
insider_count / insider_amount / insider_ratio | インサイダー保有統計 |
TokenPriceEvent - 価格イベント
TokenPriceEvent - 価格イベント
Topic:
{chain}.token-prices| フィールド | 説明 |
|---|---|
token_address | トークンアドレス |
price_in_usd | USD 価格 |
price_in_native | ネイティブ通貨価格 |
TokenSupplyEvent - 供給イベント
TokenSupplyEvent - 供給イベント
Topic:
{chain}.token-supplies| フィールド | 説明 |
|---|---|
type | イベントタイプ (INITIALIZE_MINT/MINT/BURN) |
token_address | トークンアドレス |
amount | 量 |
decimals | 小数桁数 |
amount_with_decimals | 小数桁数付きの量 |
メッセージ特性と注意事項
Kafka Streams を消費する際、開発者は以下のメッセージ特性を認識しておく必要があります:フィルタリングなしの完全データストリーム
フィルタリングなしの完全データストリーム
ストリームは事前フィルタリングを行わず、Topic 内のすべてのメッセージと完全なデータを含みます。コンシューマーには十分なネットワークスループット、サーバー性能、効率的なパースコードが必要です。
同一エンティティのメッセージは順序保証
同一エンティティのメッセージは順序保証
同じトークンまたは同じアカウントのメッセージは厳密にブロック順序で到着します。特定のトークンやウォレットアドレスのイベントストリームは順序が保証され、状態変更の追跡が容易です。ただし、異なるトークン/アカウント間のメッセージ到着順序は保証されません。
メッセージの重複が発生する場合がある
メッセージの重複が発生する場合がある
同じメッセージが複数回配信される場合があります。重複処理が問題を引き起こす場合、コンシューマーはキャッシュやストレージを使用した冪等処理を実装する必要があります。
メッセージの完全性は保証
メッセージの完全性は保証
ChainStream は各メッセージの完全性を保証します。メッセージが分割されることはありません。ブロックに含まれるトランザクション数に関係なく、受信するメッセージは完全なデータ単位です。
Protobuf バイナリ形式
Protobuf バイナリ形式
メッセージは Protobuf エンコーディングを使用し、JSON よりコンパクトです。コンシューマーは対応する言語の Protobuf ライブラリを使用してパースする必要があります。
レイテンシモデル
Kafka Streams のレイテンシは、データがパイプライン内で通過する処理ステージに依存します。同じチェーンの異なる Topic は異なるレイテンシを持ちます:Broadcasted vs Committed
| タイプ | 説明 | レイテンシ | データ確実性 |
|---|---|---|---|
| Broadcasted | ブロードキャスト段階で消費可能、ブロック確認不要 | 最低 | 低め |
| Committed | ブロック確認後にストリームに入る | 高め | 最高 |
パイプラインレイテンシ
ブロックチェーンノードから Kafka Topic までの各変換レイヤー(パーシング、構造化、エンリッチメント)がおよそ 100〜1000ms のレイテンシを追加します:- raw topic: 最低レイテンシ、生のノードデータに最も近い
- transactions topic: パース・構造化済み
- dextrades topic: 相対的に高いレイテンシだが、よりリッチなデータ
ベストプラクティス
パーティション並列消費
Kafka Topic は複数のパーティションに分割されており、各パーティションの並列読み取りがスループットを最大化します。 メッセージパーティションキーはトークンアドレスまたはウォレットアドレス(全チェーンで統一)に設定されており、以下が保証されます:- 同じトークンのすべてのイベントが同じパーティションにルーティングされ、順序を保証
- 同じウォレットのすべての残高変更が同じパーティションにルーティングされ、状態追跡が容易
継続的消費、メインループをブロックしない
コンシューマーの読み取りループは継続的に実行し、メッセージ処理のブロックによるバックログを避けてください。メッセージの処理が必要な場合は非同期処理モードを採用:メインループは読み取りを担当し、処理ロジックはワーカースレッドに委任します。メッセージ処理効率
バッチ処理はオーバーヘッドを削減できますが、バッチサイズとレイテンシのバランスが必要です。Go では channel + ワーカーグループを使用した並行処理が効果的です。チェーン別ドキュメント
EVM Streams
Ethereum、BSC、Base、Polygon、Optimism
Solana Streams
Solana 高スループットデータストリーム
TRON Streams
TRON ネットワークデータストリーム
関連ドキュメント
リアルタイムストリーミング
WebSocket リアルタイムデータ統合ガイド
認証ガイド
Access Token の取得

