Доступные эндпоинты
Jetstream доступен во всех регионах OrbitFlare. Подключитесь к ближайшему к вашей инфраструктуре региону для минимальной задержки.
| Город | Идентификатор региона | Эндпоинт |
|---|
| Нью-Йорк | ny | http://ny.jetstream.orbitflare.com |
| Солт-Лейк-Сити | slc | http://slc.jetstream.orbitflare.com |
| Эшберн | ash | http://ash.jetstream.orbitflare.com |
| Лос-Анджелес | la | http://la.jetstream.orbitflare.com |
| Город | Идентификатор региона | Эндпоинт |
|---|
| Франкфурт | fra | http://fra.jetstream.orbitflare.com |
| Амстердам | ams | http://ams.jetstream.orbitflare.com |
| Лондон | lon | http://lon.jetstream.orbitflare.com |
| Дублин | dub | http://dub.jetstream.orbitflare.com |
| Шяуляй, Литва | siau | http://siau.jetstream.orbitflare.com |
| Город | Идентификатор региона | Эндпоинт |
|---|
| Токио | jp | http://jp.jetstream.orbitflare.com |
| Сингапур | sgp | http://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 для поддержки разобранных инструкций при необходимости
Смотрите также
Поддержка
По техническим вопросам о спецификации протокола или деталях реализации посетите наш репозиторий на GitHub или присоединяйтесь к нашему сообществу в Discord.