天才程序员: "开发 CryptoKitties 难不难? 只需掌握这3点..."


640?wx_fmt=jpeg

来源 | 《以太坊技术详解与实战》javascript

做者 | 闫莺、郑凯、郭众鑫
前端

责编 | 乔治
java

出品 | 区块链大本营(blockchain_camp)git


什么是以太坊上的数字资产?程序员

你在 CryptoKitties 购买的猫咪就是一种数字资产;github

那么,如何发行一种数字资产算法

其实很简单。浏览器


你只需了解如下 3 部份内容:安全


  • 数字资产的定义及其发行和流通;网络

  • ERC 20 代币合约标准;

  • CryptoKitties 及 ERC 721 合约标准。


发行一款 CryptoKitties 简直是 so easy!还等什么?学起来吧!(文末有福利,免费送书)


◆ ◆ ◆  ◆ 


以太坊设计目标就是让各类数字资产以智能合约的形式运行在以太坊虚拟机上。目前,在以太坊上的众多智能合约之中,应用最为普遍的是代币合约(Token Contract)。代币合约是在以太坊上管理帐户及其拥有的代币的智能合约,实质上能够理解为一张帐户地址和对应帐户代币余额的映射表。


从某种意义上讲,以太坊上的代币能够被称为数字资产,记录资产数据的代币合约就是一份帐本。代币既能够表示某一虚拟货币的价值,又能够象征某些实际的物理量,甚至可用于记录帐户持有者的信誉值。但归根结底,以太坊上的数字资产就是指以太坊上代币合约中记录的帐户代币余额数据。


与以往搭建由区块链直接记录的加密货币(Cryptocurrency)不一样,以太坊上的数字资产(Digital Asset on Ethereum)是记录在以太坊之上的代币合约中。通常意义上的加密货币,如比特币、以太币和莱特币等,是记录在帐户状态中,直接存储在区块内的数据,伴随“挖矿”等机制发行,并经过交易的方式流通。而数字资产则是以以太坊区块链为平台,记录在更高一层的代币合约中,具体来说是存储在以太坊交易消息数据字段的可执行代码中。


数字资产的发行无须通过复杂的“挖矿”程序,代币合约的建立者能够经过智能合约定义本身的代币发行标准,直接在合约代码中实现“铸币”功能。而且,代币的流通是经过在以太坊交易中调用智能合约的函数接口进行转帐,代币合约建立者一样能够在这一过程中添加一些自定义的操做。相比之下,以太坊上的数字资产较加密货币拥有更高的灵活性,而且其安全性也由以太坊区块链机制和智能合约代码保证。



数字资产的发行和流通


以太坊上的代币做为一种数字资产,须要有它的发行和流通机制。相较于以太币等加密货币基于 PoW 和 PoS 共识算法的发行机制以及基于发送交易进行转帐的流通机制,以太坊上数字资产的发行和流通更加简便灵活,相关的操做通常由代币合约建立者在代币合约中实现。常见的代币合约在记录帐户及代币余额的基础上,还包含一些基本的数字资产管理操做,如铸造代币、销毁代币以及代币转帐等。


代币转帐是代币合约的一项基本功能,也是数字资产流通功能的具体实现。例如,帐户 Alice 调用合约的转帐功能函数,向帐户 Bob 转入 50 个代币,此时合约中记录的 Alice 帐户余额减小了 50,而 Bob 帐户余额增长了 50。代币合约经过铸造代币和销毁代币来增长或减小代币供应总量,这二者是数字资产发行和回收功能的具体实现。


当其余帐户经过向合约转入以太币或其余方式调用合约铸造功能时,该代币合约向帐户对应的余额值增长相应数量的代币,代币的总供应量也相应增长,完成铸币。例如,帐户 Charlie 调用代币合约的铸币功能函数,合约经验证后在将其他额增长 50 个代币,同时代币总供应量也增长 50 个代币。


与之相似,帐户经过调用合约的销毁功能函数,销毁其帐户余额中的代币,代币总供应量也相应地减小。可是,一般代币合约的代币销毁功能是经过向特殊的零地址 0x000...0000 中转入相应数量的代币来完成,此时 代币总供应量不会减小。


