簡體   English   中英

如何隨機鑄造一個 static 數量的 NFT?

[英]How to random mint a static number of NFT?

我想鑄造這些數量的代幣:

200 超 300 稀有 500 普通

但是鑄造過程需要是隨機的,你可以得到一個(超級、稀有或普通),但在過程結束時,應該鑄造相同數量的 200 超級、300 稀有和 500 普通。

以下代碼是隨機的,但最終的令牌數量將與一開始不同:

  function safeMint(address to) public onlyOwner {
        require(_tokenIdCounter.current() < totalSupply(), "There's no token to mint.");
        require(mintCnt[msg.sender] < maxMintCntPerAddress, "One address can mint 1 tickets.");

        if(mintPrice > 0) {
            require(mintPrice == msg.value, "Mint price is not correct.");
            address payable _to = payable(serviceAddress);
            _to.transfer(mintPrice);
        }

        uint randomNumber = random(expectedTokenSupply - _tokenIdCounter.current());
        for (uint256 i = 0; i < _tokenMetadata.length; i++) {
            if(_tokenMetadata[i].amount <= randomNumber) {
                _safeMint(to, _tokenIdCounter.current());
                _setTokenURI(_tokenIdCounter.current(), _tokenMetadata[i].uri);
                _tokenIdCounter.increment();
                break;
            }
        }
    }

    function random(uint maxValue) internal returns (uint) {
        return uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, _tokenIdCounter.current()))) % maxValue;
    }

首先不要使用 block.timestamp 或任何區塊或區塊鏈數據作為隨機性來源,因為它會導致“隨機性”可預測或可能被礦工操縱,嘗試使用 chainlink 作為隨機性來源,他們有他們的文檔中有很好的例子,如果你想固定供應每種類型的代幣,你可以有 3 個變量來了解每種代幣的鑄造量,以及何時獲得隨機數和你需要的所有東西應用一些數學運算,在這種情況下,您希望代幣是超級代幣的 20%,稀有代幣 30% 和普通代幣 50%,您只需要進行數學運算來決定將鑄造哪個代幣,以防萬一該類型已經達到最大供應量會發生什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM