본문으로 건너뛰기
0%

ERC721 vs. ERC721A: NFT 배치 민팅

Albert Hu @thatguyintech headshot

작성자 Albert Hu

2022년 3월 16일에 게시됨6분 읽기

NFT 크리에이터들이 잘 알고 있듯이, Ethereum 메인넷에 스마트 컨트랙트를 배포하는 것은 비용이 상당히 많이 들 수 있습니다.

하지만 스마트 컨트랙트 배포 비용만이 블록체인 엔지니어와 NFT 팀이 고려해야 할 유일한 비용은 아닙니다. 성공적인 NFT 컬렉션이나 콜렉터블 아바타 프로젝트를 만드는 것은 커뮤니티를 구축하고 사용자가 NFT를 민팅, 거래, 사용하기 쉽게 만드는 과정을 포함합니다.

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

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

ERC721A란 무엇인가?

1월 6일, Azuki NFT 개발팀은 배치 민팅을 탐구하는 ERC721 NFT 표준의 새로운 구현체인 ERC721A를 공개적으로 발표했습니다:

ERC721A 구현을 소개하는 Azuki 팀
ERC721A 구현을 소개하는 Azuki 팀

ERC721A 스마트 컨트랙트 구현을 설명하는 블로그 포스트에서, @locationtba@2pmflow는 가장 널리 사용되는 NFT 스마트 컨트랙트 스타터 코드인 OpenZeppelin의 ERC721Enumerable 컨트랙트를 통한 배치 민팅과 새로운 Azuki ERC721A 컨트랙트를 통한 배치 민팅 사이에 절약되는 가스량을 추정치로 보여줍니다:

NUMBER MINTED
GAS USED (ENUMERABLE)
GAS USED (ERC721A)
GAS SAVED

Mint 1

154,814

76,690

78,124

Mint 2

270,339

78,819

191,520

Mint 3

384,864

80,948

303,916

Mint 4

501,389

83,077

418,312

Mint 5

616,914

85,206

531,708

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

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

  • Azuki ERC721A 컨트랙트 사용 시 민팅 1건 추가당 약 2천 가스
  • OpenZeppelin ERC721Enumerable 컨트랙트 사용 시 민팅 1건 추가당 약 11만 5천 가스

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

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

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

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

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

꽤 괜찮은 결과입니다.

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

직접 확인해보고 싶어서, NFT를 생성하는 기본적인 스마트 컨트랙트 두 개를 구현했습니다:

  1. ERC721Enumerable을 사용해 민팅하는 스마트 컨트랙트 하나
  2. ERC721A를 사용해 민팅하는 스마트 컨트랙트 하나

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

결과는 다음과 같습니다:

이 테스트에 사용된 코드는 GitHub 저장소 demo-erc721a에서 확인할 수 있습니다.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

훌륭하지 않나요?

Unit ID
Owner

#100

Alice

#101

<not set>

#102

<not set>

#103

Bob

#104

<not set>

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

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

다음은 전송 시나리오를 시뮬레이션하고 가스 비용을 기록하는 테스트입니다:

Mint 1
Mint 2
Mint 3
Mint 4
Mint 5

t0

71355

92043

92043

92043

92043

t1

91197

111885

111885

117345

t2

93927

114615

114615

t3

96657

111885

t4

99387

이 표를 읽는 방법은 먼저 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를 민팅합니다.
  2. 전송할 때, 홀수 번호 토큰부터 오름차순으로 먼저 전송합니다.
  3. 그다음, 짝수 번호 토큰을 전송합니다.
이후 전송 비용을 더 저렴하게 만들기
이후 전송 비용을 더 저렴하게 만들기

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

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

현재 ERC721A 컨트랙트를 사용하고 있는 프로젝트 목록입니다:

  • @AzukiZen
  • @cerealclubnft
  • @TheLostGlitches
  • @standardweb3
  • @KittyCryptoGang
  • @XRabbitsClub
  • @WhaleTogether
  • @pixelpiracynft
  • @dastardlyducks
  • @MissMetaNFT
  • @StarcatchersNFT
  • @LivesOfAsuna
  • @richsadcatnft
  • @themonkeypoly
  • @womenofcrypto_
  • @TravelToucans
  • @HuhuNFT

NFT 배치 민팅을 위한 ERC721A 대안

더 모험적인 분들을 위해, ERC721 표준을 더욱 새롭게 최적화한 ERC721Psi도 살펴볼 시간을 가져보세요:

ERC721Psi라는 ERC721 표준의 새로운 최적화
ERC721Psi라는 ERC721 표준의 새로운 최적화

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

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

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

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

ERC721 토큰 표준이나 ERC1155 인터페이스를 구현하는 모든 컨트랙트는 대체 불가능 토큰(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 컬렉션을 배포, 모니터링, 알림, 마케팅하는 데 도움을 드릴 수 있는 도구를 갖추고 있습니다.

기다리지 말고 @Alchemy로 트윗을 보내거나 DM을 보내서 이야기 나눠요!

Background gradient

블록체인 매직을 만드세요

Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.