会撸猫了不起啊?有本事自己写一个撸猫撸鱼撸飞机才是牛逼

原创 2018年04月15日 00:00:00

640?wx_fmt=jpeg


内容 | 蔡一  北京志顶科技技术总监

整理 | Aholiab



「撸猫」游戏是2月8日上线iOS版的中国区,有个很有意思的中文名,叫「谜恋猫」。它背后是基于ERC721协议的,因为ERC20标准通证大家其实说的比较多,所以这次用ERC721这个标题来说明我们这种非标通证。


关于ERC721,NFT有3种翻译——不可替代的通证、非同质通证和非标通证,说起来可能会绕口一点,我接下来会使用非标通证这个说法。



想了解非标通证,先知道什么是ERC


说到ERC721,简单先介绍一下ERC这个东西。ERC是以太坊的一个请求评论(Ethereum Request for Comments)的简称,对应的是EIP(Ethereum Improvement Proposal,以太坊增强功能,大家会针对以太坊提一些改进建议)。而ERC20就是说我要在以太坊上做一个统一的标准通证的标准,使这些通证在交易所流通,所有人都可以来做一些接口作为开发。


这个申请提交完成后,会在社区里面讨论,讨论完以后,由委员会批准是否进EIP,就形成了相应的EIP标准。ERC20和ERC721其实是提案的ID号,就像有一个帖子的ID号是721,那它就是第721帖,20是第20帖。


现在的情况是ERC20已经进了EIP,而是否最终接受ERC721还在讨论中,这就说明情况是有可能变的。


本篇文章,我们会首先把ERC721的来龙去脉给介绍了一遍,然后会把整个非标通证,也就是撸猫游戏背后的通证,它和标准通证有什么区别做个梳理。



「撸猫」与非标通证


下面我们就把撸猫游戏的源码做一个简单的分析,看看这个ERC721的示例实现,是怎么来用智能合约遵循ERC721的接口标准来达到这个目的。


在2月8号撸猫游戏上线iOS后,取了一个中文名叫「迷恋猫」,大家都特别迷恋它,也吸引了大批以太坊的拥趸。这个猫用265位的字节来表示它的基因,它的基因是上十亿种的基因都是不一样的,所以你繁衍出来的猫到底是什么样的,是没有人知道的。

640?wx_fmt=png


这个是首页的一个情况,从首页来看,其实本质上这个游戏在网页的层面是需要你有MetaMask的钱包,里面有它的地址,底下可以在上面买猫,去拍卖,去做所有的操作。

640?wx_fmt=png

你可以在猫市交易,用以太币进行标价,都很土豪,现在比较流行的猫听说大概是77万人民币左右。这里有几个概念可以介绍一下,首先是猫咪的编号,比如193790,其实就是个ID,你多少只猫,是从0开始增长的一个ID。


第二是「代记」,就是两只猫繁殖,第二代、第三代、第四代,依次往上。第三是「块数」,块数是猫繁殖以后它是有一个冷却时间的,就是说你下一次可以在出售交配权的时候,可以多长时间再操作。


所以,这是三个最重要的属性,还有一个就是外形,大家可以看到,每只猫的外形都是完全不一样的,这些东西就决定了你猫的价格。

 

640?wx_fmt=png

现在大家常讨论高阶通证,说通证的衍生品就是高阶的。你把猫的所有权,或者交配权进行出售,或者你可以把它的转卖权往外卖,其实是一样的。


这个是大部分非标通证的一个很典型的特征,就是说你拥有它以后,那它可以做很多其他衍生的事情,不止是像比特币、以太币,或者ERC20这种,通用的标准除了交易,就没有其他用途了。但是这个其实是可以创造很多种玩法的,你可以通过这个来做一些收益,就是说特别好的基因,那你的交配权就可以卖得特别贵。


还有一个所谓的「零代猫」的概念,所谓的零代猫就是厂商自己直接繁殖出来的,就是三层的第一个,初始的,后面所有的都是以这个猫为基础的。这个猫是每15分钟产生一次,自动产生,产生完了以后,通过拍卖来让大家去买。


