简述

一个简单的不可替代性通证标准,它允许把通证分批并在一次交易中解决点对点原子交换问题。用户可以在 rinkeby 上进行测试:
https://rinkeby.etherscan.io/address/0xffab5ce7c012bc942f5ca0cd42c3c2e1ae5f0005

并且查看 github 仓库 :
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(addess _owner)public view returns(uint256[] balance)

以 array 数组形式返回用户余额

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);

返回特定通证的持有者,我认为这个函数是备选的是因为并不是所有的通证合约都需要追踪独特通证的持有者并且
它需要消耗gas 去进行 loop 循环,以及在每次余额变化时映射通证 id 持有者。

function trade(uint256 expiryTimeStamp,uint256[] tokenIndices,uint8 v,bytes32 r,bytes32 r)public payable

这个函数允许用户在 p2p 原子交换中批量兜售不可替代性通证而不需要支付 gas 费用(但买方需要支付 gas 费用)。

这是通过签署一份包含要出售的通证数量,合约地址,到期时间戳,价格,ERC 标准名称,以及链 id 认证来实现的。

买方在交易中支付适量的以太币来满足交易要求。

这种设计更加高效,因为它允许订单离线完成,而不是在智能合约中创建并更新订单,到期时间戳保护卖方免受使用旧订单人的影响。

这也为 p2p 原子交换敞开大门,但对 ERC875 标准来说是备选的,因为用户使用它的次数不多。

需要在消息中添加一些保护,例如对链 id,合约地址以及 ERC 标准名称进行编码,以防止重放攻击和欺骗用户签署允许交易的消息。

Leave a Reply

Your email address will not be published.