ERC-875: 更简单的 NFT 标准,支持批量处理和原生原子交换
Authors | Weiwu Zhang <a@colourful.land>, James Sangalli <j.l.sangalli@gmail.com> |
---|---|
Created | 2018-02-08 |
Discussion Link | https://github.com/ethereum/EIPs/issues/875 |
Table of Contents
- 概要
- 目的
- Rinkeby 示例
- 规范
- function name() constant returns (string name)
- function symbol() constant returns (string symbol)
- function balanceOf(address _owner) public view returns (uint256[] balance)
- function transfer(address _to, uint256[] _tokens) public;
- function transferFrom(address _from, address _to, uint256[] _tokens) public;
- 可选函数
- 接口
- 示例实现
- 版权
概要
一种简单的非同质化代币标准,允许将代币批量处理成批次,并在一次交易中结算 p2p 原子转移。你可以在 rinkeby 上测试一个示例实现:https://rinkeby.etherscan.io/address/0xffab5ce7c012bc942f5ca0cd42c3c2e1ae5f0005,并在此处查看仓库:https://github.com/alpha-wallet/ERC-Example
目的
虽然其他标准允许用户转移非同质化代币,但它们需要每个代币一次交易,这会消耗大量 gas,并且是造成以太坊网络拥堵的部分原因。对于如何进行简单的原子交换,也没有多少定义。
Rinkeby 示例
该标准已在 rinkeby 的示例合约中实现:https://rinkeby.etherscan.io/address/0xffab5ce7c012bc942f5ca0cd42c3c2e1ae5f0005
规范
function name() constant returns (string name)
返回合约的名称,例如 CarLotContract
function symbol() constant returns (string symbol)
返回不可替代代币的符号的简短字符串,此符号应简短且通用,因为每个代币都是非同质化的。
function balanceOf(address _owner) public view returns (uint256[] balance)
返回用户的余额数组。
function transfer(address _to, uint256[] _tokens) public;
通过添加代币索引的数组,将你的唯一代币转移到地址。这比 ERC721 更有利,因为你可以一次性转移大量代币,而不是一次转移一个。这节省了大量 gas,并且更加方便。
function transferFrom(address _from, address _to, uint256[] _tokens) public;
将可变数量的代币从一个用户转移到另一个用户。这可以由具有指定密钥的授权方完成,例如合约所有者。
可选函数
function totalSupply() constant returns (uint256 totalSupply);
返回给定合约中的代币总数,这应该是可选的,因为资产可能会被动态分配和发行。这意味着供应并不总是固定的。
function ownerOf(uint256 _tokenId) public view returns (address _owner);
返回特定代币的所有者,我认为这应该是可选的,因为并非每个代币合约都需要跟踪唯一代币的所有者,并且每次余额更改时循环和映射代币 ID 所有者都会消耗 gas。
function trade(uint256 expiryTimeStamp, uint256[] tokenIndices, uint8 v, bytes32 r, bytes32 s) public payable
一个允许用户出售一批非同质化代币而无需支付 gas 费(只有买方必须支付)的函数,用于 p2p 原子交换。这是通过签署一份证明来实现的,该证明包含要出售的代币数量、合约地址、到期时间戳、价格以及包含 ERC 规范名称和链 ID 的前缀。然后,买方可以通过附加适当的以太币来满足交易,从而在一个交易中支付交易费用。
这种设计也更有效,因为它允许订单在结算前离线完成,而不是在智能合约中创建订单并更新它们。到期时间戳可以保护卖家免受人们使用旧订单的侵害。
这为 p2p 原子交换打开了大门,但对于此标准应该是可选的,因为有些人可能不需要它。
需要向消息添加一些保护措施,例如对链 ID、合约地址和 ERC 规范名称进行编码,以防止重放和欺骗人们签署允许交易的消息。
接口
contract ERC165
{
/// @notice 查询合约是否实现了接口
/// @param interfaceID 接口标识符,如 ERC-165 中所指定
/// @dev 接口标识在 ERC-165 中指定。此函数
/// 使用不到 30,000 gas。
/// @return 如果合约实现了 `interfaceID` 并且
/// `interfaceID` 不是 0xffffffff,则为 `true`,否则为 `false`
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
interface ERC875 /* is ERC165 */
{
event Transfer(address indexed _from, address indexed _to, uint256[] tokenIndices);
function name() constant public returns (string name);
function symbol() constant public returns (string symbol);
function balanceOf(address _owner) public view returns (uint256[] _balances);
function transfer(address _to, uint256[] _tokens) public;
function transferFrom(address _from, address _to, uint256[] _tokens) public;
}
//如果你想要带有原子交换交易的标准函数
interface ERC875WithAtomicSwapTrading is ERC875 {
function trade(
uint256 expiryTimeStamp,
uint256[] tokenIndices,
uint8 v,
bytes32 r,
bytes32 s
) public payable;
}
示例实现
请访问此 repo 查看示例实现
版权
通过 CC0 放弃版权和相关权利。
Citation
Please cite this document as:
Weiwu Zhang <a@colourful.land>, James Sangalli <j.l.sangalli@gmail.com>, "ERC-875: 更简单的 NFT 标准,支持批量处理和原生原子交换 [DRAFT]," Ethereum Improvement Proposals, no. 875, February 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-875.