크립토키티 소스 분석 3 .... KittyBase

in kr •  6 years ago  (edited)

이전 편에서 이하와 같이 구조에서 순서대로 보기로 했다. 그 두번째 컨트랙트 KittyBase. 지난번에는 KittyAccessContro를 봤지만 별 내용은 그리 없고 권한 설정을 위한 modifier만 있었다.

KittyCore <- KittyMinting <- KittyAuction <- KittyBreeding <- KittyBase, ERC721

KittyBase <- KittyAccessControl

KittyBase는 크립토키티 코어에서 사용하는 데이터 구조가 정의되어 있다. 게임 전체에서 사용하는 데이터 구조로 실제 정의되어 있는 struct는 다음과 같다. 그리고 solidity의 EVM에 의하면 32바이트로 채워져서 저장이 되기 때문에 kitty의 구조체를 보면 32바이트씩 밑에서 묶을 수 있다. genes을 제외하고 나머지 요소들을 합치면 32바이트(256비트)로 묶을 수 있다. 여기서 이러한 최적화를 시켜 gas 비용을 줄이게 된다.

struct Kitty {
    uint256 genes;
    uint64 birthTime;
    uint64 cooldownEndBlock;
    uint32 matronId;
    uint32 sireId;
    uint32 siringWithId;
    uint16 cooldownIndex;
    uint16 generation;
}

하나하나 보도록하자.(참고로 게임이라 수컷, 암컷에 상관없이 다 교배가 가능하다. 아마 수컷암컷에 대한 정보도 넣게 되면 복잡해지고 게임도 그리 재미없어져서 그런 듯 싶다)

  1. genes
    크립토키티의 유전자 정보를 표현함. 실제로 크립토 키티를 보면 다양한 외형 조합이 가능한데 이 256비트로 그 조합을 표현한다. 외형은 예를 들어 앞에 몇 비트는 얼굴...그 뒤 몇 비트는 몸통 등등...그리고 물론 외형으로 표현은 되지 않지만 가지고 있는 유전자 정보도 있다.

  2. birthTime
    크립토 키티가 태어난 날, block.timestamp값이 저장

  3. cooldownEndBlock
    교배가 다시 되기까지 기다려야 하는 시간

  4. matronId
    아빠 ID

  5. sireID
    엄마 ID

  6. siringWithId
    만약에 고양이가 임신 중일 경우에 아빠가 되는 상대의 키티 ID를 설정함, 임신 중이지 않을 경우는 0

  7. cooldownIndex
    현재 cooldown의 index. 교배 후에 재교배하기까지 어느정도 기다리는지 index에 따라 시간이 결정됨

  8. generation
    키티의 제네레이션의 수. 부모의 제네레이션의 수에 1를 더한 수가 됨. 최초의 키티는 0.

이 정보에 따라서 어떤 고양이의 모습인지는 여기 cryptokittyindex를 보면 된다. 마지막에 키티 index를 넣으면 해당 고양이의 정보를 볼 수 있다.
크립토키티에서 나오는 모든 고양이는 저 struct를 가지고 있다. 그럼 가장 최초의 고양이는 어떤 모습일까? 여기를 보면 genesis kitty가 나온다 (블록의 제네시스 블록 처럼..) 지금까지 약 70만개 이상의 키티가 있다.

이 컨트랙트에서 정의 된 함수를 보도록 하자.

  1. function _transfer(address _from, address _to, uint256 _tokenId) internal
    키티의 주인을 바꾸는 함수 , _tokenId에 키티 구조체의 index 값을 넣고 변경하고자 하는 주소를 넣는다.

  2. function _createKitty( uint256 _matronId, uint256 _sireId, uint256 _generation, uint256 _genes, address _owner ) internal returns (uint)
    새로운 키티를 만드는 함수, 키티 id는 최대 2^32-1를 넘지 않는 값으로 된다. parameter로는 부모의 키티 id를 넣고, _generation(몇 대손 이라고 해야하나?) 그리고 _genes(유전자 정보)와 키티 주인 지갑 주소를 넣는 다.
    마지막 부분을 보면 _transfer(0, _owner, newKittenId);로 ERC721(draft) 토큰의 주인을 새롭게 지정한다. 결국 토큰id랑 키티 id는 동일한 값을 사용한다.

  3. function setSecondsPerBlock(uint256 secs) external onlyCLevel
    이더리움의 블록 생성 시간(약 15초)를 설정하는 함수이다. 블록 생성 시간을 이용해서 cooldown 시간을 계산하게 된다. 일반적인 프로그램처럼 타이머를 못쓰니 저렇게 각 블록간 시간을 알면 block.number로 대략적인 시간을 알 수 있다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!