“민트”라는 말에는 낭만적인 느낌이 담겨 있습니다. 동전에 무늬를 찍고, 메달을 눌러 만들고, 파일에 창작의 숨결을 불어넣는 듯합니다. 하지만 온체인에서 실제로 일어나는 일은 그보다 단순하며, 알고 나면 더 유용합니다. 민팅은 함수 호출입니다. 스마트 계약이 매핑에 “토큰 #N의 소유자는 주소 X”라는 새 항목 하나를 기록하고, 로그를 남긴 뒤 트랜잭션을 끝냅니다. 그게 전부입니다. 그 밖의 요소, 즉 작품, 경매, Discord 역할은 이 한 번의 상태 변경을 둘러싼 장치입니다.
이 글은 NFTs 101 시리즈의 3부입니다. NFT가 실제로 무엇인지 또는 메타데이터와 이미지가 실제로 어디에 저장되는지 아직 읽지 않았다면, 이어지는 내용을 이해하는 데 필요한 용어를 익힐 수 있습니다. 여기서는 생성되는 순간 자체에 초점을 맞춥니다. 비용은 얼마인지, 어떻게 작동하는지, 그리고 “레이zy 민팅”이라고 불리는 방식이 어떻게 창작자 경제를 조용히 바꾸었는지 살펴봅니다.
프로토콜 수준에서 민팅이란 무엇인가
ERC-721 표준은 이 점을 매우 간결하게 다룹니다. 명세에는 “NFT의 생성(‘민팅’)과 파괴(‘소각’)는 명세에 포함되지 않는다”고 명시되어 있습니다. 다시 말해 표준은 토큰을 만드는 방법을 정하지 않습니다. 토큰이 만들어진 뒤 어떤 형태여야 하는지만 정합니다.
관례는 Transfer 이벤트에 담겨 있습니다. 이 이벤트는 “NFT가 생성(from == 0)되거나 파괴(to == 0)될 때 발생합니다.” 여기서 영 주소인 0x0000000000000000000000000000000000000000가 의미를 나타내는 표식입니다. 발신자가 영 주소인 Transfer 이벤트는 “이 토큰은 이전에는 존재하지 않았지만 이제 존재한다”는 뜻입니다. 블록 탐색기는 이 로그를 확인하고 “민팅”으로 표시합니다.
실제로 운영되는 NFT 계약은 대부분 자체 구현을 작성하는 대신 OpenZeppelin 구현을 재사용합니다. 내부 함수 두 개가 작업을 수행합니다. _mint은 “tokenId를 민팅하여 to로 전송”합니다. 즉 소유권 슬롯을 기록하고, 잔액 카운터를 증가시키며, 이벤트를 발생시킵니다. _safeMint은 여기에 to 수신 확인도 추가합니다. to가 스마트 계약을 가리키는 경우, 해당 계약은 NFT를 보유하는 방법을 실제로 알고 있음을 확인하는 IERC721Receiver.onERC721Received을 구현해야 합니다. _mint에는 항상 두 가지 요건이 적용됩니다. tokenId은 이미 존재해서는 안 되며, to은 영 주소일 수 없습니다. 영 주소는 소각용 주소로 예약되어 있습니다.
_mint와 _safeMint의 차이는 중요합니다. 수신 인터페이스를 구현하지 않은 계약에 일반 _mint을 실행하면 토큰이 그곳에 영구적으로 갇힐 수 있습니다. OpenZeppelin의 문서도 “이 메서드의 사용은 권장하지 않습니다. 가능한 경우 ERC721._safeMint을 사용하세요”라고 경고합니다.
1차 시장과 2차 시장
민팅은 1차 시장에서 일어나는 거래입니다. 토큰이 온체인에 처음 생성되는 순간이며, 토큰을 생성하는 트랜잭션에서 첫 구매자에게 전송하는 경우가 많습니다. 판매 대금은 창작자나 계약의 재무 계정으로 들어갑니다.
그 이후의 거래는 모두 2차 시장에서 이루어집니다. 수집가가 토큰을 다른 수집가에게 판매할 때 새 저장 슬롯은 생성되지 않습니다. 계약이 기존 tokenId → owner 항목을 새 주소로 재할당할 뿐입니다. 토큰은 이미 존재하며 포인터만 이동합니다.
이때 ERC-2981 로열티가 적용됩니다. 로열티 표준에 따라 계약은 “2차 판매 시 X%를 이 주소로 보내 주세요”라고 지정할 수 있으며, 이 표준을 따르는 마켓플레이스는 이를 이행합니다. 로열티는 프로토콜이 아니라 마켓플레이스에서 적용합니다. 블록체인 자체는 개인 간 전송으로 로열티를 우회하는 것을 막지 않습니다. 1차 시장과 2차 시장의 구분을 알면 반복적으로 나타나는 양상도 이해할 수 있습니다. 인기 민팅에서는 희소한 1차 토큰을 한꺼번에 확보하려는 사람들이 몰려 민팅 당일 가스 전쟁이 벌어지고, 몇 달 뒤 재판매에서는 새 저장 항목을 쓰지 않고 소유권만 재할당하므로 비용이 낮고 거래도 한산합니다.
민팅에 드는 가스의 구성
블록체인 저장소에 기록하는 데 비용이 들기 때문에 민팅에도 비용이 발생합니다. 블록체인 트랜잭션이 작동하는 방식을 알면 이해에 도움이 됩니다. 가스에 실제 비용이 드는 이유에서는 경제적 배경을 확인할 수 있습니다. 민팅 비용을 간단히 살펴보면 다음과 같습니다.
- Ethereum 트랜잭션은 실행 자체에 드는 기본 비용 21,000가스로 시작합니다.
SSTORE_SET_GAS은 저장 슬롯의 값을 0에서 0이 아닌 값으로 바꿀 때 20,000가스가 듭니다. 민팅 비용에서 가장 큰 항목입니다.- 민팅이 건드리는 새 저장 슬롯마다 20,000가스가 추가됩니다.
tokenId → owner매핑, 주소별 잔액 카운터, 경우에 따라 토큰별 URI가 여기에 해당합니다. - 입력 데이터(전달하는 함수 인자)는 EIP-2028에 따라 0이 아닌 바이트당 16가스(기존 68에서 감소), 0 바이트당 4가스가 듭니다.
Transfer이벤트 자체에도 인덱싱된 토픽으로 인해 수천 가스가 추가됩니다.
모두 합하면 일반적인 ERC-721 민팅에는 계약이 건드리는 저장 슬롯 수와 일괄 처리 여부에 따라 50,000~150,000가스가 듭니다. 이름과 달리 “무료 민팅”도 실제로 무료는 아닙니다. 창작자가 가스비 외에 민팅 가격을 청구하지 않을 뿐이며, 네트워크 비용은 구매자가 부담합니다.
레이지 민팅: 첫 전송 시 이루어지는 가스비 없는 민팅
앞서 살펴본 방식을 자세히 보면 비효율적인 점이 드러납니다. 창작자는 토큰 10,000개를 온체인에 올리기 위해 먼저 가스비를 내지만, 실제로 몇 개가 팔릴지는 알기 어렵습니다. 아무도 사지 않는 토큰을 민팅하는 비용은 그대로 손실이 됩니다. 레이지 민팅은 시점을 바꿉니다. 구매자가 나타날 때까지 민팅을 미루고, 가스비는 구매자가 내도록 합니다.
이 방식은 Ethereum 문서에서 “바이트 문자열만 사용하는 대신 형식이 지정된 구조화 데이터에 서명하고 해시하기 위한 표준”이라고 설명하는 EIP-712를 활용합니다. 쉽게 말해 창작자는 토큰 ID, 메타데이터 URI, 가격, 자격 조건이 담긴 바우처 같은 구조화된 오프체인 메시지에 서명할 수 있으며, 스마트 계약은 나중에 암호학적으로 이를 검증합니다. 지갑은 필드를 16진수 데이터 덩어리 대신 사람이 읽을 수 있는 텍스트로 표시합니다. 이는 보안상 이점이자 EIP-712가 업계 표준으로 자리 잡은 이유입니다.
구매자가 구매를 결정하면 민팅 계약의 redeem 함수를 호출하고 바우처와 창작자의 서명을 전달합니다. 계약은 서명을 검증하고 같은 트랜잭션에서 _safeMint을 실행한 뒤 판매 대금을 창작자에게 보냅니다. 가스비는 구매자가 냅니다. 창작자는 팔리지 않은 재고에 대해 비용을 내지 않습니다. OpenSea는 과거 창작자 드롭에 이 방식을 널리 알렸습니다. Rarible, Zora 및 여러 독립 민팅 플랫폼도 변형된 방식을 사용합니다. (OpenSea의 최신 프로토콜인 Seaport는 레이지 민팅 기능이 아니라 거래 프로토콜이지만, 유사한 EIP-712 서명 주문 방식을 사용합니다.)
일반적인 민팅 방식
작동 원리를 이해하면 판매 형식은 _safeMint에 정책을 덧붙인 것에 불과합니다.
- 고정 가격: 모든 토큰의 가격이 ETH 기준으로 동일합니다.
- 더치 경매: 공급량이 모두 판매될 때까지 정해진 일정에 따라 가격이 높은 수준에서 점차 내려갑니다.
- 허용 목록 / 화이트리스트: 사전 승인된 주소는 민팅을 먼저 할 수 있으며, 대형 온체인 목록을 두는 대신 Merkle 증명을 사용하는 경우가 많습니다. 보통 할인된 가격이 적용됩니다.
- 무료 민팅: 구매자는 가스비만 부담하며, 창작자의 수익 모델은 2차 로열티에 달려 있습니다.
- 민팅 후 공개: 처음에는 모든 토큰이 자리 표시 이미지로 연결됩니다. 민팅이 끝나면 창작자가 플래그를 변경해 실제 메타데이터를 공개합니다. 민팅 중 희귀도를 노린 선점 거래를 막을 수 있습니다.
- 레이지 민팅: 누군가 구매하기 전까지 토큰은 온체인에 존재하지 않습니다. “컬렉션”은 창작자의 서버에 저장된 서명된 바우처 목록입니다.
기반이 되는 호출은 같은 _mint입니다. 민팅 시점과 주체, 가격에 관한 규칙이 다를 뿐입니다.
문제가 생길 수 있는 경우
민팅은 신규 사용자가 겪는 작업 중 실패하기 쉬운 편입니다. 주로 시간에 쫓기는 상황에서 공개적으로 진행되기 때문입니다.
- 실패한 트랜잭션에도 가스비가 듭니다. 민팅이 되돌려지더라도(판매 완료, 허용 목록에 없음, 컨트랙트 오류 등) 네트워크는 되돌리기 전에 수행한 작업에 대한 비용을 청구합니다.
- 선행 매매(프런트러닝). 인기가 많은 민팅에서는 봇이 멤풀을 감시하고 더 높은 우선 수수료를 내 사람보다 먼저 거래를 끼워 넣습니다. 사용자가 “확인”을 누른 사이 물량이 소진되면, 트랜잭션은 다음 블록에 포함되지만 대기열은 이미 비어 있습니다.
- 멈춘 민팅. 네트워크 수요에 비해 가스 가격을 너무 낮게 설정하면 트랜잭션이 멤풀에 들어간 채 블록에 포함되지 않습니다. 대부분의 지갑에서는 더 높은 수수료로 트랜잭션을 대체해 속도를 높이거나, 같은 nonce로 자신에게 보내는 금액 0의 전송으로 대체해 취소할 수 있습니다.
- 레이지 민팅의 서명 재사용. 부실하게 작성된 바우처 컨트랙트는 같은 서명을 두 번 사용할 수 있게 할 수 있습니다. 제대로 작성된 컨트랙트는 nonce나 매핑으로 사용된 바우처를 추적해 중복 사용을 거부합니다.
_mint사용 시 잘못된 수신자. 컨트랙트가_safeMint대신 일반_mint을 사용하고, 구매자가 ERC-721 수신 인터페이스를 구현하지 않은 스마트 컨트랙트 지갑으로 민팅하면 토큰이 그곳에 갇힙니다. OpenZeppelin이 공개 사용자 대상 흐름에서 일반_mint사용을 명시적으로 권장하지 않는 이유입니다.
이런 문제는 드문 예외가 아닙니다. 공개 네트워크에서 민팅할 때 흔히 겪는 일이며, 상태가 어떻게 바뀌는지 한 번 살펴보면 모두 더 쉽게 알아볼 수 있습니다.
핵심 요점
- 민팅은 소유권 매핑에 새 항목 하나를 기록하고, 제로 주소에서
Transfer이벤트를 발생시키는 특정 함수 호출입니다. 아트와 경매는 그 순간을 둘러싼 부수적인 요소입니다. - OpenZeppelin의
_safeMint은 토큰을 보유할 수 없는 컨트랙트에 토큰이 갇히지 않도록 하기 때문에 프로덕션 환경의 기본 선택지입니다._mint보다 이를 우선적으로 사용하세요. - 1차 시장의 민팅은 새 저장 공간에 데이터를 기록하므로 비용이 많이 들고, 2차 시장의 전송은 포인터만 재할당하므로 훨씬 저렴합니다. 그래서 민팅 당일에는 가스 전쟁이 벌어지지만 재판매 때는 대체로 그렇지 않습니다.
- 레이지 민팅은 EIP-712 서명 바우처를 사용해 온체인 기록을 첫 구매 시점까지 미룹니다. 판매되지 않은 물량에는 제작자가 비용을 내지 않고, 구매자는 원래 낼 예정이었던 가스비를 부담합니다.
- 민팅에 실패해도 가스비가 들고, 멈춘 민팅은 대체할 수 있으며, 선행 매매는 공개 멤풀의 버그가 아니라 작동 방식의 일부입니다. 이에 맞게 예산을 잡고 당황한 상태에서 민팅하지 마세요.



