Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-1203: ERC-1203 多类代币标准 (ERC-20 扩展)

Authors Jeff Huang <jeffishjeff@gmail.com>, Min Zu <crawlregister@gmail.com>
Created 2018-07-01
Discussion Link https://github.com/ethereum/EIPs/issues/1203

简单总结

一种用于多类代币 (MCTs) 的标准接口。

摘要

以下标准允许在智能合约中实现 MCT 的标准 API。 此标准提供基本功能来跟踪、转移和转换 MCT。

动机

此标准深受 ERC-20 代币标准和 ERC-721 非同质化代币标准的启发。 然而,这些标准主要关注于用单一类别、同质化或非同质化代币来表示项目/价值,而此提议的标准则专注于更复杂的、多类系统。 可以认为 MCT 是同质化代币 (FT) 和非同质化代币 (NFT) 的混合体,即代币在同一类别中是同质化的,但在不同类别中是非同质化的。 并且可以选择性地支持类别之间的转换。

MCT 在表示具有异构组件的各种结构时非常有用,例如:

  • 抽象概念: 一家公司可能拥有不同类别的股票(例如高级优先股、初级优先股、A 类普通股、B 类普通股),它们共同构成其未偿还的权益。 此类公司的股东头寸由每个类别中的零股或更多股组成。

  • 虚拟物品: 沙盒电脑游戏可能有很多类型的资源(例如岩石、木材、浆果、奶牛、肉、刀等),它们共同构成了虚拟世界。 玩家的库存拥有这些资源的任何组合和数量

  • 实物物品: 超市可能有许多可供购买的 SKU(例如鸡蛋、牛奶、牛肉干、啤酒等)。 当购物者沿着过道移动时,东西会被添加到购物者的购物车中或从购物车中移除。

有时,尤其是对于抽象概念或虚拟物品,可以以指定的转换率从一个类转换为另一个类。 当涉及到实物项目时,这种转换本质上是易货贸易的实施。 虽然通常更容易引入一种常见的中间类别,即货币。

规范

contract ERC20 {
    function totalSupply() public view returns (uint256);
    function balanceOf(address _owner) public view returns (uint256);
    function transfer(address _to, uint256 _value) public returns (bool);
    function approve(address _spender, uint256 _value) public returns (bool);
    function allowance(address _owner, address _spender) public view returns (uint256);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool);

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

contract ERC1203 is ERC20 {
    function totalSupply(uint256 _class) public view returns (uint256);
    function balanceOf(address _owner, uint256 _class) public view returns (uint256);
    function transfer(address _to, uint256 _class, uint256 _value) public returns (bool);
    function approve(address _spender, uint256 _class, uint256 _value) public returns (bool);
    function allowance(address _owner, address _spender, uint256 _class) public view returns (uint256);
    function transferFrom(address _from, address _to, uint256 _class, uint256 _value) public returns (bool);

    function fullyDilutedTotalSupply() public view returns (uint256);
    function fullyDilutedBalanceOf(address _owner) public view returns (uint256);
    function fullyDilutedAllowance(address _owner, address _spender) public view returns (uint256);
    function convert(uint256 _fromClass, uint256 _toClass, uint256 _value) public returns (bool);

    event Transfer(address indexed _from, address indexed _to, uint256 _class, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _class, uint256 _value);
    event Convert(uint256 indexed _fromClass, uint256 indexed _toClass, uint256 _value);
}

ERC-20 方法和事件(完全兼容)

有关详细规范,请参阅 ERC-20 代币标准。 请注意,这些方法和事件仅适用于 MCT 的“默认”类别。

    function totalSupply() public view returns (uint256);
    function balanceOf(address _owner) public view returns (uint256);
    function transfer(address _to, uint256 _value) public returns (bool);
    function approve(address _spender, uint256 _value) public returns (bool);
    function allowance(address _owner, address _spender) public view returns (uint256);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool);

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

跟踪和转移

totalSupply

返回指定 _class 中的代币总数

    function totalSupply(uint256 _class) public view returns (uint256);

balanceOf

返回 _owner 拥有的指定 _class 的代币数量

    function balanceOf(address _owner, uint256 _class) public view returns (uint256);

transfer

_class_value 个代币转移到 _to 指定的地址,如果成功则返回 true

    function transfer(address _to, uint256 _class, uint256 _value) public returns (bool);

approve

授予 _spender 转移 _class_value 个代币的权利,如果成功则返回 true

    function approve(address _spender, uint256 _class, uint256 _value) public returns (bool);

allowance

