NFT

【完全版】誰でもできる!ジェネラティブNFTの作り方

シラフ

こんちには!Allaughのシラフです!
AllaughはNFTを用いて世界をもっと幸せにするために活動しているチャリティDAOです。

今回は「動物保護」をテーマにした2つ目のコレクション「Sprimal」を作成しながら
初心者でも出来るジェネラティブNFTの作り方をご紹介します!

Sprimal」をジェネラティブで作成しようと思った背景は、
1つ目のコレクションが手書きで作品点数が少ないため、作品点数を増やし流動性を増やすことで、
NFT購入→世界平和というAllaughのテーマを気軽に安価で体験して頂ければと思い作成を始めました。

こちらは「Sprimal」のプロモーションムービーです!(お時間ある時に見て頂けると嬉しいです)

参考にしたサイト

Sprimalでは下記御三方の記事を組み合わせて、
機能を追加しつつ必要最小限でジェネラティブNFTを作れるようにまとめ直しました。
どの記事も最高なので是非一度見てください!

SoudanNFTさん
Generative NFT コレクションの作り方
ユウキさん
(保存版)10,000種類のジェネレイティブNFTの作り方
ちび画伯ママさん
【NFT】素人でもミントサイトで独自コントラクトのジェネラティブを作る方法

ざっくり手順

  1. 事前準備(PC環境・画像パーツデータ作成)
  2. NFT用の画像を生成
  3. IPFSサーバーへ画像をアップロード
  4. NFT用のメタデータを生成
  5. IPFSサーバーへメタデータをアップロード
  6. Remixでコントラクトを作り、NFTをミント
  7. OpenSeaでコレクション設定&リスト

事前準備(PC環境)

PC側ので必要な環境を整えます。

Metamaskのインストール&資金の準備

こちら既に対応済みの人は多いかもしれませんが、
まだの人は下記を参考にMetamaskのインストール&資金の準備をしてください。
https://fx-nlife.com/polygon-matic/

Python実行環境準備

画像を作成するプログラムはPythonというもので作成されているので、
使用するPCでPythonを実行できる必要があります。
※よく分からない人は下記サイトを参考に「Anaconda」をインストールするだけで大丈夫です
たった5分で簡単!AnacondaでPython3をインストール(Windows/Mac編)

必要なファイルのダウンロード

下記リンク先へ行き、緑色の「Code」ボタンを押して、
一番下の「Download ZIP」を押すと「generative-art-nft-allaugh.zip」がダウンロードされるので、
ダブルクリックで解凍してお好きな場所に配置してください。

https://github.com/Allaugh/generative-art-nft-allaugh

プログラミング詳しい人は下記でcloneするでも大丈夫です。

git clone https://github.com/Allaugh/generative-art-nft-allaugh.git

事前準備(画像データ)

画像パーツの作成

ジェネラティブは背景が透明な画像パーツ(.png)を重ね合わせることで1枚の画像を作成していきますので、
重なりを意識して各パーツを作成してく必要があります。

レイヤーが使えるアプリなどを用いて画像作成していくのがおすすめです!
私はipadアプリ「Affinity Designer」を使って作成しています。

Affinity Designer 使用画面

作成した画像パーツは、パーツ種類毎にフォルダを分けて保存していきます。
私は、体・目・首・耳・アクセサリー・服・などのパーツに分け、
それぞれ3〜20個程のバリエーションを作成しています。

レイヤーパーツの例

画像パーツの格納

先ほどダウンロードした「generative-art-nft-allaugh」の中にある「assets」フォルダに
作成した画像パーツをフォルダごとアップロードする

レイヤーのフォルダ構造

画像をジェネラティブ生成

先ほどダウンロードした「generative-art-nft-allaugh」の中にあるプログラムを自分用に編集して、
プログラムを実行することで作成した画像パーツを組み合わせて一枚の画像をジェネラティブ生成します。

「config.py」の編集

まず「generative-art-nft-allaugh」の中にある「config.py」を開き中身を編集します。
※「config.py」は各パーツを重ねる順番、出現確率、パーツ間の対応などの設定しています。
※純正のテキストエディタでも作業できますが、「Sublime Text 3」などを使うとやりやすいです。
Sublime Text 3インストール参考サイト

config.pyの32行目以降を変更していきます。

