Artículo del Blog

Envío de Transacciones, Tiempos de Espera y Tarifas Dinámicas FAQ

Autor

Justin Rice

Fecha de publicación

Transacciones

Tiempos de Espera

Tarifas

¿Obteniendo más errores de los que anticipaste al enviar transacciones a Stellar? ¿No estás seguro de cómo manejarlos? ¡Este FAQ es para ti!

El objetivo es dar una explicación de alto nivel sobre un error de Horizon que varias personas han preguntado — el tiempo de espera 504 — y, en el camino, responder algunas preguntas fundamentales sobre la presentación de transacciones, las tarifas y el precio de sobrecarga en Stellar. Debería ayudarte, ya seas un desarrollador o un negocio construyendo en Stellar, a entender cómo optimizar tu envío de tarifas para que tus transacciones tengan más probabilidades de ser procesadas por la red de manera oportuna.

Punto clave: si estás obteniendo muchos errores de tiempo de espera 504 de Horizon, es probable que la red esté en modo de precio 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á el mínimo necesario para hacer el libro mayor.

Además de este FAQ, también tenemos una guía — Manejando Errores con Gracia — que profundiza en los tipos de errores comunes y ofrece sugerencias prácticas para manejarlos. Deberías revisar eso para entender los detalles de la presentación de transacciones y el manejo de errores.

Tengo problemas para enviar transacciones. ¿Hay problemas con la red?

No. La red funciona muy bien. Ha procesado casi 2 mil millones de operaciones desde su inicio, y cerca de 500 millones en los últimos 6 meses solamente. Los libros mayores continúan cerrándose en unos 5 segundos, y el rendimiento sigue siendo alto. Para una visualización rápida, revisa el tablero de la red.

Lo que está sucediendo, sin embargo, es que hay más actividad en la red, lo que aumenta la competencia por el espacio en el libro mayor. Cuando el número de operaciones enviadas a la red excede el límite del libro mayor, la red entra en modo de precio de sobrecarga, en ese punto, las tarifas sirven como ofertas, y las transacciones que ofrecen tarifas más altas por operación tienen prioridad para la inclusión en el conjunto de transacciones que se aplica al libro mayor. Si tu oferta de tarifa es demasiado baja, puedes quedar fuera.

¿Cuál es el límite del libro mayor?

Actualmente, la red pública está configurada para permitir 1,000 operaciones por libro mayor.

Recordatorio rápido: en la jerga de Stellar, una operación es un comando individual que modifica el libro mayor. En este momento, hay 18 operaciones posibles, incluyendo 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 conjunto 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 eso en un sobre de transacción que contiene las firmas necesarias, que luego envías a un nodo de Stellar Core. Generalmente, creas y firmas la transacción usando un SDK de Stellar, y generalmente, ese SDK de Stellar usa Horizon, la API de Stellar, para enviarla.

Asumiendo que una transacción es válida, el nodo de Stellar Core que la recibe la comparte con otros nodos de Stellar Core, quienes trabajan juntos para crear un conjunto combinado de transacciones válidas. Los nodos que están armados 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 más sobre ese proceso, revisa el Ciclo de Vida de la Transacción doc.

Desde la actualización del Protocolo 11 en 2019, el tamaño máximo de un conjunto de transacciones — aka el límite del libro mayor — se ha medido en operaciones/libro mayor en lugar de transacciones/libro mayor. La razón: las operaciones son lo que se aplica para alterar cuentas, saldos y órdenes, y no son variables en tamaño como las transacciones, así que usarlas para establecer el límite del libro mayor permite un rendimiento más consistente. El protocolo esencialmente mira dentro de las transacciones, cuenta el número de operaciones dentro, y trata de acomodar tantas transacciones como sea posible dado el límite del libro mayor.

¿Qué determina el límite del libro mayor?

El límite del libro mayor es una configuración de red, y como todas las configuraciones de red, es determinado por los validadores, quienes votan sobre ello 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 ops/libro mayor, y ha permanecido así desde entonces.

Al establecer el límite del libro mayor, los validadores intentan encontrar un equilibrio: quieren permitir suficiente rendimiento para apoyar el uso de la red, pero también quieren asegurarse de que los nodos en todo el mundo con acceso a hardware de menor gama y conectividad más lenta aún puedan mantenerse 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 sobre eso a continuación), es poco probable que aumentar el límite del libro mayor en este momento haga mucho para reducir el precio de sobrecarga. 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!

¿Cómo funcionan las tarifas en Stellar?