比如说,猫的总数是50,000只,其中有5,000只是自己的促销猫,不是自动生成的,系统自动生成的是45,000只。他们认为这个猫不仅是一种数字化的藏品,就是不像名画一样,名画拿过来,就没什么用了,它还可以通过交配来繁殖后代。不过猫的繁殖是有冷却时间的,冷却的时间是递增的,所以六代猫可能就会变的很迟缓,零代猫可能会比较快。


640?wx_fmt=png


整个猫的拍卖形式其实是采用递减拍卖的形式,这个规则其实为我们对数字资产的定价提供了一个特别好的思路,这是什么概念呢?就是说我要卖一个东西,你说这个到底值多少钱,其实是不好说的,我说是10万,你说是5万,那么所有要采用这种递减拍卖的方式,就是我先用初始价格,最低是多少钱,中间大家去拍卖,大家觉得到自己满足的价位,那我可以去出价,最后看看,谁先出价,谁得到这个猫,这种拍卖方式也是比较有意思的。


不过零代猫的初始售价就不是人定的,它是以最近成交均价格的1.5倍来作为初始价格的。后面两个其实跟高阶通证一样,我们其实除了所有权可以出售以外,还可以出售衍生的权益,对猫来说就是交配权,那么对画,可能就是展览权,对数字产品他们都是采用这种递减拍卖的拍卖规则来做的。


其实这个背后的协议就是ERC721,但ERC721其实比撸猫游戏早出来很长时间,出来后其实反应热度并不高,提出ERC721的公司就推出了撸猫的游戏,这个游戏反过来又把ERC721的标准让大家熟知了,这个就是有了一个现象级的产品,那么它背后的技术大家逐渐就会去摸索。


640?wx_fmt=png


玩转非标通证


接下来我们来看看非标通证,非标通证最大的特征就是每个通证都是独一无二的,这个怎么理解呢?我们现在说的Token普遍指的是标准通证,比如比特币或以太币,那么它其实只有数量上的差异。


那么对于非标通证,每一个都有自己的价钱,是不可互换的。例如,在迷恋猫上你的一只猫和我的一只猫的价格是完全不一样的。


所以,这两种通证在开发层面的差距,一个管数量,一个要管每一个通证——每一个通证都有自己的属性。从例子上来看,标准通证就是股票、货币。非标通证就像所谓的养猫、养鱼(自从以太猫出来后,各种宠物全都出来了)。


上面介绍了非标通证的一些简单属性,其实在非标通证里面,是可以做很复杂的事情的。接下来,我们用ERP721给大家做一个简单的介绍,这个主要是很偏技术的一些东西,因此我们要了解这个协议,还是要对他们提出个接口,以及每个接口的作用和它想达到的目标做一个了解。 

640?wx_fmt=png

ERP721本质其实是参照了ERC20的一些思路,包括我们有一个总供应量,这个就不是像标准通证一样说我有多少个标准通证,这个是有多少个宠物,而不是说这个宠物价值多少钱。比如说对于以太币而言,我有5个以太币,现在每个以太币有多少钱,我一看我就知道了我的总资产是多少,但是对于非标通证而言,我有5个猫,每个猫价格差别很大,所以你不能像ERC20一样简单的计算。


包括一些所有权,下面的一些授权这块,授权的approve以及transferFrom主要是为交易所准备的,这个也是为了遵循ERC20通用的一些做法,就是说我们为了让所有的资产都支持交易。这样的话,我开发一个养猫的游戏,我要向交易所提供接口;你开发了个养狗的游戏,也可以向交易所提供接口,交易所只需开发一套接口就可以了。


那么有了ERC721的接口规范呢,大家都遵循这个规范。对于转账而言,非标通证可能就跟ERC20不太一样了。标准通证转移的是我有多少个数量,非标通证是直接把这个转移给一个东西。


下面主要是Event,上次介绍了ERC20规范的时候也说了,这个主要是用一些比如说我们在执行合约的时候,需要发出什么样的事件让大家可以来监听做自己的处理,还有一些可选的接口,就是包括这个name,你的符号以及这有一个比较复杂的接口,要列出你所有的Token ID,就是说我们相当于有一个列表,这个接口是ERC20里面没有的,因为ERC20就是个数量,这个是可以得到你这个人所有的ID。


