---
title: "ERC721 vs. ERC721A: NFT 배치 민팅"
description: "Azuki 팀이 만든 ERC721 표준의 대안 구현체입니다. NFT 배치 민팅을 최적화하는 데 유용합니다."
---

# ERC721 vs. ERC721A: NFT 배치 민팅

NFT 크리에이터들이 잘 알고 있듯이, [Ethereum 메인넷에 스마트 컨트랙트를 배포하는 것](https://www.alchemy.com/overviews/nft-deployment-cost)은 비용이 상당히 많이 들 수 있습니다.

하지만 스마트 컨트랙트 배포 비용만이 블록체인 엔지니어와 NFT 팀이 고려해야 할 유일한 비용은 아닙니다. [성공적인 NFT 컬렉션](https://www.alchemy.com/overviews/how-to-create-a-successful-nft-project)이나 콜렉터블 아바타 프로젝트를 만드는 것은 커뮤니티를 구축하고 사용자가 NFT를 **민팅**, **거래**, **사용**하기 쉽게 만드는 과정을 포함합니다.

NFT 민팅 비용에서 커뮤니티가 가스비를 절약할 수 있도록 도와주는 강력한 NFT 스마트 컨트랙트 최적화 기법을 알아보겠습니다:

ERC721A 컨트랙트를 이용한 배치 민팅 구현입니다!

### ERC721A란 무엇인가?

1월 6일, Azuki NFT 개발팀은 배치 민팅을 탐구하는 [ERC721 NFT 표준의 새로운 구현체인 ERC721A](https://www.azuki.com/erc721a)를 공개적으로 발표했습니다:

<ImageBlock
  src="https://media.alchemy.com/1704712932-azuki-team-introducing-erc721a-implementation.png"
  alt="ERC721A 구현을 소개하는 Azuki 팀"
  width={1108}
  height={938}
  caption="ERC721A 구현을 소개하는 Azuki 팀"
/>

ERC721A 스마트 컨트랙트 구현을 설명하는 블로그 포스트에서, **@locationtba**와 **@2pmflow**는 가장 널리 사용되는 NFT 스마트 컨트랙트 스타터 코드인 [OpenZeppelin의 ERC721Enumerable 컨트랙트](https://docs.openzeppelin.com/contracts/4.x/api/token/erc721#ERC721Enumerable)를 통한 배치 민팅과 새로운 Azuki [ERC721A 컨트랙트](https://github.com/chiru-labs/ERC721A)를 통한 배치 민팅 사이에 절약되는 가스량을 추정치로 보여줍니다:

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

이 표는 민팅 개수가 늘어날수록 ERC721A에서 사용되는 가스량이 훨씬 작은 상수 비율로 증가함을 보여줍니다.

NFT를 민팅할 때 드는 가스 비용의 증가폭은 다음과 같습니다:

- Azuki ERC721A 컨트랙트 사용 시 **민팅 1건 추가당 약 2천 가스**
- [OpenZeppelin](https://www.alchemy.com/dapps/openzeppelin) ERC721Enumerable 컨트랙트 사용 시 **민팅 1건 추가당 약 11만 5천 가스**

이 결과는 정말 **놀랍습니다!**

ERC721Enumerable 컨트랙트를 통해 토큰 하나를 민팅하는 비용으로, ERC721A 컨트랙트를 사용하면 대신 최대 5개(또는 그 이상)의 토큰을 민팅할 수 있습니다.

민팅 비용을 최대 80%까지 절약할 수 있다면 마다할 사람이 있을까요?

가장 중요한 부분은 다음과 같습니다:

개별 트랜잭션의 NFT 민팅 가격이 저렴해질 뿐만 아니라, 인기 있는 컬렉션 드롭 시기에 Ethereum 네트워크에 영향을 미치는 **네트워크 혼잡**과 **가스 가격 급등**도 줄어들게 됩니다.

꽤 괜찮은 결과입니다.

### 여러 NFT를 민팅할 때의 가스 절감 효과 검증하기

직접 확인해보고 싶어서, [NFT를 생성하는](https://www.alchemy.com/docs/how-to-interact-with-erc-721-tokens-in-solidity) 기본적인 스마트 컨트랙트 두 개를 구현했습니다:

1. ERC721Enumerable을 사용해 민팅하는 [스마트 컨트랙트](https://github.com/thatguyintech/demo-erc721a/blob/main/src/DemoErc721.sol) 하나
1. ERC721A를 사용해 민팅하는 [스마트 컨트랙트](https://github.com/thatguyintech/demo-erc721a/blob/main/src/DemoErc721a.sol) 하나

그 다음, 각각의 민팅 함수를 호출하고 트랜잭션별 가스 비용을 기록했습니다.

결과는 다음과 같습니다:

이 테스트에 사용된 코드는 GitHub 저장소 [demo-erc721a](https://github.com/thatguyintech/demo-erc721a)에서 확인할 수 있습니다.

여러 NFT를 민팅할 때의 가스 비용은 Azuki 블로그 포스트에 나온 수치와 약간 다르지만 비슷하며, 민팅 1건, 2건, 여러 건에 따른 가스비 증가 패턴이 일치함을 확인했습니다.

배치 민팅 시 NFT의 가스 절감 효과를 검증했습니다! ✅

### ERC721A 스마트 컨트랙트는 배치 민팅으로 어떻게 가스비를 절약하는가?

ERC721A는 스마트 컨트랙트 설계에 영향을 미치는 몇 가지 가정을 전제로 합니다:

1. **토큰 ID는 항상 0부터 연속적으로 증가**해야 합니다. 대부분의 NFT 프로젝트가 이미 이렇게 하고 있으며, Azuki도 이를 자신들의 가정에서 명시하고 있습니다.
1. **NFT 민팅 시 가스 비용을 줄이는 것이 다른 어떤 ERC721 호출을 최적화하는 것보다 중요**합니다. 민팅은 Ethereum 네트워크 혼잡이 발생하는 시점이며, 사용자가 NFT 컬렉션에 대해 갖는 첫인상이기도 합니다. 민팅이 쉬울수록 평판도 좋아집니다.

이러한 가정을 바탕으로, ERC721A는 다음과 같은 컨트랙트 최적화를 수행합니다:

1. **토큰 메타데이터의 낭비되는 저장 공간을 줄입니다.**
1. **소유권 상태 업데이트를 민팅된 NFT마다 한 번씩이 아니라, 배치 민팅당 한 번으로 제한합니다.**

이러한 최적화가 어떻게 이루어지는지 살펴보기 전에, 먼저 어떤 종류의 트랜잭션이 가장 많은 가스비를 소모하는지 이해해야 합니다.

### 쓰기 트랜잭션에 필요한 작업을 줄이면 사용자의 가스비가 절약된다

블록체인에서 트랜잭션은 크게 쓰기(write)와 읽기(read) 두 종류로 나뉩니다.

**쓰기**는 블록체인 상태를 수정하거나 업데이트할 때(예: 송금, 메시지 작성, NFT 거래) 발생합니다.

**읽기**는 기존 데이터를 조회할 때 발생합니다.

사용자는 **읽기 함수보다 쓰기 함수에 항상 더 많은 가스비를 지불합니다.**

따라서 쓰기 트랜잭션의 수를 줄이거나, 쓰기 트랜잭션을 보내는 데 필요한 작업을 줄이면, 나중에 읽기 트랜잭션을 보내는 데 더 많은 작업이 필요하더라도, 사용자가 지불하는 NFT 민팅 비용은 줄어듭니다!

그리고 이것이 바로 ERC721A가 이루어내는 것입니다.

NFT 민팅에 있어서는: 저장 공간이 많을수록, 문제도 많습니다. 저장 공간이 적을수록, 문제도 적습니다.

훌륭하지 않나요?

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

ERC721A 컨트랙트는 소유권 메타데이터를 두 번만 설정하면 됩니다: Alice의 배치에 한 번, Bob의 배치에 한 번입니다.

하지만 이는 명시적인 소유자 주소가 설정되지 않은 tokenID를 전송할 때, 컨트랙트가 전송 권한을 가진 소유자를 찾기 위해 명시적인 소유자 주소를 가진 첫 번째 NFT에 도달할 때까지 모든 tokenID에 걸쳐 반복문을 실행한 다음 새로운 소유자를 설정해야 함을 의미하며, 이로써 올바른 그룹 관계를 유지하기 위해 소유권 상태를 한 번 이상 수정하게 됩니다.

다음은 [전송 시나리오를 시뮬레이션하고 가스 비용을 기록하는](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,
      },
    ],
  }}
/>

이 표를 읽는 방법은 먼저 x축을, 그다음 y축을 보는 것입니다. 예를 들면:

- "NFT 1개를 배치로 민팅한 뒤, tokenID 0을 전송", 또는
- "NFT 3개를 배치로 민팅한 뒤, tokenID 1을 전송", 또는
- "NFT 5개를 배치로 민팅한 뒤, tokenID 4를 전송"

이 결과를 통해, 더 큰 민팅 배치의 중간에 있는 tokenID를 전송하는 것(즉, t1, t2)이 배치의 양 끝에 있는 tokenID를 전송하는 것(즉, t0, t4)보다 비용이 더 든다는 것을 알 수 있습니다.

이 간단한 실험은 민팅 후 단일 전송의 비용만을 추적한다는 점에 유의하세요.

### 배치 민팅 후 전송 비용을 줄이는 방법

전체 NFT 배치를 전송하는 총 비용을 최소화하는 흥미로운 해결책이 있습니다(원 출처: William Entriken @fulldecent):

1. 배치 민팅 시 항상 허용되는 최대 개수의 NFT를 민팅합니다.
1. 전송할 때, 홀수 번호 토큰부터 오름차순으로 먼저 전송합니다.
1. 그다음, 짝수 번호 토큰을 전송합니다.

<ImageBlock
  src="https://media.alchemy.com/1704713646-making-subsequent-transfers-cheaper-to-execute.png"
  alt="이후 전송 비용을 더 저렴하게 만들기"
  width={1106}
  height={934}
  caption="이후 전송 비용을 더 저렴하게 만들기"
/>

이 전략이 효과가 있는 이유는 `\_addressData` 매핑을 채우도록 만들어, 이후 전송을 더 저렴하게 실행할 수 있게 하기 때문입니다.

### ERC721A 컨트랙트를 사용하는 NFT 프로젝트 예시

현재 [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

### NFT 배치 민팅을 위한 ERC721A 대안

더 모험적인 분들을 위해, ERC721 표준을 더욱 새롭게 최적화한 [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="ERC721Psi라는 ERC721 표준의 새로운 최적화"
  width={1112}
  height={940}
  caption="ERC721Psi라는 ERC721 표준의 새로운 최적화"
/>

이 글에서는 ERC721Psi를 자세히 다루지 않겠지만, 이것이 어떻게 작동하는지 더 알고 싶으시다면 [@thatguyintech](https://twitter.com/thatguyintech)로 트윗을 보내주세요. 이에 대해 별도로 심층 분석을 해드리겠습니다!

Alchemy를 이용해 몇 가지 샘플 프로젝트를 배포해보는 것도 함께 살펴볼 수 있습니다.

### ERC721A 컨트랙트도 여전히 NFT로 간주되는가?

짧게 답하자면 **네,** ERC721A 컨트랙트는 확실히 NFT입니다.

[ERC721 토큰 표준이나 ERC1155](https://www.web3.university/article/comparing-erc-721-to-erc-1155) 인터페이스를 구현하는 모든 컨트랙트는 대체 불가능 토큰(non-fungible token) 또는 준대체가능 토큰(semi-fungible token)으로 간주됩니다.

ERC721A는 ERC721 표준의 확장이자 최적화입니다.

ERC721Enumerable과 ERC721Psi도 마찬가지입니다.

이들 모두 ERC721 계열에 속합니다!

### ERC721A 토큰을 소각하는 방법

지갑에 있는 NFT나 토큰을 없애고 싶지만 다른 사람에게 주고 싶지도, 판매하고 싶지도 않을 때는 아무도 사용하지 않는 특정 지갑 주소로 보내서 소각할 수 있습니다.

많은 사람들이 기억하기 쉽다는 이유로 같은 소각 주소를 사용하는 것을 선호합니다.

예를 들어, 0 주소입니다:

`0x0000000000000000000000000000000000000000`

하지만 ERC721A NFT의 경우, 배치로 민팅된 대부분의 토큰이 기본적으로 0 주소에 매핑되어 있기 때문에 **NFT를 소각하기 위해 0 주소로 토큰을 전송할 수 없습니다.**

ERC721A NFT를 소각할 다른 주소를 선택하면 문제없이 진행됩니다!

예를 들어, 또 다른 일반적인 소각 주소는 "0xdead" 주소입니다: `0x000000000000000000000000000000000000dEaD`

### ERC721A 컨트랙트로 NFT를 배치 민팅하시겠습니까?

ERC721A 컨트랙트는 NFT를 배치 민팅함으로써 커뮤니티의 가스 비용을 절약하고 Ethereum 네트워크의 불필요한 혼잡을 막을 수 있는 강력한 방법입니다.

어떤 NFT 프로젝트를 만들고 계신지, 그리고 저희가 어떻게 도울 수 있을지 알려주세요! 저희는 다음 [NFT 컬렉션을 배포, 모니터링, 알림, 마케팅](https://www.alchemy.com/amplify)하는 데 도움을 드릴 수 있는 도구를 갖추고 있습니다.

기다리지 말고 [@Alchemy](https://x.com/Alchemy)로 트윗을 보내거나 DM을 보내서 이야기 나눠요!
