上一篇讲解以太猫的一些基础合约,包含权限控制和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)) {