Доступные эндпоинты
Jetstream доступен во всех регионах OrbitFlare. Подключитесь к ближайшему к вашей инфраструктуре региону для минимальной задержки.
Город Идентификатор региона Эндпоинт Нью-Йорк nyhttp://ny.jetstream.orbitflare.comСолт-Лейк-Сити slchttp://slc.jetstream.orbitflare.comЭшберн ashhttp://ash.jetstream.orbitflare.comЛос-Анджелес lahttp://la.jetstream.orbitflare.com
Город Идентификатор региона Эндпоинт Франкфурт frahttp://fra.jetstream.orbitflare.comАмстердам amshttp://ams.jetstream.orbitflare.comЛондон lonhttp://lon.jetstream.orbitflare.comДублин dubhttp://dub.jetstream.orbitflare.comШяуляй, Литва siauhttp://siau.jetstream.orbitflare.com
Город Идентификатор региона Эндпоинт Токио jphttp://jp.jetstream.orbitflare.comСингапур sgphttp://sgp.jetstream.orbitflare.com
Jetstream использует обычный http:// (не https://) для gRPC-соединений. gRPC использует собственное согласование безопасности транспорта через HTTP/2. Используйте https:// только если ваш выделенный узел явно требует этого.
Спецификация Protocol Buffer
Этот документ описывает спецификацию Protocol Buffer (protobuf), используемую OrbitFlare Jetstream. Полную спецификацию можно найти в нашем репозитории на GitHub .
Определение сервиса
syntax = "proto3" ;
import "google/protobuf/timestamp.proto" ;
package jetstream ;
// ============= Service Definition =============
service Jetstream {
// Subscribe to data streams with filtering support
rpc Subscribe ( stream SubscribeRequest ) returns ( stream SubscribeUpdate ) {}
// Subscribe to data streams with filtering support and parsed instructions
rpc SubscribeParsed ( stream SubscribeParsedRequest ) returns ( stream SubscribeUpdateParsedTransaction ) {}
// Basic ping/pong for connection testing
rpc Ping ( PingRequest ) returns ( PongResponse ) {}
// Get information about current state
rpc GetVersion ( GetVersionRequest ) returns ( GetVersionResponse ) {}
}
Сообщения запросов
SubscribeRequest
Основное сообщение запроса для подписки на обновления данных:
message SubscribeRequest {
map < string , SubscribeRequestFilterTransactions > transactions = 1 ;
map < string , SubscribeRequestFilterAccounts > accounts = 2 ;
optional SubscribeRequestPing ping = 4 ;
}
Фильтрация транзакций
message SubscribeRequestFilterTransactions {
repeated string account_include = 1 ;
repeated string account_exclude = 2 ;
repeated string account_required = 3 ;
}
Фильтрация аккаунтов
message SubscribeRequestFilterAccounts {
repeated string account = 1 ;
repeated string owner = 2 ;
repeated SubscribeRequestFilterAccountsFilter filters = 3 ;
}
message SubscribeRequestFilterAccountsFilter {
oneof filter {
SubscribeRequestFilterAccountsFilterMemcmp memcmp = 1 ;
uint64 datasize = 2 ;
SubscribeRequestFilterAccountsFilterLamports lamports = 3 ;
}
}
message SubscribeRequestFilterAccountsFilterMemcmp {
uint64 offset = 1 ;
oneof data {
bytes bytes = 2 ;
string base58 = 3 ;
string base64 = 4 ;
}
}
message SubscribeRequestFilterAccountsFilterLamports {
oneof cmp {
uint64 eq = 1 ;
uint64 ne = 2 ;
uint64 lt = 3 ;
uint64 gt = 4 ;
}
}
Ping-запрос
message SubscribeRequestPing {
int32 id = 1 ;
}
Сообщения ответов
SubscribeUpdate
Основное сообщение ответа, содержащее обновления:
message SubscribeUpdate {
repeated string filters = 1 ;
google.protobuf.Timestamp created_at = 2 ;
oneof update_oneof {
SubscribeUpdateTransaction transaction = 3 ;
SubscribeUpdateAccount account = 4 ;
SubscribeUpdatePing ping = 5 ;
SubscribeUpdatePong pong = 6 ;
}
}
Обновление транзакции
message SubscribeUpdateTransaction {
SubscribeUpdateTransactionInfo transaction = 1 ;
uint64 slot = 2 ;
}
message SubscribeUpdateTransactionInfo {
bytes signature = 1 ;
uint64 slot = 2 ;
uint32 num_required_signatures = 3 ;
uint32 num_readonly_signed_accounts = 4 ;
uint32 num_readonly_unsigned_accounts = 5 ;
bytes recent_blockhash = 6 ;
repeated bytes signatures = 7 ;
repeated bytes account_keys = 8 ;
repeated CompiledInstruction instructions = 9 ;
repeated MessageAddressTableLookup address_table_lookups = 10 ;
}
Обновление аккаунта
message SubscribeUpdateAccount {
SubscribeUpdateAccountInfo account = 1 ;
uint64 slot = 2 ;
bool is_startup = 3 ;
}
message SubscribeUpdateAccountInfo {
bytes pubkey = 1 ;
uint64 lamports = 2 ;
bytes owner = 3 ;
bool executable = 4 ;
uint64 rent_epoch = 5 ;
bytes data = 6 ;
uint64 write_version = 7 ;
optional bytes txn_signature = 8 ;
}
Обновления Ping/Pong
message SubscribeUpdatePing {}
message SubscribeUpdatePong {
int32 id = 1 ;
}
Общие типы
message MessageAddressTableLookup {
bytes account_key = 1 ;
bytes writable_indexes = 2 ;
bytes readonly_indexes = 3 ;
}
message CompiledInstruction {
uint32 program_id_index = 1 ;
bytes accounts = 2 ;
bytes data = 3 ;
}
Поддержка разобранных инструкций
Разобранный запрос
message SubscribeParsedRequest {
optional SubscribeRequestPing ping = 1 ;
}
Обновление разобранной транзакции
message SubscribeUpdateParsedTransaction {
bytes signature = 1 ;
uint64 slot = 2 ;
SubscribeUpdateAccount account = 3 ;
bytes recent_blockhash = 4 ;
repeated bytes signatures = 5 ;
repeated Instruction instructions = 6 ;
}
Типы инструкций
message Instruction {
oneof instruction_oneof {
Initialize initialize = 1 ;
SetParams set_params = 2 ;
Create create = 3 ;
Buy buy = 4 ;
Sell sell = 5 ;
Withdraw withdraw = 6 ;
}
}
message Initialize {}
message SetParams {
bytes fee_recipient = 1 ;
uint64 initial_virtual_token_reserves = 2 ;
uint64 initial_virtual_sol_reserves = 3 ;
uint64 initial_real_token_reserves = 4 ;
uint64 token_total_supply = 5 ;
uint64 fee_basis_points = 6 ;
}
message Create {
string name = 1 ;
string symbol = 2 ;
string uri = 3 ;
}
message Buy {
uint64 amount = 1 ;
uint64 max_sol_cost = 2 ;
}
message Sell {
uint64 amount = 1 ;
uint64 min_sol_output = 2 ;
}
message Withdraw {}
Нестриминговые методы
message PingRequest {
int32 count = 1 ;
}
message PongResponse {
int32 count = 1 ;
}
message GetVersionRequest {}
message GetVersionResponse {
string version = 1 ;
}
message GetSlotResponse {
uint64 slot = 1 ;
}
Использование протокола
При реализации клиента для Jetstream вам потребуется:
Сгенерировать клиентский код из определения protobuf
Реализовать метод Subscribe RPC для потоковой передачи данных
Использовать SubscribeParsed для поддержки разобранных инструкций
Использовать Ping/Pong для проверки работоспособности соединения
Использовать GetVersion для проверки совместимости с сервером
Обрабатывать различные типы обновлений (транзакции, аккаунты, pong)
Генерация кода
Для TypeScript/JavaScript:
protoc --plugin=protoc-gen-ts_proto=./node_modules/.bin/protoc-gen-ts_proto \
--ts_proto_out=. \
--ts_proto_opt=esModuleInterop=true \
jetstream.proto
Для Rust:
protoc --rust_out=. jetstream.proto
Лучшие практики
Совместимость версий
Используйте GetVersion для проверки совместимости протокола
Отслеживайте критические изменения в бета-релизах
Тщательно тестируйте при обновлении
Обработка ошибок
Реализуйте корректную обработку ошибок для всех типов сообщений
Обрабатывайте сбои соединения без потери данных
Проверяйте поля сообщений перед обработкой
Управление соединением
Используйте Ping/Pong для проверки работоспособности соединения
Реализуйте логику автоматического переподключения
Устанавливайте подходящие тайм-ауты
Производительность
Используйте подходящие фильтры для минимизации ненужных данных
Рассматривайте использование фильтрации по аккаунтам для больших наборов данных
Отслеживайте использование ресурсов, особенно при подписках на аккаунты
Используйте SubscribeParsed для поддержки разобранных инструкций при необходимости
Смотрите также
Обзор Jetstream Руководство по началу работы, примеры и документация по фильтрации.
Журнал изменений История версий и обновления протокола.
Поддержка
По техническим вопросам о спецификации протокола или деталях реализации посетите наш репозиторий на GitHub или присоединяйтесь к нашему сообществу в Discord .