Як читати помилку 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. Ця таблиця його не охоплює.