Перейти к основному содержанию

Доступные эндпоинты

Jetstream доступен во всех регионах OrbitFlare. Подключитесь к ближайшему к вашей инфраструктуре региону для минимальной задержки.
ГородИдентификатор регионаЭндпоинт
Нью-Йоркnyhttp://ny.jetstream.orbitflare.com
Солт-Лейк-Ситиslchttp://slc.jetstream.orbitflare.com
Эшбернashhttp://ash.jetstream.orbitflare.com
Лос-Анджелесlahttp://la.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 вам потребуется:
  1. Сгенерировать клиентский код из определения protobuf
  2. Реализовать метод Subscribe RPC для потоковой передачи данных
  3. Использовать SubscribeParsed для поддержки разобранных инструкций
  4. Использовать Ping/Pong для проверки работоспособности соединения
  5. Использовать GetVersion для проверки совместимости с сервером
  6. Обрабатывать различные типы обновлений (транзакции, аккаунты, 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

Лучшие практики

  1. Совместимость версий
    • Используйте GetVersion для проверки совместимости протокола
    • Отслеживайте критические изменения в бета-релизах
    • Тщательно тестируйте при обновлении
  2. Обработка ошибок
    • Реализуйте корректную обработку ошибок для всех типов сообщений
    • Обрабатывайте сбои соединения без потери данных
    • Проверяйте поля сообщений перед обработкой
  3. Управление соединением
    • Используйте Ping/Pong для проверки работоспособности соединения
    • Реализуйте логику автоматического переподключения
    • Устанавливайте подходящие тайм-ауты
  4. Производительность
    • Используйте подходящие фильтры для минимизации ненужных данных
    • Рассматривайте использование фильтрации по аккаунтам для больших наборов данных
    • Отслеживайте использование ресурсов, особенно при подписках на аккаунты
    • Используйте SubscribeParsed для поддержки разобранных инструкций при необходимости

Смотрите также

Поддержка

По техническим вопросам о спецификации протокола или деталях реализации посетите наш репозиторий на GitHub или присоединяйтесь к нашему сообществу в Discord.