我們現在已經能夠製作具有白名單功能的 NFT,但現今市場上的 NFT 多數都還會加入盲盒功能。這篇文章就來討論一下如何製作盲盒模式的 NFT
設定CandyMachine以支持盲盒模式
前文說到,Candy Machine 有一個核心的設定文件 config.js
,裡面設定了所有 Candy Machine 的重要參數,參考之前的範例:
{
"price": 0.3,
"number": 10,
"gatekeeper": null,
"solTreasuryAccount": "DEVKXTfCTqEzgyZ98GUvxdW5raRCfMKXm5KxzgyTjRqb",
"splTokenAccount": null,
"splToken": null,
"goLiveDate": "20 Mar 2022 00:00:00 GMT",
"endSettings": null,
"hiddenSettings": null,
"whitelistMintSettings": null,
"storage": "arweave-sol",
"ipfsInfuraProjectId": null,
"ipfsInfuraSecret": null,
"awsS3Bucket": null,
"noRetainAuthority": false,
"noMutable": false
}
留意裡面的 hiddenSettings
,這個設定便是盲盒的關鍵。 hiddenSettings
允許我們將所有 NFT 的 metadata 都指向同一個地址,也就是 hiddenSettings
中設定的地址, 一般這個地址可以用來顯示沒有開啟盲盒時的圖案。同時,設定了 hiddenSettings
後,Candy Machine 也不需要在上載的過程中事先準備好相應的圖檔。以下是 hiddenSettings
的設定舉例,所有 NFT 的 metadata 都會被指向到相同的地址。
"hiddenSettings": {
"name":"Mystery Box NFT ",
"uri":"https://ipfs.io/ipfs/QmNcfWgjJUBjyd2yN28XnnnfHYSQBzTo6f94iesN4Fp7Ux",
"hash":"hashGWWsSgdqPMvmqYgTS78Mx2Bblind"
},
留意,不知道是不是 Candy Machine 的 bug, 儘管設定了 hiddenSettings
後,Candy Machine 不會再上載相應的圖檔,但依然需要在 asset
資料夾中放入至少一個 json 和 image 檔案, (之後在 upload 的時候會 skip),否則在執行 upload 時會出現錯誤。 這可能是 Candy Machine 的 bug 之一。
設定好 hiddenSettings
之後的步驟和普通 NFT 一樣。可以參考前文進行操作。
開啟盲盒
開啟盲盒的原理和 ERC721 NFT 類似,都是更改 NFT 的 metadata 地址。 這裡我們需要用到另外一個工具: Metaboss 。 Metaboss 是一個針對 Metaplex 的工具集,裡面集成了眾多實用的功能。
安裝 Metaboss: 可參考官網的安裝步驟
bash <(curl -sSf https://raw.githubusercontent.com/samuelvanderwaal/metaboss/main/scripts/install.sh)
然後,要更改 metadata 地址,我們首先需要得到所有已鑄造出的 NFT Token Account:
metaboss snapshot mints -c 31JY8szaKFFh2JzjvFvXL5KWL6k9cRyNXgFTqJbxz4MD --v2
-c
後的地址為 Candy Machine 的 ID, 執行完成後會在當前路徑下產生一個 xxx_mint_accounts.json
的檔案,裡面會記錄所有 Mint Account 的地址。
["9mKUeXfPvCQJEKkrKEvjjm87ztUfGS9SE4FfKHKGfwp7","6DLUWuoLvNxuusy9ksRkKJNC5ZaFKdX7hMD4j1zksCW8","hqkD3qtJBsJM4AxAXsKSoYpHfbhWkzA3rz28vn8ojz5","Hmnb8kUfdF4eLTKFePgh6D7Tdj1k7pB9VPpALVFM5dP"]
然後,我們需要準備好每個 NFT 對應的新 URI , 格式如下:
update.json
[
{
"mint_account": "9mKUeXfPvCQJEKkrKEvjjm87ztUfGS9SE4FfKHKGfwp7",
"new_uri": "https://arweave.net/N36gZYJ6PEH8OE11i0MppIbPG4VXKV4iuQw1zaq3rls"
},
{
"mint_account": "6DLUWuoLvNxuusy9ksRkKJNC5ZaFKdX7hMD4j1zksCW8",
"new_uri": "https://arweave.net/FPGAv1XnyZidnqquOdEbSY6_ES735ckcDTdaAtI7GFw"
},
{
"mint_account": "hqkD3qtJBsJM4AxAXsKSoYpHfbhWkzA3rz28vn8ojz5",
"new_uri": "https://arweave.net/FPGAv1XnyZidnqquOdEbSY6_ES735ckcDTdaAtI7GFw"
},
{
"mint_account": "Hmnb8kUfdF4eLTKFePgh6D7Tdj1k7pB9VPpALVFM5dP",
"new_uri": "https://arweave.net/FPGAv1XnyZidnqquOdEbSY6_ES735ckcDTdaAtI7GFw"
}
]
接著就可以執行 update
metaboss update uri-all --keypair ~/.config/solana/xxx.json --json-file ./update.json
完成後,所有 NFT 的 metadata 就成功更新完成。盲盒開啟了。