25种以太坊代币标准详细列表

原文转自:以太坊爱好者:https://ethfans.org/posts/ethereum-token-standards-list-1
对ERC20 和ERC721有补充,文章为个人笔记

编者注:本文基本穷尽了以太坊上的代币标准,但并非文中列出的所有代币标准都已被接受,一部分还处在 draft(草案)阶段,感兴趣的读者可以点击标题旁边的超链接看看原提案是怎么写的,走到哪个阶段了。

此文旨在详细解释以太坊代币的各项标准,如果大家认为有新的或者错误的代币标准需要添加以及修改,请随时提出。同时,也希望大家能对这些代币标准提出更好的描述方法以及指出它们之间的关系,因为很多代币的解释其实都是从相关的提议说明中摘取出来的。

在提出任何建议或者需求之前,请大家填写列表元素模板。如果不同意列表中的信息,大家也可以提出异议。我个人建议可以把目的非常接近的提议整合起来,以便于更加清晰地理解它们。为了保持透明度,没人会对内容做出审核,只要信息满足的提案都会涵盖进去,其中不安全或者平庸的提案会进行关闭处理,然后会从列表中移除。如果最后有足够多的人支持移除某个提案,那么它就会从列表移除。

ERC-20:标准的可替代性代币(EIP-20)

可替代型代币(同质代币)的标准 API,包括转账和余额跟踪的功能。

所有基于以太坊开发的代币合约都遵守这个协议。遵守这些协议的代币我们可以认为是标准化的代币,而标准化带来的好处是兼容性好。这些标准化的代币可以被各种以太坊钱包支持,用于不同的平台和项目。说白了,你要是想在以太坊上发行代币融资,必须要遵守ERC20标准。

ERC20的标准接口:

  contract ERC20 {
      //返回ERC20代币的名字,例如"My test token"。
      function name() constant returns (string name)
      //返回代币的简称,例如:MTT,这个也是我们一般在代币交易所看到的名字。
      function symbol() constant returns (string symbol)
      //返回token使用的小数点后几位。比如如果设置为3,就是支持0.001表示。
      function decimals() constant returns (uint8 decimals)
      //返回token的总供应量
      function totalSupply() constant returns (uint totalSupply);
      //返回某个地址(账户)的账户余额
      function balanceOf(address _owner) constant returns (uint balance);
      //从代币合约的调用者地址上转移 _value的数量token到的地址 _to,并且必须触发Transfer事件。
      function transfer(address _to, uint _value) returns (bool success);
      //从地址 _from发送数量为 _value的token到地址 _to,必须触发Transfer事件。transferFrom方法用于允许合同代理某人转移token。条件是from账户必须经过了approve。
      function transferFrom(address _from, address _to, uint _value) returns (bool success);
      //允许 _spender多次取回您的帐户,最高达 _value金额。 如果再次调用此函数,它将以 _value覆盖当前的余量
      function approve(address _spender, uint _value) returns (bool success);
      //返回 _spender仍然被允许从 _owner提取的金额。
      function allowance(address _owner, address _spender) constant returns (uint remaining);
      event Transfer(address indexed _from, address indexed _to, uint _value);
      event Approval(address indexed _owner, address indexed _spender, uint _value);
    }

ERC-223: 保护投资者以防意外的合约转账 (ERC-223)

ERC20 代币标准很可能会造成终端用户的资金丢失,主要的问题在于无法处理通过 ERC20 代币的转账函数执行的 ERC20 收入交易。ERC-233 定义了一个标准函数,代币合约以及使用特定代币的合约能够用以防止意外发送代币到(不支持该标准的)合约中,同时也让代币的转账就像以太坊转账一样。

相关的标准:

  • ERC-667
  • ERC-777
  • ERC-995

ERC-667: transferAndCall 代币标准 (ERC-667)

transferAndCalltransfer(address,uint256,bytes) 的功能类似,但是前者却可以让操作者不会因为疏忽把代币锁定在非ERC223兼容的合约。它和 ERC223 的 transfer(address,uint256,bytes) 函数不同之处仅仅在于名称,但是这个区别也可以让大家很容易地分清楚 ERC223 代币和 ERC20 + ERC667 混合代币。

非常相关的标准:

  • ERC-223
  • ERC-777
  • ERC-995

ERC-721:非同质代币标准 (EIP-721)

