Nft
為什麼要在 Openzeppeling ERC721 版稅擴展中刪除關於刻錄的版稅資訊?
function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); }
為什麼在銷毀之前重置版稅資訊,因為一旦銷毀就無法使用或轉移此令牌?
我找不到很好的理由,而且 EIP 中似乎不需要它https://eips.ethereum.org/EIPS/eip-2981
正如您在ERC2981.sol中看到的那樣,重置一詞可能會產生誤導,它是一個操作(或在 Solidity 中):
sclear``delete
/** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; }
該行動有兩個主要影響:從鏈中釋放數據並避免未來的不一致。
釋放數據
從全域儲存中刪除數據是保持鏈的全域狀態盡可能乾淨的最佳實踐。為了激勵開發人員採用這種做法,發件人從整體交易成本中獲得 15.000 天然氣。
selfdestruct
並且sclear
是目前僅有的兩個返還 Gas 而不是消耗它的 EVM 操作。來自黃皮書,第 27 頁:
sclear : 15000 當儲存值從非零設置為零時給予退款(添加到退款計數器)。
selfdestruct : 24000 為自毀帳戶提供退款(添加到退款櫃檯)。
避免不一致
正如Julissa DC在另一個答案中已經指出的那樣,目前 OpenZeppelin 的 EIP721 實現允許鑄造燒毀的代幣。鑄造和燃燒不是標準的一部分,因此可以在不違反共享規則的情況下完成。如果他們願意,每個開發人員都可以在他們的智能合約中覆蓋該行為。
關於ERC721Royalty.sol,它是 ERC721.sol 的可選擴展,因此刪除有關代幣的版稅資訊也可以確保,如果再次鑄造已燒毀的代幣,它不會有已經存在的版稅資訊,從而導致潛在的資金洩漏以前的接收者帳戶。