---
title: "ERC721 vs. ERC721A: minteo por lotes de NFTs"
description: "Una implementación alternativa del estándar ERC721 creada por el equipo de Azuki. Útil para optimizar mints por lotes al crear NFTs."
---

# ERC721 vs. ERC721A: minteo por lotes de NFTs

Como saben muchos creadores de NFT, [desplegar un smart contract en Ethereum mainnet](https://www.alchemy.com/overviews/nft-deployment-cost) puede ser increíblemente costoso.

Sin embargo, los costos de despliegue del smart contract **no** son el único costo que los blockchain engineers y los equipos de NFT deben considerar. [Crear una colección de NFT exitosa](https://www.alchemy.com/overviews/how-to-create-a-successful-nft-project) o un proyecto de avatares coleccionables incluye construir una comunidad y facilitar que los usuarios puedan **mintear**, **intercambiar** y **usar** sus NFTs.

Veamos una optimización potente de smart contracts para NFT que puede ayudar a tu comunidad a ahorrar gas fees en los costos de minteo de NFT:

¡Implementar batch minting con el contrato ERC721A!

### ¿Qué es ERC721A?

El 6 de enero, el equipo de desarrollo de Azuki NFT anunció públicamente [ERC721A, una nueva implementación del estándar NFT ERC721](https://www.azuki.com/erc721a) que explora el batch minting:

<ImageBlock
  src="https://media.alchemy.com/1704712932-azuki-team-introducing-erc721a-implementation.png"
  alt="El equipo de Azuki presenta la implementación de ERC721A"
  width={1108}
  height={938}
  caption="El equipo de Azuki presenta la implementación de ERC721A"
/>

En su publicación de blog donde explican la implementación del smart contract ERC721A, **@locationtba** y **@2pmflow** muestran estimaciones de cuánto gas se puede ahorrar al hacer batch minting usando el código base de smart contract NFT más comúnmente utilizado, [el contrato ERC721Enumerable de OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/api/token/erc721#ERC721Enumerable), en comparación con hacer batch minting de NFTs usando el nuevo [contrato ERC721A](https://github.com/chiru-labs/ERC721A) de 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,
      },
    ],
  }}
/>

Esta tabla muestra cómo el gas usado por ERC721A, a medida que aumenta el número de mints, escala con un factor constante mucho menor.

El costo en gas de mintear NFTs aumenta:

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

¡Este resultado es realmente **IMPRESIONANTE**!

Por el precio de mintear un solo token vía el contrato ERC721Enumerable, un usuario puede en cambio mintear hasta 5 tokens (o potencialmente más) vía el contrato ERC721A.

¿Quién no querría que sus usuarios ahorren hasta un 80% en sus mints?

Y esta es la mejor parte:

No solo los precios de minteo de NFT se vuelven más baratos para transacciones individuales, sino que además habría **menos congestión de red** y **picos más pequeños en el precio del gas** afectando a la red de Ethereum durante los lanzamientos de colecciones populares.

Bastante interesante.

### Verificando el ahorro de gas al mintear múltiples NFTs

Quise revisar el trabajo por mí mismo, así que implementé dos smart contracts básicos de NFT que [crean NFTs](https://www.alchemy.com/docs/how-to-interact-with-erc-721-tokens-in-solidity):

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

Luego, llamé a la función de minteo en cada uno y registré los costos de gas de cada transacción.

Estos son mis resultados:

Puedes encontrar el código de estas pruebas en este repositorio de GitHub: [demo-erc721a](https://github.com/thatguyintech/demo-erc721a)

Los costos de gas para hacer múltiples NFTs aquí son ligeramente distintos a los mostrados en la publicación de blog de Azuki, pero son cercanos, y el aumento en los gas fees de un mint, dos mints y múltiples mints se confirma.

¡Hemos validado el ahorro de gas para el batch minting de NFTs! ✅

### ¿Cómo ahorra gas fees el smart contract ERC721A con el batch minting?

ERC721A hace algunas suposiciones que influyen en el diseño de su smart contract:

1. **Los token IDs siempre deben incrementarse consecutivamente empezando desde 0**. La mayoría de los proyectos de NFT ya hacen esto, y Azuki es explícito al respecto en sus suposiciones.
1. **Reducir los costos de gas del minteo de NFTs es más importante** que optimizar cualquier otra llamada de ERC721. Los mints son cuando ocurre la congestión de la red de Ethereum, y también son la primera impresión que los usuarios tienen de una colección de NFT. Mientras más fácil sea el mint, mejor la reputación.

Con estas suposiciones establecidas, ERC721A realiza las siguientes optimizaciones en el contrato:

1. **Reducir el almacenamiento desperdiciado de metadata de tokens.**
1. **Limitar las actualizaciones del estado de ownership a solo una vez por batch mint**, en lugar de una vez por cada NFT minteado.

Veremos cómo se logran estas optimizaciones, pero antes debemos entender qué tipos de transacciones cuestan más gas fees.

### Reducir el trabajo requerido para enviar transacciones de escritura ahorra gas a los usuarios

Generalmente hay dos tipos de transacciones en la blockchain: escrituras y lecturas.

Las **escrituras** ocurren cuando modificamos o actualizamos el estado de la blockchain (por ejemplo, enviar dinero, escribir un mensaje, intercambiar un NFT).

Las **lecturas** ocurren cuando solicitamos datos existentes para consultarlos.

Los usuarios **siempre pagan más gas fees por funciones de escritura que por funciones de lectura**.

Por lo tanto, al reducir el número de transacciones de escritura, O al reducir el trabajo requerido para enviar transacciones de escritura, aunque implique más trabajo para enviar transacciones de lectura después, ¡esto reducirá los costos de minteo de NFT que pagan los usuarios!

Y eso es exactamente lo que logra ERC721A.

Cuando se trata de mints de NFT: más almacenamiento, más problemas. Menos almacenamiento, menos problemas.

Brillante, ¿no?

<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,
      },
    ],
  }}
