---
title: "ERC721 vs. ERC721A: batch minting de NFTs"
description: "Uma implementação alternativa do padrão ERC721 criada pela equipe da Azuki. Útil para otimizar batch mints na criação de NFTs."
---

# ERC721 vs. ERC721A: batch minting de NFTs

Como muitos criadores de NFT sabem, [fazer o deploy de um smart contract na Ethereum mainnet](https://www.alchemy.com/overviews/nft-deployment-cost) pode ser extremamente caro.

Porém, os custos de deployment do smart contract **não** são o único custo que engenheiros blockchain e times de NFT precisam considerar. [Criar uma coleção de NFT bem-sucedida](https://www.alchemy.com/overviews/how-to-create-a-successful-nft-project) ou um projeto de avatares colecionáveis envolve construir uma comunidade e facilitar para os usuários **mintar**, **negociar** e **usar** seus NFTs.

Vamos conhecer uma otimização poderosa de smart contract de NFT que pode ajudar sua comunidade a economizar taxas de gas nos custos de minting de NFT:

Implementar batch minting com o contrato ERC721A!

### O que é ERC721A?

Em 6 de janeiro, o time de desenvolvimento da Azuki NFT anunciou publicamente o [ERC721A, uma nova implementação do padrão NFT ERC721](https://www.azuki.com/erc721a) que explora batch minting:

<ImageBlock
  src="https://media.alchemy.com/1704712932-azuki-team-introducing-erc721a-implementation.png"
  alt="Equipe da Azuki apresentando a implementação do ERC721A"
  width={1108}
  height={938}
  caption="Equipe da Azuki apresentando a implementação do ERC721A"
/>

No post do blog explicando a implementação do smart contract ERC721A, **@locationtba** e **@2pmflow** mostram estimativas de quanto gas pode ser economizado ao fazer batch minting via o código inicial de smart contract de NFT mais comumente usado, o [contrato ERC721Enumerable da OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/api/token/erc721#ERC721Enumerable), versus fazer batch minting de NFTs usando o novo [contrato ERC721A](https://github.com/chiru-labs/ERC721A) da Azuki:

<EmbeddedTable
  table={{
    columns: [
      { key: "1", width: 200, title: "NUMBER MINTED", dataType: "object" },
      { key: "2", width: 200, title: "GAS USED (ENUMERABLE)", dataType: "object" },
      { key: "3", width: 200, title: "GAS USED (ERC721A)", dataType: "object" },
      { key: "4", width: 200, title: "GAS SAVED", dataType: "object" },
    ],
    data: [
      {
        "1": { title: "<p>Mint 1</p>", tooltip: "", icon: "" },
        "2": { title: "<p>154,814</p>", tooltip: "", icon: "" },
        "3": { title: "<p>76,690</p>", tooltip: "", icon: "" },
        "4": { title: "<p>78,124</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        "1": { title: "<p>Mint 2</p>", tooltip: "", icon: "" },
        "2": { title: "<p>270,339</p>", tooltip: "", icon: "" },
        "3": { title: "<p>78,819</p>", tooltip: "", icon: "" },
        "4": { title: "<p>191,520</p>", tooltip: "", icon: "" },
        id: 1,
      },
      {
        "1": { title: "<p>Mint 3</p>", tooltip: "", icon: "" },
        "2": { title: "<p>384,864</p>", tooltip: "", icon: "" },
        "3": { title: "<p>80,948</p>", tooltip: "", icon: "" },
        "4": { title: "<p>303,916</p>", tooltip: "", icon: "" },
        id: 2,
      },
      {
        "1": { title: "<p>Mint 4</p>", tooltip: "", icon: "" },
        "2": { title: "<p>501,389</p>", tooltip: "", icon: "" },
        "3": { title: "<p>83,077</p>", tooltip: "", icon: "" },
        "4": { title: "<p>418,312</p>", tooltip: "", icon: "" },
        id: 3,
      },
      {
        "1": { title: "<p>Mint 5</p>", tooltip: "", icon: "" },
        "2": { title: "<p>616,914</p>", tooltip: "", icon: "" },
        "3": { title: "<p>85,206</p>", tooltip: "", icon: "" },
        "4": { title: "<p>531,708</p>", tooltip: "", icon: "" },
        id: 4,
      },
    ],
  }}
/>

Essa tabela mostra como o gas usado no ERC721A, para um número crescente de mints, escala com um fator constante muito menor.

O custo de gas para mintar NFTs aumenta em:

- **~2k de gas por mint extra** usando o contrato ERC721A da Azuki
- **~115k de gas por mint extra** usando o contrato ERC721Enumerable da [OpenZeppelin](https://www.alchemy.com/dapps/openzeppelin)

Esse resultado é realmente **INCRÍVEL!**

Pelo preço de mintar um único token via o contrato ERC721Enumerable, um usuário pode em vez disso mintar até 5 tokens \(ou mais, potencialmente\) via o contrato ERC721A.

Quem não gostaria que os usuários economizassem até 80% em seus mints?

Aqui está a melhor parte:

Não só os preços de mint de NFT ficam mais baratos para transações individuais, como também haveria **menos congestionamento de rede** e **picos menores no preço do gas** afetando a rede Ethereum durante drops de coleções populares.

Bem interessante.

### Verificando a economia de gas ao mintar múltiplos NFTs

Eu quis conferir o trabalho por conta própria, então implementei dois contratos básicos de NFT que [criam NFTs](https://www.alchemy.com/docs/how-to-interact-with-erc-721-tokens-in-solidity):

1. Um [smart contract que minta usando ERC721Enumerable](https://github.com/thatguyintech/demo-erc721a/blob/main/src/DemoErc721.sol), e
1. Um [smart contract que minta usando ERC721A](https://github.com/thatguyintech/demo-erc721a/blob/main/src/DemoErc721a.sol)

Em seguida, chamei a função de mint em cada um e registrei os custos de gas de cada transação.

Aqui estão meus resultados:

Você pode encontrar o código desses testes neste repositório do GitHub: [demo-erc721a](https://github.com/thatguyintech/demo-erc721a)

Os custos de gas para criar múltiplos NFTs aqui são um pouco diferentes dos mostrados no post do blog da Azuki, mas estão próximos, e o aumento nas taxas de gas de um mint, dois mints e múltiplos mints confere.

Validamos a economia de gas para batch minting de NFTs! ✅

### Como o smart contract ERC721A economiza taxas de gas com batch minting?

O ERC721A faz algumas suposições que influenciam seu design de smart contract:

1. **Os token IDs devem sempre incrementar consecutivamente a partir de 0**. A maioria dos projetos de NFT já faz isso, e a Azuki é explícita sobre isso em suas suposições.
1. **Reduzir os custos de gas de mintar NFTs é mais importante** do que otimizar qualquer outra chamada do ERC721. Os mints são quando ocorre o congestionamento da rede Ethereum, e também são a primeira impressão dos usuários sobre uma coleção de NFT. Quanto mais fácil o mint, melhor a reputação.

Com essas suposições em vigor, o ERC721A faz as seguintes otimizações de contrato:

1. **Reduzir o armazenamento desperdiçado de metadados de token.**
1. **Limitar as atualizações de estado de propriedade a apenas uma vez por batch mint**, em vez de uma vez por NFT mintado.

Vamos ver como essas otimizações são feitas, mas antes disso devemos entender que tipos de transações custam mais taxas de gas.

### Reduzir o trabalho necessário para enviar transações de escrita economiza gas para os usuários

Geralmente existem dois tipos de transações na blockchain: escritas e leituras.

**Escritas** acontecem quando modificamos ou atualizamos o estado da blockchain \(por exemplo, enviar dinheiro, escrever uma mensagem, negociar um NFT\).

**Leituras** acontecem quando solicitamos dados existentes para consultá-los.

Os usuários **sempre pagam mais taxas de gas por funções de escrita do que pagam por funções de leitura**.

Portanto, ao reduzir o número de transações de escrita, OU ao reduzir o trabalho necessário para enviar transações de escrita, mesmo que isso demande mais trabalho para enviar transações de leitura posteriormente, isso reduzirá os custos de minting de NFT que os usuários pagam!

E é exatamente isso que o ERC721A realiza.

Quando se trata de mints de NFT: mais armazenamento, mais problemas. Menos armazenamento, menos problemas.

Genial, não é?

<EmbeddedTable
  table={{
    columns: [
      { key: "1", width: 200, title: "Unit ID", dataType: "object" },
      { key: "2", width: 200, title: "Owner", dataType: "object" },
    ],
    data: [
      {
        "1": { title: "<p>#100</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Alice</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        "1": { title: "<p>#101</p>", tooltip: "", icon: "" },
        "2": { title: "<p>&lt;not set&gt;</p>", tooltip: "", icon: "" },
        id: 1,
      },
      {
        "1": { title: "<p>#102</p>", tooltip: "", icon: "" },
        "2": { title: "<p>&lt;not set&gt;</p>", tooltip: "", icon: "" },
        id: 2,
      },
      {
        "1": { title: "<p>#103</p>", tooltip: "", icon: "" },
        "2": { title: "<p>Bob</p>", tooltip: "", icon: "" },
        id: 3,
      },
      {
        "1": { title: "<p>#104</p>", tooltip: "", icon: "" },
        "2": { title: "<p>&lt;not set&gt;</p>", tooltip: "", icon: "" },
        id: 4,
      },
    ],
  }}
/>

O contrato ERC721A só precisa definir os metadados de propriedade duas vezes: uma vez para o batch da Alice e uma vez para o batch do Bob.

Porém, isso significa que, ao transferir um tokenID que não tem um endereço de proprietário explicitamente definido, o contrato precisa rodar um loop por todos os tokenIDs até chegar ao primeiro NFT com um endereço de proprietário explícito para encontrar o proprietário que tem o direito de transferi-lo, e então definir um novo proprietário, modificando assim o estado de propriedade mais de uma vez para manter os agrupamentos corretos.

Aqui está um teste para [simular cenários de transferência e registrar custos de gas](https://github.com/thatguyintech/demo-erc721a/blob/main/test/gas-costs.js#L84-L97):

<EmbeddedTable
  table={{
    columns: [
      { key: "1", width: 200, title: "", dataType: "object" },
      { key: "2", width: 200, title: "Mint 1", dataType: "object" },
      { key: "3", width: 200, title: "Mint 2", dataType: "object" },
      { key: "4", width: 200, title: "Mint 3", dataType: "object" },
      { key: "5", width: 200, title: "Mint 4", dataType: "object" },
      { key: "6", width: 200, title: "Mint 5", dataType: "object" },
    ],
    data: [
      {
        "1": { title: "<p>t0</p>", tooltip: "", icon: "" },
        "2": { title: "<p>71355</p>", tooltip: "", icon: "" },
        "3": { title: "<p>92043</p>", tooltip: "", icon: "" },
        "4": { title: "<p>92043</p>", tooltip: "", icon: "" },
        "5": { title: "<p>92043</p>", tooltip: "", icon: "" },
        "6": { title: "<p>92043</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        "1": { title: "<p>t1</p>", tooltip: "", icon: "" },
        "2": { title: "<p></p>", tooltip: "", icon: "" },
        "3": { title: "<p>91197</p>", tooltip: "", icon: "" },
        "4": { title: "<p>111885</p>", tooltip: "", icon: "" },
        "5": { title: "<p>111885</p>", tooltip: "", icon: "" },
        "6": { title: "<p>117345</p>", tooltip: "", icon: "" },
        id: 1,
      },
      {
        "1": { title: "<p>t2</p>", tooltip: "", icon: "" },
        "2": { title: "<p></p>", tooltip: "", icon: "" },
        "3": { title: "<p></p>", tooltip: "", icon: "" },
        "4": { title: "<p>93927</p>", tooltip: "", icon: "" },
        "5": { title: "<p>114615</p>", tooltip: "", icon: "" },
        "6": { title: "<p>114615</p>", tooltip: "", icon: "" },
        id: 2,
      },
      {
        "1": { title: "<p>t3</p>", tooltip: "", icon: "" },
        "2": { title: "<p></p>", tooltip: "", icon: "" },
        "3": { title: "<p></p>", tooltip: "", icon: "" },
        "4": { title: "<p></p>", tooltip: "", icon: "" },
        "5": { title: "<p>96657</p>", tooltip: "", icon: "" },
        "6": { title: "<p>111885</p>", tooltip: "", icon: "" },
        id: 3,
      },
      {
        "1": { title: "<p>t4</p>", tooltip: "", icon: "" },
        "2": { title: "<p></p>", tooltip: "", icon: "" },
        "3": { title: "<p></p>", tooltip: "", icon: "" },
        "4": { title: "<p></p>", tooltip: "", icon: "" },
        "5": { title: "<p></p>", tooltip: "", icon: "" },
        "6": { title: "<p>99387</p>", tooltip: "", icon: "" },
        id: 4,
      },
    ],
  }}
/>

A forma de ler esse gráfico é primeiro pelo eixo x, e depois pelo eixo y, como:

- "Mintar um batch de 1 NFT, depois transferir o tokenID 0", ou
- "Mintar um batch de 3 NFTs, depois transferir o tokenID 1", ou
- "Mintar um batch de 5 NFTs, depois transferir o tokenID 4"

A partir desses resultados, podemos ver que transferir tokenIDs no meio de um batch de mint maior \(ou seja, t1, t2\) custa mais do que transferir tokenIDs nas extremidades do batch \(ou seja, t0, t4\).

Note que esse experimento rápido só rastreia o custo de uma única transferência após o mint.

### Uma solução alternativa para diminuir os custos de transferência após o batch minting de NFTs

Aqui está uma solução interessante para minimizar o custo total de transferir todo o seu batch de NFTs \(fonte original de William Entriken @fulldecent\):

1. Sempre minte o número máximo permitido de NFTs durante o batch mint.
1. Ao transferir, comece pelos tokens de número ÍMPAR primeiro, em ordem CRESCENTE.
1. Depois disso, transfira os tokens de número PAR.

<ImageBlock
  src="https://media.alchemy.com/1704713646-making-subsequent-transfers-cheaper-to-execute.png"
  alt="Tornando transferências subsequentes mais baratas de executar"
  width={1106}
  height={934}
  caption="Tornando transferências subsequentes mais baratas de executar"
/>

Essa estratégia funciona porque força o preenchimento do mapping `\_addressData`, tornando as transferências subsequentes mais baratas de executar.

### Exemplos de projetos de NFT usando contratos ERC721A

Aqui está um [conjunto de projetos que atualmente usam o contrato ERC721A](https://twitter.com/fulldecent/status/1491506123987431428?s=20&t=DZ-FrTtgF2gjSsPEv_1gZw):

- @AzukiZen
- @cerealclubnft
- @TheLostGlitches
- @standardweb3
- @KittyCryptoGang
- @XRabbitsClub
- @WhaleTogether
- @pixelpiracynft
- @dastardlyducks
- @MissMetaNFT
- @StarcatchersNFT
- @LivesOfAsuna
- @richsadcatnft
- @themonkeypoly
- @womenofcrypto\_
- @TravelToucans
- @HuhuNFT

### Alternativas ao ERC721A para batch minting de NFTs

E para os mais aventureiros, reserve um tempo para conferir uma otimização ainda _mais nova_ do padrão ERC721 chamada [ERC721Psi](https://medium.com/@medievaldao/erc721psi-a-truly-scalable-nft-standard-for-low-gas-on-chain-applications-and-randomized-metadata-c25c9e8ac8a8):

<ImageBlock
  src="https://media.alchemy.com/1704713758-newer-optimization-of-the-erc721-standard-called-erc721psi.png"
  alt="Nova otimização do padrão ERC721 chamada ERC721Psi"
  width={1112}
  height={940}
  caption="Nova otimização do padrão ERC721 chamada ERC721Psi"
/>

Não vamos entrar em detalhes sobre o ERC721Psi neste artigo, mas se você tiver curiosidade e quiser aprender mais sobre como ele funciona, me avise mandando um tweet para [@thatguyintech](https://twitter.com/thatguyintech), e farei questão de fazer outro deep dive sobre isso!

Podemos até explorar o deploy de alguns projetos de exemplo usando a Alchemy.

### Contratos ERC721A ainda são considerados NFTs?

A resposta curta é **sim**, contratos ERC721A são definitivamente NFTs.

Qualquer contrato que implemente as interfaces do [padrão de token ERC721 ou ERC1155](https://www.web3.university/article/comparing-erc-721-to-erc-1155) é considerado um token não fungível ou semifungível.

O ERC721A é uma extensão e otimização do padrão ERC721.

O mesmo vale para o ERC721Enumerable e o ERC721Psi.

Todos fazem parte da família ERC721!

### Como queimar tokens ERC721A

Quando você quer se livrar de um NFT ou de um token que tem em sua carteira, mas não quer dá-lo a outra pessoa, e não quer vendê-lo, você pode queimá-lo enviando-o para um endereço de carteira específico que ninguém usa.

Muitas pessoas gostam de usar os mesmos endereços de burn porque são fáceis de lembrar.

Por exemplo, o endereço 0:

`0x0000000000000000000000000000000000000000`

Porém, quando se trata de NFTs ERC721A, **você não pode transferir tokens para o endereço 0 para queimar NFTs**, porque a maioria dos tokens mintados em um batch é mapeada para o endereço 0 por padrão.

Escolha outro endereço para queimar seus NFTs ERC721A e estará tudo certo!

Por exemplo, outro endereço de burn comum é o endereço "0xdead": `0x000000000000000000000000000000000000dEaD`

### Você vai usar o contrato ERC721A para fazer batch mint dos seus NFTs?

O contrato ERC721A é uma forma poderosa de economizar custos de gas para sua comunidade e poupar a rede Ethereum de congestionamento desnecessário ao fazer batch minting de NFTs.

Conte para nós que tipo de projeto de NFT você está construindo e como podemos ajudar! Temos ferramentas para ajudar você a fazer deploy, monitorar, notificar e [divulgar sua próxima coleção de NFT](https://www.alchemy.com/amplify).

Não espere, mande um tweet para [@Alchemy](https://x.com/Alchemy) ou envie um DM e vamos conversar!
