Solana上にNFTをアップロード&mintサイトを作るまでの手順

2022年08月14日追記:
metaplex公式から「sugar」という新ツールがリリースされています。

別記事書きました👇
Candy Machine v2とSugarの違い【metaplex】

 

以下のザックリした手順をメモ。

  1. Candy Machine v2を使ってSolana上にNFTをDevnetにデプロイ
  2. デプロイしたNFTをmintできるサイトを作る

 

自分用なので、かなり雑に書いてます。

「ざっくりこういう流れなんだなぁー」と参考にする程度に見て下さい。

\必須でない手順には⭐を付けてます/

ジェネラティブNFTを準備する

以下の2つを用意して、ジェネラティブNFTを作成します。

  • ジェネラティブ用のパーツ画像
  • ジェネラティブNFT作成ツール

 

ジェネラティブNFT作成ツールは、HashLipsを使えばいいと思います👇(metaplex公式も「HashLipsはいいぞ」と言ってるので)

 

この記事では、metaplex公式が用意してくれているアセットを使いたいと思います👇

NFTサンプル画像

▲こういう画像10枚と、それに対応したJSONファイルが入ってます

Solanaの環境設定

SolanaCLIをインストール

以下のページを参考にして、SolanaCLIを入れます👇

Install the Solana Tool Suite | Solana Docs

 

インストールできたかどうかの確認は、以下のコマンドで行えます👇

solana --version

売上を入れるキーペアを作る

grindサブコマンドを使うと任意の文字からはじまる公開鍵を持つキーペアを作れます。

たとえば、以下のようにすると、先頭が「hoge」から始まる公開鍵を持つキーペアを作成できます👇

solana-keygen grind --starts-with hoge:1 --ignore-case
  • –ignore-case:
    • 大文字小文字を区別せずに検索する(これを付けるとかなり時間が短縮されます)
文字列の長さとPCスペックによって、探す時間は変化します。
この記事によると現実的な文字列長さは6文字くらいまでらしいです)

別にこれをせずに普通にランダムな作ってもいいです。

 

作成されるファイルは、以下のようになっています👇

  • ファイル名:公開鍵
  • ファイルの中身:秘密鍵

config設定

以下のコマンドを実行します👇

solana config set --url <RPC> --keypair <PATH_TO_KEYPAIR>

このコマンドを実行することで、以下の2つを設定します👇

  • RPCサーバー:
    • Devnetの場合は「https://api.devnet.solana.com」を指定する
  • 使用するキーペア:
    •  場所を指定せずにキーペアを作成した場合は ~/.config/solanaに作成されるはずなので、「~/.config/solana/devnet.json」みたいな感じで指定する

 

きちんと変更できたかどうかは、以下のコマンドで確認できます👇

$ solana config get
Config File: ~/.config/solana/cli/config.yml
RPC URL: https://api.devnet.solana.com 
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: ~/.config/solana/devnet.json 
Commitment: confirmed

SOLを入手する

Devnetの場合

以下のコマンドで入手できます👇

solana airdrop2

※現状1回あたりの上限が「2」で、1日の上限が「24」らしいです

 

コマンド以外の方法では、以下のようなサイトで入手できます👇

https://solfaucet.com/

 

他のウォレットに送金したい場合は以下です👇

solana transfer --from <PATH_TO_KEYPAIR> <RECIPIENT_ACCOUNT_ADDRESS> <AMOUNT>
--allow-unfunded-recipient 
--url https://api.devnet.solana.com 
--fee-payer <PATH_TO_KEYPAIR>
  • –allow-unfunded-recipient:
    • 受信者のSOL残高で0solでも送信してしまうオプション

Mainnetの場合

日本でSOLを任意のウォレットに送金したい場合は、2通りの方法があります。

まず1つ目の方法は以下です👇

  1. 日本の取引所でSOLを購入
  2. 自分のウォレットに送金

ただ、SOLが購入できる日本の取引所は(2022年06月現在)、「Liquid by FTX」という取引所だけです。
手数料もそこまで安くないので、手間を惜しまないのであれば、後者の方法のほうが良いと思います。

 

2つ目の方法は以下です👇

  1. 日本の取引所(たぶん現状最安はGMOコイン?)でXRPを購入
  2. 海外の取引所(たとえばBinance)にXRPを送金
  3. 海外の取引所でXRPをSOLに変える
  4. 海外の取引所から自分のウォレットにSOLを送金

面倒くさいですが、おそらくこちらの方が安上がりです。

Candy Machineの準備

準備

公式サイトのGetting Startedページを参考に、以下などを入れます👇

 

yarn installなどもすべて済ませてください。

公式に書いているとおり、ここではmetaplexツールをホームディレクトリ(~/metaplex)にcloneしたものとして進めます。

