[직접 만드는 NFT Generator] ― ④ NFT Metadata 생성하기

<직접 만드는 NFT Generator> 시리즈의 네번째 게시물로 구글 스프레드시트에 기록된 NFT Art의 데이터와 Property 정보를 활용하여 각각의 NFT Art에 해당하는 NFT Metadata를 생성한다.

[직접 만드는 NFT Generator] ― ④ NFT Metadata 생성하기
[직접 만드는 NFT Generator] ― ④ NFT Metadata 생성하기

지난 포스트에서는 구글 Colaboratory를 활용하여 NFT Art를 조합해보았다.

  • 구글 Colaboratory에 스프레드시트 연결하기
  • 구글 스프레드시트에 기록한 정보로 NFT Art Data 만들기
  • NFT Art Data를 스프레드시트에 기록하기
  • 이 데이터로 NFT Art Image 만들기

이번 포스트에서는 저장된 NFT Art Image와 구글 스프레드시트에 기록한 정보를 통해 IPFS에 NFT Art Image를 업도르하고 NFT Metadata를 생성해볼 것이다.


IPFS에 NFT Art 업로드하기

IPFS(InterPlanetary File System)는 분산형 파일 시스템에 데이터를 저장하고 인터넷으로 공유하는 프로토콜이다. 블록체인 기술을 기반으로 하는 NFT 프로젝트들은 대부분 IPFS에 작품과 Metadata를 업로드하는데, 이는 다양한 자료를 통해 이미 널리 알려져있다.

나는 pinata.cloud라는 무료 서비스를 활용하여 NFT Art를 IPFS에 업로드해보았다. pinata.cloud에 가입하는 과정은 생략하고 그 다음 단계부터 하나씩 설명해보고자 한다.

폴더를 통째로 PINATA.CLOUD에 업로드하기

pinata.cloud에 가입하고 나면, NFT Art를 업로드하는 것은 매우 쉽다. 직관적인 인터페이스를 제공하므로 업로드 과정을 차례로 진행하면 된다.

여기서 주의해야할 것은 우리가 제작한 NFT Art Image를 하나씩 하나씩 단일 파일로 업로드해서는 안된다. NFT Art Image가 있는 폴더 통째로 IPFS에 업로드해야만 하며, 이는 Enumerable 하게 하기 위해서이다.

Upload 버튼을 클릭한 후 Folder를 선택
NFT Art가 있는 폴더를 선택하여 업로드
NFT - Art 라는 이름으로 IPFS에 업로드
Pinata.cloud에 정상적으로 폴더가 업로드 된 모습

업로드가 완료된 후 나타나는 CID 값은 Metadata를 생성할 때 사용되며, 업로드 된 이미지는 다음과 같이 확인해볼 수 있다.

이제 구글 Colaboratory를 활용하여 NFT Metadata를 생성해보도록 하자.


구글 Colaboratory에 구글 스프레드시트 연결하기

지난 포스트에서 생성된 NFT Data를 통해 NFT Metadata를 생성한다. 이를 위해 "NFT Metadata Generator" 라는 구글 Colaboratory 파일을 만들어 구글 스프레드시트와 연결하는 작업을 선행해야 한다.

구글 Colaboratory 파일 생성하기

구글 드라이브에서 생성한 NFT-Generator 폴더 내에 다음과 같이 구글 Colaboratory 파일을 생성한다.

구글 Colaboratory 파일 생성하기

생성이 완료되면, 새로 만들어진 구글 Colaboratory 파일의 이름을 NFT Generator - Metadata로 변경한다.

구글 드라이브와 연결하기

지난 포스트에서 사용한 방법과 동일하게 구글 Colaboratory에 구글 드라이브 및 스프레드시트 파일을 연결한다.

import os
from google.colab import auth
from google.colab import drive


auth.authenticate_user()

drive.mount('/content/drive', force_remount=True)
os.chdir('/content/drive/Shareddrives/MINSOO.BLOG/NFT-Generator/')

구글 드라이브와 연결하기

구글 스프레드시트와 연결하기

동일하게 지난 포스트에서 연결한 방법대로 구글 스프레드시트 파일을 연결해준다.

import gspread
from google.auth import default

creds, _ = default()
gc = gspread.authorize(creds)

sheet = gc.open('NFT Generator')

구글 스프레드시트 연결하기


구글 스프레드시트 데이터 가져오기

지난 포스트에서 Property에 관한 데이터를 활용하여 NFT Art를 만들고, 그것의 Data를 NFT Art Data 시트에 저장해두었다. 이러한 데이터들을 활용하여 NFT Meatadata를 생성해볼 것이다.

이 과정 또한 지난 포스트에서 소개한 방법과 동일하므로, 자세한 내용은 해당 포스트를 참고하면 된다.

