以太猫合约之数据合约分析(二)

上一篇讲解以太猫的一些基础合约,包含权限控制和ERC721函数定义合约。本篇将重点介绍以太猫的基础数据合约和ERC721代币实现合约。我们先看以太猫基础数据合约。

以太猫基础数据合约

contract KittyBase is KittyAccessControl {
    // 事件
    event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);  //出生事件
    event Transfer(address from, address to, uint256 tokenId);  //转账事件                       

    // 猫的属性
    struct Kitty {
        uint256 genes;            // 基因,核心数据,决定猫的外貌
        uint64 birthTime;         //出生区块的时间
        uint64 cooldownEndBlock;  // 猫可以再次进行繁殖的最小区块,用于已经怀孕的猫
        uint32 matronId;          // 母亲的ID
        uint32 sireId;            // 父亲的ID
        uint32 siringWithId;      // 如果正在繁殖期那么就是当前交配对象的ID,否则为0
        uint16 cooldownIndex;     // 繁殖冷却时间
        uint16 generation;        // 猫的代数  max(matron.generation, sire.generation) + 1)
    }

    // 数组,cooldownIndex 对应的冷却时间,
    // 随着猫的代数和生育次数的增加,猫进行交配的冷却时间也会逐渐增加
    // 最大冷却时间不会超过7天
    uint32[14] public cooldowns = [
        uint32(1 minutes),
        uint32(2 minutes),
        uint32(5 minutes),
        uint32(10 minutes),
        uint32(30 minutes),
        uint32(1 hours),
        uint32(2 hours),
        uint32(4 hours),
        uint32(8 hours),
        uint32(16 hours),
        uint32(1 days),
        uint32(2 days),
        uint32(4 days),
        uint32(7 days)
    ];

    // 生成一个区块的秒数
    uint256 public secondsPerBlock = 15;

    // 保存所有的喵的ID
    Kitty[] kitties;  

    // 所有猫的ID对应地址的映射
    mapping (uint256 => address) public kittyIndexToOwner;  

    // 用户地址对应token数的映射
    mapping (address => uint256) ownershipTokenCount;  

    // 授权 ,把uint256(猫id)  授权给address(用户) 交易 ,先授权,然后才能交易
    mapping (uint256 => address) public kittyIndexToApproved; 

    // 授权,把uint256(猫id)  授权给address(用户)交配,先授权,然后才能交配
    mapping (uint256 => address) public sireAllowedToAddress;  

    // 拍卖合约的地址,处理用户之间的交易和每隔15分钟系统生成的gen0代猫
    SaleClockAuction public saleAuction;  

    // 交配的合约地址,和上面拍卖的不同因为两者的处理方式不同
    SiringClockAuction public siringAuction; 
 
    // 交易,把 _from 拥有的_tokenId 猫交易给 _to
    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        ownershipTokenCount[_to]++;           // _to 用户拥有猫是数量 加 1 
        kittyIndexToOwner[_tokenId] = _to;    // _tokenId 猫的所有者 更改为 _to
        if (_from != address(0)) {  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值