Alert Source Discuss
🛑 Withdrawn Standards Track: ERC

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

概要

一种简单的非同质化代币标准,允许将代币批量处理成批次,并在一次交易中结算 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.