Alert Source Discuss
Standards Track: ERC

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 的所有者时,authorizeSlotTorevokeAuthorizationrevokeAllAuthorizations 函数才会被验证。

元数据 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.