Artículo de blog
Author
Stellar Development Foundation
[Publishing date]
Transactions
Timeouts
Fees
¿Estás recibiendo más errores de los que esperabas al enviar transacciones a Stellar? ¿No estás seguro de cómo manejarlos? ¡Esta FAQ es para ti!
El objetivo es dar una explicación a alto nivel de un error de Horizon sobre el que varias personas han preguntado — el error de tiempo de espera 504 — y de paso, responder algunas preguntas fundamentales sobre el envío de transacciones, tarifas y tarifas de sobrecarga en Stellar. Debería ayudarte, como desarrollador o empresa que construye en Stellar, a entender cómo optimizar el envío de tarifas para que tus transacciones tengan más probabilidades de ser procesadas por la red de manera oportuna.
Mensaje clave: si estás recibiendo muchos errores de tiempo de espera 504 de Horizon, es probable que la red esté en modo de tarifas de sobrecarga, y la tarifa que estás enviando para tus transacciones es demasiado baja. La solución: enviar ofertas de tarifas más altas. Las tarifas en Stellar son dinámicas, por lo que la tarifa que envías es el máximo que estás dispuesto a pagar. Se te cobrará lo mínimo necesario para hacer el libro de contabilidad.
Además de esta FAQ, también tenemos una guía — Cómo manejar los errores de manera elegante — que profundiza en los tipos de errores comunes, y ofrece sugerencias prácticas para lidiar con ellos. Deberías echarle un vistazo para entender los entresijos del envío de transacciones y la gestión de errores.
No. La red está funcionando de manera excelente. Ha procesado casi 2 mil millones de operaciones desde su inicio, y alrededor de 500 millones en los últimos 6 meses solamente. Los libros de contabilidad siguen cerrando en aproximadamente 5 segundos, y el rendimiento sigue siendo alto. Para una visualización rápida, echa un vistazo al tablero de la red.
Sin embargo, lo que está sucediendo es que hay más actividad en la red, lo que está aumentando la competencia por el espacio en el libro de contabilidad. Cuando el número de operaciones enviadas a la red excede el límite del libro de contabilidad, la red entra en modo de tarifas de sobrecarga, en ese momento, las tarifas sirven como ofertas, y las transacciones que ofrecen tarifas más altas por operación tienen prioridad para ser incluidas en el conjunto de transacciones que se aplican al libro de contabilidad. Si tu oferta de tarifa es demasiado baja, es posible que te quedes fuera del precio.
Actualmente, la red pública está configurada para permitir 1,000 operaciones por libro de contabilidad.
Recordatorio rápido: en el lenguaje de Stellar, un Una operación es un comando individual que modifica el libro mayor. En este momento, hay 18 operaciones posibles, incluida la operación de pago, operaciones de pago de ruta, y operaciones para colocar órdenes de compra y venta en el DEX.
Una transacción es un paquete de 1-100 operaciones. Para modificar el libro mayor — en otras palabras, para hacer algo en Stellar — tomas operaciones, las agrupas en una transacción, y envuelves esa en un sobre de transacción que contiene las firmas necesarias, el cual luego envías a un nodo Stellar Core. Generalmente, creas y firmas la transacción usando un SDK de Stellar, y generalmente, ese SDK de Stellar utiliza Horizon, la API de Stellar, para enviarla.
Suponiendo que una transacción es válida, el nodo Stellar Core que la recibe la comparte con otros nodos Stellar Core, que trabajan juntos para crear un conjunto combinado de transacciones válidas. Los nodos que están preparados para validar luego ratifican ese conjunto de transacciones a través de un proceso de votación de múltiples etapas, y lo aplican para cambiar el estado del libro mayor. Para obtener más información sobre ese proceso, consulta el Ciclo de Vida de la Transacción.
Desde la actualización del Protocolo 11 en 2019, el tamaño máximo de un conjunto de transacciones — también conocido como límite del libro mayor — se ha medido en operaciones/libro mayor en lugar de transacciones/libro mayor. La razón: las operaciones son las que se aplican para alterar cuentas, saldos y órdenes, y no son variables en tamaño como las transacciones, por lo que utilizarlas para establecer el límite del libro mayor permite un mayor rendimiento consistente. El protocolo básicamente examina las transacciones, cuenta el número de operaciones en su interior, e intenta acomodar la mayor cantidad de transacciones posible dado el límite del libro mayor.
El límite del libro mayor es una configuración de red, y al igual que todas las configuraciones de red, es determinado por validadores, que votan sobre él al igual que votan para aplicar un conjunto de transacciones al libro mayor. Poco después de la actualización del Protocolo 11, los validadores establecieron el límite del libro mayor en 1,000 operaciones/libro mayor, y ha permanecido allí desde entonces.
Al establecer el límite del libro mayor, los validadores intentan encontrar un equilibrio: quieren permitir suficiente rendimiento para soportar el uso de la red, pero también quieren asegurarse de que los nodos en todo el mundo con acceso a hardware de gama baja y una conectividad más lenta aún puedan mantenerse al día y participar en el consenso.
En cualquier momento, los validadores de la red Stellar pueden votar para aumentar el límite del libro mayor. Sin embargo, dado que una gran parte del tráfico actual de la red consiste en transacciones de arbitraje enviadas por bots destinadas a fallar (más información sobre eso a continuación), es poco probable que aumentar el límite del libro mayor en este momento haga mucho para reducir los precios de las transacciones. Simplemente daría a los bots más espacio para operar.
Si estás leyendo esto y tienes una opinión sobre los límites del libro mayor, ten en cuenta que puedes ejecutar tu propio validador para participar en la red y votar sobre dónde establecerlos. ¿Quién puede ejecutar un validador de Stellar? Cualquiera puede. ¡Tú puedes!
Las tarifas en Stellar son dinámicas. Existe una tarifa mínima requerida para todas las transacciones, la cual, al igual que el límite del libro mayor, es una configuración de red determinada por los validadores. Actualmente, es de 100 stroops por operación. ¡Eso es 0.00001 XLM!
Cuando la actividad de la red está por debajo del límite del libro mayor, todas las transacciones válidas se registran en el libro mayor y se les aplica la tarifa mínima. Cuando el número de operaciones enviadas supera el límite del libro mayor, la red entra en modo de tarifas de emergencia. Dado que no todas las transacciones pueden registrarse en el libro mayor, se priorizan según la tarifa que especifiquen. Las transacciones que ofrecen la tarifa más alta por operación se registran primero en el libro mayor. Para obtener más información sobre cómo funciona, consulta el documento de tarifas.
Piensa en las tarifas como ofertas. ¿Cuánto estás dispuesto a pagar para que se procese tu transacción? Esa es la tarifa que debes ofrecer. La cantidad máxima que estás dispuesto a pagar. En realidad, se te cobrará la cantidad mínima necesaria para registrar la transacción en el libro mayor.
¿Cuánto están cobrando en realidad a las personas? Para tener una idea, utilicé el conjunto de datos de Stellar de BigQuery público para obtener datos de tarifas para el mes de enero de 2021. Esto es lo que descubrí:
En otras palabras, aunque las tarifas de emergencia estuvieron frecuentemente en efecto en enero, las tarifas eran aún una fracción de un centavo.
Generalmente, las aplicaciones orientadas al consumidor y otros servicios que desean asegurarse de que sus transacciones se registren en el libro mayor de manera oportuna especifican una tarifa de ~100,000 stroops. Eso equivale a 0.01 XLM, lo cual la mayoría de los usuarios aún consideran increíblemente económico para mover dinero alrededor del mundo. A medida que la actividad en la red continúa aumentando, es posible que necesites ajustar tu oferta de tarifa para mantener la competitividad, pero por ahora, deberías poder establecerla alrededor de 100,000 stroops y olvidarte de ello.
La mayoría de las personas (incluido tú, querido lector, si estás viendo este error) utilizan Horizon, la API de Stellar, para enviar transacciones a la red. El envío de transacciones, y los pasos subsiguientes necesarios para ratificar una transacción y aplicarla al libro mayor, es un proceso complicado y asíncrono. Horizon es un middleware diseñado para simplificar ese proceso para el usuario. Publica transacciones en un nodo Stellar Core, y espera para recibir resultados antes de devolver una respuesta HTTP.
Cuando envías una transacción a Horizon, Horizon primero intenta decodificarla. Si no puede hacerlo, generalmente porque hay algún error estructural con el XDR, Horizon devuelve un error 400, y te informa que la transacción es malformada. Si la transacción está bien formada, Horizon la envía a un nodo Stellar Core, y ese nodo realiza una verificación de validez. Si el nodo descubre que la transacción es inválida, por ejemplo, si no tiene el número de secuencia correcto, o la tarifa que ofrece es inferior al mínimo de la red de 100 stroops, Horizon devuelve un error 400, y te informa qué salió mal.
Si la transacción está bien formada y pasa la verificación de validez, el nodo Stellar Core la propaga al resto de la red para su posible inclusión en el libro mayor. Cuando la actividad en la red está por debajo del límite del libro mayor, la transacción se realiza y se incurre en la tarifa mínima, Stellar Core notifica a Horizon, y Horizon devuelve una respuesta 200 de éxito. ¡El camino feliz!
Sin embargo, si la red está en modo de tarificación por sobrecarga y la oferta de tarifa de la transacción es demasiado baja para que se registre en el libro mayor, el nodo Stellar Core la retiene y trata de enviarla de nuevo en los próximos 3 libros mayores. Horizon no tiene una visión directa de ese proceso, por lo que espera 30 segundos, y si no recibe respuesta de Stellar Core, concluye que no hay una respuesta de éxito en camino, y le informa al usuario que la solicitud ha expirado. Eso es lo mejor que puede hacer.
Eso significa que cuando recibes un 504, aún hay una posibilidad de que tu transacción se registre en el libro mayor, Horizon no sabe con certeza si Stellar Core ha descartado la transacción, por lo que sugerimos encarecidamente usar límites de tiempo para limitar la ventana de envío. Sin embargo, si recibes muchos 504, es probable que tus ofertas de tarifa sean generalmente demasiado bajas. Envía tarifas más altas.
Como se mencionó al principio de las preguntas frecuentes, publicaremos una guía técnica para manejar los errores de manera adecuada. Para obtener detalles y ejemplos de código, deberías revisarla en cuanto esté disponible.
Sin embargo, en general, deberías hacer tres cosas al enviar una transacción:
Si haces esas tres cosas, deberías poder evitar o solucionar los tiempos de espera, y lograr que tus transacciones se registren de manera consistente en el libro mayor.
No. Si estás usando la instancia de Horizon pública y mantenida por SDF, obtendrás un error 429 si intentas enviar más de 3,600 solicitudes por hora. Es una API pública y gratuita, y otras personas también necesitan usarla. ¡No seas un abusador de recursos! Si estás siendo limitado por la tasa, es hora de configurar tu propia instancia de Horizon.
Si estás intentando enviar un alto volumen de transacciones, es posible que estés experimentando problemas relacionados con la gestión de números de secuencia. La mejor práctica es usar una cuenta de canal de la que puedes leer todo en el documento de Canales.
Si observas el panel de red, es posible que notes un alto volumen de transacciones fallidas incluidas en el libro mayor. Estas son causadas por una serie de bots de trading que intentan aprovechar un pequeño número de oportunidades de arbitraje.
Stellar tiene un conjunto único de operaciones llamadas pagos de ruta, que permiten el envío y conversión simultánea de monedas — envío USD; recibes NGN — y facilitan enormemente el uso de la red para transacciones transfronterizas y entre monedas.
Los pagos de ruta convierten monedas consumiendo órdenes en los libros de órdenes integrados de Stellar, y a veces una ineficiencia en los libros de órdenes da lugar a una discrepancia de precios. No entraremos en detalles aquí, pero los desarrolladores expertos se dieron cuenta de que —de vez en cuando— puedes enviar un pago de ruta y terminar con un poco más de dinero del que empezaste, y crearon bots para buscar esas oportunidades, y tratar de aprovecharlas.
Mucha gente construyó bots de arbitraje, y todos buscan las mismas oportunidades. Cuando surge una, es una carrera: el bot ganador envía una transacción que reclama la oportunidad y tiene éxito; los bots restantes envían transacciones condicionadas a la existencia de esa oportunidad, y como ya no está disponible, esas transacciones fallan.
Porque esas transacciones cumplían con el requisito mínimo de tarifa, fallan después de que se incluyan en el libro mayor en lugar de antes, por lo que terminan en el camino de todos los demás. Es como un grupo de palomas revoloteando alrededor de un banco en el parque: dejas una migaja en la acera, todas se lanzan tras ella. Una paloma obtiene la migaja, el resto se queda con hambre, y mientras los perdedores se sientan allí arrullando y pavoneándose y deseando lo que podría haber sido, bloquean la acera para que los peatones no la puedan usar.
En realidad no. Stellar es una participación abierta: cualquiera puede enviar transacciones a la red, incluidas las personas que construyen bots que intentan aprovechar oportunidades de arbitraje.
En julio, hubo una discusión sobre aumentar la tarifa mínima para tratar de eliminar los bots de arbitraje, pero hacerlo habría tenido un impacto inmediato en todos en el ecosistema, especialmente en los creadores de mercado, que envían un alto volumen de órdenes DEX para proporcionar liquidez, y no hubo un apoyo consistente para la idea.
En cambio, tú, querido lector, deberías planear superar a los bots. Recuerda: no obtienen ninguna ganancia de las transacciones fallidas, y a medida que aumentan las tarifas, se vuelve más caro para ellos seguir lanzándose tras las migas de pan.
Las tarifas no van a la Stellar Development Foundation ni a los validadores de la red: van al grupo de tarifas, que se rastrea en el encabezado del libro mayor. Por el momento, ahí es donde permanecen.
En los viejos tiempos, Stellar tenía una operación de inflación, y el grupo de tarifas se distribuía cada vez que se ejecutaba. Sin embargo, después de un montón de comentarios del ecosistema, se implementó una propuesta para desactivar la inflación en el Protocolo 12, y cuando los validadores votaron para actualizar la red a esa versión del protocolo el 28/10/2019, la operación de inflación se deprecó oficialmente. No hay inflación en Stellar. Además, no hay apuesta en Stellar.
En algún momento, alguien podría proponer una nueva distribución del grupo de tarifas, esa propuesta podría implementarse en una versión importante del protocolo, y los validadores de la red podrían votar para actualizar la red a esa versión del protocolo. ¡Esa persona podrías ser tú! Recuerda: Stellar es de código abierto y cualquiera puede contribuir al código base.
Por el momento, sin embargo, las tarifas son tan bajas en Stellar, incluso con tarifas de aumento, que el grupo de tarifas no es tan grande y no crece tan rápidamente. Se necesitaría mucho tiempo y esfuerzo de ingeniería para redistribuirlo, y probablemente no valga la pena preocuparse por ello a corto plazo.
Si bien las tarifas no enriquecen a nadie, sí cumplen un propósito: desalientan el comportamiento malicioso a gran escala y brindan a todos una oportunidad justa de ofertar por un espacio limitado en el libro mayor.