Ethereum-Wallet-Dapp
在可靠的條件場景中可以替代while循環嗎?
我正在開發一個帶有 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
使用