판매자가 민팅한 nft가 market에서 팔리지 않는다면, 판매자 입장에선 minting price만 지불한셈이다. 이런 상황을 피하기 위해 lazy minting이 도입되었다. 이름에서 알 수 있듯이, 민팅 과정을 미루는 것이다.
이는 nft가 실제로 구매 될 때 nft를 판매자에게 민팅하고 판매자가 구매자에게 nft를 transfer하는 방식이다. 즉, 구매가 이뤄지기 전 까지 market에 올라가있는 nft는 사실 nft가 아니라 단순 이미지일 뿐이다.
lazy minting을 사용하면 minting price를 구매자가 지불하게 된다.
참고 - https://nftschool.dev/tutorial/lazy-minting/#how-it-works
0xd849585d6e93ac0089cb21f2d7001a57a4361ce7e4f26794222e336ad4713dcc6549aac8f3~~~~~~~b48e1d8039c85142aae5c62ce0ab64fd471c
function redeem(address redeemer, NFTVoucher calldata voucher) public payable returns (uint256) {
// make sure signature is valid and get the address of the signer
address signer = _verify(voucher);
// make sure that the redeemer is paying enough to cover the buyer's cost
require(msg.value >= voucher.minPrice, "Insufficient funds to redeem");
// first assign the token to the signer, to establish provenance on-chain
_mint(signer, voucher.tokenId);
_setTokenURI(voucher.tokenId, voucher.uri);
// transfer the token to the redeemer
_transfer(signer, redeemer, voucher.tokenId);
return voucher.tokenId;
}
function _verify(NFTVoucher calldata voucher) internal view returns (address) {
bytes32 digest = _hash(voucher);
return ECDSA.recover(digest, voucher.signature);
}
function _hash(NFTVoucher calldata voucher) internal view returns (bytes32) {
return _hashTypedDataV4(keccak256(abi.encode(
keccak256("NFTVoucher(uint256 tokenId,uint256 minPrice,string uri)"),
voucher.tokenId,
voucher.minPrice,
keccak256(bytes(voucher.uri))
)));
}
결론
lazy minting을 사용하면 판매자 입장에선 minting price로 인한 진입장벽으로부터 자유로워지기 때문에 market에 다양한 nft가 등록될 수 있다. 하지만 minting되기 전까지 minting을 위한 정보(image, signature 등)가 어딘가에 저장되어있어야하기 때문에 탈중앙이라는 가치엔 다소 위배된다.