除了以上的转帐、铸币、销毁等基本功能,代币合约还能够加入数字资产的查询、权限控制,甚至经济学公式计算等功能。那么,功能繁多的代币智能合约是否有共同点,或者对代币合约的基本功能进行一些规范呢?以太坊开发人员在以太坊改进计划(Ethereum Improvement Proposal,EIP)中提出了 ERC 20 代币合约标准,为以太坊代币合约制定了一套标准的接口。



ERC 20 代币合约标准


ERC 20 代币合约标准规定了一个以太坊代币合约所需实现的函数功能和事件记录。该标准知足了代币做为数字资产所必须具有的一些基本功能和要求,如注明代币名称、代币转帐、本帐户中容许链上第三方使用的代币限额等。ERC 20 的出现为以太坊上的代币合约提供了一个标准化的方案,也对以太坊上数字资产的实现进行了必定的规范。ERC 20 标准使得种类繁多的代币可以被更多的去中心化应用(DApp)、交易所等兼容。


 
 

ERC 20 标准接口


自 2015 年提出以来,ERC 20 代币合约标准在以太坊开发社区的协商下逐步肯定。这一标准的出现为 2017 年以太坊合约代币井喷式发展打下了基础。


随着智能合约和代币的兴起,以及 ERC 20 代币合约标准的提出,以太坊上涌现出了大量符合 ERC 20 标准的代币,如 EOS、BAT 和 REP 等。目前以太坊上市场份额较大的代币主要是由 DApp 发行的代币或者开发其余种类区块链以前众筹而发行的代币,包括 EOS 代币BAT 代币 REP 代币等。


EOS 代币


EOS 代币是由 Daniel Larime 等人开发的 EOS.IO 项目所发行的一种代币。EOS.IO 是一款新一代的区块链项目,针对以太坊现有的一些问题做出改进。EOS.IO 采用股权委托证实 (DPoS)的共识算法,提升吞吐量和用户数量,计划可支持每秒百万级别的交易量;将交易延迟下降至数秒,而且拥有冻结功能,更便于项目升级和问题修复。自 2017 年 6 月公布白皮书并开放众筹以来,EOS.IO 项目受到普遍关注,人们将其视为以太坊有力的竞争者。


该项目于 2017 年 9 月发布了 EOS.IO Dawn 1.0 版本,于 12 月发布了 Dawn 2.0 版本,截至笔者撰稿时,已完成了 P2P 网络的搭建、导入创世区块的测试等开发步骤。此外,该项目经过在以太坊上发行 ERC 20 标准代币 EOS,目前仍处于众筹阶段,众筹将于 2018 年 6 月结 束。此后,在 EOS.IO 区块链开发完成正式上线后,以太坊上的 EOS 代币会经过创世区块转移至 EOS 链上,以太坊用户的 EOS 代币可由此转换为 EOS 链上的数字货币。


BAT 代币


BAT 代币(Basic Attention Token)是以太坊上一款数字广告平台 DApp 在 2017 年 5 月 所发行的一种 ERC 20 代币。该 DApp 将前端浏览器上统计的用户网页广告停留时间换算成用户的“注意力”(attention),依此转换成 BAT 代币的价值,并让广告主由此向广告发行商支付相应的 BAT 代币。目前该 DApp 支持在 Brave 浏览器上实现广告统计功能,利用以太坊上的 ERC 20 代币实现了广告对用户的吸引力和广告价值之间的转化以及广告实际价值的流通,略去了广告主、发行商和用户之间的众多中间商,以更加透明高效的方式实现数字广告的升级。


REP 代币


REP 代币是由 Augur DApp 项目 2017 年 7 月发行的一种代币。Augur 是一个用于预测将来事件的、基于以太坊区块链的市场预测平台,用户能够经过该平台对将来的事件进行预测并押注,若预测正确则能够得到奖励,不然会有必定的损失。Augur 平台的智能合约中包括了一套 ERC 20 标准代币合约,其代币 REP 可用于预测过程当中的交易。相比于通常的市场预测平台,Augur 将平台搭建于以太坊区块链之上,使用智能合约进行管理,实现了去中心化,更加安全可靠,而且使用符合 ERC 20 标准的 REP 代币,提升市场交易效率,加强了流通性。



