Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-4883: 可组合的 SVG NFT

通过将 SVG 与另一个 NFT 的渲染 SVG(渲染为特定 token ID 的字符串)连接起来,从而组合一个 SVG NFT。

Authors Andrew B Coathup (@abcoathup), Alex (@AlexPartyPanda), Damian Martinelli (@damianmarti), blockdev (@0xbok), Austin Griffith (@austintgriffith)
Created 2022-03-08
Discussion Link https://ethereum-magicians.org/t/eip-4883-composable-svg-nft/8765
Requires EIP-721

摘要

通过将 SVG(可缩放矢量图形)NFT 与另一个 NFT 的 SVG 连接起来,从而组合一个 SVG NFT,该 NFT 被渲染为特定 token ID 的字符串。

动机

链上 SVG NFT 允许 NFT 通过在 tokenUri 函数的数据 URI 中返回 SVG 格式的艺术品,从而完全在链上。可组合性允许制作链上 SVG NFT。例如,向个人资料图片 NFT 添加眼镜和帽子 NFT,或向鱼缸 NFT 添加鱼 NFT。

规范

本文档中的关键词“必须”,“不得”,“必需”,“应”,“不应”,“应该”,“不应该”,“推荐”,“可以”和“可选”应按照 RFC 2119 中的描述进行解释。

/// @title EIP-4883 非同质化代币标准
/// @title EIP-4883 Non-Fungible Token Standard
interface IERC4883 {
    function renderTokenById(uint256 id) external view returns (string memory);
}

renderTokenById 必须返回指定 token id 的 SVG 主体,并且必须是空字符串或有效的 SVG 元素。

原理

SVG 元素可以字符串连接以组成 SVG。

连接顺序

SVG 使用“画家模型”进行渲染。

可缩放矢量图形 (SVG) 1.1 (第二版),章节:3.3 渲染顺序

SVG 文档片段中的元素具有隐式绘制顺序,SVG 文档片段中的第一个元素首先被“绘制”。后续元素绘制在先前绘制的元素之上。

SVG 连接的顺序决定了绘制顺序,而不是 z-index 的任何概念。

此 EIP 仅指定渲染的 SVG NFT 的渲染,并且不要求在组合时使用任何特定顺序。这允许 SVG NFT 根据需要使用渲染的 SVG NFT 作为前景或背景。

连接的替代方案

SVG 指定了一个 link 标签。链接可以允许组合复杂的 SVG,但需要创建 URI 格式,然后获得生态系统的采用。由于已经支持 SVG 的字符串连接,因此使用了更简单的连接方法。

尺寸

此 EIP 没有指定对渲染的 SVG 尺寸的任何要求。任何基于尺寸的缩放都可以由 SVG NFT 根据需要执行。

渲染函数名称

渲染函数被命名为 renderTokenById,因为此函数名称最初由 Loogies 使用,并允许现有的已部署 NFT 与此 EIP 兼容。

向后兼容性

此 EIP 没有向后兼容性问题

安全考虑

  • SVG 使用“画家模型”进行渲染。可以添加渲染的 SVG 主体,并完全遮盖现有的 SVG NFT 艺术品。
  • SVG 是 XML,可以包含恶意内容,虽然它不会影响合约,但可能会影响 SVG 的使用。

版权

版权及相关权利通过 CC0 放弃。

Citation

Please cite this document as:

Andrew B Coathup (@abcoathup), Alex (@AlexPartyPanda), Damian Martinelli (@damianmarti), blockdev (@0xbok), Austin Griffith (@austintgriffith), "ERC-4883: 可组合的 SVG NFT [DRAFT]," Ethereum Improvement Proposals, no. 4883, March 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-4883.