CONFIG = [
    #ここは変更必須
    {
        "id": 1,
        "name": "background",
        "directory": "background",
        "required": True,
        "rarity_weights": None,
    },
    {
        "id": 2,
        "name": "body_back",
        "directory": "body_back",
        "required": True,
        "rarity_weights": [2,2,2,2,2,2,2,2,100,2,2,2,2,2],
    },
    {
        "id": 3,
        "name": "body",
        "directory": "body",
        "required": True,
        "rarity_weights": None,
    },
    {
        "id": 4,
        "name": "pants",
        "directory": "pants",
        "required": True,
        "rarity_weights": [10,10,10,10,10,100,10,10,10,10,10,10,10,10,10,10],
    },
    {
        "id": 5,
        "name": "shirt",
        "directory": "shirt",
        "required": True,
        "rarity_weights": None,
    },
    {
        "id": 6,
        "name": "pants_sub",
        "directory": "pants_sub",
        "required": True,
        "rarity_weights": None,
        "link": {
            "overall-beige.png" : "overall-beige2.png",
            "overall-black.png" : "overall-black2.png",
            "overall-blue.png" : "overall-blue2.png",
            "overall-green.png" : "overall-green2.png",
            "overall-pink.png" : "overall-pink2.png",
            "jeans-beige.png" : "none_pantsub.png",
            "jeans-black.png" : "none_pantsub.png",
            "jeans-pink.png" : "none_pantsub.png",
            "jeans.png" : "none_pantsub.png",
            "nappy.png" : "none_pantsub.png",
            "none.png" : "none_pantsub.png",
            "shorts-black.png" : "none_pantsub.png",
            "shorts-green.png" : "none_pantsub.png",
            "shorts-red.png" : "none_pantsub.png",
            "tights-gray.png" : "none_pantsub.png",
            "tights-pink.png" : "none_pantsub.png",
        },
    },
]

それぞれ、下記のkeyを持っています。

  1. id:レイヤーの重なり合いの順序。画像の重ね合わせの順序通りに記述してください。
    数字が低い方が下に表示されます。
  2. name:レイヤー名です。こちらはメタデータに利用されます。
  3. directory:レイヤーのフォルダ名です。
  4. required:こちらがtrueの場合、そのレイヤー画像は必ず表示されます。背景や目など、必ず表示したいものはtrueにしてください。アクセサリなど、必ず表示しなくても良いものはfalseにします。 最初のレイヤーは必ずtrueにしてください。
  5. rarity_weights:これは各レイヤーのレアリティ設定を行います。※後述
  6. link:これは、前髪・後ろ髪などのように、他レイヤーと1対1対応しなければいけないときに使います。例文のように、1対1対応しなければいけない画像に関しては、それぞれの対応関係及び、そのファイル名を記述してください。

レアリティの設定について

こちらのプログラムは、各パーツごとにレアリティの設定をすることが出来ます。 レアリティの設定方法は「none」と「random」と「Python List」の3つあります。

None rarity_weightsの値を「None」に設定すると、各パーツには同じ確率が割り当てられます。したがって、4つのパーツがある場合、それぞれのパーツは全体の約25%に現れます。 requiredがFalseの場合は、そのパーツが全く出ないことも同じようにあります。先ほどのケースでは、requiredプロパティをFalseにした場合、各パーツは全体の約20%に現れます。また、20%の確率でそのパーツをもっていないことになります。

random randomは、パーツの出現確率がランダムになります。こちらは使用しない方がいいです。

Python List レアリティの設計をする場合は、これが一番良いです。 各フォルダのパーツの名前順で検索して、一番先のものから順番に出現確率を設定します。

[100, 10, 1, 100]

この場合、1番目のパーツ出現率が100で、二番目の出現率が10となっています。この場合、2番目の出現率は、1番目出現率の10分の1になり、10倍レアであることになります。

「nft.py」の実行

「generative-art-nft-allaugh」の中にある「nft.py」を実行すると画像が生成されます。
実行にはPCに元からあるターミナルと言われる機能を利用します。
※LaunchPadにターミナルと打てば見つかります。

ターミナルの検索方法

起動すると下の画面になるので、

ターミナル起動画面
cd generative-art-nft-allaughフォルダのパス(各自の環境で変わります)