虽然可替代的代币可以继续分解,但是非同质代币(NFTs)却是不可以的。NFTs 可以作为产权,并且进行交易,同时也能委托给第三方中介/钱包/拍卖商(“操作人员”)。NFTs 也能代表数字资产或者实物资产的所有权。

721代币是独一无二的,原因在于这些代币是非同质的。

许多人已经听说过以太坊区块链上的一款新游戏,名为以太猫(CryptoKitties)。由于创意独特新颖并且在以太坊网络上初步表现不错,该款游戏近期在加密货币社区内数次成为头条新闻。在加密猫这款游戏中,玩家可以购买、出售、交易以及饲养电子猫。这些电子猫可被视为“可繁殖的豆豆娃(Beanie Babies,一款玩具公仔的名称),因为每只猫在某种程度上是独一无二的。这种独特性使得加密猫极具收藏价值,因为人们会对好几款猫咪的特征产生兴趣并希望拥有许多只。

25种以太坊代币标准详细列表_第1张图片
  • 来源:Vice Media(一家北美互联网媒体公司)

然而,可收藏的对象并不限于电子猫。人类一直以来有收藏东西的历史;这没什么新鲜的。从物理货币到神奇宝贝卡,人们喜爱收集。这是一种出于对稀缺物品的独特兴趣而形成的习惯。商品价值与其稀缺程度有关,与此类似的是,收藏物对于收藏者的价值与其和其它物品相比起来的稀罕程度相关。

我们能够将以太坊代币看作稀有且具有收藏价值的物品,并且其中每个代币都遵循以太坊社区内被称为ERC721的标准。以太坊代币标准721,或称ERC721,是Dieter Shirley在2017年底引入的一项以太坊改进计划。这项提议标准让智能合约能够像ERC20一样按照可交易代币进行操作。
文末有ERC721 的详细介绍

ERC-777:基于操作者的代币标准 (ERC-777)

和授权第三方代表用户进行交易不同,ERC-777 提议使用用户和操作者之间的布尔匹配(Boolean Mapping)模式。这就会简化编程语言和授权过程,同时也减少了 Gas 的消耗。777 标准也包含数据传递的功能。

非常相关的标准:

  • ERC-223
  • ERC-667
  • ERC-995

相关的标准:

  • EIP-20

ERC-809 : 非同质代币的租赁标准(ERC-809)

竞用品:如果有人在使用某样东西,其他人就不可能同时使用,那么就称这个东西为竞用品(校对注:经济学概念,或译为“竞争品”,与“public good”相对。对后者而言,多人可同时使用同一物品而不会互相干扰)。例如,正在开车这个事件是竞争使用的,但是看日落则是大家都可以同时做到的。

非同质物品:如果不能某样东西不能互相进行交换,我们就称这个东西是非同质的。例如,某人的汽车是非同质的,但是 Ether 是可替代的。

ERC-809 标准可以让用户使用一系列指令来出租他们的非同质化代币(NTFs),因此,用户从单个的钱包界面就可以看到过去和现在的租赁协议。

ERC-827 : transferFromAndCall & approveAndCall (ERC-827)

该标准不安全,故移除。

ERC-864:NFTs 共有产权 (ERC-864)

这项标准提议旨在 NFT 合约中分享 NTF 的所有权。

相关的标准:

  • EIP-721

特别相关的标准:

  • ERC-981

ERC-865 : TransferPreSigned (ERC-865)

这项标准定义了代币合约可以使用的一种标准函数,用户可用于委托第三方帮忙转账。这个第三方会支付 Gas,然后以代币的形式向交易发起方收取费用。

相关的标准:

  • EIP-20

特别相关的标准:

  • ERC-965

ERC-874: 加权的不可替代代币 (ERC-874)

不是所有的 NFT 都是同等条件下创造的,但是又没有东西可以分辨 NFT。加权的方法可以让去中心化自治组织(DAO)或者其他外部机构了解到独特资产拥有的价值。

相关的标准

  • EIP-721

ERC-888: 多维代币标准 (ERC-888)

多维代币体系的模型,其使用标识符代表余额和数据。

相关的标准:

  • EIP-20
  • EIP-721

非常相关的标准:

  • ERC-994
  • ERC-998
  • ERC-1155
  • ERC-1178
  • ERC-1203

ERC-918: 可挖矿的代币标准(EIP-918)

标准化工作量证明算法的挖矿代币标准。

相关的标准

  • EIP-20

ERC-965 : sendByCheque (ERC-965)

