CryptoKitties?做了很棒的工作,他展示除了简单的金融交易之外还可以使用区块链做什么。
我希望将来我们会看到更多创新的区块链用法,所以我想快速浏览CryptoKitties背后的代码,以展示它背后是如何实现的。
本文是为开发人员编写的,虽然这不是一个绝对的初学者对Solidity的介绍,但是我试图包含文档的链接,以便尽可能适合所有开发者。
让我们开始...
CryptoKitties源码
几乎所有的CryptoKitties代码都是开源的,因此找出它的工作原理的最好方法是阅读源代码。
总共大约有2000行,所以在这篇文章中,我只会讲解我认为最重要的部分。 但是,如果您想单独阅读,请参阅EthFiddle上的完整合约代码副本:
CryptoKitties Source Code:https://ethfiddle.com/09YbyJRfiI
总概:
如果你不了解CryptoKitties是什么,它基本上是一个购买,销售和繁殖数字猫的游戏。 每只猫都有一个独特的外观,由它的基因所定义,当你通过两只猫繁殖时,它们的基因以一种独特的方式结合在一起产生一个后代,然后你可以繁殖或出售它。
CryptoKitties 的代码分为许多相关的较小的合约, 而不是一个单一的包含所有东西的巨大文件
子合约像下面这样继承主kitty合约:
KittyBase 定义了应用程序的很多核心数据。首先它将Kitty定义为一个结构体: 这个数组包含了所有Kitty的数据,所以它就像一个Kitty的数据库一样。 无论何时创建一个新的猫,它都会被添加到这个数组中,数组的索引成为猫的ID,就像这个 ID为'1'的创世喵: 该合约还包含从猫的ID到其拥有者地址的映射,以跟踪拥有猫的人:contract KittyAccessControlcontract KittyBase is KittyAccessControlcontract KittyOwnership is KittyBase, ERC721contract KittyBreeding is KittyOwnershipcontract KittyAuction is KittyBreedingcontract KittyMinting is KittyAuctioncontract KittyCore is KittyMinting
所以KittyCore是最终应用程序指向的合约地址,他继承了前面合约的所有的属性和方法
让我们一个一个的看看这些合约:
1. KittyAccessControl:谁控制合约?
这个合约管理只能由特定角色执行操作的各种地址和约束。这些角色叫CEO, CFO and COO.
这个合约是为了管理合约,根本不涉及到游戏的机制。他为CEO, COO 和CFO提供有“setter”方法, 他们(CEO, COO, CFO)是对合约具有特殊所有权和控制权的以太坊地址。
KittyAccessControl 定义一些modifier函数例如 onlyCEO(只有CEO才能执行),还有暂停/恢复合约的方法或者提现方法modifier onlyCLevel() { ? ?require( ? ? ? ?msg.sender == cooAddress || ? ? ? ?msg.sender == ceoAddress || ? ? ? ?msg.sender == cfoAddress ? ?); ? ?_;}//...some other stuff// Only the CEO, COO, and CFO can execute this function:function pause() external onlyCLevel whenNotPaused { ? ?paused = true;}
pause() 函数可能被添加,以便开发人员可以更新一个新的版本,以防有任何不可预见的错误... 但正如我的同事Luke指出,这实际上将允许开发人员完全冻结合约,使其没有人可以转让,出售或繁殖他们的小猫! 并不是说他们会这么做 - 但是有趣的是,由于大多数人认为DApp完全是去中心化的,只是因为它在以太坊上。
继续。。。
2. KittyBase: Kitty是什么?
这是我们定义在整个核心功能中共享的最基本代码的地方。 这包括我们的主要数据存储,常量和数据类型,以及用于管理这些数据的内部函数。struct Kitty {
? ? uint256 genes;
? ? uint64 birthTime;
? ? uint64 cooldownEndBlock;
? ? uint32 matronId;
? ? uint32 sireId;
? ? uint32 siringWithId;
? ? uint16 cooldownIndex;
? ? uint16 generation;
}
所以一只kitty实际上只是一串无符号的整数...
展开每个属性:
?genes—代表猫的遗传密码的256位整数。 这是决定猫的长相的核心数据。
?birthTime—猫出生时的时间戳
?cooldownEndBlock—之后这只猫可以再次繁殖的最小时间戳
?matronId&sireId—分别是猫的母亲和父亲的ID
?siringWithId—如果猫当前怀孕,则设置为父亲的ID,否则为零
?cooldownIndex—目前这只猫的冷却时间(猫需要等待多久才能繁殖)
?generation—这只猫的“世代号”。 第一只猫被合约创造是0代,新一代的猫是他们的父母一代中较大的一个,再加上1.
请注意,在Crypto Kitties中,猫是无性的,任何2只猫都可以一起繁殖 - 因此猫没有性别。
KittyBase 合约定义了一个kitty 数据结构的数据Kitty[] kitties;
您可能想查找下面的文章: