Pular para o conteúdo
0%

Escalando a Smurfs' Society com transações otimizadas de gas

Parceria com a Alchemy para escalar transações on-chain

Por The Smurfs' Society Team

The Smurfs' Society é o projeto web3 oficial dos Smurfs. O projeto é uma plataforma de gamificação totalmente on-chain, somente por convite, lançada em dezembro de 2022, que gerou mais de 30.000 conexões de carteira e 1,5 milhão de transferências on-chain em menos de um mês, tornando-se um dos TOP 100 aplicativos mais usados segundo a DappRadar.

Neste artigo, seu CTO e cofundador aborda os desafios técnicos de escalar grandes volumes de transações on-chain, e como a equipe está colaborando com a Alchemy para entregar uma experiência de usuário fluida e consistente a dezenas de milhares de jogadores usando o Transact API suite.

A relatividade da "escalabilidade" no contexto de blockchains

A maioria de nós não consideraria 100 transações por minuto um problema de "escala" ou volume, inclusive eu. No passado, colaborei com várias empresas para otimizar implantações do Cassandra operando clusters em um ambiente multi data-center com TBs de dados, baixa latência e alto volume; na época, eu jamais imaginaria que esse volume baixo de transações poderia ser difícil de alcançar ao trabalhar com infraestrutura blockchain.

O desafio tem duas frentes:

  1. Precisamos ser capazes de executar fisicamente a transação
  2. Precisamos garantir a correção da transação, mais precisamente sua consistência e exatidão de dados eventual.

Para resolver o primeiro desafio, isso é basicamente o mesmo que dimensionar qualquer cluster de plataforma implantado em k8s com capacidades de auto-scaling. Uma pequena diferença está na forma como fizemos o sharding da carga usando uma HD wallet em um StateFulSet, para fornecer a cada pod sua própria carteira para gerenciar diretamente. E lembre-se de que a blockchain exige que as transações sejam executadas em ordem (para uma carteira específica).

Para o segundo, pense em uma transação no mempool que não está sendo minerada (gas).

Nossas opções são:

  1. Esperar a rede esfriar (se possível) para que a transação simplesmente seja minerada
  2. Sobrescrever a transação com uma nova (forçando o nonce) e configurações de gas maiores
  3. Simplesmente usar uma carteira diferente

Claramente, no nosso caso, não podíamos estar na opção 1 nem na opção 3. Então a opção 2 era nossa única alternativa, o que criou suas próprias complexidades.

Este é um breve relato da nossa experiência, em parceria com a Alchemy, saindo de Reinforced Transactions em direção a Gas Optimized Transactions.

Minerando 20.000 transações por dia enquanto maximizamos a correção

Por que é tão difícil escalar uma aplicação ou jogo que depende fortemente da blockchain como espinha dorsal?

  • Estamos limitados pelo número de transações que podem ser mineradas em um único bloco?
  • Estamos limitados pela capacidade da rede como um todo?
  • Estamos limitados pelo congestionamento da rede e por padrões específicos de uso intradiário?
  • Estamos limitados pela forma como as transações na blockchain são executadas?
  • Estamos limitados pela volatilidade do preço do gas?

Após várias semanas de operação e muitas iterações em todos os nossos controles, agora temos uma plataforma para o jogo operar em condições ideais.

Antes de explicar todos os obstáculos que tivemos que superar para chegar até aqui, deixe-me apresentar a dinâmica do jogo e dar uma visão geral das ações que automatizamos do ponto de vista blockchain e seus desafios. Depois explicarei como resolvemos os problemas em parceria com a Alchemy.

Como funciona o jogo on-chain dos smurfs?

O jogo, como está hoje, é uma ruptura do conceito normal de "lista de espera", em que os jogadores misturam ingredientes para tentar encontrar receitas que criam poções, algumas das quais podem dar acesso a um cristal (acesso garantido ao mint com desconto).

Todos os ativos que usamos no jogo são representados como NFTs. São tokens ERC-1155 para itens que consideramos fungíveis e consumíveis (por exemplo, ingredientes, poções, argila azul, estatuetas, etc.), ou tokens ERC-721 para itens que não são fungíveis (por exemplo, cristais).

As interações do jogo dos smurfs

Abaixo estão as interações que nossa plataforma tem com a rede Polygon para o jogo funcionar:

  1. Reivindicar caixa(s) de drop compostas por ingredientes - os jogadores são convidados a reivindicar sua caixa de 3 ingredientes diariamente
  2. Mint da estatueta (o componente principal do jogo) - todos os jogadores precisam possuir uma para poder completar ações do jogo. A estatueta é entregue gratuitamente quando o jogador faz login no jogo. Mais adiante no jogo, o papel da estátua será anunciado.
  3. Queima de argila - quando o jogador que tenta uma receita falha, a argila azul é queimada (x1)

O jogador, por outro lado, realiza uma única operação na rede Polygon:

  1. Misturar receita - o jogador é convidado a misturar 3 ingredientes para criar uma receita (o jogador é quem paga as taxas de gas nesse caso).
Tela do jogo The Smurfs' Society mostrando um jogador misturando três ingredientes em uma receita
Figura 1: Jogador misturando uma receita

Para as duas primeiras funções, podemos trabalhar de forma 100% assíncrona sem impacto real no jogo caso uma transação que tentamos não seja minerada por muito tempo. Obviamente, do ponto de vista da experiência, nossa preferência seria que esses tempos fossem o mais baixos possível.

Queimar argila é um pouco mais desafiador, e as escolhas de implementação foram principalmente guiadas pelo próprio jogo. Quando um jogador propõe uma receita, ele o faz assinando uma struct EIP-712 contendo todos os ingredientes que deseja usar para misturar, com um prazo de 3 horas, como mostrado abaixo.

