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
。
原理
-
通过在链上发出的
PrivilegeExercised
事件,我们可以确定用户已确认行使此特权,从而在现实世界中实施该特权。 -
我们选择为函数
exercisePrivilege
、isExercisable
和isExercised
包含一个地址_to
,以便 NFT 的特定特权可以为除 NFT 持有者或交易发起者之外的其他人行使并从中受益。并且此 EIP 不假设谁有权执行此操作,这完全由使用此标准的开发人员决定。 -
我们选择为函数
exercisePrivilege
包含一个额外的_data
字段,用于额外的消息或未来的扩展。例如,开发人员可以使用_data
来行使直接在链上生效的特权,例如直接分配加密货币资产。 -
isExercisable
和isExercised
的布尔视图函数可用于检查 NFT 的特定特权是否可对_to
地址行使或已被行使。
向后兼容性
本标准是 ERC-721 的扩展。它与 ERC-721 标准中提到的两种常用可选扩展(IERC721Metadata
和 IERC721Enumerable
)完全兼容。
参考实现
特权 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.