Solana NFT 開發第五話 盲盒模式

  • FrankFrank
  • /
  • 8 分鐘閱讀
  • /
  • Jun 19, 2022
  • /
  • - views

我們現在已經能夠製作具有白名單功能的 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 就成功更新完成。盲盒開啟了。