这个标准旨在让提前签署的信息可以批准第三方来执行代币转账,并且初始转账者无需首先进行链上转账。转账者只需要签署信息,那么第三方就会通过签名来调用 sendByCheque() 。

相关的标准:

  • EIP-20

非常相关的标准:

  • ERC-865

ERC-981: 部分拥有权标准 (ERC-981)

这个标准描述了发行代币的全新以太坊接口,其代币资产的拥有者会有固定的代币在市场上进行交易,并且代表了 100% 的拥有权。然后他们可以选择将代币进行分解,从而提高数字资产的可互换性。

相关的标准:

  • EIP-721

非常相关的标准:

  • ERC-864

ERC-994: 委托性非同质代币标准 (ERC-994)

委托性非同质代币(DNFTs)是对 ERC721 标准的延伸,该标准可以用来在以太坊注册土地和实物产权。NFTs 是类似树一样的联盟型结构(和 DNS 类似),其中 NFTs 可以委托并且在某个空间内对其进行分解。和数字资产(例如以太猫)不同 ,实物资产不仅需要数据库中有个准确的身份,同时还需要现实管辖权范围内的法律效力。土地注册机构作为根 DNFT 就可以建立 DNFT 空间,进而辐射一片广阔的领域,而且,可以将根区域的细分区域委托给现有的产权持有者,以此更新土地登记。

相关标准:

  • EIP-721

相关标准:

  • ERC-888
  • ERC-998
  • ERC-1155
  • ERC-1178
  • ERC-1203

ERC-995: 转账调用前后(ERC-995)

除了 ERC20 的功能,这个标准提供了增强型的代币转账功能。它在转账前后都对转账和授权进行调用,无论接收地址是不是一个合约。

非常相关的标准:

  • ERC-223
  • ERC-667
  • ERC-777

ERC-998: 可合成非同质代币的标准 (ERC-998)

ERC-998 作为标准化扩展,是为了所有非同质代币都能够持有其他非同质 ERC-721 代币或者标准同质化 ERC-20 代币。转移合成代币意味着转移其中的整个层次结构。例如,以太猫中会有打斗和喂食的部分;喂食部分也许就会包含同质化的“食物”代币。

相关的标准:

  • EIP-20
  • EIP-721

非常相关的标准:

  • ERC-888
  • ERC-994
  • ERC-1155
  • ERC-1178
  • ERC-1203

ERC-1003: 安全合约转账扩展(ERC-1003)

该标准不安全,故移除。

ERC-1067: 可升级代币合约的标准 (ERC-1067)

这个标准描述了更加分布式的代币合约架构,其中带有可以升级的协议,并且可以在协议部署后增加新的功能。

相关的标准:

  • EIP-20

ERC-1132: 代币锁定能力的标准 (ERC-1132)

这个标准提供了代币在合约内多种用途的时间锁仓功能,而且还不需要转移代币。这个标准也可以获得锁定和非锁定代币(可以转账的代币)的余额。

相关的标准:

  • EIP-20

ERC-1155: 多代币的标准 (ERC-1155)

追踪多个代币余额和所有权的合约,从而可以提高批量转账的效率。

相关的标准:

  • EIP-20
  • EIP-721

非常相关的标准:

  • ERC-888
  • ERC-994
  • ERC-998
  • ERC-1178
  • ERC-1203

ERC-1178: 多级别代币的标准 (ERC-1178)

为多个级别(Multiple Class)代币的合约提供标准接口。

非常相关的标准:

  • ERC-888
  • ERC-994
  • ERC-998
  • ERC-1155
  • ERC-1203

ERC-1190:非同质版税代币的标准 (ERC-1190)

可以向创造者 以及/或者 所有者支付版税的非同质代币标准接口。

相关的标准:

  • EIP-721

ERC-1203:多层级代币的标准(ERC-20扩展) (ERC-1203)

多层级代币合约的标准接口,同时也是ERC-20兼容。

非常相关的标准:

  • ERC-888
  • ERC-994
  • ERC-998
  • ERC-1155
  • ERC-1178

ERC-1238:不可转账代币的标准 (ERC-1238)

代表“徽章”的不可转账代币。

更多资源

