
openzeppelin을 활용하면 간단하게 ERC-721을 구현 할수가 있다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract MyNFT is ERC721{
constructor() public ERC721("MyNFT", "NFT"){}
}
하지만 NFT를 발행하는 기능은 없다.
만약 새로운 NFT를 만들고 싶다면 기능을 추가해야 한다.
https://ethereum.org/en/developers/tutorials/how-to-write-and-deploy-an-nft/#write-contract
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract MyNFT is ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() public ERC721("MyNFT", "NFT") {}
function mintNFT(address recipient, string memory tokenURI) public onlyOwner returns (uint256){
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
}
이후 배포를 하면 mintNFT 트랜잭션 생성 함수가 포함되게 된다.
일단 기본 onlyOwner를 통해, 함수를 실행한 지갑의 주소와 오너의 주소가 같은지 검사를 한다.
mintNFT는 라이브러리 Counters를 이용해 변수 토큰의 ID를 관리하게 된다.
tokenURI는 NFT에 적용할 정보를 담고 있는 json객체의 엔드포인트 이다.
{
"name": "name #1",
"description": "description",
"image": "imageUri",
"attributes": [
{
"trait_type": "Background",
"value": "White"
}
]
}
NFT의 정보를 담고 있는 객체 형식의 데이터이다.
name
description
image
attributes
image의 링크를 DB의 링크로 저장을 한뒤에 해당 uri를 tokenURI로 입력해줌으로써 NFT를 만들어 낼 수가 있다.
Ropsten 네트워크에서는 발행항 토큰은 OpenSea에서 확인할 수는 없다.
IPFS는 모든 컴퓨터를 연결하고자 하는 분산된 P2P파일 시스템이다.
일단 P2P시스템이기 떄문에 중앙화된 서버가 없고 더 빠르고 안전하게 열린 네트워크를 제공한다.
대형 서버의 연걸이 끊기게 되면 치명적인 HTTP Web와 달리 분산되어 있다는것이 큰 특징이다.
고용량의 파일을 빠르고 효율적이게 전달할 수 있으며, 중복을 알 수 있기 때문에 저장소도 효율적으로 사용 가능하다.
업로드된 파일은 영원히 기록되며 파일의 버전관리 또한 가능하다.
일단 기본적으로 모든 파일의 이름을 DB속에 저장하며 동일 파일의 중복을 배제하고 각 파일의 버전 정보를 트래킹 한다.
노드들은 본인이 관심있느 파일만 저장소에 보관하며, 인덱싱 정보를 통해 누가 어떤 파일을 저장하고 있는지 알 수 있다.
IPNS를 통해 모든 파일명은 사람이 읽기 쉬운 형태로 변환 가능하다.
또한 파일은 여러개의 블록으로 이루어져 있고 각각의 블록은 해시로 표현된 고유의 이름이다.
파일을 업로드하게 되면 업로드된 파일의 해시값이 산출된다.
해시값을 이용해, IPFS를 제공하는 노드의 엔드포인트를 tokenURI로써 블록체인에 저장하여 온체인 NFT를 구현할 수 있다.
어떤경우에 클라우드, IPFS를 사용해야 하는지는 정답이 없다.
🔨 IPFS에 배포하기
별거 없다.
Remix기분 배포하기 밑에 Publish to IPFS를 체크해 주면 된다.
🔨 정리
블록체인과 어떤점이 다른지 이해가 안가서 따로 좀더 알아 보았다.
두 경우 모두 P2P방식이다.
하지만 차이점은 데이터를 어떻게 가져오냐 이다.
블록체인, 토렌트 같은 P2P방식은 모든 데이터를 가져오지만
IPFS같은 경우에는 데이터를 조각조각 잘게 나눠서 빠른 속도로 가져온뒤에 나중에 하나로 합치는 방식으로 작동한다.