返回 _spender 被授权代表 _owner 转移的 _class 的代币数量

    function allowance(address _owner, address _spender, uint256 _class) public view returns (uint256);

transferFrom

_class_value 个代币从 _from 指定的地址转移到 _to 指定的地址(如先前批准的那样),如果成功则返回 true

    function transferFrom(address _from, address _to, uint256 _class, uint256 _value) public returns (bool);

Transfer

当代币被转移或创建时触发,包括零值转移

    event Transfer(address indexed _from, address indexed _to, uint256 _class, uint256 _value);

Approval

在成功 approve 时触发

    event Approval(address indexed _owner, address indexed _spender, uint256 _class, uint256 _value);

转换和稀释

fullyDilutedTotalSupply

返回代币总供应量,就好像全部转换为最小公分母类别一样

    function fullyDilutedTotalSupply() public view returns (uint256);

fullyDilutedBalanceOf

返回 _owner 拥有的代币总数,就好像全部转换为最小公分母类别一样

    function fullyDilutedBalanceOf(address _owner) public view returns (uint256);

fullyDilutedAllowance

返回 _spender 被授权代表 _owner 转移的代币总数,就好像全部转换为最小公分母类别一样

    function fullyDilutedAllowance(address _owner, address _spender) public view returns (uint256);

convert

_fromClass_value 转换为 _toClass,如果成功则返回 true

    function convert(uint256 _fromClass, uint256 _toClass, uint256 _value) public returns (bool);

Conversion

在成功 convert 时触发

    event Conversion(uint256 indexed _fromClass, uint256 indexed _toClass, uint256 _value);

理由

本标准特意扩展了 ERC-20 代币标准,以便遵循此标准的新 MCT 或扩展此标准的现有 ERC-20 代币与当前的钱包和交易所完全兼容。 此外,新的方法和事件尽可能与 ERC-20 规范保持一致,以便于采用。

我们已经考虑了支持多类结构的其他实现方式(如下所述),并且我们发现当前的代币标准无法处理或处理此类结构效率低下。

使用多个 ERC-20 代币

当然可以为每个类别创建一个 ERC-20 代币,并创建一个单独的合约来协调潜在的转换,但这种方法的缺点显而易见。 此标准背后的理由是拥有一个合约来管理多个类别的代币。

硬塞 ERC-721 代币

将每个代币视为唯一的,非同质化代币标准提供了最大的表示灵活性,但可能会以牺牲便利性为代价。 使用 ERC-721 表示多类代币的主要挑战是需要单独的逻辑来跟踪哪些代币属于哪个类别,这是一种笨拙且不必要的尝试。

使用 ERC-1178 代币

当我们对自己的提案进行最后的润色时,我们偶然发现了 ERC-1178。 这两个 ERC 在表面上看起来非常相似,但我们认为这个 ERC 比 ERC-1178 有几个关键优势。

  • ERC-1178 不提供向后兼容性,而此提案是 ERC-20 的扩展,因此与所有现有的钱包和交易所完全兼容
  • 同样,现有的 ERC-20 合约可以扩展自己以采用此标准并支持其他类别,而不会影响其当前行为
  • 此提案引入了跨类转换和稀释的概念,使每个代币类别成为整个系统不可分割的一部分,而不是许多孤岛

向后兼容性

只要实现包括“最小公分母”类别,此 EIP 就与 ERC20 代币标准的强制方法完全兼容,在上面的抽象/虚拟/物理示例中,该类别可能是 B 类普通股/金币/货币。 如果无法实现此类类别,则该实现应指定一个用于跟踪或转移的默认类别,除非另有说明,例如,除非明确指定其他货币,否则转移的是美元。

我们发现要求 ERC20 代币标准的可选方法 name()symbol()decimals() 是人为的,但开发人员当然可以随意实现这些方法。

测试用例

jeffishjeff/ERC-1203 上的存储库包含示例测试用例

实现

jeffishjeff/ERC-1203 上的存储库包含示例实现

参考文献

  • ERC-20 代币标准。 ./eip-20.md
  • ERC-721 非同质化代币标准。 ./eip-721.md
  • ERC-1178 多类代币标准。 ./eip-1178.md

版权

版权和相关权利通过 CC0 放弃。

Citation

Please cite this document as:

Jeff Huang <jeffishjeff@gmail.com>, Min Zu <crawlregister@gmail.com>, "ERC-1203: ERC-1203 多类代币标准 (ERC-20 扩展) [DRAFT]," Ethereum Improvement Proposals, no. 1203, July 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1203.