をターミナルに打ち込み「enter」を押します。
generative-art-nft-allaughフォルダのパスはターミナルにcdと入力した後、
Finderのgenerative-art-nft-allaughフォルダをターミナルにドラッグ&ドロップすることで自動的に入力されます。

フォルダパスの入力方法

その後、

python nft.py

をターミナルに入力し「enter」を押す。
その後、何枚画像を作成するか、出力されるフォルダの名前を聞かれるので、
数値等を入力して「enter」を押す、を2回繰り返す。
※重複した画像は削除されてしまうので、作成する画像枚数は予定より多くする。

すると画像生成が始まり、生成が終わると「output」フォルダの中に「images」フォルダが作られます。

画像作成後イメージ

IPFSサーバー(nft.storage)に画像をアップロード

nft.storageの準備

NFT-STORAGE

nft.storageにアクセスして、Loginからメールアドレスを入力し認証をするとTOPページが表示される。

NFT-STORAGE2

API Keyの作成

まずファイルのアップロードに似つようなAPI Kyesを作成します。
下記画面になるので、上のタブから「API Keys」→「+New Key」→Nameに好きな名前を入れて「Create」の順でボタンを押す。

NFT-STORAGE3

すると、下記の用にAPI Keyが作成されるので、「Action」からコピーして保存する。
※この後画像アップロードする時に使います

NFT-STORAGE4

画像アップロード用のソフト「NFT UP」のダウンロード

画面上の「Files」を押してTOPページに戻ります。
「Upload directories easily with NFTUp」を押すとダウンロードページに飛ぶので、
使っているMacにあったリンクからダウンロードしてください。
※最新のMacの場合は「M1」、そのほかは「Universal」で問題ないと思います。
これでインストール完了です。

NFT UPダウンロード画面

nft.storageへ画像をアップロード

「NFT UP」を起動し、「nft.py」で生成した画像が入っているフォルダをドラッグ&ドロップする。
何か入力を求められたら、先ほど作成したAPIキーを入力する。(キャプチャし忘れました。。)

NFT UP アップロード画面

アップロードが完了すると下記画面になるので、一番上のCIDをコピーして保存しておく。
これで完了です。

NFT UP CID表示画面

NFTメタデータの作成

メタデータはNFTの名前や画像のリンク、パーツの情報などをまとめたデータのことです。

「meta_to_json.py」の編集

まず、「generative-art-nft-allaugh」の中にある「meta_to_json.py」を編集します。

17行目:NFTの名前を入力
18行目:NFTの説明文を入力
19行目:nft.storageにアップロードした画像フォルダのCIDを入力

30行目以降:NFTに表示したい属性の数だけ下記4行1セットで入力していく

{
"trait_type":"PANTS",
"value":row['pants']
},

※trait_typeはNFTに表示される属性名
※valueは「assets」フォルダに作成したパーツ毎のフォルダの名前

meta_to_json.py編集画面

「meta_to_json.py」の実行

python meta_to_json.py

をターミナルに入力し「enter」を押す。
すると「metadatas」というフォルダの中に〇〇.jsonというメタデータファイルが大量に生成されます。
※画像の時と同様に多く作られているので、必要ないファイルは削除します。

IPFSサーバー(nft.storage)にメタデータをアップロード

画像をアップロードした時と同様に、NFT Upを起動し「metadatas」フォルダごとアップロードします。
アップロードが完了したら、一番上のCIDをコピーして保存します。

NFT UP CID画面

NFT作成用のコントラクト作成

Remixというオンラインでブロックチェーンプログラムを作成できるサービスを利用して、
ジェネラティブNFTのコントラクトを作成します。

Remixでコントラクトを作成

左上の+ボタンを押してワークスペースを作成
名前を入力し(好きな名前でOK ※英語)OKを押す。

REMIX画面
REMIX ワークスペース作成画面

contractsというフォルダが生成されるので、中にある3つの「〇〇.sol」を削除します。

REMIX画面キャプチャ
その後、contractsの上にある紙のようなアイコンを押して、新規ファイルを作成します。
私は「Sprimal.sol」としていますがお好きな英語の名前てOKです。
REMIX画面キャプチャ