Property 정보를 Dataframe으로 가져오기

NFT Art Data와 Property 정보를 연결하기 위해, 먼저 Property 정보를 Dataframe으로 가져온다.

import pandas as pd

props_worksheet = pd.DataFrame(
    sheet.worksheet('Properties').get_all_records(head=1)
).sort_values(by=['order'])

props = props_worksheet['trait_type'].to_list()

worksheets = dict()
for prop in props:
    worksheets.update({
        prop: pd.DataFrame(
            sheet.worksheet(prop).get_all_records(head=1)
        )
    })

Property 정보를 Dataframe으로 가져오기

구글 스프레드시트에서 NFT Art Data 불러오기

다음으로 NFT Art Data에 저장해두었던 데이터를 불러온다. 이는 이미 제작되어 있는 NFT Art Image에 대한 데이터이다.

nft_df = pd.DataFrame(
    sheet.worksheet('NFT Art Data').get_all_records(head=1)
)

구글 스프레드시트에서 NFT Art Data 불러오기


NFT Metadata 만들기

이제 IPFS에 올라간 NFT Image의 주소와, Property에 관한 데이터를 활용하여 NFT Meatadata를 생성해보자.

NFT Art의 IPFS CID 저장하기

먼저 NFT Art를 업로드한 IPFS의 CID를 기록해야하는데, 이전에 pinata.cloud에 업로드한 CID가 그 값이 된다.

Pinata.cloud에 기록된 CID
ipfs_cid = 'QmXJqwzeTkRxE2K9V8W8d1E9xEZqRnPuQQGtJbtRZbLy9c'

NFT Art의 IPFS CID 저장하기

Property 정보로 NFT Metadata 완성하기

NFT Art Data worksheet의 각 셀에는 File 이름이 저장되어 있다. 이를 Property 각각의 시트에서 값을 가져와 Metadata를 생성해야한다.

Background Property 정보를 담은 worksheet(좌측)와 NFT Art Data worksheet(우측)

NFT Art Data에서는 File에 대한 정보를 담고 있으므로, Background가 1이면 NFT Metadata에는 Blue로 저장되어야 한다. 즉, Property 정보를 담은 시트에서 File에 맞는 Value를 찾아야한다.

이는 다음과 같이 구현될 수 있으며, Metadata의 형식은 Opensea.io에서 제공하는 Metadata Standards에 맞도록 작성하였다.

import json

for idx, row in nft_df.iterrows():
    metadata = {
        'name': f'NFT #{idx:03d}',
        'image': f'ipfs://{ipfs_cid}/{idx}.png',
        "attributes": list()
    }

    for prop in props:
        if row[prop] == '-': 
            continue
        
        metadata['attributes'].append({
            'trait_type': prop,
            'value': worksheets[prop].loc[
                worksheets[prop]['File'] == row[prop]
            ]['Value'].values[0]
        })

    with open(f'./NFT Metadata/{idx}', 'w') as f:
        json.dump(metadata, f)

Property 정보로 NFT Metadata 완성하기

NFT Metadata 확인하기

위 작업들을 완료하면 NFT Metadata 10개가 다음과 같이 생성된 것을 확인할 수 있다.

NFT Metadata가 10개 모두 생성된 모습

이 중 하나를 열어보면 정상적으로 NFT Metadata가 생성된 것을 확인할 수 있다.

{
    "attributes": [
        {
            "trait_type": "Background", 
            "value": "Purple"
        }, {
            "trait_type": "Face Shape",
            "value": "Circle"
        }, {
            "trait_type": "Eyes", 
            "value": "Happy Eyes"
        }, {
            "trait_type": "Mouth", 
            "value": "Sad Mouth"
        }],
    "name": "NFT #000", 
    "image": "ipfs://QmXJqwzeTkRxE2K9V8W8d1E9xEZqRnPuQQGtJbtRZbLy9c/0.png"
}

생성된 NFT Metadata 


Summary

이번 포스트에서는 앞서 작성한 모든 정보들을 통해 NFT Metadata를 생성하고 [직접 만드는 NFT Generator] 시리즈를 완성하였다.

  • Pinata.cloud에 NFT Art 업로드하기
  • 이전 포스트들에서 작성된 데이터 Google Colaboratory로 가져오기
  • NFT Metadata 생성하기

생성된 NFT Metadata는 ERC-721 Smart Contract 배포에 활용할 수 있으며, 이는 이번 시리즈에서 다루지 않는 것으로 한다. 추후 다른 포스트를 통해 Smart Contract와 관련된 내용을 다뤄보려고 한다.

이것으로 [직접 만드는 NFT Generator] 시리즈를 마친다.