본문 바로가기
프로그래밍/solidity

[220516] 민팅에 type을 랜덤으로 생성하기

by 한코코 2022. 5. 16.

MintAnimalToken.js

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";

contract MintAnimalToken is ERC721Enumerable {
    constructor() ERC721("h662Animals", "HAS") {}

    mapping(uint256 => uint256) public animalTypes;
    // 앞에있는 uint256 = animalTokenId
    // 뒤에있는 uint256 = animalTypes
    // 즉, animalTokenId를 입력하면 animalTypes이 나오는 함수

    function mintAnimalToken() public {
        uint256 animalTokenId = totalSupply() + 1; //지금까지 민팅(발행)된 nft의 양

        // nft 5개를 생성하기
        uint256 animalType = uint256(
            // 솔리디티 내장 해시함수 : 충돌할 확률이 가장 적은 난수를 생성해줌
            keccak256( 
                // keccak256을 사용하기위한 바이트값
                abi.encodePacked(
                    // 언제 실행했는지, 누가 실행했는지, 무엇을 할건지
                    block.timestamp, msg.sender, animalTokenId
                )
            )
        ) % 5 + 1; // 1-5번까지 랜덤하게 넣기위한 함수
        
        animalTypes[animalTokenId] = animalType;

        _mint(msg.sender, animalTokenId);
        //animalTokenId = nft의 유일한 값
    }
}

 

 

코드를 작성했으면 Deploy(전개하다) 버튼을 클릭해 새로 개체를 생성한다.

mintAnimalTo...를 클릭해 민팅을 해준다.

 

 

animalType에 1부터 5까지 랜덤으로 숫자를 부여하는 코드를 작성했었다.

왼쪽 이미지는 민팅을 한번 한 후에 animaTypes에 1을 입력한 후 call을 클릭한 결과다.

숫자는 0이 부여 되었다.

민팅 실행후 순서대로 숫자를 1,2,3,4,5를 입력하면 계속해서 랜덤으로 바뀌는 값을 볼 수 있다.

(가끔 민팅한 숫자랑 animalTypes에 넣은 숫자가 맞지 않으면 숫자가 고정되어서 안 움직인다. 왜지)

숫자 0이 부여된 왼쪽 이미지 / 숫자 4가 부여된 오른쪽 이미지

 

댓글