Erc-721

ERC721 代幣 - 再次燃燒和鑄造

  • August 11, 2019

我還沒有嘗試,但讓我們假設以下內容:

  • 我有一個 ERC721 合約代幣,總供應量為 101
  • 我的契約可以鑄造和燃燒
  • 第一個令牌的 id 為 0,最後一個令牌的 id 為 100
  • 我燒掉了 id 為 50 的令牌。

我可以再次鑄造 id 為 50 的令牌嗎?

這取決於您的mintburnToken和函式addToken的實現。removeToken

ERC-721 模式不聲明mint函式,就像 ERC-20 也不聲明一樣。因此,如果您的mint函式要求之前未使用過令牌 ID,那麼您的問題的答案是“否”。否則,它可能是“是的,只是小心點”。

按照ERC721.org中的連結,您將找到這個基本實現。轉到那裡的第 371 行,您會看到如下內容:

function _mint(address _to, uint256 _tokenId) internal {
   require(_to != address(0));
   _addToken(_to, _tokenId);
   Transfer(0x0, _to, _tokenId);
}

因此,在這種情況下,您似乎可以再次鑄造它,因為它只需要tois not address(0)。但在第 410 行,我們得到:

function _addToken(address _to, uint256 _tokenId) private {
   require(tokenOwner[_tokenId] == address(0));
   tokenOwner[_tokenId] = _to;
   uint256 length = balanceOf(_to);
   ownedTokens[_to].push(_tokenId);
   ownedTokensIndex[_tokenId] = length;
   totalTokens = totalTokens.add(1);
}

require那裡保證令牌在那一刻沒有所有者。這將我們引向burnremoveToken實現。此範例中沒有burnToken函式,但請注意IS a removeToken().

function _removeToken(address _from, uint256 _tokenId) private {
   require(ownerOf(_tokenId) == _from);

   uint256 tokenIndex = ownedTokensIndex[_tokenId];
   uint256 lastTokenIndex = balanceOf(_from).sub(1);
   uint256 lastToken = ownedTokens[_from][lastTokenIndex];

   tokenOwner[_tokenId] = 0;
   ownedTokens[_from][tokenIndex] = lastToken;
   ownedTokens[_from][lastTokenIndex] = 0;
   ownedTokens[_from].length--;
   ownedTokensIndex[_tokenId] = 0;
   ownedTokensIndex[lastToken] = tokenIndex;
   totalTokens = totalTokens.sub(1);
 }

它有效地將該令牌的所有者設置為 0 並清除所有引用。如果您遵循該實現並removeToken在您burnToken的函式內部呼叫,則該令牌 ID 在被燒毀後將不屬於任何人。在這種情況下,你的問題的答案是肯定的,你可以鑄造一個之前已經被燒毀的代幣

允許重新鑄造已銷毀令牌的實現將被視為 ERC-721 標準的有效實現。事實上,這個功能是通過標準中引用的參考實現來描述和實現的。

此外,如果您閱讀該實現,它會記錄您的具體問題:

 /**
  * @dev Burns a NFT.
  * @notice This is a private function which should be called from user-implemented external burn
  * function. Its purpose is to show and properly initialize data structures when using this
  * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
  * NFT.
  * @param _tokenId ID of the NFT to be burned.
  */
 function _burn(
 ...

來源:https ://github.com/0xcert/ethereum-erc721/blob/ba888772931a62068d849b5a0e3fbd3aad3965e2/src/contracts/tokens/nf-token.sol#L360-L365

關於這個主題的進一步討論在https://github.com/0xcert/ethereum-erc721/issues/198

最終結果是參考實現(https://github.com/0xcert/ethereum-erc721)具有主要範例 nf-token-mock.sol 包括薄荷而不是燃燒,因為它可能導致混淆重新薄荷正如你所描述的。

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