Solidity

大量 NFT 的隨機分佈

  • April 14, 2021

我是 Solidity 的初學者,與一個團隊合作,我們有一個 NFT 契約項目。

我與 5000 NFT limite 簽訂了合約(卡片,20 張特定卡片組成一個家族,每個家族和卡片都是獨一無二的)。所有這些 NFT 卡的索引數量都是獨一無二的。

遊戲的目標是組裝一組卡片(例如:卡片編號 1 到 25 形成家族 RED)以贏得獎品。

所以,在遊戲開始時,我們需要隨機分配這張牌。在我的函式“claimCard”中,計算了一個“隨機數”,卡片的數字索引是所有者地址的屬性。

我有 :

function claimCard(uint _cardIndex) public payable returns(uint){
 
_cardIndex = 5000;
randNonce++;   

cardIndexToAddress[uint(keccak256(abi.encodePacked(now, msg.sender, randNonce))) % _cardIndex] = msg.sender;

return uint(keccak256(abi.encodePacked(now, msg.sender, randNonce))) % _cardIndex;

問題:如果“隨機數”是一張已經擁有的卡,我如何管理我的重新啟動功能並為尚未擁有的卡找到一個新的隨機數?

  • 我可以循環(如果地址卡是!= 0x0,循環)但是這個解決方案可能會花費大量的氣體 50% 的卡索賠 => 2loop 33% 的卡索賠 => 3loop 10% 的卡索賠 => 10loop卡索賠的 4% => 25loop 卡索賠的 1% => 100loop
  • 我可以創建一個索引為 5000 的數組,比如 arrayCard(1, 2, 3… 5000) 和一個隨機數模 lengh.array,取這個數字並刪除數組中的元素,所以數組變成了 5000 個元素- 1…但是5000個元素的數組的成本太貴了…

你有什麼問題要找我嗎?:) 謝謝你,祝你有美好的一天!

在 NFT 的建構子或一些初始化方法中創建包含隨機數 (466,35,77,2466,….) 的卡片數組。獎勵卡片時,只需使用卡片數組中的第一個元素,然後將其刪除。仍然不確定 NFT 智能合約的這種部署或初始化會消耗多少 gas

對於好奇,這是我如何處理我的問題:

對於我的 200 個家庭的偽隨機分佈,我以兩種方式將聲明分開:

  • 第一種方法是在我的文章中使用 keccak 函式的偽隨機數。這是 4500 令牌的方式。當assignToken > 4500時,函式轉到第二方
  • 第二種方法是將下一個聲明發送到令牌編號 1。如果是聲明,則下一個是 2,等等……這裡沒有 randomNumber,但目標是為使用者節省氣體。

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