ERC-6982: 高效的默认可锁定代币
一种用于可锁定的 ERC-721 代币的 gas 高效方法
Authors | Francesco Sullo (@sullof), Alexe Spataru (@urataps) |
---|---|
Created | 2023-05-02 |
Requires | EIP-165, EIP-721 |
摘要
本提案引入了一个用于 ERC-721 代币的可锁定接口,该接口通过消除不必要的事件来优化 gas 用量。这个接口构成了创建和管理可锁定的 ERC-721 代币的基础。它提供了一种 gas 高效的方法,在部署时发出一个 DefaultLocked(bool locked)
事件,为所有代币设置初始锁定状态,而单独的 Locked(uint256 indexed tokenId, bool locked)
事件处理特定代币的后续状态更改。该接口还包括一个视图函数 locked(uint256 tokenId)
,用于返回代币的当前锁定状态,以及一个视图函数 defaultLocked()
,用于查询新铸造代币的默认状态。
动机
现有的可锁定代币提案通常要求每次铸造代币时都必须发送一个事件。这导致了不必要的 gas 消耗,尤其是在代币从一开始就被永久锁定的情况下(例如,灵魂绑定或不可转让的徽章)。本提案提供了一种更 gas 高效的解决方案,该方案仅在合约部署和单个代币状态更改时发送事件。
规范
本文档中的关键词“必须”,“不得”,“要求”,“应”,“不应”,“应该”,“不应该”,“推荐”,“不推荐”,“可以”和“可选”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。
该接口定义如下:
// ERC165 interfaceId 0x6b61a747
interface IERC6982 {
/**
* @dev 必须在部署合约时发出,以建立所有代币的默认锁定状态。
* 此外,如果默认锁定状态发生更改,则必须再次发出,
* 以确保更新所有代币(没有特定的 `Locked` 事件)的默认状态。
*/
event DefaultLocked(bool locked);
/**
* @dev 必须在特定代币的锁定状态更改时发出。
* 此状态覆盖该特定代币的默认锁定状态。
*/
event Locked(uint256 indexed tokenId, bool locked);
/**
* @dev 返回代币的当前默认锁定状态。
* 返回值必须反映最近的 `DefaultLocked` 事件指示的状态。
*/
function defaultLocked() external view returns (bool);
/**
* @dev 返回特定代币的锁定状态。
* 如果未为此代币发送 `Locked` 事件,则必须返回当前默认锁定状态。
* 如果代币不存在,则该函数必须回退。
*/
function locked(uint256 tokenId) external view returns (bool);
}
ERC-165 的 interfaceId 是 0x6b61a747
。
理由
本标准旨在通过最小化事件广播的频率来优化 gas 消耗。DefaultLocked
事件旨在确立所有代币的锁定状态,从而避免了每次铸造新代币时都发送事件的需要。需要注意的是,DefaultLocked
事件可以在任何时间点发送,并且不限于仅在 Locked
事件发送之前。
代币可能在某些情况下(例如在揭示之后)改变其行为,从而促使重新发送 DefaultLocked
事件以反映新的默认状态。这里的主要目标是通过避免在默认状态改变时为每个代币发送 Locked
事件的需求来节省 gas 消耗。
Locked
事件用于记录单个代币的锁定状态的变化。
defaultLocked
函数返回代币的当前默认锁定状态。此函数是有益的,因为它促进了与其他合约的交互,并避免了与 ERC-5192 的潜在冲突,后者正处于最后阶段。
locked
函数给出特定代币的当前锁定状态,进一步促进与其他合约的交互。如果未对特定代币 ID 进行任何更改,则此函数应返回 defaultLocked
函数提供的值。
请记住,将代币指定为“锁定”并不一定意味着它完全不可转让。在某些情况下,即使代币处于锁定状态,仍然可以转让。主要地,锁定状态与代币在市场和外部交易所的可转让性有关。
为了说明,让我们考虑 Cruna 协议。在这个系统中,NFT 所有者有能力激活所谓的“保护者”。这本质上是一个具有启动关键交易的独特权限的辅助钱包。设置启动器后,代币的状态呈现为“锁定”。但是,如果转移的启动来自指定的保护者,这不会阻碍代币的可转移性。
向后兼容性
此标准与现有的 ERC-721 合约完全向后兼容。它可以轻松集成到现有合约中,并且不会导致任何冲突或中断。
参考实现
示例实现在 assets 目录中。
它解决了特定的用例:当在池中质押资产时,代币所有者会失去所有权。该实现允许池锁定资产,将所有权留给所有者。在 README 中,您可以找到有关如何编译和测试合约的更多详细信息。
安全考虑
此 EIP 没有引入任何已知的安全考虑。但是,与任何智能合约标准一样,在实现此接口时,必须采用严格的安全措施。
版权
在 CC0 下放弃版权和相关权利。
Citation
Please cite this document as:
Francesco Sullo (@sullof), Alexe Spataru (@urataps), "ERC-6982: 高效的默认可锁定代币," Ethereum Improvement Proposals, no. 6982, May 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6982.