作成した「Sprimal.sol」をクリックすると右にエディタが開きますので、
「generative-art-nft-allaugh」フォルダの中にある「Sprimal.sol」の中身を全てコピーして貼り付けましょう。
全部で1351行ありますが変更するところは少しなのでがんばりましょう。

変更箇所

1235行目:Sprimalを各自のコレクションの名前に変更
1240行目:他の人がミントするときの費用(5etherで5MATIC)

※Polygonでnft作成する場合も単位はetherのままです
※自分で全てミントする場合は関係ありませんが、低いと他人にミントされる可能性があるのでそのままにしておくことが無難です。
1241行目:コレクションのNFT数上限を変更
1242行目:一度にミント数できる最大数を変更

REMIX画面キャプチャ

これでプログラミング作業は終わりです!

コンパイル(プログラムのチェック的な作業)

左側のメニューの上から3個目を押し、
「Auto compile」「Enable optimization」にチェックを入れ、
一番下の水色のボタンを押す。

REMIXコンパイル画面キャプチャ

テストネットでコントラクトをデプロイ(作成したプログラムの実行)

Rinkebyというイーサリアムのテストネットを使って、NFTが問題なく作成できるかを確認していきます。

テストネットにETHを用意

下記サイトにウォレットを接続し「Send request」を押すとETHが貰えます。
https://faucets.chain.link/rinkeby

テストネット用のETH無料獲得方法

もらった金額の確認

Metamaskを開いて、上の「イーサリアムメインネット」押すと、
ネットワーク一覧が表示されるので、Rinkbyテストネットワークを押す。
するとRinkbyが表示され、もらったETHが確認できます。

テストネットワーク
テストネットE TH

Remixでデプロイ作業

左側メニューの上から4つ目のボタンを押し、
①ENVIRONMENT;Injected Provider – Metamask
②下側のCONTRACT:「○○ – contracts/○○.sol」
を選択。

REMIX画面キャプチャ

上記を選択したら、下にあるDEPLOYの横にある🔽 をクリック。

REMIX画面キャプチャ

今回はこんな感じ入力してます。
①_NAME: Sprimal(NFTコレクションの名前になります)
②_SYMBOL: SPM(適当で大丈夫です。BITCOINでいうBTC的な)
③_INTBASEURI: ipfs://QmTj4ZdiSzxTrJ9h8WW5Qp9C5ymMYQJXWD6TS9UMwsF2YG/
(nft.storageのメタデータファイルのCIDを ipfs://○○/ のように書く
※〇〇の部分は前にnft.storageにアップしたメタデータフォルダのCIDを入れてください。
④_INITNOTREVEALEDURI:(リビールしないので③と同じ値を入れておきます)

REMIX画面キャプチャ
NFT UP CID

その後オレンジ色の「transact」ボタンを押してデプロイ。

Metamaskキャプチャ

「Deployed Contracts」の下を押すと下記みたいに色々はボタンが表示されます。

REMIX画面キャプチャ

テストで100個ミントしてみます。右側にミントしたい数字を入力し、
赤い「mint」ボタンを押すと、Meatamaskが表示され、承認するとNFTがテストネット上に作成されます。

REMIX画面キャプチャ

下の方にある青い「total supply」をクリックすると現在のNFTの個数が確認できます。

OpenSeaテストネットでNFTを確認

https://testnets.opensea.io/
こちらがテストネット版のOpenSeaなので、作成したMetamaskでログインして
プロジェクトを確認してみてください。

無事100個作成されたのが確認できました♪

OpenSeaテストネット版

本番環境でコントラクトをデプロイ(Polygon)

無事テストも完了したので、本番環境でNFTを作成していきたいと思います。
私は11,111個NFTを作成するので、ETHチェーンだとガス代で何十万円もかかってしまうため、
Polygonチェーンで作成していきます。※ETHでも同じ手順でできます。

コントラクトのデプロイ

まずMetamakのネットワークをPolygonにします。
※ETHでやりたい方はETHにしてください
※やり方わからない人はこちらを参考

Metamask

その後Remixに戻り、DEPLOY画面(左側メニュー上から4つ目)にいくと
「Custom(137)network」となっていることが確認できます。
※ETHの人は「Main(1)network」です

REMIX画面キャプチャ

テストネットの時と同様に4つを入力し、「transact」ボタン左のコピーマークをクリックしてABIを保存。
ABIはコントラクトを「Verify」する時に使うので絶対忘れないでください。

REMIX画面キャプチャ

こんな感じの数字がコピーされています。

ABIファイル中身

その後オレンジ色の「transact」をクリックするとMetamaskの認証画面が出ます。
このままではガス代が低く、失敗してしまう可能性が高いのでガス代を高く設定していきます。

真ん中の「編集ボタンを押す」

Metamask承認画面

「ガス代の編集を提案」を押し、

Metamaskガス代変更

最大優先手数料:50
最大手数料:200
に設定します。(私が実行した時はネットワーク混んでいたので200にしています)

「保存」を押して、その後「確認」を押すとデプロイが開始します。

Meatamaskガス代変更

デプロイ完了すると下記が表示されるので、右のコピーマークを保存します。
※これはコントラクトアドレスと呼ばれるものです

REMIX画面キャプチャ

コントラクトの「Verify」

polygonscamを開き、先ほどコピーしたコントラクトアドレスと検索窓に打ち込みます。

Poigonscan画面

下の「Contract」ボタンを押して、「Verify and Publish」を押します。

PolygonScanキャプチャ

ユーザ名とパスワードを求められるので、アカウント持っていない人は
下の「Click to sign up」から登録をしましょう。

PolygonScanキャプチャ

ログイン後、「Verify and Publish」を押すと下記画面になります。

PolygonScanキャプチャ

下記3つを入力して「Continue」を押します。

Compiler Type:Solidity (Single file) 
Compiler Version:v0.8.7+commit.e28d00a7 ※各自確認
Open Source License Type:3) MIT License (MIT)

