ERC-7603: ERC-1155 多资产扩展
一个与 ERC-1155 兼容的接口,用于具有上下文相关资产类型输出控制的多资产 Token。
Authors | Haru (@haruu8) |
---|---|
Created | 2024-01-25 |
Discussion Link | https://ethereum-magicians.org/t/erc-multi-context-dependent-multi-asset-tokens-eip1155-extension/18303 |
Requires | EIP-165, EIP-1155 |
摘要
多资产 Token 标准与 ERC-1155 兼容,有助于开发一个新的基础组件:每个集合的上下文相关数据输出。
上下文相关数据输出意味着资产以适当的格式显示,这取决于访问 Token 的方式。例如,如果 Token 在电子书阅读器中打开,则显示 PDF 资产;如果 Token 在市场上打开,则显示 PNG 或 SVG 资产;如果 Token 从游戏中访问,则访问 3D 模型资产;如果 Token 被物联网 (IoT) 集线器访问,则访问提供必要寻址和规范信息的资产。
一个 Token 集合可以有多个资产(输出),可以是任何文件,按优先级排序。它们的 mime-type 或 tokenURI 不必匹配,也不必相互依赖。资产不是独立的实体,而应被视为“命名空间的 tokenURI”。
动机
由于与 ERC-1155 兼容的 Token 是以太坊生态系统中广泛存在的 Token 形式,并被用于各种用例,因此现在是时候标准化其附加实用程序了。将多个资产与单个 Token 集合相关联可以提高实用性、可用性和向前兼容性。本 EIP 在以下方面改进了 ERC-1155:
跨元宇宙兼容性
该提案可以支持任意数量的不同实现。
跨元宇宙兼容性也可以称为跨引擎兼容性。一个例子是游戏 A 的化妆品在游戏 B 中不可用,因为框架不兼容。
可以通过新的资产为这些 Token 提供更多实用性:更多游戏、化妆品等等。
以下是一个更具体的例子。一个资产是游戏 A 的化妆品,一个包含化妆品资产的文件。另一个是游戏 B 的化妆品资产文件。第三个是旨在在目录、市场、投资组合跟踪器或其他通用 Token 集合查看器中显示的通用资产,其中包含化妆品的表示、风格化缩略图和动画演示/预告片。
此 EIP 增加了一个抽象层,允许游戏开发者直接从用户的 Token 中提取资产数据,而不是对其进行硬编码。
多媒体输出
eBook 的 Token 可以表示为 PDF、MP3 或其他格式,具体取决于加载它的软件。如果加载到电子书阅读器中,则应显示 PDF,如果加载到有声读物应用程序中,则应使用 MP3 表示形式。其他元数据可能存在于 Token 中(可能是书籍的封面图像),以便在各种市场、搜索引擎结果页面 (SERP) 或投资组合跟踪器上进行识别。
媒体冗余
许多 Token 在铸造时没有考虑到最佳实践。具体来说,许多 Token 在铸造时元数据集中在某处的服务器上,或者在某些情况下,集中在一个硬编码的 IPFS 网关上,该网关也可能出现故障,而不是仅仅使用 IPFS 哈希。
通过将相同的元数据文件添加为不同的资产,例如,一个 Arweave 上的元数据资产及其链接的图像,一个 Sia 上的相同组合的资产,另一个 IPFS 上的相同组合的资产等,元数据及其引用信息的弹性呈指数级增长,因为所有协议同时出现故障的可能性变得越来越小。
规范
本文档中的关键词“必须 (MUST)”、“禁止 (MUST NOT)”、“需要 (REQUIRED)”、“应该 (SHALL)”、“不应 (SHALL NOT)”、“应当 (SHOULD)”、“不应当 (SHOULD NOT)”、“推荐 (RECOMMENDED)”、“不推荐 (NOT RECOMMENDED)”、“可以 (MAY)”和“可选 (OPTIONAL)”按照 RFC 2119 和 RFC 8174 中的描述进行解释。
/// @title ERC-7603 上下文相关的多资产 Token,ERC-1155 执行
/// @dev 请参阅 https://eips.ethereum.org/EIPS/erc-7603
pragma solidity ^0.8.23;
interface IERC7603 /* is ERC165 */ {
/**
* @notice 用于通知监听器,资产对象已在 `assetId` 处初始化。
* @param assetId 已初始化的资产的 ID
*/
event AssetSet(uint64 assetId);
/**
* @notice 用于通知监听器,`assetId` 处的资产对象已添加到 Token 的资产数组中。
* @param tokenId 接收新资产的 Token 的 ID
* @param assetId 已添加到 Token 资产数组中的资产的 ID
* @param replacesId 将被替换的资产的 ID
*/
event AssetAddedToToken(
uint256[] tokenId,
uint64 indexed assetId,
uint64 indexed replacesId
);
/**
* @notice 用于通知监听器,Token 的优先级数组已重新排序。
* @param tokenId 更新了资产优先级数组的 Token 的 ID
*/
event AssetPrioritySet(uint256 indexed tokenId);
/**
* @notice 为给定的 Token 设置一个新的优先级数组。
* @dev 优先级数组是一个非顺序的 `uint16` 列表,其中最低的值被认为是最高的优先级。
* @dev 优先级 `0` 的值是一种特殊情况,等同于未初始化。
* @dev 要求:
*
* - `tokenId` 必须存在。
* - `priorities` 的长度必须等于资产数组的长度。
* @dev 发出 {AssetPrioritySet} 事件。
* @param tokenId 用于设置优先级的 Token 的 ID
* @param priorities 资产的优先级数组。 priorities 数组中项目的顺序与数组中项目的顺序匹配
* 数组中的项目顺序相匹配。
*/
function setPriority(uint256 tokenId, uint64[] calldata priorities)
external;
/**
* @notice 用于检索给定 Token 的资产的 ID。
* @dev 资产数据通过引用存储,为了访问与 ID 对应的数据,调用
* `getAssetMetadata(tokenId, assetId)`。
* @dev 您可以安全地获得 1 万个
* @param tokenId 用于检索资产 ID 的 Token 的 ID
* @return uint64[] 给定 Token 的资产 ID 数组
*/
function getAssets(uint256 tokenId)
external
view
returns (uint64[] memory);
/**
* @notice 用于检索给定 Token 资产的优先级。
* @dev 资产优先级是一个非顺序的 uint16 值数组,其数组大小等于资产优先级。
* @param tokenId 用于检索资产优先级的 Token 的 ID
* @return uint16[] 给定 Token 资产的优先级数组
*/
function getAssetPriorities(uint256 tokenId)
external
view
returns (uint64[] memory);
/**
* @notice 用于获取指定 Token 的资产在给定索引处的资产元数据。
* @dev 可以被覆盖以实现枚举、回退或其他自定义逻辑。
* @param tokenId 从中检索资产元数据的 Token 的 ID
* @param assetId 资产 ID,必须在资产数组中
* @return string 属于 Token 资产数组中指定索引的资产的元数据
*/
function getAssetMetadata(uint256 tokenId, uint64 assetId)
external
view
returns (string memory);
}
理由
待定
向后兼容性
MultiAsset Token 标准已与 ERC-1155 兼容,以便利用 ERC-1155 实现的强大工具,并确保与现有 ERC-1155 基础设施的兼容性。
安全注意事项
需要讨论。
版权
Copyright 和相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Haru (@haruu8), "ERC-7603: ERC-1155 多资产扩展 [DRAFT]," Ethereum Improvement Proposals, no. 7603, January 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7603.