NFT 민팅해보기 (기본편)

1. 이미지 파트

  • pinata/infura 등의 API를 사용하여 IPFS에 이미지 업로드후 이미지 url 얻음
  • 해당 url을 nft를 위한 metadata(json file)에 추가하고 metadata 역시 IPFS에 업로드
  • 업로드한 metadata의 url이 nft minting 함수의 tokenURI로서 사용됨

2. smart contract 파트

  • alchemy - 발급받은 API를 smart contract 배포 및 Ethereum API 호출에 사용
  • Openzeppelin - import 해서 smart contract 작성에 활용 (ERC721를 상속받음)
  • hardhat - smart contract 테스트, 컴파일, 배포에 사용
  • dotenv - alchemy API key, metamask private key 등 관리
  • web3.js - smart contract 배포, frontend에서의 metamask 지갑 연결, contract 함수 호출 등에 사용

3. minting 파트

민팅의 정의: Minting refers to the process of turning a digital file into an NFT on the Ethereum blockchain. This NFT is stored on the decentralized database making it impossible to edit, modify, or delete.

  • alchemy-web3 설치 후 민팅 스크립트 생성
    • Step 1. 변수 정의 (위에서 업데이트한 .env 파일의 변수를 process.env.API_URL 형식으로 활용)

    • Step 2. ABI 정의 / hardhat이 이미 json파일 형식으로 ABI 생성해둠 / ABI는 smart contract와 상호작용하기 위한 interface

    • Step 3. 민팅 함수 정의 // nonce와 transaction에 필요한 값들 설정

    • Step 4. Transaction 할당

    • Step 5. 이미지의 메타데이터 tokenURI를 이용해 민팅 함수 콜 (The mintNFT function requires a tokenURI parameter that refers to a JSON document where the metadata (image, properties, name, description,…) is stored.)

      //step 1: You define your variables from .env file
      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);
      
      //step 2: Define our contract ABI (Application Binary Interface) & adresses
      const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json");
      const contractAddress = "0x099D1751c33d75297c9f331a5Cd39275ff534f96";
      const nftContract = new web3.eth.Contract(contract.abi, contractAddress);
      
      //step 3: Define the minting function
      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,
          'maxPriorityFeePerGas': 1999999987,
          'data': nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI()
        };
      
        //step 4: Sign the transaction
        const signedTx = await web3.eth.accounts.signTransaction(tx, PRIVATE_KEY);
        const transactionReceipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction);
        
        console.log(`Transaction receipt: ${JSON.stringify(transactionReceipt)}`);
      }
      
      //step 5: Call the mintNFT function
      mintNFT("https://gateway.pinata.cloud/ipfs/Qmeou5f7ttU98n96mYWfYzKHV7pfRe5rcZBhYznHZCUV7M");
  • 터미널에서 스크립트 실행
    • node scripts/mint-nft.js
    • If you followed all the steps correctly, you should receive a “Transaction receipt” which stipulates all the used parameters. You can also check on Ropsten Etherscan if your transaction was successful.

튜토리얼 참고 : https://docs.alchemy.com/alchemy/tutorials/how-to-create-an-nft

좋은 웹페이지 즐겨찾기