CryptoKitties 코드에서 제형 로직 탐색

소개



CryptoKitties라고 하는 Ethereum상에서 실시하는 고양이 육성 게임이 2017년 말에 유행했습니다.
htps //w w. cryp 때때로 s. 코/

ERC721을 채용하는 것으로, 고양이를 Non-Fungible Token으로 해, 고양이 1마리씩에 아이덴티티를 갖게 해, 어느 고양이도 세계에 하나밖에 없는 대체 불가한 것으로 하고 있습니다.

고양이는 배합하는 것으로, 새로운 고양이가 낳을 수 있어 희귀한 고양이는 무려 수백만엔으로 거래되고 있습니다.
CryptoKitties의 코드가 공개되어 있기 때문에 코드에서 제형 로직을 찾고 싶습니다.


코드는 여기에서 볼 수 있습니다.

배합 로직 탐색



코드는 여러 계약으로 구성되며 결국 kittyCore가 계약을 상속합니다.
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

배합에 대해서는 KittyBreeding의 contract에 기재되어 있습니다.
    function setGeneScienceAddress(address _address) external onlyCEO {
        GeneScienceInterface candidateContract = GeneScienceInterface(_address);

        // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117
        require(candidateContract.isGeneScience());

        // Set the new contract address
        geneScience = candidateContract;
    }
function giveBirth(uint256 _matronId)
        external
        whenNotPaused
        returns(uint256)
    {
        // Grab a reference to the matron in storage.
        Kitty storage matron = kitties[_matronId];

        // Check that the matron is a valid cat.
        require(matron.birthTime != 0);

        // Check that the matron is pregnant, and that its time has come!
        require(_isReadyToGiveBirth(matron));

        // Grab a reference to the sire in storage.
        uint256 sireId = matron.siringWithId;
        Kitty storage sire = kitties[sireId];

        // Determine the higher generation number of the two parents
        uint16 parentGen = matron.generation;
        if (sire.generation > matron.generation) {
            parentGen = sire.generation;
        }

        // Call the sooper-sekret gene mixing operation.
        uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);

        // Make the new kitten!
        address owner = kittyIndexToOwner[_matronId];
        uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);

        // Clear the reference to sire from the matron (REQUIRED! Having siringWithId
        // set is what marks a matron as being pregnant.)
        delete matron.siringWithId;

        // Every time a kitty gives birth counter is decremented.
        pregnantKitties--;

        // Send the balance fee to the person who made birth happen.
        msg.sender.send(autoBirthFee);

        // return the new kitten's ID
        return kittenId;
    }
}

주목하는 것은 여기
uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);

여기에서 아이의 유전자가 결정되지만, geneScience가 외부의 계약을 참조하고 코드가 공개되지 않기 때문에, 불행히도 mixGenes의 내용까지는 알 수 없습니다. (알고 버리면 게임성이 없어지네요^^;)
다만 인수로서 아버지, 어머니의 유전자, 어머니의 cooldownEndBlock 가 이용되는 것을 알 수 있습니다.
geneScience는 CEO 만 계약 주소를 설정할 수 없도록합니다.

덧붙여서 geneScience의 계약 주소까지는 알기 때문에 흥미있는 분은 이쪽으로부터.
ぇtps://에어ぇrs칸. 이오 / 아 d s / 0xf97 00 5b616d fc913 72455f 9 8 8996 2b # 여기

해외에서는 고양이의 배합 샘플로부터 해석하거나,bytecode로부터 해석하고 있는 쯔와모노도 있는 것 같습니다.
htps : // 메이 m. 코 m / @ 카이 가니 / 테 - cryp 때로는 s 게의 메 - p 로지 ct - 68582016f687
htps : // 메이 m. 코 m / @ ax x 헤지 / cryp 때 딱딱한 s- s sen-1f5b41963b0d
htps : // 메이 m. 이 m/@세안. 썰매 / cryp 토치에 s-mi x gene s-fun c Chion-69207883fc80

배합 로직은 몰랐습니다만, Dapp를 만드는데 있어서, 클로즈로 하고 싶은 구현을 배울 수 있었습니다.

참고하겠습니다.



CryptoKitties 코드 해설
가상 새끼 고양이 게임 CryptoKitties 계약 해독 2

좋은 웹페이지 즐겨찾기