如何在Ethereum上编写自己的CryptoKitties风格的游戏

吸血鬼猫

【翻译】原文:https://medium.com/loom-network/how-to-code-your-own-cryptokitties-style-game-on-ethereum-7c8ac86a4eb3

CryptoKitties 做了很棒的工作,他展示除了简单的金融交易之外还可以使用区块链做什么。

我希望将来我们会看到更多创新的区块链用法,所以我想快速浏览CryptoKitties背后的代码,以展示它背后是如何实现的。

本文是为开发人员编写的,虽然这不是一个绝对的初学者对Solidity的介绍,但是我试图包含文档的链接,以便尽可能适合所有开发者。

让我们开始...

CryptoKitties源码

几乎所有的CryptoKitties代码都是开源的,因此找出它的工作原理的最好方法是阅读源代码。

总共大约有2000行,所以在这篇文章中,我只会讲解我认为最重要的部分。 但是,如果您想单独阅读,请参阅EthFiddle上的完整合约代码副本:

CryptoKitties Source Code

总概:

如果你不了解CryptoKitties是什么,它基本上是一个购买,销售和繁殖数字猫的游戏。 每只猫都有一个独特的外观,由它的基因所定义,当你通过两只猫繁殖时,它们的基因以一种独特的方式结合在一起产生一个后代,然后你可以繁殖或出售它。

CryptoKitties 的代码分为许多相关的较小的合约, 而不是一个单一的包含所有东西的巨大文件

子合约像下面这样继承主kitty合约:

所以KittyCore是最终应用程序指向的合约地址,他继承了前面合约的所有的属性和方法 

让我们一个一个的看看这些合约:

1. KittyAccessControl:谁控制合约?

这个合约管理只能由特定角色执行操作的各种地址和约束。这些角色叫CEO, CFO and COO.

这个合约是为了管理合约,根本不涉及到游戏的机制。他为CEO, COO 和CFO提供有“setter”方法, 他们(CEO, COO, CFO)是对合约具有特殊所有权和控制权的以太坊地址。

KittyAccessControl  定义一些modifier函数例如 onlyCEO(只有CEO才能执行),还有暂停/恢复合约的方法或者提现方法


pause() 函数可能被添加,以便开发人员可以更新一个新的版本,以防有任何不可预见的错误... 但正如我的同事Luke指出,这实际上将允许开发人员完全冻结合约,使其没有人可以转让,出售或繁殖他们的小猫! 并不是说他们会这么做 - 但是有趣的是,由于大多数人认为DApp完全是去中心化的,只是因为它在以太坊上。

继续。。。

2. KittyBase: Kitty是什么?

这是我们定义在整个核心功能中共享的最基本代码的地方。 这包括我们的主要数据存储,常量和数据类型,以及用于管理这些数据的内部函数。

KittyBase 定义了应用程序的很多核心数据。首先它将Kitty定义为一个结构体:

所以一只kitty实际上只是一串无符号的整数...

展开每个属性:

genes—代表猫的遗传密码的256位整数。 这是决定猫的长相的核心数据。

birthTime—猫出生时的时间戳

cooldownEndBlock—之后这只猫可以再次繁殖的最小时间戳

matronId&sireId—分别是猫的母亲和父亲的ID

siringWithId—如果猫当前怀孕,则设置为父亲的ID,否则为零

cooldownIndex—目前这只猫的冷却时间(猫需要等待多久才能繁殖)

generation—这只猫的“世代号”。 第一只猫被合约创造是0代,新一代的猫是他们的父母一代中较大的一个,再加上1.

请注意,在Crypto Kitties中,猫是无性的,任何2只猫都可以一起繁殖 - 因此猫没有性别。

KittyBase 合约定义了一个kitty 数据结构的数据


KittyBase 合约

这个数组包含了所有Kitty的数据,所以它就像一个Kitty的数据库一样。 无论何时创建一个新的猫,它都会被添加到这个数组中,数组的索引成为猫的ID,就像这个 ID为'1'的创世喵:


索引为 “1”!


