现有ERC 20 标准代币
随着智能合约和代币的兴起,以及ERC 20代币合约标准的提出,以太坊上涌现出了大量符合ERC 20标准的代币,如EOS、BAT和REP等。目前以太坊上市场份额较大的代币主要是由DApp发行的代币或者开发其他种类区块链之前众筹而发行的代币。
EOS代币是由Daniel Larime等人开发的EOS.IO项目所发行的一种代币。EOS.IO是一款新一代的区块链项目,针对以太坊现有的一些问题作出改进。EOS.IO采用股权委托证明(DPOS)的共识算法,提高吞吐量和用户数量,计划可支持每秒百万级别的交易量;将交易延迟降低至数秒,并且拥有冻结功能,更便于项目升级和问题修复。自今年(2017年)6月份公布白皮书并开放众筹以来,EOS.IO项目受到广泛关注,人们将其视为以太坊有力的竞争者。该项目于9月份发布了EOS.IO Dawn 1.0版本,于12月份发布了Dawn 2.0版本,截至笔者撰稿时,已完成了P2P网络的搭建、导入创世区块的测试等开发步骤。此外,该项目通过在以太坊上发行ERC 20标准代币EOS,目前仍处于众筹阶段,众筹将于2018年6月份结束。此后,在EOS.IO区块链开发完成正式上线后,以太坊上的EOS代币会通过创世区块转移至EOS链上,以太坊用户的EOS代币可由此转换为EOS链上的数字货币。
BAT代币(Basic Attention Token)是以太坊上一款数字广告平台DApp在今年(2017年)5月份所发行的一种ERC 20代币。该DApp在前端浏览器上统计用户在网页广告上停留的时间,换算成用户的“注意力”(attention),转换成BAT代币的价值,并让广告主由此向广告发行商支付相应的BAT代币。该DApp目前支持在Brave浏览器上实现广告统计功能,利用以太坊上的ERC 20代币实现了广告对用户的吸引力和广告价值之间的转化以及广告实际价值的流通,略去了广告主、发行商和用户之间的众多中间商,以更加透明高效的方式实现数字广告的升级。
REP代币是由Augur DApp项目今年(2017年)7月份发行的一种代币。Augur是一个用于预测未来事件的基于以太坊区块链的市场预测平台,用户可以通过该平台对未来的事件进行预测并押注,若预测正确则可以获得奖励,否则会有一定的损失。Augur平台的智能合约中包括了一套ERC 20标准代币合约,其代币REP可用于预测过程中的交易。相比于一般的市场预测平台,Augur将平台搭建于以太坊区块链之上,使用智能合约进行管理,实现了去中心化,更加安全可靠,并且使用符合ERC 20标准的REP代币,提高市场交易效率,增强了流通性。
下面以EOS代币为例,简要介绍ERC 20标准在EOS代币合约中的具体实现。
在EOS代币的合约中,ERC 20标准接口的具体实现位于合约DSTokenBase中。其中,ERC 20标准中的基本功能——转账(transfer)函数如下。transfer函数的输入参数为转账接收方地址dst和转账金额wad。函数首先判断转账发送方也即转账消息的发起方msg.sender的余额是否足够;然后发送方msg.sender余额减少,接收方dst余额增加;再触发Transfer事件记录转账的msg.sender、dst和wad;最后,转账成功,返回真值。
function transfer(address dst, uint wad) returns (bool) {
assert(_balances[msg.sender] >= wad);
_balances[msg.sender] = sub(_balances[msg.sender], wad);
_balances[dst] = add(_balances[dst], wad);
Transfer(msg.sender, dst, wad);
return true;
}
ERC 20中更进一步的转账功能——transferFrom函数。函数的输入参数为转账的发送方src、接收方dst和金额wad。transferFrom函数转账的流程如下:
1)除了判断发送方余额是否足够之外,还需判断发送方src对转账发起者msg.sender的允许限额_approvals是否足够;
2)转账过程中,除了发送方、接收方的余额变更之外,还需将发送方对转账发起者的允许限额_approvals[src][msg.sender]扣除相应的转账数额;
3)同样触发Transfer事件进行记录;
4)转账成功,返回真值。
function transferFrom(address src, address dst, uint wad) returns (bool) {
assert(_balances[src] >= wad);
assert(_approvals[src][msg.sender] >= wad);
_approvals[src][msg.sender] = sub(_approvals[src][msg.sender], wad);
_balances[src] = sub(_balances[src], wad);
_balances[dst] = add(_balances[dst], wad);
Transfer(src, dst, wad);
return true;
}
此外,ERC 20 中还有一个重要的功能——对允许限额(_approvals)的设置。函数除了将调用者msg.sender对被授权方guy的允许值_approvals进行更改之外,还触发了Approval事件记录授权方msg.sender、被授权方guy和允许限额wad,并返回真值。approve函数的实现如下。
function approve(address guy, uint256 wad) returns (bool) {
_approvals[msg.sender][guy] = wad;
Approval(msg.sender, guy, wad);
return true;
}
除了ERC 20标准核心函数的实现外,在合约DSToken中也包括了代币基本的发行功能——铸币(mint)和销毁(burn),具体函数实现如下,两个函数均带有auth函数修改器,限定了只能由合约创建者、合约所有者或由创建者授权过的账户调用。铸币mint函数根据输入的铸币金额wad,在消息发送方msg.sender的账户余额以及代币总供应量_supply的数额上直接增加wad数额的代币。与之相反,销毁burn函数则是在账户余额以及代币总供应量中减少相应数额的代币。
function mint(uint128 wad) auth stoppable note {
_balances[msg.sender] = add(_balances[msg.sender], wad);
_supply = add(_supply, wad);
}
function burn(uint128 wad) auth stoppable note {
_balances[msg.sender] = sub(_balances[msg.sender], wad);
_supply = sub(_supply, wad);
}
闫莺(博士)
微软亚洲研究院主管研究员,区块链领域负责人,微软Coco区块链平台中国负责人。中国软件协会区块链创业学院及区块链专委会专家、中国电子学会区块链专家委员。专注于区块链技术、大数据分析、数据库以及云计算的研究。在区块链领域获得多项国际专利,并在数据库和云计算领域国际会议论文和期刊30余篇。参与翻译《区块链项目开发指南》。
郑凯(博士)
电子科技大学教授,博士生导师,澳大利亚昆士兰大学计算机科学博士。主要研究领域为区块链数据管理,以及时空数据挖掘、不确定数据库、内存数据库、图数据库等。在数据库、数据挖掘等领域的重要会议和期刊发表论文100余篇,被累计引用1500余次。2013年获澳大利亚优秀青年基金,2015年获数据库会议ICDE论文奖。担任数据库领域知名国际会议的程序主席和联合执行主席,国际SCI期刊客座编委,以及数十个国际会议的程序委员。
郭众鑫
微软亚洲研究院研发工程师,微软Coco区块链平台核心开发者。专注于区块链技术、大数据分析、分布式系统等方面的研究和开发。
矩阵数字经济智库由矩阵财经依托“MATRIX贝叶斯研究基金”(MATRIX与清华大学教育基金会联合成立)和MATRIX与“一带一路研究中心”的战略合作协议发起。智库将联合区块链、人工智能、金融、数字资产管理与投资领域的专家,聚焦传统产业转型和技术/商业创新,以新技术赋能实体经济,推动技术进步,引领数字经济的变革。
矩阵财经出品
领取专属 10元无门槛券
私享最新 技术干货