Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-7765: 与 RWA 绑定的特权型非同质化代币

一种扩展 ERC-721 的接口,代表现实世界资产,用户可以使用 NFT 行使特权。

Authors frank (@frankmint2024) <frank@mintchain.io>
Created 2024-08-20
Discussion Link https://ethereum-magicians.org/t/erc7765-privileged-non-fungible-tokens-tied-to-rwa/21048
Requires EIP-165, EIP-721

摘要

本 EIP 定义了一个接口,用于携带具有某些特权的现实世界资产,这些特权可以由相应 NFT 的持有者行使。本 EIP 标准化了非同质化代币的接口,这些代币代表具有可行使特权的现实世界资产,例如在链上销售的可以在现实世界中兑换的产品。

我们这里描述的特权,特指绑定在 RWA NFT 上的,可以由持有者在现实世界中执行的权利和权益。

动机

绑定到现实世界资产的 NFT 有时需要携带某些可以由持有者行使的特权。用户可以在链上发起交易以指定行使某种特权,从而通过后续操作实现直接映射链上特权的现实世界特权。例如,如果某种产品(如一双鞋)以 NFT 的形式在链上销售,则 NFT 持有者可以行使兑换线下实物鞋的特权,从而达到区块链与现实世界互操作的目的。

拥有一个标准接口可以为基于此用例的服务、客户端、UI 和合约间功能实现互操作性。

规范

本文档中的关键词“必须(MUST)”、“禁止(MUST NOT)”、“必需(REQUIRED)”、“应(SHALL)”、“不应(SHALL NOT)”、“应该(SHOULD)”、“不应该(SHOULD NOT)”、“推荐(RECOMMENDED)”、“不推荐(NOT RECOMMENDED)”、“可以(MAY)”和“可选(OPTIONAL)”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。

本标准继承 ERC-721 NFT 代币标准的所有转移和批准逻辑。所有转移和批准函数都从该代币标准继承,没有更改。此外,本标准还继承了 ERC-721 元数据标准,用于名称、符号和元数据 URI 查找。

任何符合此 EIP 的合约必须实现以下接口:

pragma solidity >=0.7.0 <0.9.0;

/// @title ERC-7765 与现实世界资产绑定的特权型非同质化代币
/// @dev 参阅 https://eips.ethereum.org/EIPS/eip-7765
interface IERC7765 /* is IERC721, IERC165 */ {

    /// @notice 当代币的特定特权成功行使时,会发出此事件。
    /// @param _operator  行使特权的地址。
    /// @param _to  从特权中受益的地址。
    /// @param _tokenId  NFT tokenID。
    /// @param _privilegeId  特权的 ID。
    event PrivilegeExercised(
        address indexed _operator,
        address indexed _to,
        uint256 indexed _tokenId,
        uint256 _privilegeId
    );

    /// @notice 此函数行使代币的特定特权。
    /// @dev 如果 `_privilegeId` 不是有效的 privilegeId,则抛出错误。
    /// @param _to  从特权中受益的地址。
    /// @param _tokenId  NFT tokenID。
    /// @param _privilegeId  特权的 ID。
    /// @param _data  传入的附加数据,用于额外消息或未来扩展。
    function exercisePrivilege(
        address _to,
        uint256 _tokenId,
        uint256 _privilegeId,
        bytes calldata _data
    ) external;

    /// @notice 此函数用于检查代币的特定特权是否可行使。
    /// @dev 如果 `_privilegeId` 不是有效的 privilegeId,则抛出错误。
    /// @param _to  从特权中受益的地址。
    /// @param _tokenId  NFT tokenID。
    /// @param _privilegeId  特权的 ID。
    function isExercisable(
        address _to,
        uint256 _tokenId,
        uint256 _privilegeId
    ) external view returns (bool _exercisable);

