Fazendo deploy do seu Transactions Server
Ofereça aos usuários transactions sem custo
O transactions-server é um servidor proxy que encaminha transações para Gelato. Ele recebe uma transação assinada do client, que por sua vez é enviada para a network apropriada nos bastidores. Isso permite ao owner do server facilitar para os seus users transações sem custo
O transaction server é usado para ajudar com a UX de usar múltiplas networks e para evitar que eles tenham de trocar de network provider em tempo real. Os users podem permanecer conectados a Ethereum e interagir com Polygon assinando apenas transações
A Decentraland DAO configurou um servidor usado pelos nossos dapps, cobrindo o custo até um certo limite com algumas restrições. Este documento explica como você pode deployar este servidor para habilitar os seus users a encaminhar transações com as restrições de que você precise, se houver.
Restrições
Todas as restrições são por transação que o user tenta enviar. O que, na prática, se traduz em uma request POST para o server.
As restrições configuráveis que o server tem são:
Verifica uma quota de máximo de transações por dia. Veja a seção de collections para mais informações.
Verifica contratos na whitelist, então se uma transação estiver tentando interagir com um contract que não é reconhecido ela falhará. Para isso, ele usa
Os contratos e collections deployados. Veja a seção de contracts e collections para mais info
O preço de vendas, restringindo-o se estiver abaixo de um threshold. Veja a seção de min sale value para mais info
Configurando o Gelato
Gelato é um Multichain Relayer Protocol. Usamos a sua infraestrutura para habilitar transações sem custo. Isso significa efetivamente que, quando você vai enviar uma transação, em vez disso você está assinando uma message e enviando isso para o Gelato. O serviço cuidará de enviar a transação para você e devolver uma response (transaction hash).
Ele precisa de um contract para encaminhar as transações, mas felizmente podemos reutilizar o que está sendo usado pela Decentraland (veja abaixo)
Gelato funciona como uma API para o server. Para configurar ele, você primeiro precisará de uma API KEY que nós usaremos depois. Para obter isso:
Registre-se no serviço
Crie um novo dapp para a network que você pretende targetear. Para imitar a configuração da Decentraland:
Selecione a
MainnetsoptionsDefina um
App nameapropriado para o seu dAppescolha
Polygoncomo a network para oSmart ContractAtive a
Any Contractopção de toggle
Copie a API KEY da
API Keyseção
Por fim, você precisará financiar o dapp recém-criado. Você pode fazer isso conectando sua wallet na 1Balance seção na barra lateral esquerda. Uma vez conectado, isso permitirá que você deposite o seu USDC para financiar as transações que os seus users enviarão. Se você precisar obter MATIC, confira este post.
Testnet
Se você quiser testar seu app antes de ir para produção e estiver usando Polygon, você pode fazer isso em Polygon Amoy, a testnet da Polygon.
Para fazer isso, simplesmente repita o processo mas escolhendo Matic Testnet (Amoy) no campo de network.
Você precisará financiar o seu dapp, mas pode fazer isso facilmente obtendo tokens Sepolia ETH do faucet.
Baixando o transactions server
Antes de mais nada, você precisará de uma cópia do código do transactions-server da Decentraland. Você pode encontrá-lo no github. A partir daí, você tem duas opções:
Baixando o código: Para baixar o código, você precisa primeiro clicar no botão verde e então
Códigobotão e depois
Clique em
Download ZIPCopie a URL abaixo do
Clonetítulo e então execute$ git clone THE_URL_HERE
Fazendo fork do código: Você pode clicar no botão
forkno canto superior direito da página. Quando o processo estiver concluído, você poderá baixar o seu código da mesma forma que faria na primeira opção. Você precisará de uma conta no Github para isso; para mais informações sobre fazer fork de repositories, veja aqui
Configurando o server
O transactions server é escrito em NodeJS usando TypeScript. Antes de executá-lo, você precisará configurar algumas variáveis de ambiente.
Para fazer isso:
Copie o
.env.examplearquivo e cole-o renomeado para.envAbra o arquivo com um editor de texto e role até encontrar
.envarquivo. Você verá que algumas variáveis têm um valor padrão, comoHTTP_SERVER_PORT=5000(em qual port executar o server)Você pode deixar a maioria dos valores como estão, mas há alguns valores importantes a considerar:
Gelato
Use a API KEY que obtivemos ao configurar o Gelato.
Transações
Quando uma nova request de transação chegar, ele verificará a quantidade um endereço que foi enviada naquele dia. Se estiver acima do valor definido, a transação falhará.
Para remover completamente esta verificação, você pode ir ao código e remover o
método de async function checkData(transactionData: TransactionData): Promise<void> { em src/ports/transactions/component.ts
Contracts e collections
O server buscará a URL dos endereços dos Contract e os armazenará localmente, além de consultar o subgraph. Quando uma nova request de transação chegar, ele então verificará se o contract com o qual a transação está interagindo pertence aos contracts deployados na URL ou às collections deployadas no subgraph.
Se você quiser fornecer os seus próprios contracts, altere a URL e mantenha a mesma estrutura que a atual https://contracts.decentraland.org/addresses.json tem. A network usada é determinada por COLLECTIONS_CHAIN_ID, e o intervalo com que o cache é recarregado é COLLECTIONS_CHAIN_ID
Se você tiver as suas próprias collections, também poderá alterar a URL do subgraph.
Para remover completamente estas verificações, você pode ir ao código e remover o
método de async function checkData(transactionData: TransactionData): Promise<void> { em src/ports/transactions/component.ts
Min sale value
Quando uma nova request de transação chegar, ela primeiro fará o parse dos dados que está tentando encaminhar. Se detectar uma sale (marketplace buy, bid, etc), verificará o valor em relação a MIN_SALE_VALUE_IN_WEI. Se for menor, a transação falhará.
Para verificar os métodos de sale relevantes, você pode ver src/ports/transaction/validation/checkSalePrice.ts e, para remover completamente esta verificação, você pode ir ao código e remover o
método de async function checkData(transactionData: TransactionData): Promise<void> { em src/ports/transactions/component.ts
Executando o server
Agora que toda a configuração está pronta, o que resta é realmente executar o server. Você pode seguir o README dele mas, em resumo, você terá que:
Ter NodeJS instalado
Abra o terminal de sua preferência
Execute os seguintes comandos:
Claro, você provavelmente vai querer deployar isso no service de sua escolha, como AWS por exemplo. Você pode usar o Dockerfile do Projeto para fazer isso.
Usando o server
Agora que tudo está configurado e em execução, é hora de realmente usar o server.
Para enviar uma transação, você precisa fazer POST para /transactions. O schema necessário para a request é definido por transactionSchema em src/ports/transaction/types.ts.
Se, em vez disso, você quiser usar nossas libs prontas para facilitar sua vida, você pode tentar decentraland-transactions. Ele é usado via decentraland-dapps em nossos dapps como o Marketplace, com os utils sendTransaction. Confira este código para um exemplo.
Atualizado