Как читать ошибку liteserver

На каждый запрос liteserver отвечает либо запрошенным объектом, либо liteServer.error с целочисленным code и текстом message. Шлюз TONNode использует тот же конверт для собственных отказов, поэтому ваша библиотека показывает их так же, как любую ошибку ноды: tonutils-go хранит код в ton.LSError, pytoniq бросает LiteServerError с .code и .message, а ton-lite-client — Error, в котором только текст.

Коды приходят из двух мест, и таблица помечает, откуда именно:

  • Коды шлюза — 400, 403, 429, 500, 502 — выдаёт шлюз TONNode, стоящий между вашим ADNL-соединением и нодой. Он сверяет метод с тарифом, применяет лимит скорости и потолок параллелизма и направляет запрос на лёгкую или архивную ноду. Эти строки повторяют главу 5 документации LiteServers.
  • Коды ноды приходят из софта ноды в ton-blockchain/ton. -400 — код по умолчанию, с которым отправляется текст ошибки LiteQuery, -503 timeout — собственный дедлайн ноды на запрос, а 651 и 652 — это ErrorCode::notready и ErrorCode::timeout из common/errorcode.h. Две строки порождает сам C++-клиент (lite-client, tonlib), а не сервер; библиотеки на других языках в тех же ситуациях бросают собственные исключения.

Самые важные

403 archive history is not included in this plan. Единственный сигнал, который имеет значение при обходе истории. Запросу понадобился блок, которого лёгкая нода уже не хранит — она держит около двух дней истории при текущей скорости блоков, это порядок величины, а не обещание, — а в тарифе нет архива. Повторять бессмысленно: либо добавьте архив в тариф, либо запросите более свежий блок. Глава 4 объясняет, где проходит граница, и содержит пробу, которая измеряет её для вашего ключа.

429 — три разных лимита. too many requests — лимит скорости на ключ, leaky bucket в единицах стоимости: обычное чтение стоит 5, полная страница getTransactions — до 16, целый блок — 50. too many concurrent requests for this key — потолок запросов в полёте: половина RPS тарифа, не меньше 8 и не больше 128. gateway is saturated — общий потолок в 256 запросов в полёте по всем клиентам. Первые два означают, что клиенту нужен темп; последний — что бэкенду тяжело, и правильный ответ — задержка перед повтором. В главе 7 есть таблица стоимости и примеры клиента с заданным темпом.

502 backend node timeout. Нода не ответила в окно шлюза: 7 с для лёгкой ноды, 20 с для архива. Установите собственный таймаут клиента выше этих значений; более короткий превращает настоящий 502 в локальный таймаут и теряет диагноз.

651 и семейство «not in db». block … is not applied, block … is not in db и lt not in db несут ErrorCode::notready. Все они означают, что у этой ноды нет готовым того, что вы запросили: она ещё догоняет сеть, блок опережает её состояние, либо блок или логическое время старше её хранилища. Свежий блок появится сам; для старого нужен архив.

Что повторять

429 повторяйте с задержкой, 502 — один раз сразу. 403 не повторяйте — ни один из вариантов не станет верным со второй попытки. -400 из обхода транзакций тоже не повторяйте: это граница, а не сбой. Для 651 повторите через мгновение запрос блока новее состояния ноды и перестаньте повторять запрос блока старше её хранилища.

Ошибки мемпул-стрима

Мемпул-стрим — другой протокол со своим списком ошибок: JSON-сообщения error и коды закрытия WebSocket вроде 4401 и 4429. Эта таблица его не охватывает.