ERC721 代幣 - 再次燃燒和鑄造
我還沒有嘗試,但讓我們假設以下內容:
- 我有一個 ERC721 合約代幣,總供應量為 101
- 我的契約可以鑄造和燃燒
- 第一個令牌的 id 為 0,最後一個令牌的 id 為 100
- 我燒掉了 id 為 50 的令牌。
我可以再次鑄造 id 為 50 的令牌嗎?
這取決於您的
mint
、burnToken
和函式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); }
因此,在這種情況下,您似乎可以再次鑄造它,因為它只需要
to
is notaddress(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
那裡保證令牌在那一刻沒有所有者。這將我們引向burn
和removeToken
實現。此範例中沒有burnToken
函式,但請注意IS aremoveToken()
.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/issues/198
最終結果是參考實現(https://github.com/0xcert/ethereum-erc721)具有主要範例 nf-token-mock.sol 包括薄荷而不是燃燒,因為它可能導致混淆重新薄荷正如你所描述的。