Las tarifas en Stellar son dinámicas. Hay una tarifa mínima requerida para todas las transacciones, que, como 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 hacen el libro mayor e incurren en la tarifa mínima. Cuando el número de operaciones enviadas excede el límite del libro mayor, la red entra en modo de precio de sobrecarga. Dado que no todas las transacciones pueden hacer el libro mayor, las transacciones se priorizan en base a la tarifa que especifican. Las transacciones que ofrecen la tarifa más alta por operación hacen el libro mayor primero. Para más información sobre cómo funciona eso, vea el documento de Tarifas.

¿Dónde debería establecer mi tarifa?

Piensa en las tarifas como ofertas. ¿Cuánto estás dispuesto a pagar para que tu transacción sea procesada? Esa es la tarifa que debes ofertar. La cantidad máxima que estás dispuesto a pagar. De hecho, se te cobrará la cantidad mínima necesaria para hacer el libro mayor.

¿Cuánto están cobrando realmente a las personas? Para tener una idea, utilicé el conjunto de datos públicos BigQuery de Stellar para extraer datos de tarifas para el mes de enero de 2021. Esto es lo que descubrí:

  • La tarifa promedio/op cobrada en enero de 2021 fue de 1,221 stroops. Eso es 0.0001221 XLM (unos $0.00004762 en el momento de escribir).
  • El 52% de las transacciones incurrieron en la tarifa mínima de 100 stroops/op.

En otras palabras, aunque el precio de sobrecarga estaba frecuentemente en efecto en enero, las tarifas eran aún una fracción de una fracción de un centavo.

Generalmente, las aplicaciones orientadas al consumidor y otros servicios que quieren asegurar que sus transacciones hagan el libro mayor de manera oportuna especifican una tarifa de ~100,000 stroops. Eso es 0.01 XLM, que la mayoría de los usuarios aún encuentran increíblemente barato para mover dinero alrededor del mundo. A medida que la actividad de la red continúa aumentando, puedes encontrar que necesitas ajustar tu oferta de tarifa para seguir siendo competitivo, pero por ahora, deberías poder establecerla alrededor de 100,000 stroops y olvidarte de ella.

¿Por qué recibo un error de tiempo de espera 504?

La mayoría de las personas (incluyéndote a ti, querido lector, si estás recibiendo este error) usan Horizon, la API de Stellar, para enviar transacciones a la red. La presentación de transacciones — y los pasos subsiguientes requeridos para ratificar una transacción y aplicarla al libro mayor — es un proceso complicado y asincrónico. Horizon es un middleware diseñado para simplificar ese proceso para el usuario. Publica transacciones a un nodo de Stellar Core, y espera escuchar resultados antes de devolver una respuesta HTTP.

Cuando envías una transacción a Horizon, Horizon primero intenta decodificarla. Si no puede — usualmente porque hay algún error estructural con el XDR — Horizon devuelve un error 400, y te informa que la transacción está malformada. Si la transacción está bien formada, Horizon la publica en un nodo de Stellar Core, y ese nodo realiza una verificación de validez. Si el nodo descubre que la transacción es inválida — digamos que no tiene el número de secuencia correcto, o la tarifa que ofrece está por debajo del mínimo de 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 de Stellar Core la propaga al resto de la red para su posible inclusión en el libro mayor. Cuando la actividad de la red está por debajo del límite del libro mayor, la transacción se realiza e incurre la tarifa mínima, Stellar Core notifica a Horizon, y Horizon devuelve una respuesta de Éxito 200. ¡El camino feliz!

Sin embargo, si la red está en modo de precio de congestión y la oferta de tarifa de la transacción es demasiado baja para hacer el libro mayor, el nodo de Stellar Core la retiene e intenta volver a enviarla para 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 noticias de Stellar Core, concluye que no viene ninguna respuesta de éxito, y le informa al usuario que la solicitud ha expirado. Eso es lo mejor que puede hacer.

Eso significa que cuando obtienes un 504, todavía hay una posibilidad de que tu transacción haga el libro mayor — Horizon no sabe con certeza si Stellar Core ha descartado la transacción — por lo que sugerimos fuertemente usar límites de tiempo para limitar la ventana de envío. Sin embargo, si estás recibiendo un montón de 504s, es probable que tus ofertas de tarifas sean generalmente demasiado bajas. Envía tarifas más altas.

¿Cómo lidiar con los errores de tiempo de espera 504?

Como se mencionó al principio del FAQ, publicaremos una guía técnica para manejar errores con gracia. Para detalles y ejemplos de código, deberías revisarla tan pronto como esté disponible.