640?wx_fmt=png


元数据也是ERC721特有的一个东西,比如我们发现标准通证其实很好描述,分辩我是做什么的,一个Symbol就可以了。但对于非标通证,像猫的照片,其实猫的照片最早是想存到IPFS上的,但后来因为成本和其他一些考虑,所以其实他们把这些数据是放到外面的,通过一个URL,或是其他一些方式让大家可以访问,像这些衍生数据,你是可以给大家一些访问的地址,这个地址大家也可以通过这种合约直接得到的。


上面主要是对ERC721的接口做了一个介绍,从这个接口上我们可以看到其实ERC721本身也借鉴了ERC20,本质上来说还是想基于这种非标通证上做一些创新和做一些流通、管理的思路。



「撸猫」背后的代码分析


接下来我们分析一下迷恋猫的代码,智能合约比较好的一个地方就是它是开源的,但迷恋猫其实有一部分代码是不开源的,也就是那些核心代码。


从智能合约的架构的层面来看,因为智能合约一旦部署就不可更改,那我们在设计的时候,需要考虑我出了bug升级怎么办,我要改点逻辑怎么办。所以就需要在设计逻辑的时候,把那些可能需要变化的因素都要考虑进去,那么通过一种机制,比如通过指向智能合约地址的方式来把变化的智能合约重新部署,部署以后再把新的地址存上去,来达到这个目的。


所以呢, 迷恋猫这个游戏确实有一个问题,就是本来区块链是不可更改的。迷恋猫的基因的智能合约是不开源的,其实可以改正的,只是在主智能合约上会给你重新设置地址就可以了。


所以,这个公司在经济利益足够大的情况下,是可以修改他们的智能合约,批量产出很稀缺的猫。由于这种猫产生的概率特别小,所以它的价值往往上千万人民币。但实际上只要这个公司愿意,它其实是可以更改它的智能合约,以后再批量产生这种猫的,只是说现在智能合约的主合约是不能改的,这个也是撸猫游戏为人所诟病的地方,其他还包括它的基因生产算法也是不开源的,是直接看不到的,大家只能通过猜。


智能合约的代码,迷恋猫的代码挺长的,有几千行。大家可以从下图看到,这两边是接口,这边都是一个实现的类别,通过这个KittyAccessControl,它本身是一个访问的类,就是说它定义的一些权限,可以有公司的CEO,以及技术人员可以对拍卖暂停,可以对生成促销的加密猫,可以对一些智能合约的指向地址做更正,这个其实它是定义了一堆的权限,KityBase继承了KittyAccessControl,本身它里面是定义了整个猫的属性,就比如说一个猫有生日、有代数、有ID、有内部的一些基础的函数,都在这个里面。 


640?wx_fmt=png


KittyOwnerShip,这是一个对ERC721实现的一个合约,它里面就包括了ERC721规定的一些接口,包括Transfer等,这一系列的东西都在这个里面有体现。


实现基因科学的接口,这个接口本来就是外部合约,这个是不开源的,这个基因接口实现的是不开源的合约,这个就有比如说繁殖两个猫,繁殖生出来的小猫会是怎么样的基因,都是随着基因而生成的。


最后这个是个拍卖的猫入口,就是说按时间、地点,我要对拍卖做一些支持,包括我拍卖以后转移所有权利、权限,包括交配权的拍卖都是在这个合约里面做的。


接下来是发行,就是说他们除了自动发行以外,还有促销小猫的发行,做一些小猫发行以后,需要手动的去调发行合约,决定什么时候发行促销小猫,还有指定基因是什么,还有签字的权限。


最后是最核心的是KittyCore,这个合约定义了前面所有的对外操作的接口。从这个层面来看,其实我们自己要写一个游戏也好,或者要通过智能合约写一个东西也好,它本身的思路跟我们做其他开没有特别大的差别,你也要做需求分析、要设计,要思考怎么通过一系列的设计来保证你的合约可升级、可维护,怎么来保证你后继的逻辑的严密性。


