以下のザックリした手順をメモ。
- Candy Machine v2を使ってSolana上にNFTをDevnetにデプロイ
- デプロイしたNFTをmintできるサイトを作る
自分用なので、かなり雑に書いてます。
「ざっくりこういう流れなんだなぁー」と参考にする程度に見て下さい。
\必須でない手順には⭐を付けてます/
ジェネラティブNFTを準備する
以下の2つを用意して、ジェネラティブNFTを作成します。
- ジェネラティブ用のパーツ画像
- ジェネラティブNFT作成ツール
ジェネラティブNFT作成ツールは、HashLipsを使えばいいと思います👇(metaplex公式も「HashLipsはいいぞ」と言ってるので)
この記事では、metaplex公式が用意してくれているアセットを使いたいと思います👇
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:
- 大文字小文字を区別せずに検索する(これを付けるとかなり時間が短縮されます)
作成されるファイルは、以下のようになっています👇
- ファイル名:公開鍵
- ファイルの中身:秘密鍵
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 airdrop 2
※現状1回あたりの上限が「2」で、1日の上限が「24」らしいです
コマンド以外の方法では、以下のようなサイトで入手できます👇
他のウォレットに送金したい場合は以下です👇
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つ目の方法は以下です👇
- 日本の取引所でSOLを購入
- 自分のウォレットに送金
ただ、SOLが購入できる日本の取引所は(2022年06月現在)、「Liquid by FTX」という取引所だけです。
手数料もそこまで安くないので、手間を惜しまないのであれば、後者の方法のほうが良いと思います。
2つ目の方法は以下です👇
- 日本の取引所(たぶん現状最安はGMOコイン?)でXRPを購入
- 海外の取引所(たとえばBinance)にXRPを送金
- 海外の取引所でXRPをSOLに変える
- 海外の取引所から自分のウォレットに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にアップロードする方法は、以下のページを参考にしてください。
もしくは、画像をアップするためだけに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ファイル
⭐アセットがアップロードできたか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になってるので、自分の好きなように変更します。
ここでは、以下の画像を使うものとします。
変更したら、以下で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を負担して無理やり作成するオプション
mintサイトの作成
metaplex公式のjsディレクトリの中に、テンプレがあります。
以下のディレクトリです。
https://github.com/metaplex-foundation/metaplex/tree/master/js/packages/candy-machine-ui
中身はReactなので、Reactが分かる人ならすぐに把握できると思います。
これを参考にすれば(というか丸パクリすれば)、一瞬でmintサイトを作れます。
基本的に.env
ファイルを編集して、npm run start
するだけです。
mintする
10個分、すべてmintします。
⭐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をデプロイするのは良い選択なんじゃないかと思います。
おわり
コメント