Nft

為什麼要在 Openzeppeling ERC721 版稅擴展中刪除關於刻錄的版稅資訊?

  • January 27, 2022

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/783ac759a902a7b4a218c2d026a77e6a26b6c42d/contracts/token/ERC721/extensions/ERC721Royalty.sol#L34我們有

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 的可選擴展因此刪除有關代幣的版稅資訊也可以確保,如果再次鑄造已燒毀的代幣,它不會有已經存在的版稅資訊,從而導致潛在的資金洩漏以前的接收者帳戶。

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