ERC-5489: NFT 超链接扩展
NFT 超链接扩展将超链接嵌入到 NFT 中,允许用户点击任何 hNFT 并跳转到所有者设置的任何 URL。
Authors | IronMan_CH (@coderfengyun) |
---|---|
Created | 2022-08-16 |
Requires | EIP-165, EIP-721 |
摘要
本 EIP 提出了一种新的 NFT(非同质化代币,又名 EIP-721)扩展:nft-hyperlink-extention (hNFT),将 NFT 嵌入超链接,称为“hNFT”。 作为 hNFT 的所有者,用户可以将 URL 插槽授权给特定地址,该地址可以是外部拥有账户 (EOA) 或合约地址,并且 hNFT 所有者有权随时撤销该授权。 具有插槽授权的地址可以管理该插槽的 URL。
动机
随着 NFT 越来越受到关注,它们有潜力成为 Web3 的主要媒介。 目前,最终用户无法将富文本、视频或图像附加到 NFT,并且无法渲染这些富内容附件。 许多行业都热切期盼这种富内容附件能力。 以标准化的方式附加、编辑和显示高度定制的信息将非常有用。
本 EIP 使用超链接作为上述形式的“NFT 上的高度自定义附件”,并且还指定了如何附加、编辑和显示 NFT 上的这些附件。
规范
本文档中的关键词“必须”、“不得”、“必需”、“应该”、“不应该”、“推荐”、“可以”和“可选”应按照 RFC 2119 中的描述进行解释。
接口
IERC5489
// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.0;
interface IERC5489 {
/**
* @dev 当 `tokenId` 上的插槽已授权给 `slotManagerAddr` 时,将发出此事件
*/
event SlotAuthorizationCreated(uint256 indexed tokenId, address indexed slotManagerAddr);
/**
* @dev 当 token `tokenId` 的插槽 `slotManagerAddr` 上的授权被撤销时,将发出此事件。
* 因此,相应的 DApp 可以处理此问题以停止正在进行的激励或权利
*/
event SlotAuthorizationRevoked(uint256 indexed tokenId, address indexed slotManagerAddr);
/**
* @dev 当 token `tokenId` 的插槽 `slotManagerAddr` 上的 uri 已更新为 `uri` 时,将发出此事件。
*/
event SlotUriUpdated(uint256 indexed tokenId, address indexed slotManagerAddr, string uri);
/**
* @dev
* 将 `tokenId` 上的超链接插槽授权给地址 `slotManagerAddr`。
* 实际上,插槽是映射中的一个条目,其键是地址 `slotManagerAddr`。
* 只有地址 `slotManagerAddr` 才能管理特定的插槽。
* 此方法将发出 SlotAuthorizationCreated 事件
*/
function authorizeSlotTo(uint256 tokenId, address slotManagerAddr) external;
/**
* @dev
* 撤销 token `tokenId` 上由 `slotManagerAddr` 指示的插槽的授权
* 此方法将发出 SlotAuthorizationRevoked 事件
*/
function revokeAuthorization(uint256 tokenId, address slotManagerAddr) external;
/**
* @dev
* 撤销 token `tokenId` 上插槽的所有授权
* 此方法将为每个插槽发出 SlotAuthorizationRevoked 事件
*/
function revokeAllAuthorizations(uint256 tokenId) external;
/**
* @dev
* 为 token 上的插槽设置 uri,该插槽由 `tokenId` 和 `slotManagerAddr` 指示
* 只有通过 {authorizeSlotTo} 授权的地址才能操作此插槽。
* 此方法将发出 SlotUriUpdated 事件
*/
function setSlotUri(
uint256 tokenId,
string calldata newUri
) external;
/**
* @dev 如果 `tokenId` 不是有效的 NFT,则抛出异常。 URI 在 RFC 3986 中定义。
* URI 必须指向符合“EIP5489 元数据 JSON 模式”的 JSON 文件。
*
* 返回 token 上插槽的最新 uri,该插槽由 `tokenId`、`slotManagerAddr` 指示
*/
function getSlotUri(uint256 tokenId, address slotManagerAddr)
external
view
returns (string memory);
}
authorizeSlotTo(uint256 tokenId, address slotManagerAddr)
函数可以实现为 public 或 external。
revokeAuthorization(uint256 tokenId, address slotManagerAddr)
函数可以实现为 public 或 external。
revokeAllAuthorizations(uint256 tokenId)
函数可以实现为 public 或 external。
setSlotUri(uint256 tokenId, string calldata newUri)
函数可以实现为 public 或 external。
getSlotUri(uint256 tokenId, address slotManagerAddr)
函数可以实现为 pure 或 view。
当插槽被授权给地址时,必须发出 SlotAuthorizationCreated
事件。
当插槽授权被撤销时,必须发出 SlotAuthorizationRevoked
事件。
当插槽的 URI 更改时,必须发出 SlotUriUpdated
事件。
当使用 0x8f65987b
调用时,supportInterface
方法必须返回 true。
身份验证
当且仅当消息发送者是 token 的所有者时,authorizeSlotTo
、revokeAuthorization
和 revokeAllAuthorizations
函数才会被验证。
元数据 JSON 模式
{
"title": "AD Metadata",
"type": "object",
"properties": {
"icon": {
"type": "string",
"description": "指向具有 mime 类型 image/* 的资源的 URI,表示插槽的占用者。 考虑制作宽度在 48 到 1080 像素之间,宽高比在 1.91:1 到 4:5 之间的任何图像(含)。 建议将其显示为目标资源的缩略图"
},
"description": {
"type": "string",
"description": "简要介绍目标资源的一段文字"
},
"target": {
"type": "string",
"description": "指向目标资源的 URI,建议遵循 30X 状态代码以支持更多重定向,mime 类型和内容取决于用户的设置"
}
}
}
理由
使用超链接扩展 NFT
URI 用于表示插槽的值,以确保在处理不同的用例时具有足够的灵活性。
将插槽授权给地址
我们使用地址来表示插槽的键,以确保在处理所有用例时具有足够的灵活性。
向后兼容性
如规范部分所述,通过添加扩展函数集,此标准可以与 EIP-721 完全兼容。
此外,此标准中引入的新函数与 EIP-721 中的现有函数有很多相似之处。 这使开发人员可以轻松快速地采用该标准。
参考实现
您可以在 ERC5489.sol
中找到此标准的实现。
安全考虑
未发现安全考虑。
版权
通过 CC0 放弃版权和相关权利。
Citation
Please cite this document as:
IronMan_CH (@coderfengyun), "ERC-5489: NFT 超链接扩展," Ethereum Improvement Proposals, no. 5489, August 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5489.