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

Установка

Сборка клиента

Клиент со всеми заданными опциями:
Минимальная настройка:
gRPC не требует API-ключа. URL берётся из переменной окружения ORBITFLARE_GRPC_URL.

Методы билдера

.URL(url) - Основной gRPC-эндпоинт. Резерв: ORBITFLARE_GRPC_URL. Используйте http:// для незашифрованного HTTP/2 и https:// для TLS.
.URLs(urls...) - Основной и резервные одним вызовом. Первый элемент - основной.
.FallbackURL(url) / .FallbackURLs(urls...) - Добавить резервные эндпоинты. При сбое соединения SDK перебирает их.
.Retry(policy) - Управляет backoff при переподключении. При обрыве соединения SDK ждёт InitialDelay, затем увеличивает задержку на каждой попытке (не выше MaxDelay). MaxAttempts равное 0 - бесконечные повторы. По умолчанию: 100 мс начальная, 30 с максимум, множитель 2x, бесконечно.
.Timeout(duration) - Таймаут подключения/набора. По умолчанию 30 с.
.Keepalive(duration) - Интервал keepalive TCP/HTTP2, используется для обнаружения мёртвых соединений на транспортном уровне. По умолчанию 60 с.
.PingInterval(duration) - Как часто SDK отправляет Ping-сообщения уровня протокола серверу. Сервер должен отвечать Pong. По умолчанию 10 с.
.MaxMissedPongs(n) - Сколько последовательных ping могут остаться без ответа, прежде чем SDK сочтёт соединение мёртвым и переподключится. По умолчанию 3. При значениях по умолчанию мёртвое соединение обнаруживается в течение 30 секунд.
.ChannelCapacity(n) - Ограниченный канал между фоновой горутиной и вашим кодом. Если ваш код медленно потребляет события, фоновая горутина блокируется при заполнении канала, а не расходует неограниченную память. По умолчанию 4096.
.Logger(logger) - *slog.Logger для событий жизненного цикла соединения. Если не задан, управляется через ORBITFLARE_LOG.

Построение подписки

Фильтры строятся программно с помощью SubscribeRequestBuilder и типизированных типов фильтров. Транзакция совпадает, если задействует любой адрес из AccountInclude; AccountExclude убирает совпадения; AccountRequired требует присутствия всех перечисленных адресов.

Типы фильтров

  • NewTransactionFilter() - Vote(bool), Failed(bool), Signature(string), AccountInclude(...), AccountExclude(...), AccountRequired(...).
  • NewAccountFilter() - Account(...), Owner(...), Datasize(uint64), TokenAccountState(bool), Memcmp(...), Lamports(...), NonemptyTxnSignature(bool).
  • NewSlotFilter() - FilterByCommitment(bool), InterslotUpdates(bool).
  • NewBlockFilter() - AccountInclude(...), IncludeTransactions(bool), IncludeAccounts(bool), IncludeEntries(bool).
  • NewDeshredTransactionFilter() - Vote(bool), AccountInclude(...), AccountExclude(...), AccountRequired(...).
Memcmp строится через geyser.MemcmpBytes(offset, []byte), geyser.MemcmpBase58(offset, string) или geyser.MemcmpBase64(offset, string). Lamports - через geyser.LamportsEq/Ne/Lt/Gt(uint64). Commitment - одно из geyser.Processed, geyser.Confirmed, geyser.Finalized. Subscribe также принимает сырой *geyser.SubscribeRequest (реэкспорт proto-типа), если вы предпочитаете собрать его вручную.

Чтение потока

Subscribe возвращает *geyser.Stream. Вызовите Next(ctx), чтобы получить следующее обновление:
Next(ctx) блокируется до прихода события. Возвращает io.EOF после завершения потока (в том числе после Close); любая другая ненулевая ошибка фатальна для этого потока. Также возвращает ctx.Err(), если контекст отменён. Сообщения Pong обрабатываются внутри и никогда не попадают в ваш поток.

Закрытие

Немедленно останавливает фоновую горутину. client.Close() останавливает каждый поток, запущенный клиентом.

Несколько потоков

Один клиент может вести много потоков одновременно. У каждого своё фоновое соединение:
Они разделяют состояние здоровья эндпоинтов: если один поток изолирует сбойный эндпоинт, остальные пропустят его при следующем переподключении. Но их соединения и жизненные циклы полностью независимы. Новые потоки можно запускать в любой момент.

Полный пример

Поток, отслеживающий транзакции pump.fun и печатающий сводку по каждой.