- ERC-20과 ERC-721로 만든 Token은 모두 이더리움 기반 토큰이라는 공통점을 가지고 있지만, 가장 큰 차이점은 대체 가능성(
fungible)입니다.- ERC-20으로 발행한 Token은 대체 가능한 토큰입니다. A가 가진 1 토큰의 가격이 500원이라고 가정할때 B가 가진 1 토큰도 마찬가지로 500원인 동일하 가치를 지니고, 이는 A의 토큰과 B의 토큰이 서로 대체 할 수 있는것입니다.
- 반대로 ERC-721로 발행한 Token은 대체 불가능한 토큰입니다. ERC-721로 발행한 토큰은 각 토큰마다 고유한 값을 가지고 식별할 수 있는 토큰입니다. 즉 NFT는 각 토큰마다 동일한 토큰양을 가지고는 있지만 서로 고유한 값을 가지고 있기때문에 서로 대체 할 수는 없습니다.
ERC-721 토큰 예시

- 오늘은
remix IDE를 사용하여 작업을 할것입니다.- 또한
openzeppelin라이브러리를 사용하여 NFT를 만들어볼 것입니다.
- mkdir truffle
- cd truffle
- truffle init
- npm init -y
- npm install openzeppelin-solidity
- npm install -g @remix-project/remixd
- cd contracts
- remixd -s . --remix-ide https://remix.ethereum.org => 아래와 같이 버전 나오면 잘 실행된겁니다.
- 브라우저에서
remix IDE접속후default workspace를localhost로 변경합니다.
- 오늘은
Rinkeby Test Network를 통하여Contract를 배포할 것입니다. 아래와 같이MetaMask의 네트워크를Rinkeby로 변경합니다.
Rinkeby Test Network에서는 가스비로RinkebyETH를 지불하는데 아래의 두 사이트를 통해서RinkebyETH를 24시간마다0.1RinkebyETH씩 받을 수 있습니다.
Rinkeby ETH 1
Rinkeby ETH 2
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
import "openzeppelin-solidity/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
contract Minitng is ERC721 {
constructor(string memory _name,string memory _symbol) ERC721(_name, _symbol) {
}
// 코드를 실행한 계정에게 토큰을 줄것이다. _tokenId는 ERC721 Token의 고유한
function _minting(uint _tokenId) public {
_mint(msg.sender, _tokenId);
}
function tokenURI(uint _tokenId) public override pure returns (string memory){
return "https://gateway.pinata.cloud/ipfs/QmPwjnvWYN4etA5eW4yAbWCTy2ukEC1Jj5417VLGyH5XpU/1/1.json";
}
}
- 오늘은
ERC-721을 기반으로NFT토큰을 생성해줄 것이니openzeppelin에서ERC721Enumerable solidity파일을 불러온 후 상속받아 사용하였습니다._minting함수의 인자값에 토큰의 고유한tokenId를 넣고 함수를 실행하면 실행한 계정에게 고유한tokenId를 가진NFT를 지급할 것입니다.tokenURI함수를 사용하여 지급할Token에 사용할 이미지와 다른 정보들이 들어있는json파일을return해줍니다.- 현재
return해주고있는json파일은 아래와 같습니다.{ "name": "ingoo NFT", "description": "ingoo NFT description", "image": "https://gateway.pinata.cloud/ipfs/QmVs28uP4MgFMHRrndLDXsoAKMQ4EGjkgFxJUEr1KCPxrU/1/1.jpg", "attributes": [ { "trait_type": "Rank", "value": 1 }, { "trait_type": "Type", "value": 1 } ] }
- 위와 같이 솔리디티 코드를 작성한후
remix IDE에서 작성한 솔리디티 코드가 업데이트 되었는지 확인한 후 우측 세번째 아이콘을 클릭하고 코드가 수정될 때 자동으로Complie을 진행하도록Auto Complie을 체크해준후Compile을 진행합니다. 업데이트가 되지 않는다면 다른파일 클릭하면 업데이트 됩니다.
- 4번째 아이콘을 클릭하여
ENVIRONMENT를Metamask로 변경하고Deploy에constructor에 들어갈 토큰명과 심볼명을 입력하고Deploy를 클릭하여 로 배포합니다.
- MetaMask 연동후 아래와 같이 가스비를 확인한 후
Transaction에 내Contract를 넣고 블록이 생성 완료되었다면Rinkeby네트워크에 내Contract가 배포 완료된 것 입니다.
- 배포가 완료되었다면 아래의
Deployed Contracts의 작성한Contract를 클릭하여Contract의 메서드들을 확인합니다.getter함수와setter함수가 각각 다른색으로 표시되는 것을 알 수 있습니다.
- 위의
ACCOUNT에서Contract를 배포한account를 복사한후balanceOf함수에 넣고balanceOf를 클릭하면 해당 계정에 몇개의 NFT가 있는지 알 수 있습니다. 아직은_minting함수를 실행하여 해당 계정에게NFT를 발급해주지 않았기에0개의 NFT를 보유중이라고 나옵니다.
_minting함수에tokenId로 들어갈1을 넣고 실행하고setter함수이니 가스비를 지불한 후 블록이 마이닝이 되었을때 다시balanceOf를 클릭하면 값이1올라갑니다.
ownerOf함수에 1을 넣고 실행하면 해당tokenId를 가진 NFT를 보유하고 있는account계정이 나옵니다.
- OpenSea Testnets으로 접속한 후 우측에 지갑모양을 클릭하고
metamask로NFT를 보유중인 계정을 연결합니다.
Profile에 들어가 해당 계정의NFT를 확인하고 클릭하면 아래와 같이 내가 발행한NFT의 자세한 내용을 확인할 수 있습니다.
유용한 글 감사합니다.
질문이 있는데, 내용대로 따라서 했는데 opensea Testnets에서 확인이 안되는 이유를 알 수 있을까요??