apex-sender-client является эталонным клиентом для Apex. Он держит одно постоянное QUIC-соединение на каждый эндпоинт Apex, аутентифицируется клиентским сертификатом, производным от вашего API-ключа, отправляет одну сериализованную транзакцию на поток и переподключается с 0-RTT при обрыве соединения.
Установка
Крейт скоро появится на crates.io под именемapex-sender-client. Пока он не опубликован, устанавливайте его из GitHub-репозитория OrbitFlare:
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 с чаевыми и сообщает слот, в который оно попало.
Чего клиент не делает
- Не собирает и не подписывает транзакции и не выбирает вашу приоритетную комиссию.
- Не выполняет симуляцию и preflight-проверки. Этого не делает никто между вами и лидером.