Solidity

為 NFT 合約中的 TokenIds 生成隨機起始索引

  • May 12, 2022

我最近開始探索和學習 Solidity,並一直在研究一些著名的 NFT 項目的合約。

我發現的一個常見模式是,他們中的大多數人在鑄幣前設置一個ProvenanceHash,在鑄幣完成後隨機startingTokenIndex

這是其中之一的程式碼片段

function finalizeStartingIndex() public
   {
       require(starting_index == 0, "Starting index already set");
       require(starting_index_block != 0, "Starting index block not set");

       starting_index = uint256(blockhash(starting_index_block)) % max_token_supply;

       if (block.number.sub(starting_index_block) > 255)
       {
           starting_index = uint256(blockhash(block.number-1)) % max_token_supply;
       }

       if (starting_index == 0)
       {
           starting_index = starting_index.add(1);
       }
   }

我了解出處雜湊是什麼以及需要隨機化起始索引,但我很難理解它在契約中的實際運作方式。

在上面的程式碼片段中,starting_index設置了變數,但除了一些保護條件外,我在契約中的任何地方都找不到它的用法。

那麼它是如何真正實現隨機tokenIds的預期分配的呢?

它不應該在我們實際儲存/歸還所有權之類的地方使用tokenUri嗎?還是我在這裡遺漏了一些關鍵資訊?

這是相關契約的完整原始碼的連結。

這是一段多餘的程式碼。

來自BAYC 合約分析部落格-

BAYC 團隊試圖通過隨機化代幣的順序來防止在預售期間對稀有代幣進行狙擊。startIndex 應該作為隨機偏移量來隨機化順序。

但是……這個隨機偏移實際上並沒有在任何地方使用!程式碼不使用它!儘管 BAYC 聲稱猿的順序是隨機的,但實際上並非如此!而startingIndex只是浪費氣體!

關於 BAYC 的文章還聲稱,其他 NFT 只是盲目地複制/粘貼了 BAYC 程式碼,而不了解它的作用。所以他們繼承了這個 startingIndex 錯誤。我想驗證這一說法,但懶得超越“受 BAYC 啟發的 NFT”Google搜尋。如果您知道任何此類契約,請在評論中留下它們。

引用自:https://ethereum.stackexchange.com/questions/128110