Skip to main content
apex-sender-client является эталонным клиентом для Apex. Он держит одно постоянное QUIC-соединение на каждый эндпоинт Apex, аутентифицируется клиентским сертификатом, производным от вашего API-ключа, отправляет одну сериализованную транзакцию на поток и переподключается с 0-RTT при обрыве соединения.

Установка

Крейт скоро появится на crates.io под именем apex-sender-client. Пока он не опубликован, устанавливайте его из GitHub-репозитория OrbitFlare:
Когда он появится на crates.io:
Фича rpc добавляет HTTP-хелперы: getTipAccounts, JSON-RPC sendTransaction, бинарные маршруты, а также хелпер для blockhash и подтверждения на любом Solana RPC. Сам путь QUIC не имеет HTTP-зависимостей, поэтому не включайте эту фичу, если вам нужен только QUIC. Крейт требует Rust 1.92 или новее.

Быстрый старт

Полную программу с Cargo.toml см. на вкладке Rust в разделе Быстрый старт.

Регионы

Region перечисляет все эндпоинты Apex. Region::parse("fra") и Region::code() преобразуют короткие коды в обе стороны, а Region::ALL содержит их список. region.quic_endpoint() возвращает <code>.apex.orbitflare.com:7001, а region.rpc_url() возвращает http://<code>.apex.orbitflare.com. См. Эндпоинты и регионы.

Транспорты

Транспорт не влияет на приоритет и маршрутизацию. На них влияют чаевые.

API

Clone клиента обходится дёшево, и клоны разделяют одно соединение. Создайте его один раз и раздайте клоны своим задачам.
В крейте пока нет хелпера для бандлов. Отправляйте бандлы через sendBundle или POST /send-bundle по HTTP.

Параметры

ClientOptions реализует Default, поэтому задавайте только то, что вам нужно:

Keep-alive и переподключения

Соединение остаётся открытым благодаря QUIC PING каждую секунду при тайм-ауте простоя 30 секунд на эндпоинте Apex. В прогретом соединении отправка сводится к одному открытию потока и одной записи. Если соединение оборвалось:
  • Фоновая задача замечает это и сразу выполняет новое рукопожатие (proactive_reconnect), поэтому следующая отправка обычно находит живое соединение.
  • Переподключение использует закэшированный сессионный тикет и отправляет ожидающую транзакцию в первом пакете рукопожатия (0-RTT). Если эндпоинт отклоняет ранние данные, клиент отправляет их повторно после рукопожатия.
  • Отправка, которая не удалась из-за потери соединения, переподключается и повторяется один раз (auto_reconnect). Установите значение false, чтобы обрабатывать это самостоятельно.
health(), reconnects_total() и zero_rtt_resumptions_total() показывают, что произошло. Экспортируйте их в свои метрики.

Ошибки

HTTP-хелперы возвращают rpc::RpcError: Http для транспортных сбоев, Rpc { code, message } для отклонения JSON-RPC или простого HTTP-маршрута и BadResponse.

Примеры в репозитории

Все примеры читают APEX_API_KEY, KEYPAIR_PATH (по умолчанию payer.json), SOLANA_RPC_URL и при необходимости APEX_REGION, APEX_QUIC, APEX_RPC, TIP_LAMPORTS и APEX_TX_VERSION (legacy или v1). Каждый отправляет memo с чаевыми и сообщает слот, в который оно попало.
Типичный вывод в mainnet от клиента, расположенного рядом с эндпоинтом Apex:

Чего клиент не делает

  • Не собирает и не подписывает транзакции и не выбирает вашу приоритетную комиссию.
  • Не выполняет симуляцию и preflight-проверки. Этого не делает никто между вами и лидером.