Cómo leer un error de liteserver
Un liteserver responde a cada consulta con el objeto pedido o con un liteServer.error que lleva un code entero y un message. El gateway de TONNode usa el mismo sobre para sus propios rechazos, así que tu biblioteca los muestra como muestra cualquier error del nodo: tonutils-go conserva el código en ton.LSError, pytoniq lanza LiteServerError con .code y .message, y ton-lite-client lanza un Error cuyo mensaje es solo el texto.
Los códigos vienen de dos sitios, y la tabla marca cuál:
- Códigos del gateway —
400,403,429,500,502— los produce el gateway de TONNode que se sitúa entre tu conexión ADNL y el nodo. Comprueba el método contra tu plan, aplica el límite de tasa y el techo de concurrencia, y enruta la consulta a un nodo ligero o a un nodo de archivo. Estas filas reproducen el capítulo 5 de la documentación de LiteServers. - Códigos del nodo vienen del software del nodo en
ton-blockchain/ton.-400es el código por defecto con el que se envía el texto de un fallo deLiteQuery,-503 timeoutes el plazo por consulta del propio nodo, y651y652sonErrorCode::notreadyyErrorCode::timeoutdecommon/errorcode.h. Dos filas las produce el propio cliente C++ (lite-client,tonlib) y no el servidor; otros lenguajes lanzan sus propias excepciones en esas situaciones.
Los que más importan
403 archive history is not included in this plan. La única señal que importa cuando recorres la historia. La consulta necesitaba un bloque que el nodo ligero ya no conserva — el nodo ligero guarda unos dos días de historia al ritmo actual de bloques, un orden de magnitud más que una promesa — y el plan no tiene alcance de archivo. No se puede reintentar: añade archivo al plan o pide un bloque más reciente. El capítulo 4 explica dónde está el límite e incluye una sonda que lo mide para tu clave.
429, tres límites distintos. too many requests es el límite de tasa por clave, un leaky bucket denominado en unidades de coste: una lectura ordinaria cuesta 5, una página completa de getTransactions hasta 16, un bloque entero 50. too many concurrent requests for this key es el techo de consultas en vuelo — la mitad del RPS del plan, con un mínimo de 8 y un máximo de 128. gateway is saturated es el techo global de 256 consultas en vuelo entre todos los clientes. Los dos primeros significan que tu cliente necesita regular su ritmo; el último, que el backend está sufriendo, y la respuesta correcta es el backoff. El capítulo 7 tiene la tabla de costes y fragmentos de cliente con ritmo regulado.
502 backend node timeout. El nodo no respondió dentro de la ventana del gateway: 7 s para el nodo ligero, 20 s para el archivo. Pon tu propio timeout de cliente por encima de esos valores; uno más corto convierte un 502 real en un timeout local y pierde el diagnóstico.
651 y la familia "not in db". block … is not applied, block … is not in db y lt not in db llevan todos ErrorCode::notready. Significan que este nodo no tiene listo lo que pediste: todavía se está poniendo al día, el bloque va por delante de su estado, o el bloque o el tiempo lógico son más antiguos que su almacenamiento. Un bloque reciente aparecerá por sí solo; uno antiguo necesita archivo.
Qué reintentar
Reintenta 429 con backoff y 502 una vez, de inmediato. No reintentes 403 — ninguna variante se vuelve cierta en un segundo intento. Tampoco reintentes -400 de un recorrido de transacciones; es un límite, no un fallo pasajero. Para 651, reintenta tras un momento un bloque más nuevo que el estado del nodo, y deja de reintentar uno más antiguo que su almacenamiento.
Errores del stream de mempool
El stream de mempool es un protocolo distinto con su propia lista de errores — mensajes JSON error y códigos de cierre de WebSocket como 4401 y 4429 — y no está cubierto por esta tabla.
