본문 바로가기
BlockChain

ERC721 스마트 컨트랙트(SmartContract)를 만들어보자 [5]

by parkjp 2023. 8. 28.

 

 

시작하기 앞서

이번 편에서는 ERC721 컨트랙트를 간단하게 예시를 들어 만들어보자.

ERC721은 ERC20과는 다르게 대체불가능 토큰이며 각 토큰마다의 소유권을 나타내는 표준이다.

우리가 말하는 NFT가 ERC721의 표준으로 만들어진 것이다.

 

 

ERC721 예시

간단하게 코드를 먼저 보자.

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract TestERC721 is ERC721URIStorage, ReentrancyGuard {

    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() ERC721("item", "ITM"){}

    function awardItem(address player, string memory tokenURI)
    public
    returns (uint256)
    {
        uint256 newItemId = _tokenIds.current();
        _mint(player, newItemId);
        _setTokenURI(newItemId, tokenURI);

        _tokenIds.increment();
        return newItemId;
    }

    function buy(uint256 tokenId)
    external
    payable nonReentrant
    {
        address buyer = msg.sender;
        address payable seller = payable(ownerOf(tokenId));

        require(buyer != address(0));
        require(msg.value <= address(buyer).balance, "lack of your balance");

        _safeTransfer(seller, buyer, tokenId, "");
        seller.transfer(msg.value);
    }
}

 

ERC721은 경매로 transfer가 이루어진다. 하지만 위는 예시이기 때문에 직접 구매하는 기능을 넣어보았다.

awardItem 함수는 NFT를 발급하는 함수이다. Counter 객체로 아이템ID를 발급해주고 그 아이템ID와 아이템의 상세 정보 파일을 가르키는 URL을 매칭한다. 보통 json파일로 매칭하는데 예를 들어보자.

 

awardItem(playerAddress, "https://game.example/item-a19ek.json")

// output itemId: 1


// https://game.example/item-a19ek.json
{
    "name": "Thor's hammer",
    "description": "the legendary hammer of the Norse god of thunder.",
    "image": "https://game.example/item-id-8u5h2m.png",
    "properties": {
    	"strength": 20
    }
}

 

메타데이터 정보는 체인에 직접적으로 있지 않아 개발자는 실수로 올렸거나 규칙이 변경되었을 시 메타데이터를 변경하여 수정할 수 있다. 이러한 모든 정보를 체인에 저장하려면 ERC721을 확장하여 저장할 수 있지만 비용이 많이 들게 된다.

IPFS를 활용하여 tokenURI 정보를 저장할 수도 있지만 이러한 방법은 ERC721의 개요 가이드 범위를 벗어난다.

 

두번째로 볼 함수는 구매함수이다. 위에서 언급했듯 보통 경매로 거래가 진행되지만 예시로 넣어보았다.

거래가 진행되려면 함수에 payable이 있어야한다. 그리고 재진입 방지를 위한 reentrancyGuard를 붙여두었다.판매자가 구매자에게 물건을 넘겨줌과 구매자가 판매자에게 비용을 주게된다.

간단하게 ERC721의 예시를 마치겠다.

 

 

다음편에서는

ERC1155에 대해 알아보자. 마찬가지로 간단한 예시로 진행해 보겠다.

 

 

https://developer-jp.tistory.com/106

 

ERC1155 스마트 컨트랙트(SmartContract)를 만들어보자 [6]

시작하기 앞서 ERC1155는 단순하게 말하면 이전 편에서 했었던 ERC20과 ERC721을 결합한 형태라 볼 수 있다. EIP-165를 지원하고 ERC20이나 ERC721과는 다르게 한 번의 트랜잭션으로 여러 자산을 전송하거

developer-jp.tistory.com

 

반응형