智能合约开发最主要的问题还是不可更改,一旦进入部署以后,很多东西都不可更改了,所以它要测试对你设计的完备性其实要求很高的。



我是怎样基于ERC721来「撸鱼」的


刚才看了ERC721的合约接口,也看了撸猫游戏的结构。其实要写一个自己的宠物游戏还是蛮复杂的,包括里面有很多逻辑、设计,游戏嘛,除了程序,还有很多数字策划、剧情,都是很需要的。


利用非标协议,我做的一个ERC721「撸鱼」的示例,其实从本质来说跟撸猫差不多。我还专门查了金鱼的一些知识,了解到金鱼的形态决定了它的价值,其实这些形态也分很多品类,包括它的头型、鳞片、体型、体纹、尾巴、眼睛,其实这些东西都决定了它的价值,不同的金鱼,体纹不一样,体型也不一样,那价值也是不一样的。


在设计demo的时候,我写的比较简单,下面我会用这个demo做一个代码的浏览,之后给大家看看效果。


首先我们会定一个FishBase的类,主要是定义一个事件,事件是为了通知大家说我做了ERC721所有权的转移,通知给不管是交易所也好,还是其他关系的人也好,这个是最核心的数据结构,比如我们比较简单的写三个:1. 出生时间,什么时候出生的;2. 基因是什么;3. 价格,因为对于商店来说,我卖多少钱,其实还是很重要的。 


640?wx_fmt=png

在这个层面,你首先需要定义一个数据结构,比如你这个鱼到底是什么样的属性。最后,这三个其实是一个比较有意思的设计,一个是你的数组来储存你所有的鱼,然后有一个mapping来存你的鱼和鱼的数组、鱼的ID和你拥有者之间的关系管理。还有一个是来存采购的,这个主要也是考虑到提升效率的提高,而设计的一个东西,就是我可以快速知道我有多少条鱼。

640?wx_fmt=png


这是变量的部分,这边就实现了几个比较核心的一个函数,一个是transfer、另外还有一个create,有一个所有权的转移,大家能看到的就是说,这边ERC721的transfer和ERC20的transfer还是有很大的区别的,因为ERC20的transfer最典型的就是一个银行记账的过程,我两个账户,一个账户减一个技能,我这个账户加一个技能。


但是ERC721本身因为不是为余额而设计的,它是为所有权的专一而设计,那么你需要把某个人的所有权转移到某个人身上,然后还要给另外一个人的地址要加上,大概就是这样的,这个是转移的一个函数。


这个是生成的函数,这部分你通过系统自动生成还是手工生成,其实都是要生成一些鱼的。你可以输入基因、价格,还有是谁把它直接创建出来。实际在你自己设计游戏的过程中,这个肯定有很多新的规则,比如基因随机是怎么运行的,那么你的拥有者可能最早是合约拥有,完了以后再通过拍卖,拍卖给后面的玩家。


这边其实是一个比较简单的智能合约,一个是定义类成的一个对象,设置它的一些属性,包括时间,还有我们把这个鱼放到刚刚定义的队列里面,最后定义要把这个所有权转移给谁。


640?wx_fmt=png

640?wx_fmt=png


刚刚那个是比较核心的FisBase的对于Fish做了一个定义,其实后面一个FishCore就是对ERC721接口规范的一个支撑,它会调到下面的一些函数,比如说balanceOf,就是返回给我们每个人有多少条鱼,包括名字叫什么、形态是什么样的,以及owns,本身就是要我把我的金鱼转出去,包括我们一共现在总共供应了多少个,就是这样。

 

640?wx_fmt=png


这个是比较复杂的一个合约,就是说我们其实是要返回这个人所有的Token的ID是多少,这些比较复杂是因为跟语言的功能有关系,就是它没法比较快速的返回某一个ID值,必须通过便利把它发挥出来。


最后这是一个买的合约函数,就是说我们有了东西,总得让他们买吧,买的话,相当于他们要支付以太币给我,我要能把这个鱼转给它。


640?wx_fmt=png