该合约还包含从猫的ID到其拥有者地址的映射,以跟踪拥有猫的人:


还有一些其他的映射也被定义,但为了保持这篇文章的合理长度,我不会仔细研究每一个细节。

每当小猫从一个人转移到下一个时,这个kittyIndexToOwner映射就会被更新以反映新的所有者:


转移所有权 设置Kitty的ID指向接收人`_to`的地址。

现在我们来看看在创建一个新的kitty时会发生什么:

这个函数传递了母亲和父亲的ID,小猫的世代号码,256位遗传密码和所有者的地址。 然后创建小猫,将其加入到Kitty数组,然后调用_transfer() 将其分配给它的新所有者。

Cool - 现在我们可以看到CryptoKitties如何将一只猫咪定义为一种数据类型,它如何将所有小猫都存储在区块链中,以及如何跟踪谁拥有哪些小猫。

3. KittyOwnership: Kitties代币化

这提供了遵循ERC-721规范草案的基本不可互换令牌交易所需的方法。

CryptoKitties符合ERC721代币规范,这是一种不可替换的代币类型,它非常适合在MMORPG中跟踪数字收集游戏(如数字扑克牌或稀有物品)的所有权。

关于Fungibility的说明:Ether是可互换的,因为任何5个ETH都与其他5个ETH一样好。 但是像CryptoKitties这样的是非可互换代币,并不是每只猫都是平等的,所以它们不能互相交换。

您可以从合约定义中看出,KittyOwnership继承了ERC721合约:

而所有ERC721令牌都遵循相同的标准,所以KittyOwnership合约实现了以下功能:


由于这些方法是公开的,这就为用户提供了一个标准的方式来与CryptoKitties令牌进行交互,就像他们与任何其他ERC721令牌进行交互一样。 您可以通过直接与以太坊区块链上的CryptoKitties合约进行交互,而不必通过他们的Web界面来将您的代币转让给其他人,所以从这个意义上说,您真的拥有自己的小猫。 (除非CEO暂停合约)。

我不会解读所有这些方法的实现,但是你可以在EthFiddle(搜索“KittyOwnership”)上查看它们。

4. KittyBreeding:猫的繁殖

这个文件包含了将猫一起繁殖所必需的方法,包括跟踪繁殖提供者,并依靠外部基因组合合约。

“外部基因组合合约”(geneScience)存储在一个不是开源的单独合约中。

KittyBreeding 合约包含一个方法,让CEO设置这个外部基因组合约地址:


他们这样做是为了让游戏变得不那么容易 - 如果你能够读懂一只小猫的DNA是如何确定的,那么就知道为了得到一只“奇特的猫”而跟哪只猫繁殖会容易得多。

这个外部 geneScience合约之后会在theGiveBirth() (我们稍后会看到)函数中使用,以确定新猫的DNA。

现在让我们看看当两只猫在一起时会发生什么:


这个函数需要母亲和父亲的ID,在kitties数组中查找它们,并将母亲上的siringWithId设置为父亲的ID。 (当siringWithId不为零时,表示母亲怀孕)。

它也执行父母双方的triggerCooldown函数,这会使他们在一段时间内不能再一次繁殖。

接下来,有一个公开的 giveBirth() 函数 创建一个新的猫:



代码是非常明显的。 基本上,代码首先执行一些检查,看看母亲是否准备好生孩子。 然后使用geneScience.mixGenes() 确定孩子的基因,将新基因的所有权分配给母亲,然后调用我们在KittyBase中的函数_createKitty()。

请注意,geneScience.mixGenes() 函数是一个黑匣子,因为该合约是闭源的。 所以我们实际上并不知道孩子的基因是如何决定的,但我们知道这是母亲基因和父亲基因的功能,还有母亲的cooldownEndBlock。

5. KittyAuctions: 买卖和繁殖服务(出台)

在这里,我们有公开的方法来拍卖猫或招标猫或繁殖猫。 实际的拍卖功能是在两个兄弟合约(一个用于买卖,一个用于繁殖)中处理的,而拍卖的创建和投标主要是通过核心合约。