※Compiler VersionはRemixのコンパイル画面(左側メニュー上から3番目)で確認できます。

REMIXキャプチャ

次に下記画面が表示されますので、下記3つを入力し、紫色の「Verify and Publish」を押します。

Optimization:Yes
Contract Code:Remixで作成した○○.solの中身(私はSprimal.solで1351行)
Constructor Arguments ABI-encoded:ABIをコピペした数字(大量の0のから最後までの部分

ABIは下記の選択していた部分です(見えにくいですが、、)

ABIコードの中身
PolygonScanキャプチャ

下記画面が表示されればVerify完了です。

PolygonScanキャプチャ

Token Trackerのところにコレクションの名前が追加されてます!
独自コントラクトでやった人だけの特権です!
これでVerifyは完了です。

PolygonScanキャプチャ

本番用NFTのミント

下準備は全て終わったので、実際にNFTをミントしていきます。

Rimixでの作業

テストネットと同様にRemixでミントしていきます。
※一度に200個以上ミントしようとするとガス代上限に引っかかるので、200個以下で繰り返しやってください
※ガス代上限はデプロイの時と同様に編集して高くしましょう。

REMIXのミント実行画面

OpenSeaでの作業

全てミントが終わったらOpenSeaで確認しましょう。

OpenSeaプロフィール画面

画像やメタデータが表示されていない場合は、そのNFTクリックして、
右上の「Refresh metadata」を押すと2~3分後に更新されます。
※しかし1つずつやっていくのは大変なので、リスト(後述)するときに自動で全てやろうと思います。

OpenSeaメタデータ更新画面

OpenSeaのアカウントプロフィール設定

既に設定済みの人は飛ばして下さい。
OpenSeaアカウントページの右側真ん中にある「…」を押し、「Settings」を押します。

OpenSeaプロフィール画面

下記画面になるので、ユーザ名やプロフィール画像などを各自で記入して「Save」を押せば完了です。
※初回はメールアドレス認証を求められます

OpenSeaプロフィール設定画面

OpenSeaでコレクション設定

全てミントが終わったらOpenSea上でコレクションの名前などを設定していきます。
まずはコレクションページにいき、右側真ん中「…」を押し、「Edit」を押します。

OpenSeaコレクション画面

下記画面が表示されるので、各自入力してください。
最低限流力が必要な項目を記載しておきます。

Logo image:コレクションのアイコン
Banner image:コレクションページのバナー ※なくてもいいが、あると見栄えが良し
Name:コレクションの名前 ※既に記入済のはず
Creator Earnings:2次流通のマージン率 ※私はMAXの10%に設定しています

Your payout wallet address:自分のウォレットアドレス

上記を設定したら「Submit changes」を押して設定完了

OpenSeaコレクション設定画面

OpenSeaでリスト(販売)

11,111個のNFTを販売していきます。
最初の一つは手動、残りは自動化していきます。

リストの方法

まずは一つリストしていきます。
リストしたいNFTをクリックし、下記画面になったら右上の「Sell」ボタンを押します。
※この時「〇〇 #1」をリストするとこの後の自動化がやりやすいです。

OpenSeaリスト画面

下記2つを設定し「Complate listing」をクリック。

Price:販売する価格(単位はETH)を各自設定 ※最低価格は5ドル
Duration:リスト期間 ※価格を変えるつもりがなければ6ヶ月がおすすめ

OpenSeaリスト画面

Metamaskの承認を求められるので、
ガス代上限を高く変更し「承認」ボタンを押します。
※こちらは初回だけしかやりません

Metamask

もう一度Metamaskが開くので「署名」を押します。
クリックできない場合は、文字のところを下にスクロールするとボタンが青くなってクリックできます。

Metamask

もう一度Metamaskが開く場合がありますが、
上記と同様に青いボタンを押してください。

Metamask

下記画面が表示されればリスト完了です。

OpenSea画面

これをミントNFTの数だけ繰り返せばOKですが、
途方もないので、自動化する方法をご説明します。

自動化

プログラミングなしでマウスとキーボード操作を自動化できるMurGaa Recorderを使って、
リスト作業を自動化していきます。

ざっくりと流れを説明すると、下記3ステップです
①MurGaa Recorderを起動し初期設定
②MurGaa Recorderでリストする際のクリックとキーボード操作を保存
③保存した操作を繰り返し実行

※MurGaa Recorderの使い方は下記リンクで説明してます。
https://www.murgaa.com/macro-recorder-mac/

では簡単に画像付きで手順を見せます。
ダウンロードしたMurGaa Recorderを開きます。

まずは録画を止めるショートカットキーの設定。
真ん中のKey to Start / Stop Recordingの右のボタンを押して、スペースキーを押してください。

MurGaa Recorder

次はリスト作業のマウス操作とキーボード操作を録画していきます。

事前の準備

①OpenSeaのコレクション画面を開き、「command」+「-」で画面のサイズを少し小さく(私は50%)
こちらからスプレッドシートを開き、A1を選択しておく
③「MurGaa Recorder」を開く
④左上の「Start Recording」を押して録画を開始
⑤下記手順に従いリストを録画(1回分)
⑥Spaceを押して録画を停止

OpenSeaの画面が一番前に来るので、リスト作業をしていきます。
手順は下記を真似してください。

録画する際の手順

①スプレッドシートのタブをクリック ※既に開いている場合でも必ずクリック
②「↓」キーを押して、「command」+「c」を押す ※1個下の数字がコピーされる
③OpenSeaのタブを開き、ブラウザの更新ボタンを押す ※最新の情報に更新するため
④左側にある並び替えボタンを押し、「Oldest」に変更 ※数字小さい順位するため
④左隣の検索窓をクリックし、「command」+「v」で数字を貼り付け
⑤NFTが表示されるので、一番最初のNFTをクリック
⑥右上の「Refresh metadata」をクリックした後に「Sell」ボタンをクリック
⑦価格、リスト期間を設定し、「Complate listing」をクリック
⑧Metamaskが表示されるので、メッセージの文章を一度クリックして、「↓」キーを数秒押し続ける
⑨ボタンが青くなるので、「署名」クリック
⑩完了画面が表示されたら、そのその画面中央のコレクション名をクリック

以上で完了です。
数が多い場合はとても時間かかるので、Macを充電しながら自動画面オフを解除して放置してください。

これで全て終わりです!
皆さん、ジェネラティブNFTをお楽しみください!!

おまけ

ジェネラティブには直接関係ありませんが、関連作業を下記に追記していきます!!

プロモーションムービー作り

Doodlyという有料サービス($39)で作成しました。
ココナラで5000円〜だったので自分で作ってみました!
英語版と日本語版作ったので、めちゃお得!!
※後日記事化予定

コラージュ画像作成プログラム

プログラム自体は作成済みでGithubに入っていますが、
使い方を説明した記事音で書きます!