Generalmente, sin embargo, deberías hacer tres cosas al enviar una transacción:

  1. Establece un límite de tiempo. De esa manera, si la transacción no tiene éxito dentro del tiempo especificado, sabes que no está esperando ser procesada. Puedes intentar de nuevo sabiendo que no duplicarás accidentalmente, digamos, un pago.
  2. Establece la tarifa máxima más alta que estás dispuesto a pagar. Realmente pagarás la cantidad mínima necesaria para hacer el libro mayor. En circunstancias normales, incluso con una tarifa máxima más alta establecida, pagarás el mínimo de la red — actualmente 100 stroops.
  3. Implementa un bucle de reintento con un retraso creciente (por ejemplo, 30s, 60s, 90s). Solo debería ejecutarse una vez que hayas superado el límite de tiempo que estableciste.

Si haces esas tres cosas, deberías poder evitar o sortear los tiempos de espera y conseguir consistentemente que tus transacciones entren en el libro mayor.

¿Son lo mismo los errores de tiempo de espera y la limitación de tasa?

No. Si estás usando la instancia de Horizon 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 acapares recursos! Si estás siendo limitado por la tasa, es hora de configurar tu propia instancia de Horizon.

¿Cuál es la mejor manera de enviar un alto volumen de transacciones?

Si estás intentando enviar un alto volumen de transacciones, puedes estar experimentando problemas relacionados con la gestión del número de secuencia. La mejor práctica es usar una cuenta de canal sobre la cual puedes leer todo en el documento de Canales.

¿Qué pasa con todas las transacciones fallidas en el libro mayor?

Si miras el tablero de red, puedes notar un alto volumen de transacciones fallidas incluidas en el libro mayor. Esas son causadas por una multitud de bots de comercio intentando 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áneos de moneda — Yo envío USD; tú recibes NGN — y hacen increíblemente fácil usar la red para transacciones transnacionales y de múltiples divisas.

Los pagos de ruta convierten moneda consumiendo órdenes en los libros de órdenes integrados de Stellar, y a veces una ineficiencia en los libros de órdenes da lugar a un desajuste de precios. No entraremos en detalles aquí, pero los desarrolladores astutos 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 construyeron bots para buscar esas oportunidades y tratar de capitalizarlas.

Muchas personas construyeron bots de arbitraje, y todos buscan las mismas oportunidades. Cuando aparece 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 cumplen con el requisito de tarifa mínima, fallan después de ser incluidas en el libro mayor en lugar de antes, por lo que terminan estorbando a todos los demás. Es como un grupo de palomas revoloteando alrededor de un banco del parque: tú tiras una miga en la acera, todas se lanzan tras ella. Una paloma consigue la miga, las demás se quedan hambrientas, y mientras las perdedoras se quedan allí arrullando y pavoneándose y deseando lo que podría haber sido, bloquean la acera para que los peatones no puedan usarla.

¿No pueden simplemente deshacerse de los bots de arbitraje?

No realmente. Stellar es de participación abierta: cualquiera puede enviar transacciones a la red, incluidas las personas que construyen bots que intentan aprovechar las oportunidades de arbitraje.

En julio, hubo una discusión sobre aumentar la tarifa mínima para intentar excluir a 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 la oferta de los bots. Recuerda: ellos no obtienen ningún retorno de transacciones fallidas, y a medida que las tarifas aumentan, se vuelve más costoso para ellos continuar lanzándose tras las migajas de pan.

¿Qué sucede con las tarifas de la red?

Las tarifas no van a Stellar Development Foundation ni a los validadores de la red: van al fondo de tarifas, que se rastrea en el encabezado del libro mayor. Por el momento, ahí es donde permanecen.

En los días de antaño, Stellar tenía una operación de inflación, y el fondo de tarifas se distribuía cada vez que se ejecutaba. Sin embargo, después de un montón de comentarios del ecosistema, una propuesta para deshabilitar la inflación fue implementada 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 fue oficialmente desaprobada. No hay inflación en Stellar. Además, no hay staking en Stellar.

En algún momento, alguien podría presentar una nueva propuesta para distribuir el fondo de tarifas, esa propuesta podría ser implementada 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. ¡Ese alguien podrías ser tú! Recuerda: Stellar es de código abierto, y cualquiera puede contribuir al código.

Por el momento, sin embargo, las tarifas son tan bajas en Stellar — incluso con el precio de congestión — que el fondo de tarifas no es tan grande, y no crece tan rápidamente. Tomaría mucho tiempo y esfuerzo de ingeniería redistribuirlo, y probablemente no valga la pena preocuparse por ello a corto plazo.

Aunque las tarifas no enriquecen a nadie, sí cumplen un propósito: desalientan el mal comportamiento a gran escala y dan a todos una oportunidad justa de pujar por espacio limitado en el libro mayor.