---
title: "Cómo Smurfs' Society escaló con transacciones optimizadas de gas"
description: "Smurfs' Society usó las transacciones optimizadas de gas de Alchemy para garantizar transacciones minadas en Polygon durante períodos de alta volatilidad en el precio del gas."
---

## Cómo colaborar con Alchemy para escalar transacciones on-chain

**Por** **El equipo de The Smurfs' Society**

[The Smurfs' Society](https://thesmurfssociety.com/) es el proyecto web3 oficial de los Pitufos. El proyecto es una plataforma de gamificación totalmente on-chain, solo por invitación, que se lanzó en diciembre de 2022 y generó más de 30,000 conexiones de wallet y 1.5 millones de transferencias on-chain en menos de un mes, lo que la convirtió en una de las TOP 100 aplicaciones más usadas según DappRadar.

En este artículo, su CTO y cofundador aborda los desafíos técnicos de escalar grandes volúmenes de transacciones on-chain, y cómo su equipo está colaborando con Alchemy para ofrecer una experiencia de usuario fluida y consistente a decenas de miles de jugadores que usan el [conjunto de APIs Transact](https://www.alchemy.com/transact).

## **La relatividad de la "escalabilidad" en el contexto de blockchains**

La mayoría de nosotros no consideraría 100 transacciones por minuto como un problema "a escala" o de volumen, y yo incluido. En el pasado, colaboré con muchas empresas para optimizar implementaciones de Cassandra que corrían clusters en un entorno multi data-center con TB de datos, baja latencia y alto volumen; en ese momento, nunca pensé que este bajo volumen de transacciones podría ser difícil de lograr al trabajar con infraestructura blockchain.

El desafío tiene dos aristas:

1. Necesitamos poder ejecutar físicamente la transacción
1. Necesitamos [garantizar la corrección de la transacción](https://alchemy.com/blog/data-accuracy), y más precisamente, su consistencia y exactitud final de datos.

Para abordar el primer desafío, esto es prácticamente lo mismo que dimensionar cualquier cluster de plataforma desplegado en k8s con capacidades de auto-scaling. Una pequeña diferenciación estaría en la forma en que distribuimos la carga usando una HD wallet en un StateFulSet, para darle a cada pod su propia wallet para administrar directamente. Y hay que recordar que blockchain exige que las transacciones se ejecuten en orden \(para una wallet de orden específica\).

Para el segundo, piensa en una [transacción en el mempool](https://www.alchemy.com/overviews/transaction-propagation) que no llega a minarse (gas).

**Nuestras opciones son:**

1. Esperar a que la red se enfríe \(si es posible\) para que la transacción simplemente se mine
1. Sobrescribir la transacción con una nueva \(forzando el nonce\) y con ajustes de gas más altos
1. Simplemente usar una wallet diferente

Está claro que, en nuestro caso, no podemos estar en el grupo 1 ni en el grupo 3. Así que el grupo 2 fue nuestra única opción, lo que generó sus propias complejidades.

Esta es una mirada rápida a nuestra experiencia, colaborando con Alchemy, al pasar de [Reinforced Transactions](https://www.alchemy.com/docs/reference/mev-protection) a [Gas Optimized Transactions](https://www.alchemy.com/docs/reference/mev-protection).

### **Minar 20,000 transacciones al día maximizando la corrección**

¿Por qué es tan difícil escalar una aplicación o juego que usa blockchain intensivamente como columna vertebral?

- ¿Estamos limitados por la cantidad de transacciones que se pueden minar en un solo bloque?
- ¿Estamos limitados por la capacidad de la red en su conjunto?
- ¿Estamos limitados por la congestión de la red y patrones específicos de uso durante el día?
- ¿Estamos limitados por la forma en que se ejecutan las transacciones en la blockchain?
- ¿Estamos limitados por la volatilidad del precio del gas?

Después de varias semanas de operación y mucha iteración sobre todos nuestros controles, ahora contamos con una plataforma para que el juego funcione en condiciones óptimas.

Antes de explicar todos los obstáculos que tuvimos que superar para llegar hasta aquí, déjenme presentarles la dinámica del juego y dar un panorama de las acciones que automatizamos desde el punto de vista de blockchain y su desafío. Luego explicaré cómo resolvimos los problemas colaborando con Alchemy.

## **¿Cómo funciona el juego on-chain de los Pitufos?**

El juego, tal como está ahora, es una disrupción del concepto normal de "lista de espera", donde los jugadores mezclan ingredientes para intentar encontrar recetas que crean pociones, algunas de las cuales pueden dar acceso a un cristal \(acceso garantizado al mint con descuento\).

Todos los activos que usamos en el juego están representados como NFTs. Estos son tokens ERC-1155 para los ítems que consideraríamos fungibles y consumibles \(por ejemplo, ingredientes, pociones, arcilla azul, estatuillas, etc.\), o tokens ERC-721 para ítems que no son fungibles \(por ejemplo, cristales\).

### Las interacciones del juego de los Pitufos

A continuación, las interacciones que tiene nuestra plataforma con la red Polygon para que el juego funcione:

1. **Reclamar caja(s) de botín compuestas de ingredientes** - se invita a los jugadores a reclamar diariamente su caja de 3 ingredientes
1. **Mint de estatuilla \(el componente principal del juego\)** - todos los jugadores deben tener una para poder completar acciones del juego. La estatuilla se entrega gratis cuando el jugador ingresa al juego. Más adelante en el juego se anunciará el rol de la estatua.
1. **Quemar arcilla** - cuando el jugador que intenta una receta falla, se quema la arcilla azul \(x1\)

El jugador, por su parte, realiza una sola operación en la red Polygon:

1. **Mezclar receta** - se invita al jugador a mezclar 3 ingredientes para crear una receta \(en este caso, el jugador es quien paga las tarifas de gas\).

<ImageBlock
  src="https://media.alchemy.com/1704556400-player-mixing-a-recipe.png"
  alt="Pantalla del juego The Smurfs' Society mostrando a un jugador mezclando tres ingredientes en una receta"
  width={654}
  height={319}
  caption="Figura 1: Jugador mezclando una receta"
/>

Para las dos primeras funciones, podemos trabajar de forma 100% asíncrona sin un impacto real en el juego si una transacción que intentamos no se minaba durante mucho tiempo. Obviamente, nuestra preferencia desde el punto de vista de la experiencia sería que estos tiempos fueran lo más bajos posible.

Quemar arcilla es un poco más desafiante, y las decisiones de implementación estuvieron impulsadas principalmente por el propio juego. Cuando un jugador propone efectivamente una receta, lo hace firmando una estructura EIP-712 que contiene todos los ingredientes que quiere usar para mezclarla, con un plazo de 3 horas, como se muestra a continuación.

<ImageBlock
  src="https://media.alchemy.com/1704556456-player-signs-eip-712-to-propose-a-recipe.png"
  alt="Figura 2: El jugador firma EIP-712 para proponer una receta"
  width={354}
  height={499}
  caption="Figura 2: El jugador firma EIP-712 para proponer una receta"
/>

Esta firma se usará como autorización para quemar si no se encuentra ninguna receta con la mezcla asociada. Y ejecutamos esta transacción burnClay en nombre del jugador para absorber las tarifas transaccionales asociadas.

**A partir de este momento, tenemos que gestionar varios estados:**

1. La transacción está en tránsito - almacenada off-chain -\> moviéndose hacia on-chain. Se usa para reconciliaciones.
1. La transacción está en el mempool y espera ser minada - este estado de transición requiere que reconciliemos lo que creemos que el usuario tiene en vuelo frente a lo que se está procesando, todo sin garantía de cuánto tiempo tomará
1. La transacción está minada - la cantidad de arcilla azul mostrada en pantalla ahora es precisa. Este estado es el estado final y no representa ningún desafío: blockchain es la fuente de verdad
1. La transacción está minada pero se considera abortada

### Por qué el equipo de los Pitufos eligió Polygon

En un mundo ideal, esperamos que todos los estados converjan en 1 minuto o menos para garantizar la corrección de las operaciones y la experiencia del juego. Para este caso de uso, decidimos usar la red Polygon para la fase de gamificación. A continuación, algunos de los criterios más importantes que nos ayudaron a [elegir Polygon como nuestra red](https://www.alchemy.com/polygon):

- Tiempos de finalización rápidos para la capacidad de reacción
- Tarifas de transacción reducidas para la gestión de costos operativos
- Interoperabilidad con Ethereum para la visión a largo plazo

**Nuestro desafío: minar 20,000 transacciones al día maximizando la consistencia**

<VideoCta
  title="Mira el dashboard de Alchemy en acción"
  description="Recorrido guiado de 30 minutos: cada herramienta del dashboard, demostrada en vivo."
  ctaHref="/resources/dashboard-demo"
  thumbnail={{
    src: "https://media.alchemy.com/alchemy-dashboard-demo-thumbnail.png",
    alt: "Alchemy Dashboard Demo",
  }}
/>


## **Reducir el impacto de la volatilidad del gas en Polygon manteniendo una alta tasa de éxito**

Polygon puede experimentar congestión, lo cual nos puede afectar directamente al agregar demoras en las distintas acciones que describimos antes. Hay acciones básicas que podemos tomar para abordar esto:

1. **Sharding** - tener múltiples wallets interactuando con la blockchain. Mientras haya una wallet operativa \(similar a un connection pool para una DB\), las transacciones pueden realizarse.
1. **Sobreprecio** - para garantizar que nuestras transacciones se procesen de manera oportuna, podemos aumentar el incentivo en las [priority fees \(EIP-1559\)](https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum).

Nuestra configuración inicial se hizo usando la solución [**Reinforced transaction**](https://www.alchemy.com/docs/reference/mev-protection) y pagando por encima del mercado en tarifas de gas para optimizar los tiempos de finalización de las transacciones.

<ImageBlock
  src="https://media.alchemy.com/1704556545-example-of-extreme-gas-prices-on-polygon.png"
  alt="Ejemplo de precios de gas extremos en Polygon."
  width={558}
  height={199}
  caption="Ejemplo de precios de gas extremos en Polygon."
/>

<ImageBlock
  src="https://media.alchemy.com/1704556581-example-of-dramatic-gas-price-volatility-on-polygon.png"
  alt="Ejemplo de volatilidad drástica en los precios de gas en Polygon."
  width={546}
  height={191}
  caption="Ejemplo de volatilidad drástica en los precios de gas en Polygon."
/>

Las dos capturas de pantalla se tomaron con un intervalo de pocos minutos \(~5 minutos\). Se puede ver la gran variación en el gas en un período de tiempo muy corto, lo cual tiene un impacto directo en nosotros: ¡cualquier aumento rápido en la volatilidad del mercado del precio del gas, y nuestra transacción quedaría atascada bloqueando una de nuestras wallets!

### Cómo optimizar las transacciones de Polygon durante períodos de gas volátil

Empezamos a trabajar en la optimización de transacciones durante períodos de gas volátil mediante:

- Agregar resiliencia a nuestra aplicación y hacer un mejor seguimiento del estado de las transacciones durante períodos más largos
- Rastrear y alertar cuando aparecen síntomas - hicimos esto rastreando el tiempo que tarda en procesarse un mensaje

**Cuando todo se ve bien a nivel micro, vemos esto:**

<ImageBlock
  src="https://media.alchemy.com/1704556646-processing-time-that-varies-but-below-20-second-mark.png"
  alt="Un proceso saludable con un tiempo de procesamiento que varía pero se mantiene por debajo de los 20 segundos."
  width={1600}
  height={432}
  caption="Un proceso saludable con un tiempo de procesamiento que varía pero se mantiene por debajo de los 20 segundos."
/>

**Y esto es a nivel macro, cuando las cosas se ponen más interesantes:**

<ImageBlock
  src="https://media.alchemy.com/1704556694-messages-that-are-older-than-200-seconds.png"
  alt="Ejemplo de mensajes con más de 200 segundos de antigüedad."
  width={1600}
  height={436}
  caption="Ejemplo de mensajes con más de 200 segundos de antigüedad."
/>

En ocasiones, algunos mensajes tenían casi 200" de antigüedad \(el ejemplo anterior es de uno de nuestros días más difíciles\). Cuando esta brecha de tiempo crece demasiado, los jugadores pueden empezar a notarlo: la señal más evidente es que el contador de arcilla azul no disminuye.

En nuestro peor día, después de una actualización de Polygon, tuvimos que detener el juego durante 30 minutos porque algunas transacciones no se podían minar.

Desde entonces, estamos colaborando activamente con Alchemy para atacar este desafío con una de sus nuevas ofertas, y decidimos entrar en la beta de [**Gas Optimized transactions**](https://www.alchemy.com/docs/reference/mev-protection).

**La promesa de las transacciones optimizadas por gas es gestionar los valores atípicos impredecibles.**

¡Imaginen si, en lugar de firmar una sola transacción con algún tipo de lógica codificada para determinar el gas, pudieran firmar 5 o 10 transacciones con distintas condiciones de precio de gas, y dejar que Alchemy escale automáticamente el precio por nonce!

En nuestro caso, decidimos optar por la siguiente política de escalamiento: 1.25, 1.5, 1.75, 2, 2.25, 2.5

Hasta ahora, hemos tenido excelentes resultados con esto.

Hemos ejecutado con éxito varias optimizaciones y las vemos funcionando en vivo en el sistema. Esperamos seguir colaborando con el equipo de Alchemy, a quienes quiero agradecer personalmente por la rapidez de respuesta el día en que todo se complicó y por el tiempo de respuesta ágil. ¡De eso se trata elegir a los socios correctos!

Pitufonamente,

El equipo de The Smurfs' Society.
