function _burn(uint256 tokenId) internal virtual override {
super._burn(tokenId);
_resetTokenRoyalty(tokenId);
}为什么要在燃烧之前重新设置版税信息,因为一旦燃烧,就没有办法使用或传输此令牌了?
我找不到一个很好的理由,这似乎不是EIP https://eips.ethereum.org/EIPS/eip-2981所要求的
发布于 2022-01-27 00:11:25
“重置”一词可能具有误导性,正如您在ERC2981.sol中看到的那样,它是一个sclear操作(或在Solidity中的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是唯一两个退还汽油而不是消耗汽油的EVM操作。
来自黄纸,第27页:
sclear:当存储值从非零设置为零时(添加到退款计数器) 15000的退款。自毁: 24000的退款(添加到退款柜台),以自毁一个帐户.
正如朱莉莎直流在另一个答案中已经指出的那样,当前OpenZeppelin的现721实现允许对已烧毁的令牌进行造币。造币和烧制并不是标准的一部分,所以这可以在不违反共享规则的情况下完成。如果他们不这样做,则由每个开发人员在他们的智能契约中重写该行为。
关于ERC721Royalty.sol,它是ERC721.sol的一个可选扩展,因此删除有关令牌的版税信息也可以确保,如果再次铸造刻录的令牌,它将不会有已存在的版税信息,从而可能导致资金泄漏到先前的接收方帐户。
发布于 2022-01-27 00:12:41
作为一种安全措施和释放空间,更多的是关于后面的这里。现在回到安全推理,您可以看到没有什么可以阻止您在tokenId被烧毁后重新铸造它,并且有人可以创建一个已刻录的tokenId,其中包含了版税信息,从而导致一些资金泄漏到先前的接收方帐户。
免责声明:我就是那个做出承诺的人。
https://ethereum.stackexchange.com/questions/119384
复制相似问题