根据开发者的说法,他们将这个拍卖功能分为“兄弟”合约,是因为“他们的逻辑有点复杂,总是存在微妙的bug风险。 通过保留它们自己的合约,我们可以升级它们而不会中断追踪小猫所有权的主合约。“

因此,这个KittyAuctions合约包含函数 setSaleAuctionAddress() 和setSiringAuctionAddress() ,像 setGeneScienceAddress() 只能由CEO调用,并设置处理这些函数的外部合约的地址。

注意:“Siring”指的是把你的猫拉出来 - 把它拍卖,在那里另一个用户可以付钱给你以太,让你的猫与他们一起繁殖。哈哈。

这意味着,即使CryptoKitties合约本身是不可变的,首席执行官也可以灵活地改变这些拍卖合约的地址,从而改变拍卖规则。 同样,不一定是坏事,因为有时候开发人员需要修正bug,但是这是要注意的事情。

我不打算详细讨论如何处理拍卖和出价逻辑,以防止这篇文章过长(已经够长了!),但是您可以在EthFiddle(搜索KittyAuctions)中查看代码。

6. KittyMinting: 创世猫工厂

最后一个方面包含我们用来创建新的gen0猫的功能。 我们最多可以制作5000只可以赠送的“营销”猫(在社区初期的时候尤为重要),其他所有的猫只能通过算法确定的起始价格创建,然后立即投入拍卖。 不管它们是如何创造的,都有50k gen0猫的硬性极限。 之后,社群就要繁殖,繁殖,繁殖!

合约能够创建的promo cats和gen0 cat的数量在这里是硬编码的:


这里是“COO”可以创建营销小猫和gen0小猫的代码:



所以通过createPromoKitty(),看起来COO可以用任何他想要的基因创建一个新的kitty,然后发送给任何他想要给的人(最多5000个kitty)。 我猜测他们是为了早期测试者,朋友和家人,为了促销目的而赠送免费的小猫咪等等。

但是这也意味着你的猫可能并不像你想象的那样独一无二,因为他可能会有5000个相同的副本!

对于createGen0Auction(),COO也提供新基因的遗传密码。 但不是将其分配给特定的人的地址,而是创建一个用户可以出价购买小猫的拍卖。

7. KittyCore: 主合约

这是主要的CryptoKitties合约,编译和运行在以太坊区块链上。 这份合约把所有东西联系在一起。

由于继承结构,它继承了我们之前所看到的所有合约,并增加了几个最终的方法,就像这个使用ID来获取所有的Kitty数据的函数:


这是一个公共方法,它返回区块链中特定小猫的所有数据。 我想这是他们的Web服务器在网站上显示的猫的查询。

等等...我没有看到任何图像数据。 什么决定了小猫的样子?

从上面的代码可以看出,一个“小猫”基本上归结为一个256位的无符号整数,代表其遗传密码。

Solidity合约代码中没有任何内容存储猫的图像或其描述,或者确定这个256位整数的实际含义。 该遗传密码的解释发生在CryptoKitty的网络服务器上。

所以虽然这是区块链上游戏的一个非常聪明的演示,但实际上并不是100%的区块链。 如果将来他们的网站被脱机,除非有人备份了所有的图像,否则只剩下一个毫无意义的256位整数。

在合约代码中,我找到了一个名为ERC721Metadata的合约,但它永远不会被用于任何事情。 所以我的猜测是,他们最初计划将所有内容都存储在区块链中,但之后却决定不要这么做(在Ethereum中存储大量数据的代价太高),所以他们最终需要将其存储在Web服务器上。

总结一下:

小猫如何表现为数据

现存的所有小猫如何存储在一个智能合约中,以及如何跟踪谁拥有什么

gen0小猫如何生产

小猫如何在一起繁殖,形成新的小猫

https://medium.com/loom-network/how-to-code-your-own-cryptokitties-style-game-on-ethereum-7c8ac86a4eb3 


----------------------------------------------分割线-----------------------------------------------------


我买的小猫  

https://www.cryptokitties.co/kitty/83194

http://cryptokittydex.com/  cryptokitties数据分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353