Candy Machineの設定

以下のコマンドで、Candy Machineのいろいろなファイルを格納するディレクトリを作って移動します👇

mkdir ~/candymachine/
cd ~/candymachine/

assetsの移動

assetsディレクトリ配下に、さきほどのアセットファイル(0.pngとか0.jsonとか)をすべて移動します。

以下のようなディレクトリ構成になります。

📁 ~/candymachine/
└ 📁 assets/
  ├ 📄0.png
  ├ 📄0.json
  ├ 📄1.png
  ├ 📄1.json
  ・
  ・

  ├ 📄9.png
  └ 📄9.json
  • jsonファイルとpngファイルの数が違うとエラーになります。
  • 必ず連番である必要があります。歯抜けがあってもダメです。

config.jsonの設定

以下のようなconfig.jsonを作ります👇

{
  "price": 1,
  "number": 10,
  "gatekeeper": null,
  "solTreasuryAccount": <WALLET_ADDRESS>,
  "splTokenAccount": null,
  "splToken": null,
  "goLiveDate": "23 Jun 2022 04:35:00 GMT",
  "endSettings": {
    "endSettingType": { "date": true },
    "value": "23 Jun 2022 09:00:00 GMT"
  },
  "whitelistMintSettings": {
    "mode": { "burnEveryTime": true },
    "mint": "<MINT_ADDRESS>",
    "presale": true,
    "discountPrice": 0.5
  },
  "hiddenSettings": {
    "name": "NFT Comming Soon... ",
    "uri": <PRE_REVEAL_JSON_URI>,
    "hash": "44kiGWWsSgdqPMvmqYgTS78Mx2BKCWzd"
  },
  "storage": "arweave",
  "ipfsInfuraProjectId": null,
  "ipfsInfuraSecret": null,
  "awsS3Bucket": null,
  "noRetainAuthority": false,
  "noMutable": false
}
  • number:
    • NFTの数を指定します。
    • さきほどの◯.jsonと◯.pngの組み合わせ数と同じにします。
      (たぶん同じになってないとエラーが出ますし、次のステップの「アセットのVerify」でエラーになります。
  • solTreasuryAccount:
    • NFTが売れたときの売上が入るアドレスを指定します。
    • <WALLET_ADDRESS>

 

ちょっと全部説明するのは面倒くさいので、そのほかの項目については公式サイトをみてください👇

参考:Configuration | Metaplex Docs

 

hashという項目だけ(個人的に)ややこしいと感じたので、記事書きました👇
参考:【Candy Machine】hiddenSettings→hideプロパティの意味

 

ここまでのディレクトリ構成です👇

📁 ~/candymachine/
├ 📄 config.json
└ 📁 assets/
  └ 任意数のjsonとpngファイル

⭐Reveal準備

Revealしたい場合は、Reveal用の画像も用意します。

Reveal前の画像は、以下を使いたいと思います👇

 

これを使って以下のように表示させる想定です。

 

Arweaveにアップロードする方法は、以下のページを参考にしてください。

参考:Arweaveにファイルをアップロードする方法

Arweaveにアップロードするには、事前にArweave公式サイトで無料アカウント登録しておく必要があります。無料登録するとARトークンが0.02 ARだけもらえるので、それで大体700MB分くらいのアセットをアップロードできちゃいます。

なので、1000枚くらいのジェネラティブなら無料の範囲内で全部できちゃうレベルです。

▲1AR=1,300円くらいの計算

 

もしくは、画像をアップするためだけにCandy Machineをデプロイするのでも良いと思います。(デプロイについては後述)

⭐アセットのVerify

「アセットでおかしな部分はないか」の簡易チェックをしてくれるコマンドです👇

ts-node ~/metaplex/js/packages/cli/src/candy-machine-v2-cli.ts 
verify_assets 
./assets
  • きちんと連番になっているか
  • JSONファイルと画像ファイルがペアになっているか

などをチェックしてくれるみたいです。

Candy Machineをデプロイ

Candy Machineをデプロイできるコマンドです👇

ts-node ~/metaplex/js/packages/cli/src/candy-machine-v2-cli.ts upload
-e devnet
-k <PATH_TO_KEYPAIR> 
-cp config.json 
./assets

デプロイ後は、.cacheというディレクトリが生成されて、その中にdevnet-temp.jsonというファイルが生成されます。

 

ここまでのディレクトリ構成です👇

📁 ~/candymachine/
├ 📄 config.json
├ 📁 .cache/
├ └ 📄 devnet-temp.json
└ 📁 assets/
  └ 📄 任意数のjsonとpngファイル
本番環境での注意点:

  • 「メインネットでデプロイする場合はカスタムなRPCを指定した方がいいよ」と書かれているので、本番ではSolana公式のRPCを使うのはやめたほうが良いと思われます。
  • 「コレクションのサイズ(アイテム数および/またはイメージのサイズ)によって、デプロイは複数回失敗する可能性がありますが、再度実行すると、前回の実行で停止したポイントから再開されます」と書かれてるので、本番では何回もデプロイすることになりそうです。

⭐アセットがアップロードできたかVerify

アセットがきちんとアップロードできたか確認するコマンドです👇

ts-node ~/metaplex/js/packages/cli/src/candy-machine-v2-cli.ts verify_upload
 -e devnet
-k <PATH_TO_KEYPAIR> 
 -c tmep

⭐コレクションを編集する

コレクションは「この一連のジェネラティブはシリーズものなんだよ」を証明できるSolanaアカウントです。

Candy Machineでは、Candy Machineのデプロイと同時にコレクションも作ってくれて、さらにmintしたNFTはすべてそのコレクションに所属することになってます。

ただ、このコレクションのmetadataはデフォルトで

  • 「NFT Collection」という名前になっていたり、
  • metadataが設定していなかったりで、

いろいろと格好悪いので修正します。

まずコレクションのmetadataを取得します👇

metaboss decode mint --account <MINT_ACCOUNT> -o <OUPUT_DIRECTORY>

 

これで<OUPUT_DIRECTORY>にJSONファイルが出力されます。このJSONファイルはそのままmetadataになってるので、自分の好きなように変更します。

ここでは、以下の画像を使うものとします。

▲コレクションが並んだ棚のイラスト(引用:https://www.irasutoya.com/2016/02/blog-post_40.html

 

変更したら、以下でmetadataをアップデートします。👇

metaboss update data --keypair <PATH_TO_KEYPAIR> --account <MINT_ACCOUNT> 
--new-data-file <PATH_TO_NEW_DATA_FILE>

⭐Candy Machineの設定変更

Candy Machineをデプロイした後、

  • 終了時間を変更したい
  • 終了条件を変更したい
  • 開始時間を変更したい
  • 価格を変更したい

みたいな場合に使えるコマンドです。

config.jsonを変更した後、以下のコマンドを実行すると設定を変更できます。

ts-node ~/metaplex/js/packages/cli/src/candy-machine-v2-cli.ts update_candy_machine 
-e devnet 
-k <PATH_TO_KEYPAIR> 
-cp config.json

⭐CreatorのVerify

「このNFTはこのウォレットアドレスの人が作ったんだよ」を証明するための作業です。

metaboss -r <SOLANA_RPC> sign all --keypair <PATH_TO_KEYPAIR> -c <CANDY_MACHINE_ID> --v2

※Creatorアドレスと同じ秘密鍵で実行します

⭐ホワイトリストを作成&配布

ホワイトリストを配布したい場合は設定します。

トークンの情報を登録

以下の記事などを参考にして、トークンの情報を登録します。

Creating Tokens on Solana | Brian Friel(後半のほうにあります)

トークン作成

以下のコマンドでホワイトリストとして使用するSPLトークンを作成します。

# SPLトークンの作成
spl-token create-token --decimals 0

※コマンド成功後にTOKEN_ADDRESSが出力される

# 自分のトークンアカウントを作成
spl-token create-account <TOKEN_ADDRESS>

# ホワイトリストの数だけトークンをmintする(ここでは1000)
spl-token mint <TOKEN_ADDRESS> 1000

最初のコマンドで--decimals 0 と付けるのは重要です。

これを付けないと、mint時に0.000000001単位(たぶんlamportってやつ)でWLがburnされることになります。

ちょっと意味が分からないと思うので例を出すと、たとえば普通は

「ホワイトリストをあげたい人に1WLを渡すことで、mint時に1WLを引き換えにして安い値段でmintさせてあげる」

みたいな仕組みになるわけですが、--decimals 0 と付けていない場合は

「ホワイトリストをあげたい人に1WLを渡すことで、mint時に0.000000001WLを引き換えにして安い値段でmintさせてあげる」

みたいなことになってしまいます。

トークン配布

以下のコマンドで、任意のユーザーに作成したSPLトークンを送付します。

spl-token transfer --fund-recipient  --allow-unfunded-recipient <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
  • <TOKEN_AMOUNT>:
    • 送付する量。1トークン送りたいなら「1」と書く。
  • –allow-unfunded-recipient:
    • 受信者のSOL残高で0solでも送信してしまうオプション
  • –fund-recipient
    • 相手がトークンアドレスを持っていない場合は、こちら側でRENTを負担して無理やり作成するオプション
ちなみにGumdropとかいうツールを使えば「ユーザーにURLを踏ませて自主的にWLを取得させる」みたいなこともできるみたいです。なのでGumdropを使うとホワイトリストの配布代が無料にできます。

Solflare walletだと、以下のようにネイティブトークンであるSOLなどと同じように表示されるのですが👇

Phantom walletだと、以下のようにSFTやNFTとして扱われてしまいます👇

▲Unknown Tokensと表示されてしまう

Phantom walletでもきちんと表示されてほしいなら、metadata付きのFTを作って、それらを配布するしかないです。

別記事に書きました👇
参考:【Candy Machine】WhitelistをNFTとして発行する手順

mintサイトの作成

metaplex公式のjsディレクトリの中に、テンプレがあります。

以下のディレクトリです。

https://github.com/metaplex-foundation/metaplex/tree/master/js/packages/candy-machine-ui

 

中身はReactなので、Reactが分かる人ならすぐに把握できると思います。

これを参考にすれば(というか丸パクリすれば)、一瞬でmintサイトを作れます。

 

基本的に.envファイルを編集して、npm run startするだけです。

▲デプロイ後の画面。ホワイトリスト用のトークンを保持しているアカウントの場合、自動的にDiscount Priceが表示される。

mintする

10個分、すべてmintします。

▲mintするときの取引承認画面。ホワイトリストを保持している場合は、ホワイトリストのトークンが自動的にburnされて、その代わりにdiscount価格で購入できる。

⭐Revealする

すべてのmintが終わったら、最後にRevealします。

Reveal設定をONにした状態(hideSettingをONにした状態)だと

  • すべての画像が卵の画像のまま
  • 名前も「What will be in it ? #◯」のまま

になっているので、metabossというサードパーティツールを使って無理やりmetadataを書き換えます。

 

まずmetabossをインストールします。

インストール後、現在のCandy Machineで発行済のmintアドレスをすべて取得します👇

metaboss -r https://api.devnet.solana.com snapshot mints -c <CANDY_MACHINE_ID> --v2 --output <OUTPUT_DIR>

 

次に、取得したmintアドレスを元に、全mintアカウントのメタデータ(JSONファイル)を取得します👇

metaboss decode mint --list-file <LIST_FILE> -o <OUPUT_DIRECTORY>
  • <LIST_FILE> :mintアカウントのアドレスが配列で格納されたJSONファイル
  • <OUPUT_DIRECTORY>:出力するディレクトリ

 

そして、以下の2つを元に、

  • 全mintアカウントのメタデータ(JSONファイル)
  • .cache/devnet-temp.json

「こういう風にNFTのメタデータを書き換える」なJSONファイルを10個作ります。

このとき作るJSONの中身は以下のような感じです。

{
  "mint_account": <各NFTのmintアドレス>,
  "nft_data": {
    "creators": [
      { "address": <candy machineのアドレス>, "share": 0, "verified": true },
      { "address": <自分のウォレットアドレス>, "share": 100, "verified": false }
    ],
    "name": <変更したい名前>,
    "seller_fee_basis_points": 500,
    "symbol": <変更したいシンボル>,
    "uri":  <変更したいメタデータ>,
  }
}

たとえばNFTを10個mint済みなら、このようなJSONファイルを10個つくります。

(これを実現するソフトはおそらくないので、自分でスクリプトを自作する必要があります)

 

最後に、作成した10個のJSONファイルを元に、metabossを使って書き換えます。

metaboss update data-all --keypair <PATH_TO_KEYPAIR> --data-dir <10個のJSONファイルが入っているディレクトリパス>

これで、すべてのNFTのタイトルや画像が書き換わっているはずです。(反映されるまで10秒くらいかかります)

⭐コレクションのコレクションをつくる

作ったコレクションをさらに別のコレクションに追加したい場合、

metaplexの公式が用意してくれているWEBツールで新しいコレクションを作成できます。

まとめ

このようにCandy Machineを使うと比較的簡単にmintサイトを作れます。

ただ現状、WhitelistやRevealを設定しようとすると「ここから先は自分で何とかしろ」みたいなことになるので、Solana周辺の知識がないとキツイ印象です。(Candy Machine公式の設定で用意されているのにも関わらず。。)

ただ、Ethereumで NFT をデプロイしたりするのと比べると

  • たぶん楽チン
  • セキュリティ的に安全(コントラクトを書かなくていいので)

なので、SolanaでNFTをデプロイするのは良い選択なんじゃないかと思います。

 

おわり

Dapp
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。
WEBエンジニアです。うんちコードなら書けます。

技術スタック:TypeScript/Next.js/Express/Docker/AWS

penpenをフォローする
penpenをフォローする
penpenメモ

コメント

タイトルとURLをコピーしました