Token系列 – 加密猫智能合约源码分析

GeneScienceInterface合约

这个合约没有源码,从名字看已经很明显,就是猫的基因工程,用于决定新出生猫的基因。
这里仅仅定义了一个接口,没有具体实现,后续的调用请看后续代码分析

/// @title SEKRETOOOO
contract GeneScienceInterface {/// @dev simply a boolean to indicate this is the contract we expect to befunction isGeneScience() public pure returns (bool);/// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor/// @param genes1 genes of mom/// @param genes2 genes of sire/// @return the genes that are supposed to be passed down the childfunction mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);
}
  • kitties数组,所有的猫都会存储在 kitties数组里,这个数组会不断增长,kittyId其实就是Kitty对象在这个数组中的下标。而kittyId其实就是erc721的tokenId。kitties数组建立了erc721 token 和猫数据结构的映射关系。通过erc721的tokenid就能够获取到Kitty对象数据.
  • kittyIndexToOwner表,通过这个映射,可以快速的知道,哪知猫是谁的。那为什么owner属性为什么不放在Kitty的数据结构里呢?笔者推测,很多场景并不需要获取Kitty上具体数据,如果每次要先找到猫再获取主人,效率可能比较低,毕竟智能合约的执行是要钱的。
  • ownershipTokenCount表,记录了谁有几只猫。
  • kittyIndexToApproved表,记录了一种授权操作,你可以把你的猫授权给某个地址,比如你进行拍卖的时候,你的猫其实授权给了拍卖合约,这个合约有权利将你的猫转给他人。
  • sireAllowedToAddress表,你可以把你的猫拿去配种,对方要和你猫的配种,必须要得到你的授权,那这张表记录了,你把你的那种猫允许谁配种。
    这几个属性几乎记录了,所有猫的所有权和配种操作。

KittyOwnership合约

上面讲的好几个合约,其实都是抽象基类,并没有部署在以太坊上,他们都是为了节约代码抽出来的。
KittyOwnership合约是一个真正部署在以太坊上的合约,他定义了一个 ERC721代币。KittyOwnership把KittyBase和ERC721的接口桥接起来了。
里面的很多代码,基本都是KittyBase合约的接口转换

需要部署的是这个合约

KittyCore:以太猫的主合约
KittyCore 合约地址就是以太猫DApp的合约地址, 这个合约把之前提到的所有合约链接在一起,提供完整的DApp功能。这个合约继承了之前提到的所有合约,并追加了几个方法

各合约的继承关系

contract ERC721contract Ownable
contract Pausable is Ownable
contract ClockAuctionBase				 (ClockAuctionBase内实例化了ERC721)
contract ClockAuction is Pausable, ClockAuctionBase	(构造函数需要传参 ERC721的地址和交易抽水万分比)
$ contract SiringClockAuction is ClockAuction		(构造函数需要传参 ERC721的地址和交易抽水万分比)
$ contract SaleClockAuction is ClockAuction		(构造函数需要传参 ERC721的地址和交易抽水万分比)$ contract GeneScienceInterface					(猫的基因合约)
$ contract ERC721Metadata						(负责生成小猫元数据的外部合约)contract KittyAccessControl
contract KittyBase is KittyAccessControl		 (KittyBase内实例化了SiringClockAuction siringAuction和SaleClockAuction saleAuction)
contract KittyOwnership is KittyBase, ERC721     	 (KittyOwnership内实例化了ERC721Metadata)
contract KittyBreeding is KittyOwnership		 (KittyBreeding内实例化了GeneScienceInterface,并且可以替换合约地址)
contract KittyAuction is KittyBreeding			 (并且可以替换SiringClockAuction和SaleClockAuction合约地址)
contract KittyMinting is KittyAuction
$ contract KittyCore is KittyMinting			 (升级主合约setNewAddress)

带 payable 的合约函数

KittyBreeding	function breedWithAuto(uint256 _matronId, uint256 _sireId)
ClockAuction 	function bid(uint256 _tokenId)
SiringClockAuction	function bid(uint256 _tokenId)
SaleClockAuction	function bid(uint256 _tokenId)
KittyAuction	bidOnSiringAuction(uint256 _sireId,uint256 _matronId)
KittyCore	function() external payable 

调用方法例如: siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);


往期精彩回顾:

区块链知识系列
密码学系列
零知识证明系列
共识系列
公链调研系列
比特币系列
以太坊系列
EOS系列
Filecoin系列
联盟链系列
Fabric系列
智能合约系列
Token系列

Published by

风君子

独自遨游何稽首 揭天掀地慰生平