Figura 2: Jogador assina EIP-712 para propor uma receita
Figura 2: Jogador assina EIP-712 para propor uma receita

Essa assinatura será usada como autorização para queimar caso nenhuma receita seja encontrada com a mistura associada. E executamos essa transação burnClay em nome do jogador para absorver as taxas transacionais associadas.

A partir daqui, precisamos gerenciar vários estados:

  1. Transação em trânsito - armazenada off-chain -> movendo para on-chain. Usada para reconciliações.
  2. Transação no mempool aguardando ser minerada - estado de transição que exige reconciliarmos o que acreditamos que o usuário tem em andamento com o que está sendo processado - tudo sem garantia de quanto tempo vai levar
  3. Transação minerada - a quantidade de argila azul exibida na tela agora está precisa. Esse estado é o estado final e não representa nenhum desafio - a blockchain é a fonte da verdade
  4. Transação minerada mas considerada abortada

Por que a equipe dos smurfs escolheu Polygon

No mundo ideal, esperamos que todos os estados convirjam em 1 minuto ou menos para garantir a correção das operações e a experiência do jogo. Para esse caso de uso, decidimos usar a rede Polygon para a fase de gamificação. Abaixo estão alguns dos critérios mais importantes que nos ajudaram a escolher Polygon como nossa rede:

  • Tempos de finalização rápidos para reatividade
  • Taxas de transação reduzidas para gestão de custos operacionais
  • Interoperabilidade com Ethereum para a visão de longo prazo

Nosso desafio: minerar 20.000 transações por dia enquanto maximizamos a consistência

Alchemy Dashboard Demo
Free video demo

Veja o dashboard da Alchemy em ação

Tour guiado de 30 minutos: todas as ferramentas do dashboard, demonstradas ao vivo.

Watch the demo

Reduzindo o impacto da volatilidade do gas na Polygon enquanto entregamos uma alta taxa de sucesso

A Polygon pode sofrer congestionamento e isso pode nos afetar diretamente, adicionando atrasos nas diferentes ações que descrevemos anteriormente. Existem ações básicas que podemos tomar para resolver isso:

  1. Sharding - ter várias carteiras interagindo com a blockchain. Enquanto houver uma carteira operacional (semelhante a um connection pool para DB), as transações podem ser feitas.
  2. Overpricing - para garantir que nossas transações sejam processadas em tempo hábil, podemos aumentar o incentivo nas priority fees (EIP-1559).

Nossa configuração inicial foi feita usando a solução Reinforced transaction e fazendo overpricing no mercado em relação às taxas de gas para otimizar os tempos de finalização das transações.

Exemplo de preços de gás extremos na Polygon.
Exemplo de preços de gás extremos na Polygon.
Exemplo de volatilidade drástica nos preços de gás na Polygon.
Exemplo de volatilidade drástica nos preços de gás na Polygon.

As duas capturas de tela foram feitas com um intervalo de poucos minutos (~5 minutos). Você pode ver a grande variação no gas em um período de tempo muito curto, o que tem um impacto direto sobre nós: qualquer disparada rápida na volatilidade do mercado para o preço do gas, e nossa transação ficaria presa, bloqueando uma de nossas carteiras!

Como otimizar transações na Polygon durante períodos de gas volátil

Começamos a trabalhar na otimização de transações durante períodos de gas volátil ao:

  • Adicionar resiliência à nossa aplicação e rastrear o estado das transações melhor por um período mais longo
  • Rastrear e alertar quando sintomas são exibidos - fizemos isso rastreando o tempo que uma mensagem leva para ser processada

Quando tudo parece bem em micro, vemos isto:

Um processo saudável com tempo de processamento que varia, mas fica abaixo de 20 segundos.
Um processo saudável com tempo de processamento que varia, mas fica abaixo de 20 segundos.

E isto é em nível macro, quando as coisas ficam mais interessantes:

Exemplo de mensagens com mais de 200 segundos.
Exemplo de mensagens com mais de 200 segundos.

Ocasionalmente, algumas mensagens tinham quase 200" de "idade" (o exemplo acima é de um dos nossos dias mais difíceis). Quando esse intervalo de tempo cresce demais, os jogadores começam a notar: o maior sinal é que o contador de argila azul não diminui.

No nosso pior dia, após o upgrade da Polygon, tivemos que parar o jogo por 30 minutos porque algumas transações não puderam ser mineradas.

Desde então, estamos colaborando ativamente com a Alchemy para atacar esse desafio com uma de suas novas ofertas, e decidimos entrar no beta de Gas Optimized transactions.

A promessa das gas optimized transactions é gerenciar outliers imprevisíveis.

Imagine se, em vez de assinar uma única transação com algum tipo de lógica fixa para determinar o gas, você pudesse assinar 5 ou 10 transações com diferentes condições de preço de gas, e deixar que a Alchemy escalone automaticamente o preço do nonce!

No nosso caso, decidimos optar pela seguinte política de escalonamento: 1,25, 1,5, 1,75, 2, 2,25, 2,5

Até agora, tivemos ótimos resultados com isso.

Executamos com sucesso várias otimizações e as vemos funcionando ao vivo no sistema. Estamos ansiosos para continuar nossa colaboração com a equipe da Alchemy, à qual quero agradecer pessoalmente pela reatividade no dia em que tudo deu errado e pelo tempo de resposta rápido. Tudo se resume a escolher os parceiros certos!

Smurfilmente,

A equipe da The Smurfs' Society.

Gradiente de fundo

Construa magia blockchain

A Alchemy combina os produtos e ferramentas de desenvolvimento web3 mais poderosos com recursos, comunidade e suporte lendário.