cryptokitties猫吧 关注:17贴子:59
  • 15回复贴,共1

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

只看楼主收藏回复

CryptoKitties 做了很棒的工作,他展示除了简单的金融交易之外还可以使用区块链做什么。
我希望将来我们会看到更多创新的区块链用法,所以我想快速浏览CryptoKitties背后的代码,以展示它背后是如何实现的。
本文是为开发人员编写的,虽然这不是一个绝对的初学者对Solidity的介绍,但是我试图包含文档的链接,以便尽可能适合所有开发者。
让我们开始...


1楼2017-12-12 09:33回复
    CryptoKitties源码
    几乎所有的CryptoKitties代码都是开源的,因此找出它的工作原理的最好方法是阅读源代码。
    总共大约有2000行,所以在这篇文章中,我只会讲解我认为最重要的部分。 但是,如果您想单独阅读,请参阅EthFiddle上的完整合约代码副本:
    CryptoKitties Source Code(h_ttp_s://ethfiddle.com/09YbyJRfiI)


    2楼2017-12-12 09:34
    回复
      2025-08-21 17:21:34
      广告
      不感兴趣
      开通SVIP免广告
      总概:
      如果你不了解CryptoKitties是什么,它基本上是一个购买,销售和繁殖数字猫的游戏。 每只猫都有一个独特的外观,由它的基因所定义,当你通过两只猫繁殖时,它们的基因以一种独特的方式结合在一起产生一个后代,然后你可以繁殖或出售它。
      CryptoKitties 的代码分为许多相关的较小的合约, 而不是一个单一的包含所有东西的巨大文件
      子合约像下面这样继承主kitty合约:
      contract KittyAccessControl
      contract KittyBase is KittyAccessControl
      contract KittyOwnership is KittyBase, ERC721
      contract KittyBreeding is KittyOwnership
      contract KittyAuction is KittyBreeding
      contract KittyMinting is KittyAuction
      contract KittyCore is KittyMinting
      所以KittyCore是最终应用程序指向的合约地址,他继承了前面合约的所有的属性和方法
      让我们一个一个的看看这些合约:


      3楼2017-12-12 09:35
      回复
        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完全是去中心化的,只是因为它在以太坊上。
        继续。。。


        4楼2017-12-12 09:37
        回复
          2. KittyBase: Kitty是什么?
          这是我们定义在整个核心功能中共享的最基本代码的地方。 这包括我们的主要数据存储,常量和数据类型,
          以及用于管理这些数据的内部函数。
          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只猫都可以一起繁殖 - 因此猫没有性别。


          5楼2017-12-12 09:39
          回复
            KittyBase 合约定义了一个kitty 数据结构的数据
            Kitty[] kitties;
            这个数组包含了所有Kitty的数据,所以它就像一个Kitty的数据库一样。 无论何时创建一个新的猫,它都会被添加到这个数组中,数组的索引成为猫的ID,就像这个 ID为'1'的创世喵:

            该合约还包含从猫的ID到其拥有者地址的映射,以跟踪拥有猫的人:
            mapping (uint256 => address) public kittyIndexToOwner;
            还有一些其他的映射也被定义,但为了保持这篇文章的合理长度,我不会仔细研究每一个细节。
            每当小猫从一个人转移到下一个时,这个kittyIndexToOwner映射就会被更新以反映新的所有者:
            /// @dev Assigns ownership of a specific Kitty to an address.
            function _transfer(address _from, address _to, uint256 _tokenId) internal {
            // Since the number of kittens is capped to 2^32 we can't overflow this
            ownershipTokenCount[_to]++;
            // transfer ownership
            kittyIndexToOwner[_tokenId] = _to;
            // When creating new kittens _from is 0x0, but we can't account that address.
            if (_from != address(0)) {
            ownershipTokenCount[_from]--;
            // once the kitten is transferred also clear sire allowances
            delete sireAllowedToAddress[_tokenId];
            // clear any previously approved ownership exchange
            delete kittyIndexToApproved[_tokenId];
            }
            // Emit the transfer event.
            Transfer(_from, _to, _tokenId);
            }
            转移所有权 设置Kitty的ID指向接收人_to的地址。
            现在我们来看看在创建一个新的kitty时会发生什么:


            6楼2017-12-12 09:43
            回复
              楼主厉害,可以加个qq交流吗?对区块链技术很感兴趣


              IP属地:海南来自Android客户端7楼2017-12-19 01:15
              收起回复
                请问楼主 如果开发自己的游戏 难度有多大?


                IP属地:贵州8楼2017-12-25 02:16
                收起回复
                  2025-08-21 17:15:34
                  广告
                  不感兴趣
                  开通SVIP免广告
                  这个可以不用以太坊吗? 用其他的公有链。


                  9楼2017-12-25 14:56
                  收起回复
                    大佬 我想尝试先复制原游戏研究研究 请问 能辅导辅导吗?留个常用联系方式号码?本人邮箱5031066@qq.com 万分期待您的指导!


                    IP属地:贵州10楼2017-12-25 22:46
                    回复
                      我就想问问这是什么语言写的


                      11楼2018-03-21 10:43
                      回复