    /// @notice 此函数用于检查代币的特定特权是否已被行使。
    /// @dev 如果 `_privilegeId` 不是有效的 privilegeId,则抛出错误。
    /// @param _to  从特权中受益的地址。
    /// @param _tokenId  NFT tokenID。
    /// @param _privilegeId  特权的 ID。
    function isExercised(
        address _to,
        uint256 _tokenId,
        uint256 _privilegeId
    ) external view returns (bool _exercised);

    /// @notice 此函数用于列出代币的所有 privilegeId。
    /// @param _tokenId  NFT tokenID。
    function getPrivilegeIds(
        uint256 _tokenId
    ) external view returns (uint256[] memory privilegeIds);

}

函数 exercisePrivilege 对代币的特定特权执行行使操作。如果成功,则应发出 PrivilegeExercised 事件。

函数 getPrivilegeIds 提供了一种管理 NFT 和 privilegeId 之间绑定关系的方法。

元数据扩展对于 EIP-7765 智能合约是可选的。这允许查询智能合约以获取有关 NFT 所携带的特权的详细信息。

pragma solidity >=0.7.0 <0.9.0;

/// @title ERC-7765 与现实世界资产绑定的特权型非同质化代币,可选元数据扩展
/// @dev 参阅 https://eips.ethereum.org/EIPS/eip-7765
interface IERC7765Metadata /* is IERC7765 */ {

    /// @notice 给定 privilegeId 的不同统一资源标识符 (URI)。
    /// @dev 如果 `_privilegeId` 不是有效的 privilegeId,则抛出错误。 URI 在 RFC 中定义
    ///  3986。URI 可以指向符合“ERC-7765 元数据 JSON 模式”的 JSON 文件。
    function privilegeURI(uint256 _privilegeId) external view returns (string memory);

}

这是上面引用的“EIP-7765 元数据 JSON 模式”。

{
    "title": "特权元数据",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "description": "标识特定特权。"
        },
        "description": {
            "type": "string",
            "description": "描述特定特权。"
        },
        "resource": {
            "type": "string",
            "description": "指向表示特定特权的资源的 URI。"
        }
    }
}

IERC7765Metadata 提供了获取特权元数据信息的规范。实现 IERC7765Metadata 的合约同时实现 IERC7765

原理

  1. 通过在链上发出的 PrivilegeExercised 事件,我们可以确定用户已确认行使此特权,从而在现实世界中实施该特权。

  2. 我们选择为函数 exercisePrivilegeisExercisableisExercised 包含一个地址 _to,以便 NFT 的特定特权可以为除 NFT 持有者或交易发起者之外的其他人行使并从中受益。并且此 EIP 不假设谁有权执行此操作,这完全由使用此标准的开发人员决定。

  3. 我们选择为函数 exercisePrivilege 包含一个额外的 _data 字段,用于额外的消息或未来的扩展。例如,开发人员可以使用 _data 来行使直接在链上生效的特权,例如直接分配加密货币资产。

  4. isExercisableisExercised 的布尔视图函数可用于检查 NFT 的特定特权是否可对 _to 地址行使或已被行使。

向后兼容性

本标准是 ERC-721 的扩展。它与 ERC-721 标准中提到的两种常用可选扩展(IERC721MetadataIERC721Enumerable)完全兼容。

参考实现

特权 NFT 的参考实现可以在此处找到。

安全考虑

符合标准的合约应注意特权状态的存储。合约应正确处理每个 NFT 的每个特权的状态转换,清楚地表明每个特权是可行使的还是已被行使。

符合标准的合约还应仔细定义访问控制,特别是任何 EOA 或合约帐户是否可以在任何用例中调用 exercisePrivilege 函数。应使用安全审计和测试来验证对 exercisePrivilege 函数的访问控制是否按预期运行。

版权

版权和相关权利已通过 CC0 放弃。

Citation

Please cite this document as:

frank (@frankmint2024) <frank@mintchain.io>, "ERC-7765: 与 RWA 绑定的特权型非同质化代币 [DRAFT]," Ethereum Improvement Proposals, no. 7765, August 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7765.