【block#32】详解ERC20与ERC721

摘要

数字加密货币大致可以分为原生币(coin)和代币(token)两大类。前者如BTC、ETH等,拥有自己的区块链。后者如Tether、TRON、ONT等,依附于现有的区块链。市场上流通的基于以太坊的代币大都遵从ERC20协议。最近几个月间还出现了一种被称为ERC721的数字加密资产,例如CryptoKitties(参阅[block #24])。ERC20和ERC721究竟是什么呢?

首先,ERC是Ethereum Request for Comments的缩写,代表以太坊开发者提交的协议提案。它相当于是以太坊版的RFC(https://www.ietf.org/standards/rfcs/)。ERC后面的数字是议案的编号。

打算制定以太坊新标准的开发者可以在https://github.com/ethereum/EIPs/issues先创建一个EIP(Ethereum Improvement Proposal,以太坊改进提案),详细描述协议。经过公开审议之后,获得广泛认同的提案会被标准化,列入https://github.com/ethereum/EIPs。有些改动触及区块链共识,比如增加虚拟机操作符,属于核心层变更。而另一些提案则不涉及修改以太坊本身的代码,只是约定俗成的上层协议,它们通常被归类为ERC标准。

ERC20可能是其中最广为人知的标准了。它诞生于2015年,到2017年9月被正式标准化。协议规定了具有可互换性(fungible)代币的一组基本接口,包括代币符号、发行量、转账、授权等。所谓可互换性(fungibility)指代币之间无差异,同等数量的两笔代币价值相等。交易所里流通的绝大部分代币都是可互换的,一单位的币无论在哪儿都价值一单位。

与之相对的则是非互换性(non-fungible)资产。比如CryptoKitties中的宠物猫就是典型的非互换性资产,因为每只猫各有千秋,而且由于不同辈分的稀缺性不同,市场价格也差异巨大。这种非标准化资产很长时间内都没有标准协议,直到2017年9月才出现ERC721提案,定义了一组常用的接口。ERC721至今仍旧处于草案阶段,但已经被不少dApp采用,甚至出现了专门的交易所(Y Combinator孵化的http://opensea.io)。

以下详细拆解ERC20和ERC721协议,技术性偏强,目标读者是以太坊智能合约开发者。

ERC20

ERC20定义了三个可选函数:

由于这三个函数都是返回常量,在Solidity中也可以用以下简略形式定义。solc编译器会自动生成与以上接口等价的字节码。

ERC20定义了六个必须声明的函数:

ERC20还定义了两个事件:

官方文档参见https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.mds/blob/master/EIPS/eip-20.md。

ERC721

ERC721与ERC20有些相似,但由于它管理的是非互换性资产(non-fungible token,简称NFT),所以函数语义并不一样。合约下每份ERC721资产都拥有一个uint256类型的独立编号(以下代码中的_tokenId)。

ERC721事件:

ERC721函数:

ERC721元数据接口(可选项):

元数据描述结构如下所示:

ERC721枚举扩宽接口(可选项):

符合ERC721协议的合约还需要符合ERC165规范,实现以下函数:

interfaceID由bytes4(keccak256(函数签名))计算得到。有多个函数时,将全部byte4异或(xor)得到最终结果。详见ERC165标准文档(https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md)。

例如以下接受转账回调函数接口的interfaceID就是0xf0b9e5ba:

这是支持ERC721资产的钱包或交易平台需要实现的代码。发放ERC721资产的合约本身不需要处理。

ERC721官方文档参见https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.mds/blob/master/EIPS/eip-721.md。

相关ERC

ERC223是对ERC20的小改进,增加了tokenFallback函数,更好地处理错误情况。详见https://github.com/ethereum/EIPs/issues/223。

ERC621在ERC20的基础上添加了increaseSupply和decreaseSupply函数,控制代币总量的增减。详见https://github.com/ethereum/EIPs/pull/621。

更近期提出的ERC827则是增强了函数回调功能。详见github.com/ethereum/EIPs/issues/827s/issues/827。

以上这些ERC尚未标准化,普及率也不高。目前参考一下即可。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180328G1DP1000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

同媒体快讯

扫码关注腾讯云开发者

领取腾讯云代金券