/>

El contrato ERC721A solo tiene que establecer la metadata de ownership dos veces: una vez para el batch de Alice y otra para el batch de Bob.

Sin embargo, esto significa que al transferir un tokenID que no tiene una dirección de owner establecida explícitamente, el contrato tiene que ejecutar un loop a través de todos los tokenIDs hasta llegar al primer NFT con una dirección de owner explícita, para encontrar al owner con el derecho de transferirlo, y luego establecer un nuevo owner, modificando así el estado de ownership más de una vez para mantener las agrupaciones correctas.

Aquí hay una prueba para [simular escenarios de transferencia y registrar los costos 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,
      },
    ],
  }}
/>

La forma de leer esta tabla es primero por el eje x, y luego por el eje y, por ejemplo:

- "Mintear un batch de 1 NFT, y luego transferir el tokenID 0", o
- "Mintear un batch de 3 NFTs, y luego transferir el tokenID 1", o
- "Mintear un batch de 5 NFTs, y luego transferir el tokenID 4"

A partir de estos resultados, podemos ver que transferir tokenIDs en la mitad de un batch de minteo más grande (es decir, t1, t2) cuesta más que transferir tokenIDs en los extremos del batch (es decir, t0, t4).

Nota que este experimento rápido solo registra el costo de una única transferencia después del mint.

### Una solución alternativa para reducir los costos de transferencia después del batch minting de NFTs

Aquí hay una solución interesante para minimizar el costo total de transferir todo tu batch de NFTs (fuente original de William Entriken @fulldecent):

1. Siempre mintea el número máximo permitido de NFTs durante el batch mint.
1. Al transferir, comienza primero con los tokens de número IMPAR en orden ASCENDENTE.
1. Después de eso, transfiere los tokens de número PAR.

<ImageBlock
  src="https://media.alchemy.com/1704713646-making-subsequent-transfers-cheaper-to-execute.png"
  alt="Hace que las transferencias posteriores sean más económicas de ejecutar"
  width={1106}
  height={934}
  caption="Hace que las transferencias posteriores sean más económicas de ejecutar"
/>

Esta estrategia funciona porque fuerza la población del mapping `\_addressData`, haciendo que las transferencias posteriores sean más baratas de ejecutar.

### Ejemplos de proyectos de NFT que usan contratos ERC721A

Aquí hay un [conjunto de proyectos que actualmente usan el 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 a ERC721A para el batch minting de NFTs

Y para los más aventureros, tómense un tiempo para revisar una optimización aún _más nueva_ del estándar ERC721 llamada [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="Optimización más reciente del estándar ERC721 llamada ERC721Psi"
  width={1112}
  height={940}
  caption="Optimización más reciente del estándar ERC721 llamada ERC721Psi"
/>

No profundizaremos en ERC721Psi en este artículo, pero si tienes curiosidad y quieres saber más sobre cómo funciona, avísame enviándome un tweet a [@thatguyintech](https://twitter.com/thatguyintech), ¡y con gusto haré otro análisis a fondo sobre eso!

Incluso podemos explorar el despliegue de algunos proyectos de ejemplo usando Alchemy.

### ¿Los contratos ERC721A siguen siendo considerados NFTs?

La respuesta corta es **sí**, los contratos ERC721A definitivamente son NFTs.

Cualquier contrato que implemente las interfaces del [estándar de token ERC721 o ERC1155](https://www.web3.university/article/comparing-erc-721-to-erc-1155) se considera un token no fungible o un token semi-fungible.

ERC721A es una extensión y optimización del estándar ERC721.

Lo mismo aplica para ERC721Enumerable y ERC721Psi.

¡Todos son parte de la familia ERC721!

### Cómo quemar tokens ERC721A

Cuando quieres deshacerte de un NFT o un token que tienes en tu wallet, pero no quieres dárselo a otra persona, ni tampoco venderlo, puedes quemarlo enviándolo a una dirección de wallet específica que nadie usa.

A muchas personas les gusta usar las mismas direcciones de quema porque son fáciles de recordar.

Por ejemplo, la dirección 0:

`0x0000000000000000000000000000000000000000`

Sin embargo, cuando se trata de NFTs ERC721A, **no puedes transferir tokens a la dirección 0 para quemar NFTs** porque la mayoría de los tokens minteados en un batch están mapeados por defecto a la dirección 0.

¡Elige otra dirección para quemar tus NFTs ERC721A y estarás bien!

Por ejemplo, otra dirección de quema común es la dirección "0xdead": `0x000000000000000000000000000000000000dEaD`

### ¿Usarás el contrato ERC721A para hacer batch minting de tus NFTs?

El contrato ERC721A es una forma potente de ahorrarle a tu comunidad costos de gas y de evitar que la red de Ethereum sufra congestión innecesaria mediante el batch minting de NFTs.

¡Cuéntanos qué tipo de proyecto de NFT estás construyendo y cómo podemos ayudarte! Tenemos herramientas para ayudarte a desplegar, monitorear, notificar y [promocionar tu próxima colección de NFT](https://www.alchemy.com/amplify).

No esperes más, envíanos un tweet a [@Alchemy](https://x.com/Alchemy) o mándanos un DM, ¡y conversemos!
