1. NFT(Non-Fungible Token)란?
대체불가능한 특성을 의미하는 NFT(Non Fungible Token)는 최근에 블록체인 커뮤니티 사이에서 중요성이 상당히 증가했다
디지털 자산에 대한 Ownership(소유권)의 개념은 다양한 산업들이 블록체인을 도입하면서 확고해졌다
NFT가 주목을 받게 된 이유는 현존하는 디지털 자산의 소유권 분쟁을 해결할 수 있기 때문이다
- 고유의 가치를 가지는 토큰이다
- 디지털 자산의 소유권을 보장한다
- 토큰의 내용이 대체 불가능한것이 아니고, 토큰 자체가 고유의 값을 가지고 있어서 대체 불가능하다
- NFT를 생성했을때 내용이 같아도 각각 고유성을 가지고 있어서 대체 불가능하다
🚀 NFT 구조 예시
const nft = {
tokenId : "0x1111111111111" // 토큰의 고유값 고유 식별자
url : "https://nfturl.com/data.json" // NFT의 어떤 파일내용을 담을지 객체 파일의 경로 (json : 내용 설명 파일 경로 json객체가 들어감)
}
🚀 NFT 내용 (JSON 파일)
{
"name": "NFT의 이름",
"description": "NFT의 설명",
"image": "이미지 경로 (NFT에 포함할 이미지 경로)",
"attributes": [
// 원하는 추가 속성
]
}
- url 의 객체 내용을 DB에 저장해도 우리가 NFT 민팅을 할 수 있지만 탈중앙화로 보기 어렵기 때문에 분산 파일 시스템 IPFS 를 사용한다
- 분산 파일 시스템 IPFS에 객체의 내용과 이미지를 저장하고 URL을 전달하여 NFT를 조회하면 분산 파일 시스템에 저장된 객체의 내용으로 NFT를 보여준다
- IPFS 는 파일을 업로드하면 여러 노드가 분산 네트워크에 파일을 저장하며, 안정성과 무결성이 검증되는 분산 네트워크로 데이터를 저장한다
- 파일을 업로드하면 파일의 경로는 고유한 주소를 가진다 (해시값으로)
🧐 pinata ?
- IPFS Provider 로 사용한다
아래 테스트 코드 작성시
- 파일 업로드 하고 ➡️ 해시값 가져온다
- pinata로 IPFS 직접 파일 업로드하고 업로드한 파일의 해시주소를 가져온다
2. ERC-721 이란?
이더리움 블록체인에서 사용되는 토큰 표준 중 하나이다
이 표준은 고유한 소유권을 나타내기 위한 스마트 계약 및 디지털 자산을 만드는 데 사용된다
ERC-721 토큰은 일반적으로 게임 아이템, 예술 작품, 부동산 및 기타 고유한 자산을 나타내기 위해 사용된다
ERC-721 토큰은 다른 토큰과는 달리 각각이 고유하며, 중복되지 않는다
이러한 고유성은 자산의 소유권을 정확하게 추적하고 전송할 수 있게 해준다
ERC-721 스마트 계약은 토큰의 생성, 소유권 이전, 거래 기록 등을 관리하는데 사용된다
ERC-721 토큰은 대체불가토큰 Non-Fungible Token(NFT)의 기초로 사용되며, 디지털 자산의 고유성을 보장하고 디지털 컬렉션을 만들고 거래하는 데 사용된다
예를 들어 만약 우리가 무당벌레를 그리고, 이 그림을 '무당벌레 그림' 이라고 하자
여기서 그린다는 것은 '무당벌레 그림'과 같은 하나의 작품을 만드는 것이 되는 것이다
이렇게 하나의 작품을 만드는 과정이 ERC-721 토큰을 만드는 과정에 해당하는 것이고, '무달벌레 그림'은 다른 무당벌레를 그린 그림들과 대체가 불가능하며 가치가 다르므로 ERC-721 기반의 NFT에 해당하는 것이다
NFT 의 또 다른 특징은 토큰에 대한 소유권이 나뉘어 질 수 있다는 것이다
즉, 부분적인 소유권이 허용되며 교환될 수 있다
예를 들어 '무당벌레 그림'의 소유권은 J 가 100ETH 모두 가질 수 있고, R이 90ETH를 주고 구매한다면 J 와 R이 소유권을 각각 10%, 90% 씩 나누어 가질수도 있다
NFT에 대한 판매와 구매는 온라인 시장에 제한되어 있지 않다
핸드폰과 같은 제품들 역시 ERC-721 토큰의 개념이 도입될 수 있고, 제품에 대한 소유권은 온라인으로 거래될 수 있다
3. ERC-20 토큰과 ERC-721 차이점
🧐 ERC 란 ? / ERC-20 이란?
- Ethereum Request for Comment 로 이더리움 네트워크에서 토큰을 만들 때 따라야하는 프로토콜을 의미한다
많은 프로토콜중에서 20번째 프로토콜이 ERC-20 이다
- ERC-20 프로토콜에 맞추어 생성된 암호화폐가 ERC-20 토큰이다
- 이더리움 네트워크에서 생성된 대부분의 토큰들은 ERC-20을 기반으로 생성되었다
- ERC-20 토큰 :
- 2017 년 당시 가장 많이 쓰이고 있던 토큰이다
- 일반적으로 거래소에서 거래하고 있는 대부분의 토큰 발행 기준이 되고 있는데, ERC-20 토큰이 대체 가능한 암호화폐를 지원하고 있기 때문이다
- 대체가능 의 의미는 화폐를 떠올리면 쉽다 (ex. 지금 가지고 있는 1,000원 지폐와 다른 누군가가 가진 1,000원 지폐는 동일한 가치)
- 즉, 누가 토큰을 가지고 있는지 상관없이 동일한 가치를 지닌다 그리고 이 토큰은 동등한 가치로 구매, 판매, 교환 된다 - ERC-721 토큰 :
- 대체 불가능한 특징을 가지고 있다
- ERC-721로 발행되는 토큰은 모두 각각의 가치를 갖고 있다
4. Pinata 를 사용해 Minting 해보기
1. OpenZeppelin 의 Solidity Contracts 설치
npm install @openzeppelin/contracts
2. 프로젝트 초기화 (package.json 파일 생성)
npm init -y
3. React 앱을 위한 React 및 Axios 패키지 설치
npx create-react-app my-app
cd my-app
npm install axios
4. Pinata
- https://www.pinata.cloud/ 피나타 사이트
- https://docs.pinata.cloud/reference/post_pinning-pinfiletoipfs API Reference
4-1. minting 할 파일 업로드
4-2. API key 받기 (공개하면 안된다/ 이 key 들은 app.js 에서 사용)
5. 📂my-app > 📂src > 📂NFTjson > 📃test.json
- 4-1.https 부터 밑줄친곳 까지 복사해서
test.json> "image" 경로에 넣어준다
{
"name": "HeeNFT",
"description": "NFT",
// 이미지 경로 넣어주기
"image": "https://red-capable-wildcat-470.mypinata.cloud/ipfs/QmXstZDm31ivwDgxcjpFMdAs7Q6wa9C54LxcgBSXZPtBY2",
"attributes": []
}
6. 📃 App.js
- axios.post 에 피나타 사이트를 넣어준다
- pinata_api_key , pinata_secret_api_key 는 pinata에서 받을수있는 API key라서 공개하면 안된다 (4-2. 참고)
import { useState } from "react";
import axios from "axios";
const App = () => {
const [file, setFile] = useState(null);
const [ipfsHash, setIpfsHash] = useState({});
const upload = async () => {
const fileData = new FormData();
fileData.append("file", file);
const resp = await axios.post(
"https://api.pinata.cloud/pinning/pinFileToIPFS",
fileData,
{
headers: {
"Content-Type": "multipart/form-data",
pinata_api_key: "비밀",
pinata_secret_api_key:
"비밀",
},
}
);
console.log(resp);
};
return (
<>
<label>IPFS 에 파일 업로드</label>
<input
type="file"
onChange={(e) => {
setFile(e.target.files[0]);
}}
/>
<button onClick={upload}>파일업로드</button>
</>
);
};
export default App;
7. react 실행 후 이미지의 해시값 받아오기
- IpfsHash 값이 업로드한 파일의 해시주소임!
8. 📃 myNFT.sol
- 배포해서 얻은 파일의 해시 값을 function tokenURI 에 return 값으로 넣어준다
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "./node_modules/@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract MyNFT is ERC721 {
constructor(string memory _name, string memory _symbol) ERC721(_name,_symbol){}
function minting(uint256 _tokenId) public {
_mint(msg.sender, _tokenId);
}
// 배포해서 얻은 해쉬값 입력
function tokenURI(uint256 _tokenId) public view override returns (string memory){
return "QmUWbpiTeDWkWfaSMAgZFupzWs896oQGzXHeP7LC2nx1Br";
}
function _baseURI() internal view override returns(string memory){
return "https://red-capable-wildcat-470.mypinata.cloud/ipfs";
}
}
9. remix 에서 myNFT.sol 배포
- 세폴리아 계정으로 배포할 예정 (public 네트워크로 배포해야 opensea 에서 조회 가능하기 때문)
- 배포 후 DEPLOY 에 name, symbol 입력하고 transact
- minting > _tokenId : 1
1로 민팅하기 - balanceOf > 지갑주소 넣기
- ownerOf > _tokenId : 1
1로 민팅했으니까 확인하기
10. opensea 에서 확인해보기
- 세폴리아 네트워크로 배포했기때문에 이 네트워크로 연결해주기!
- 프로필 들어가서 확인하면 아래화면과 같다
'BlockChain' 카테고리의 다른 글
[BlockChain] ERC-20 Contract 만들기 (Truffle, Remix) (2) | 2023.10.12 |
---|---|
[BlockChain] Use MetaMask (1) | 2023.10.11 |
[BlockChain] 비트코인 채굴 마이닝(Mining) 이란? (1) | 2023.10.08 |
[BlockChain] Truffle과 Ganache를 이용한 EVM Smart Contract / React 구현 및 배포 (1) | 2023.10.04 |
[Block Chain] 스마트 컨트랙트(Smart Contract) (0) | 2023.09.26 |