所以,也是需要在锁定里面让它可以pableable,看看价格对不对,之后要把他的钱转 给我。转完以后,我们要把owner的所有权转给payable,这是和UI结合以后的效果。就是说,这边的价格都是通过智能合约读出来的。


640?wx_fmt=png


不同基因值的鱼,获得不同的图片、不同的名义,这个可以通过外部的一些信息来获取,但是这个ID和编号也是智能合约里面的,最后你就可以有一个类似于撸猫游戏这样一个网站。你可以操作你智能合约的数据,比如说我要买,得先买个按纽,买个按纽就是会和MetaMask来做一个互动,你就转钱过去,转到刚刚我们调的这个函数,最后把钱给准备好,你所有权转给他,你就买到了这个金鱼了。

因为主题确实比较集中,比较垂直一点,所以内容不会特别多,下一个问题就是我们说招财猫的问题,这个好像也没有什么影响,实际上这又新出了一个叫FishBank,这个比以太猫其实玩法更复杂一些了,这个是什么样的呢?


640?wx_fmt=png


这个是遵循了大鱼吃小鱼,小鱼吃虾米的思路,每个人都可以去买自己的鱼,每个鱼都有敏捷、重量、速度的相关属性。这是个纯PVP游戏,每条鱼只要不是在睡觉,都会随机抽出来,和另外的鱼去战斗。


然后不同的重量对攻击加成是不一样的,攻击的时候,谁赢了谁把谁的身上咬掉一口肉,这口肉的重量就会加到你的那条鱼上去。这样不停的培养,但是攻击本身你还是要花钱做的,比如说一些动作是需要重新指定的,核心就是这样的,最后就看谁的鱼是最重的,后面新加了很多新的玩法。


这个智能合约在2月28号公开了,看了它的代码还挺有意思,他们3月18号就正式发布,现在应该是Alpha版本,然后还加了一些新的玩法,挺有意思的这个游戏。



结束语


很多人说其实通过游戏的方式来推广区块链其实也是一条思路,因为游戏行业其实在整个行业里市场是最大的,而且也符合人的天性。

因为这些游戏的推出,它的一些尝试,可能会对我们整个区块链生态进行影响。其实整个娱乐产业也会推动技术的不断发展,那么我们也可以使用这些的技术来做一些我们自己的事情。



对话实录


区块链大本营:刚才说的养猫和养鱼的游戏,它的用户系统、基因、图片什么的,都是储存在哪里的?也是基于数据库吗?


蔡一:是这样的,刚刚我给大家说的比较简单,就是说其实从迷恋猫,他们最早设计的时候,想把那些图片存在区块链上,比如IPFS,但是从实际情况来看,存在那个上面有几个方面的考虑:第一,代价很高,你的读取和更换都要钱的。


第二,如果出现一些什么问题,要想修改其实是很难的,刚刚我也说迷恋猫最大的问题是什么?是你看到的那个花纹是很好的,所以它的价格很贵,但是这一组基因对应哪一张图片,哪一个花纹,解释权其实是不在用户的。所以本质上来说,这个花纹特别需要重新有一个编码。


所以,这种还是有一些道德风险在里面的,现在包括猫和鱼的这些花纹,一般都会存在中心化的服务器上,或者你自己的服务器上,但数值本身,比如说鱼的重量、基因码等数据一般都会存在区块链上。


区块链大本营:宠物的基因生成的算法是放在链下做的吗?


蔡一:这块是放在链上做的,但这块的代码是没开源的,而且它拥有随时更改算法的权利。这个基因算法的接口是指向一个智能合约的地址的,这个地址是CFO、CTO才可以改的,就是说我发现这个算法有问题,我可以重新到另外一个合约地址上,而且它那个代码是不开源的。


这是跟以太坊的EVM的结构有关的,就是说以太坊是不可能主动调外部的东西,只有通过外部,通过oracle那种方式,就是回掉过来。所以,以太坊EVM本身的设计就是这样的,就是说你要做个什么事情要调用外部的一个东西,是做不到的。




热门文章






640?wx_fmt=gif




营长招人啦


CSDN区块链大本营招采编2名:

