[멋쟁이 사자처럼 블록체인 스쿨 3기] 23-06-07

임형석·2023년 6월 7일
0

Solidity


ERC-1155

오늘은, 이전에 분석했던 ERC-1155 컨트랙트를 이용해서 토큰을 만들고

테스트넷에 배포, 확인해보았다.

먼저, ERC-1155 에는 ERC-20, ERC-721 과 다른 중요한 특징이 하나 있다.

하나의 컨트랙트에서 여러개의 토큰을 관리할 수 있다는 점.

ERC-20 의 경우, 토큰id 가 따로 존재하지 않았다.

ERC-721 의 경우, 토큰id 가 존재했지만 하나의 토큰id 에 하나의 토큰이었다.

이 둘의 특징을 보완해서 나온 것이 ERC-1155 라고 생각하면 쉬울 것 같다.

예를 들어, P2E 게임을 만들었다고 가정해보자.

이 게임에서 플레이어들이 사용 할 무기들을 토큰화 해서 관리한다고 한다면..

	{
    	name : Sword,
        tokenId : 1,
        totalSupply : 10
    }
    
    {
    	name : Shield,
        tokenId : 2,
        totalSupply : 5
    }
    
    {
    	name : Bow,
        tokenId : 3,
        totalSupply : 3
    }

위의 예시 처럼 관리할 수 있을 것이다. (실제 코드나 json 파일과는 다르다..)


Pinata 에 접속해 이미지 파일과 json 파일을 업로드 한다.

Pinata

attributes 는 다음과 같이 단순하게 적었다.

{
  "name": "red",
  "description": "This color is red",
  "image": "https://gateway.pinata.cloud/ipfs/****링크****"
}

그리고 Remix 로 이동해 컨트랙트를 작성했다.

먼저, 아래 라이브러리를 import 해서 사용한다.

Openzeppelin ERC-1155

ERC1155 컨트랙트를 상속 받아 사용한다.

contract RAINBOW is ERC1155

각 색깔마다의 토큰Id 값을 지정해준다.

    uint public constant Red = 1;
    uint public constant Yellow = 2;
    uint public constant Green = 3;
    uint public constant Blue = 4;
    uint public constant Purple = 5;

컨스트럭터로 uri 를 설정해준다.

    string public baseUri;

constructor(string memory _baseUri) ERC1155(_baseUri) {
        baseUri = _baseUri;
        _mint(msg.sender, Red, 5, "");
        _mint(msg.sender, Yellow, 5, "");
        _mint(msg.sender, Green, 5, "");
        _mint(msg.sender, Blue, 5, "");
        _mint(msg.sender, Purple, 5, "");
    }

그리고, 설정한 uri, "/", tokenId, "json" 을 묶어서 하나의 각 토큰별 이미지 링크를 만든다.

function uri(uint tokenId) public override view returns(string memory) {
        return string(abi.encodePacked(baseUri,"/",Strings.toString(tokenId),".json"));
    }

민팅 함수와 balance 를 가져오는 함수를 만들어준다.

function mintToken(uint _id, uint _amount) public {
        _mint(msg.sender, _id, _amount, "");    
    }

    function getBatchAddresses(uint a) public view returns(address[] memory) {
        address[] memory _list = new address[](a);
        for(uint i=0; i<a; i++) {
            _list[i] = msg.sender;
        }
        return _list;
    }

    function getBalanceOfBatch(uint[] memory _tokenIds) public view returns(uint[] memory) {
        return balanceOfBatch(getBatchAddresses(_tokenIds.length), _tokenIds);
    }

그리고 배포한다.

다른 5개의 ID 를 가진 토큰이 각 5개의 수량을 가지고 민팅되었다.

이는 컨스트럭터에 포함되어있던 _mint 함수 때문이다.

_mint(msg.sender, Red, 5, "");

여기서 빨강 토큰을 더 민팅해보았다.

빨강의 tokenId 는 1, 민팅량 5개로 설정.

트랜잭션이 컨펌되면, 갯수가 바뀌는 것을 볼 수 있다.


0개의 댓글