- 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에서 확인이 안되는 이유를 알 수 있을까요??