최근 blockchain 업계에서 가장 이슈가 되고 있는 기술은 단연 "NFT"와 "메타버스"이다.
NFT는 대체 불가능한 토큰(Non-fungible token) 블록체인 기술을 활용하여 디지털 컨텐츠 혹은 자산의 소유주를 증명하는 토큰이라고 볼 수 있다. 예를들면, 어떤 작가의 "디지털 이미지" 등을 내가 샀다고 보는 불멸의 영수증이라고 보면 된다.
예전에 이더리움 토큰을 발행하다 보면 요구사항에 Mint와 Burn 기능이 있다. 각각 코인을 추가발행하고 소각하는 기능인데, 자산을 NFT로 만드는 것을 Minting 이라고 표현하는데, 어떤 차이가 있는지 매우 궁금하다.
디센트럴랜드 사이트 http://wiki.hash.kr/index.php/%EB%94%94%EC%84%BC%ED%8A%B8%EB%9F%B4%EB%9E%9C%EB%93%9C
개인적으로는 NFT 소유 증명에 대한 기술에 대한 전망은 밝다고 보지만, 디지털 데이터에 대한 NFT는 좀 더 성숙하고 유익한 서비스를 필요로 한다. 이미 다방면에서 NFT 활용을 강구하고 개발되고 있으니 기대는 해본다. 하지만 쏟아지는 프로필 이미지, 디지털 작화에 대한 NFT 발행은 좀 자제 했으면 한다. 아직은 의견이 분분하니 개인적인 의견은 아끼는게 좋아 보인다.
매일경제 NFT 전망 : https://www.mk.co.kr/news/culture/view/2022/03/291997/
위처럼 개념적인 부분이나 구분 등을 살펴보는 것도 필요하지만, 나는 개발자이기 때문에 실제로 NFT를 Deploy해보는 것이 NFT에 대한 이해와 습득에 더 더움이 된다. 사실 minting 이라는 단어로 여느 코인 발행과 크게 다르지 않다는 걸 예상해 본다.
일반 light 유저들은 위에서 nft 업체를 통해 작품을 올려보는게 가장 쉬운 방법이다.
자 그럼 NFT 거래소에서는 Minting을 어떻게 구현했을지 직접 작업해 보자.
contract ABI 가져온다.
IPFS를 사용하여 이미지데이터 올리기
항상 실제 이미지 데이터는 어디에 deploy되는지 궁금했는데 IPFS라는 곳에 저장이 된다. 블록체인과 마찬가지로 분산형 파일 저장 프로토콜이라고 볼 수 있다. 토렌트같은 파일 공유 서비스라고 생각하면 현하고 pinata라는 사이트에서 제공하고 있다.
NFT에 대한 메타데이터 구성
위에 파일데이터 올린뒤, url등의 메타데이터를 json으로 구성한다.
{
"속성" : [
{
"trait_type" : "견종" ,
"값" : "말티푸"
} ,
{
"trait_type" : "눈 색깔" ,
"값" : "모카"
}
] ,
"description" : "세상에서 가장 사랑스럽고 민감한 강아지." ,
"이미지" : "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb" ,
"이름" : "람세스"
}
//아래와 같은 JS코드를 이용하여 NFT를 발행할 수 있다.
require("dotenv").config()
const API_URL = process.env.API_URL
const PUBLIC_KEY = process.env.PUBLIC_KEY
const PRIVATE_KEY = process.env.PRIVATE_KEY
const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
const web3 = createAlchemyWeb3(API_URL)
const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
const contractAddress = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"
const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
async function mintNFT(tokenURI) {
const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce
//the transaction
const tx = {
from: PUBLIC_KEY,
to: contractAddress,
nonce: nonce,
gas: 500000,
data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),
}
const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
signPromise
.then((signedTx) => {
web3.eth.sendSignedTransaction(
signedTx.rawTransaction,
function (err, hash) {
if (!err) {
console.log(
"The hash of your transaction is: ",
hash,
"\nCheck Alchemy's Mempool to view the status of your transaction!"
)
} else {
console.log(
"Something went wrong when submitting your transaction:",
err
)
}
}
)
})
.catch((err) => {
console.log("Promise failed:", err)
})
}
mintNFT(
"ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP"
)
pinana나 etherscan에서 nft에 대한 이미지와 메타 데이터 등을 확인 할 수 있다.
이미지 확인 url : https://gateway.pinata.cloud/ipfs/"metadata-hash-code를 가져와"
metamask 등에서 등록하면 이미지와 함께 메타 정보등을 확인할 수 있다.
- NFT Web3 : https://docs.alchemy.com/alchemy/tutorials/how-to-create-an-nft/how-to-mint-a-nft
- HOW TO WRITE & DEPLOY AN NFT : https://ethereum.org/en/developers/tutorials/how-to-write-and-deploy-an-nft/
- HOW TO MINT AN NFT : https://ethereum.org/en/developers/tutorials/how-to-mint-an-nft/
- HOW TO VIEW YOUR NFT IN YOUR WALLET : https://ethereum.org/en/developers/tutorials/how-to-view-nft-in-metamask/