Ethereum-Wallet-Dapp

在可靠的條件場景中可以替代while循環嗎?

  • March 29, 2022

我正在開發一個帶有 Dropsite 模組的 NFT 市場,其中將隨機分發免費的 NFT。固定數量的 NFT 分為 3 類:Platinum:150,Gold:350,Silver:500

現在我想建構一個邏輯,如果從白金中鑄造 150 個,或從金類中鑄造 350 個或從銀類別中鑄造 500 個,則應再次生成隨機數。這可以使用 while 循環輕鬆完成,但我想避免這種情況,因為它在 gas 費用方面太貴了。

我怎麼能省略這個?我現在有以下邏輯:

function randomMint() contractIsNotPaused public returns (uint) {
   uint nftId = random();
while((Platinum<=150 && nftId==0) || (Gold<=350 && nftId==1) || (Silver<=500 && nftId==2))
   {
       nftId = random();
       if(nftId==0)
       {
           data="Platinum";
           Platinum++;
       }
       else if(nftId==1)
       {
           data="Gold";
           Gold++;
       }
       else if(nftId==2)
       {
           data="Silver";
           Silver++;
       }
   }
_mint(_msgSender(), nftId, numOfCopies, data);
TotalNFTsMinted++;
dropsite_NFT_Owner[_msgSender()]=nftId;
return nftId;
}

我添加了一些註釋,這裡不需要循環,它會增加很多計算,並且你在每個循環上呼叫 random() 。

function randomMint() contractIsNotPaused public returns (uint) {
   // no need to call random() multiple times
   uint nftId = random(); // we're assuming that random() returns only 0,1,2
   // if nftID is 0, and less than 151 so 150 MAX
   if(nftId == 0 && platinum < 151) {
       data = "Platinum";
       Platinum++; 
   // if nftID is 0 or 1 and platinum is more than 150, it will go there
   } else if(nftId <= 1 && gold < 351) {
       data = "Gold";
       Gold++;
   // if any of the above conditions are filled it will mint silver if enough silver available
   } else if(nftId == 2 && silver < 501) {
       data="Silver";
       Silver++;
   } else {
       if(gold < 351) {
           data = "Gold";
           Gold++; 
       } else {
           data = "Platinum";
           Platinum++;
       }
   }
}

我建議盡可能避免string使用

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