ERC 721 代币合约标准


除了最为通用的 ERC 20 标准,目前有许多人在此基础上不断提出功能更为全面、内容更为细致的合约标准,如 ERC 72一、ERC 22三、ERC 644 以及 ERC 677 等。本文将主要介绍 ERC 721 合约标准。


一、标准定义


ERC 721 合约标准规定了一种不可替代的代币(Non-fungible Token,NFT)的合约接口。此类代币的最小单位为个,即在 ERC 20 标准中对应小数点位的 decimal 值为零。此类代币最重要的特色为每个代币都是独一无二的。每个代币拥有各自的 _tokenId 标号, 而且能够附上一些各不相同的特征值,这样使得每一个代币都是“不可替代”的。ERC 721 代币合约标准的接口以下。


 
 


ERC 721 标准继承了 ERC 20 标准的一些基本功能接口,如 name( )、symbol( )、 totalSupply( )、balanceOf(),以 及 事 件 Transfer( )、Approval( ) 等,并在一些函数,如 transfer( )、approve( ) 中加入了 _tokenId 用以指定特定的代币。


除此以外,ERC 721 相比于 ERC 20 还新增了一些功能函数。其中,ownerOf( ) 和 tokenOfOwnerByIndex( ) 分别为根据代币 ID 查询该代币的持有者,以及根据持有者及其索引查询所持有的代币 ID;ERC 20 中的 transferFrom( ) 方法被更改成 takeOwnership( ),在限额 approve 容许的条件下,交易发起方 msg.sender 调用该函数能够将指定 _tokenId 的代币从他人处转至本身的帐户中;tokenMetadata( ) 函数用于查看代币的元数据等,根据代币的 ID 查询到一个 URL 格式字符串,其中包含这一代币的名称、图像和描述等相关信息。


二、CryptoKitties DApp


近来一款养猫游戏 CryptoKitties 的 DApp 在以太坊上引发一阵热潮,上线仅两周,这款 DApp 便吸引了超过 150 000 名用户,买卖小猫的交易数额将近 15 000 000 美圆,其中用户所发出的交易数量占到了以太坊网络中全部交易的 1/4,甚至一度形成了网络堵塞。


在这款 DApp 中,用户能够饲养、交易一只只可爱的小猫,每一只小猫都拥有独一无二的基因,而且外表也是各不相同。在游戏中,用户还可让小猫进行繁殖,由不一样父母繁育出的后代会产生出全新的基因和外表,这一有趣的特征吸引了许多以太坊用户纷纷饲养繁育本身的小猫。实际上,每只小猫形态万千的特色正是由 ERC 721 合约标准中的“不可替代的代币”NFT 所实现。


CryptoKitties DApp 是一套以太坊上的智能合约,其中一只只各不相同的小猫正是合约中的一个个 NFT 代币。CryptoKitties 合约应用了 ERC 721 标准定义了小猫代币,每一个小猫代币拥有独一无二的 _tokenId,而且包含基因 genes、出生时间 birthTime、父亲 matronId、母亲 sireId 等信息。


合约根据 ERC 721 标准实现了 transfer( )、approve( )、ownerOf( ) 和 tokenOfOwner( ) 等函数功能。但该合约中仍保留了加上 _tokenId 后的 transferFrom( ) 函 数,相比 takeOwnership( ) 函数还可以实现(如向第三方转帐等)更多的功能。如下是 CryptoKitties 合约中 ERC 721 接口部分的代码。


 
 


相比于普通的数字加密货币,以太坊上的数字资产利用了以太坊智能合约的灵活性,既保持了去中心化和安全等特性,又具备轻量化以及更强的流通性等特色。


更多参考:

https://github.com/cryptocopycats/awesome-cryptokitties

https://github.com/ethereum/EIPs/issues/721

https://dwz.cn/7iPm83ZG


福利时间到!本期话题:谈谈你对数字资产的理解(50字以上)


请在文末畅所欲言,营长将从精选留言用户中抽取 5 位幸运读者,免费送书一本

截止时间7月18日(下周四)中午12点


640?wx_fmt=gif

推荐阅读:


猛戳"阅读原文"有惊喜哟smiley_12.png


老铁在看了吗??