最小化代币(Minime Token) (https://github.com/Giveth/minime)

带有更多功能的 ERC-20 代币:比较容易克隆代币,获得余额转账历史以及代币控制。

瑜伽代币 (https://github.com/Giveth/yogatoken)

带有ERC-233功能的最小化代币。


阿剑评:其实一开始看到这个列表我是很惊讶的。有两个原因:(1)我隐约想到,这些代币标准的出现可能模拟了人类历史上物权演化的过程,有区别的是历史上往往先出现对物的占有,然后才出现详细的物权界定,务使人们的行动没有冲突,交易顺利进行,而在区块链上,我们不得不先定义物权,然后才能交易物权;在人类历史上,如果法律没有明确的界定,还可能借由传统和风俗界定,而区块链没有这些东西。(2)要真正发挥智能合约的潜力,不仅要靠单个单个的合约,更要靠一些高出单个合约的协议。可以说,智能合约系统的潜力,我们还未窥见全貌。很多人是小看以太坊了。

原文链接: https://github.com/PhABC/ethereum-token-standards-list
作者: PhABC
翻译&校对: Eric Wang & 阿剑


ERC721的详细解释

ERC721合约

contract ERC721 {
   // 类似ERC20的函数(方便展示)

   // 该函数用于告诉外部合约和应用程序该代币的名称。该函数的一项实现示例可以如下。
   function name() constant returns (string name);

   // 该函数同时有助于提供与ERC20代币标准的兼容性。其向外部程序提供该代币的简称或标识符。
   function symbol() constant returns (string symbol);

   // 该函数会返回区块链上可提供的货币的总数量。这种供给不一定要保持不变。
   function totalSupply() constant returns (uint256 totalSupply);

   // 该函数用来获得某个给定地址拥有的代币数量。
   function balanceOf(address _owner) constant returns (uint balance);

   // 所有权函数
   // 该函数返回某代币的所有者的地址。由于每个ERC721代币都是非同质且因此独一无二的,其在区块链上通过一个唯一的ID被查询。我们可以利用其ID判断代币的所有者。
   function ownerOf(uint256 _tokenId) constant returns (address owner);

   // 该函数批准或授予另一个实体代表所有者转移代币的权利。例如,如果Alice拥有1个MyNFT(我的非同质代币),她可以为朋友Bob调用 approve 函数。调用成功后,Bob稍后就可以代表Alice获得该代币的所有权或对该代币进行操作。关于所有权转移的更多内容可参见函数 
   function approve(address _to, uint256 _tokenId);

   // 该函数担任提现功能,因为某个外部方可以调用它来从另一个用户的账户中提取出代币。因此,在某个用户已经被授权获得一定数额的代币并且希望从另一个用户的余额中提取所述代币的时候,可以使用函数 takeOwnership 。
   function takeOwnership(uint256 _tokenId);

   // 转移代币的下一个方法就是使用该函数。函数transfer让代币所有者将其代币发送给另一个用户,与独立加密货币类似。然而,只有收款账户事先被打款账户授予获得代币的权利,转账才能开始。
   function transfer(address _to, uint256 _tokenId);

   // 每个非同质代币所有者可以一次拥有1个以上的代币。每个代币通过唯一的ID来查询,然而,追踪某个用户可能拥有的每个代币也许存在困难。为此,合约记录着每个用户拥有的所有代币的ID。因此,某个用户拥有的每个代币都可以在该用户拥有的代币列表(数组)中通过索引检索到。 tokenOfOwnerByIndex
   function tokenOfOwnerByIndex(address _owner, uint256 _index) constant returns (uint tokenId);

   // 元数据函数
   // 该函数让我们发现代币的元数据或指向其数据的链接。
   function tokenMetadata(uint256 _tokenId) constant returns (string infoUrl);

   // 事件
   // 该事件在代币被转手时得以触发。当代币的所有权从某个用户转移到另一个用户手上时,该事件被广播。其详细说明了哪个账户发送该代币,哪个账户接收该代币,以及哪个代币(通过ID定义)被转移。
   event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
   
   // 该事件在某个用户授权另一个用户获得某个代币的所有权时(即,当授权被执行时)得以触发。其详细说明了哪个账户目前拥有该代币,哪个账户获许在未来获得该代币,以及哪个代币(通过ID定义)被授权转移其所有权。
   event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
}

参考资料:
ERC721 : https://ethfans.org/posts/the-anatomy-of-erc721
ERC20 : https://ethfans.org/posts/1007

本文章为个人笔记,转载请联系原作者,原文与参考资料已说明,请勿直接使用。

你可能感兴趣的:(25种以太坊代币标准详细列表)