ERC-5516: Soulbound 多所有者代币
用于绑定到以太坊账户的不可转移、多所有者 NFT 的接口
Authors | Lucas Martín Grasso Ramos (@LucasGrasso), Matias Arazi (@MatiArazi) |
---|---|
Created | 2022-08-19 |
Discussion Link | https://ethereum-magicians.org/t/EIP-5516-soulbound-multi-token-standard/10485 |
Requires | EIP-165, EIP-1155 |
Table of Contents
摘要
本 EIP 提出了一种用于不可替代的双重签名 Soulbound 多代币的标准接口。先前的账户绑定代币标准面临用户丢失其账户密钥或密钥轮换的问题,从而在此过程中丢失其代币。本 EIP 提供了解决此问题的方法,该方法允许回收 SBT。
动机
本 EIP 的灵感来自 EIP-1155 代币的主要特征以及介绍 Soulbound/Accountbound 代币 (SBT) 的好处和潜在用例的文章。 此设计还允许批量代币转移,从而节省交易成本。多种代币的交易可以建立在此标准之上,并且无需单独批准各个代币合约。它还可以轻松地在单个合约中描述和混合多种可替代或不可替代的代币类型。
特点
- NFT 在初始转移后将不可转移
- 与 EIP-1155 部分兼容
- 双重签名
- 多代币
- 多所有者
- 半同质化
应用
- 学位
- 代码审计
- POAP(出席证明协议 NFT)
规范
本文档中的关键词“MUST(必须)”、“MUST NOT(禁止)”、“REQUIRED(需要)”、“SHALL(应)”、“SHALL NOT(禁止)”、“SHOULD(应该)”、“SHOULD NOT(不应该)”、“RECOMMENDED(推荐)”、“MAY(可以)”和“OPTIONAL(可选)”应按照 RFC 2119 中的描述进行解释。
实现此 EIP 的智能合约必须实现 EIP-5516
接口中的所有函数。
实现此 EIP 的智能合约必须实现 EIP-165 supportsInterface
函数,如果 0x8314f22b
通过 interfaceID
参数传递,则必须返回常量值 true
。它们还必须实现 EIP-1155 接口,如果 0xd9b67a26
通过 interfaceID
参数传递,则必须返回常量值 true
。此外,它们必须实现 EIP-1155 元数据接口,如果 0x0e89341c
通过 interfaceID
参数传递,则必须返回常量值 true
。
参见 EIP-1155
// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.4;
/**
@title Soulbound,多代币标准。
@notice EIP-5516 的接口
Note: 此接口的 ERC-165 标识符是 0x8314f22b。
*/
interface IERC5516 {
/**
* @dev 当 `account` 声明或拒绝 `ids[]` 下的待处理代币时发出。
*/
event TokenClaimed(
address indexed operator,
address indexed account,
bool[] actions,
uint256[] ids
);
/**
* @dev 当 `from` 将 `id` 下的代币转移到 `to[]` 中的每个地址时发出。
*/
event TransferMulti(
address indexed operator,
address indexed from,
address[] to,
uint256 amount,
uint256 id
);
/**
* @dev 获取给定地址拥有的代币。
*/
function tokensFrom(address from) external view returns (uint256[] memory);
/**
* @dev 获取等待给定地址声明的代币。
*/
function pendingFrom(address from) external view returns (uint256[] memory);
/**
* @dev 声明或拒绝待处理的 `id`。
*
* 要求:
* - `account` 在调用时必须在 `id` 下有待处理的代币。
* - `account` 在调用时不得拥有 `id` 下的代币。
*
* 发出 {TokenClaimed} 事件。
*
*/
function claimOrReject(
address account,
uint256 id,
bool action
) external;
/**
* @dev 声明或拒绝 `ids[]` 下的待处理代币。
*
* 每个 `id` `action` 对的要求:
* - `account` 在调用时必须在 `id` 下有待处理的代币。
* - `account` 在调用时不得拥有 `id` 下的代币。
*
* 发出 {TokenClaimed} 事件。
*
*/
function claimOrRejectBatch(
address account,
uint256[] memory ids,
bool[] memory actions
) external;
/**
* @dev 将 `id` 代币从 `from` 转移到 `to[]` 中的每个地址。
*
* 要求:
*
* - `from` 必须是 `id` 的创建者(铸币者)。
* - `to[]` 中的所有地址必须是非零的。
* - `to[]` 中的所有地址必须在 `_pendings` 下拥有代币 `id`。
* - `to[]` 中的所有地址不得拥有 `id` 下的代币类型。
*
* 发出 {TransfersMulti} 事件。
*
*/
function batchTransfer(
address from,
address[] memory to,
uint256 id,
uint256 amount,
bytes memory data
) external;
}
理由
SBT 作为 EIP-1155 的扩展
我们认为 Soulbound 代币是现有 EIP-1155 代币的专门子集。这种设计的优势在于 SBT 与现有 NFT 服务的无缝兼容性。服务提供商可以将 SBT 视为 NFT,而无需对其现有代码库进行重大更改。
使该标准主要与 EIP-1155 兼容还允许 SBT 绑定到多个地址和智能合约。
双重签名
实施双重签名功能是为了防止接收不需要的代币。它象征着代币接收者和发送者之间的握手,意味着双方都同意代币转移。
元数据
实施了 EIP-1155 元数据接口,以进一步兼容 EIP-1155。
保证的日志跟踪
随着以太坊生态系统的不断发展,许多 DApp 依赖于传统的数据库和浏览器 API 服务来检索和分类数据。EIP-1155 标准保证智能合约发出的事件日志将提供足够的数据来创建所有当前代币余额的准确记录。数据库或浏览器可能会监听事件,并能够提供合约中每个 EIP-1155 代币的索引和分类搜索。
引自 EIP-1155
本 EIP 将此概念扩展到双重签名功能:{TokenClaimed}
事件记录了 ClaimOrReject(...)
或 ClaimOrRejectBatch(...)
函数调用的所有必要信息,存储了有关用户执行的操作的相关信息。这也适用于 batchTransfer(...)
函数:它发出 {TransferMulti}
事件并记录必要的数据。
异常处理
考虑到 SBT 的不可转移性,如果用户帐户的密钥遭到泄露或轮换,则该用户可能会失去将自己与代币相关联的能力。
鉴于符合 EIP-1155 的接口和合约的多所有者特性,SBT 将能够绑定到多个帐户,从而为该问题提供潜在的解决方案。
还可以将多所有者 SBT 颁发给实现多重签名功能的合约帐户(如 EIP-4973 中建议的那样);这可以通过 EIP-1155 代币接收器接口来实现。
多代币
多代币功能允许在同一合约中实施多种代币类型。此外,所有发行的代币都存储在同一合约中,从而防止将冗余字节码部署到区块链。它还有助于转移到代币发行者,因为所有发行的代币都存储在同一合约地址下并可以访问。
batchTransfer
函数
本 EIP 支持转移到多个接收者。这简化了向大量地址的代币转移,使其更具 gas 效率和用户友好性。
向后兼容性
此提案仅与 EIP-1155 部分兼容,因为它使代币在首次转移后不可转移。
参考实现
你可以在 ../assets/EIP-5516 中找到此标准的实现。
安全考虑
需要讨论。
版权
通过 CC0 放弃版权及相关权利。
Citation
Please cite this document as:
Lucas Martín Grasso Ramos (@LucasGrasso), Matias Arazi (@MatiArazi), "ERC-5516: Soulbound 多所有者代币 [DRAFT]," Ethereum Improvement Proposals, no. 5516, August 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5516.