1. 对区块链技术有一定的理解,对大公司动态有极强敏感性,且有深度剖析的楞劲儿。

2. 出稿速度快,具有每天报题和出稿的能力。

3. 有能力采访行业高端人物,能将其观点进行深刻呈现。

4. 相关媒体经验2年以上。

5. 英语6级以上,能快速编译。

6. 本科以上


待遇:

绝不低于行业水平,只要有才,我们愿意给你一切资源。

邮件发送:puge@csdn.net

邮件注明:姓名+区块链+采编应聘

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Blockchain_lemon/article/details/79956153

巧用Delphi制作溅射屏幕

(作者:施路 2000年12月08日 09:32)  精心编写的WINDOWS程序显示启动注意事项,称之为溅射屏幕(splash screen)。利用一点儿小小的内容,即可给程序的显示添加不少色彩。 ...
  • ghj1976
  • ghj1976
  • 2000-12-11 09:24:00
  • 1134

撸这些完整项目,你不牛逼都难!

经常有人问我有没有什么项目代码,我回复说去 Github 找,但是还是好多人不知道如何找到那些比较好的项目。 今天花了点时间找了些安卓的项目,觉得还是不错的,几乎就是自己生活常用的一些 app ...
  • wangwangli6
  • wangwangli6
  • 2017-05-14 12:24:20
  • 982

1054: 撸猫狂魔

1054: 撸猫狂魔 时间限制: 1 Sec  内存限制: 128 MB 提交: 26  解决: 7 [提交][状态][讨论版] 题目描述 zyyyyy是一个二刺猿。虽然他没有九十八...
  • m0_37286282
  • m0_37286282
  • 2017-11-22 19:16:19
  • 124

190行LUA撸撸撸了一天。

这是我一天的战果,几乎每一个函数都会碰到问题,这里撸撸那里撸撸,结果,一天的时候只撸了190行。不过还好,功能都实现了。。。local MainScene = class("MainScene", c...
  • mengjiangtao
  • mengjiangtao
  • 2017-04-13 23:18:44
  • 551

我撸了一个视频播放器

这是一款基于ijkplayer的MaterialDesign视频播放器 开发环境 AndroidStudio2.1.1 gradleVersion = ‘2.10’compileSdkVers...
  • yoywow
  • yoywow
  • 2016-07-23 18:47:29
  • 1737

狠狠撸网站黑色源码 带采集 ASP

  • 2014年01月13日 20:00
  • 6.89MB
  • 下载

怎样查看qq好友的ip

很久很久以前,有一个名叫“珊瑚虫”的QQ版本,话说可以显示对方网友的IP地址,但是由于某些原因消失了。接着又来一个“彩虹”外挂,同样可以显示好友IP地址,但是又因为某些原因也消失了。现在我们怎么样能够...
  • aerchi
  • aerchi
  • 2012-02-27 17:35:43
  • 2355

撸一撸MVP吧

吹吹水最近刚刚上班,几天连续加班,做重构,满心激情,像打了鸡血一样。连续几天没去健身了,心里痒痒的,今天果断不加班,回来去健身。回到家里看着有些时间,这几天做的东西也有点心得,赶紧写写东西记录一下。背...
  • u012943767
  • u012943767
  • 2016-12-07 00:12:29
  • 7154

(qq群分享)0元撸淘宝10元现金红包,2018淘宝新年红包0元领取活动教程总结后的文件

  • 2018年02月05日 17:11
  • 963KB
  • 下载

朱江:区块链游戏绝不是撸猫那么简单。

导语:在撸猫游戏的带动下,区块链游戏火了。不过,在朱江看来,这只是区块链游戏的1.0阶段,挂在公链上,简单,偏休闲,主要是币圈的人在玩。到了2.0阶段,更多的游戏厂商和游戏玩家就开始入场了。而在3.0...
  • Blockchain_lemon
  • Blockchain_lemon
  • 2018-04-04 00:00:00
  • 2192
收藏助手
不良信息举报
您举报文章:会撸猫了不起啊?有本事自己写一个撸猫撸鱼撸飞机才是牛逼
举报原因:
原因补充:

(最多只允许输入30个字)