crypto_zombie

21827 ワード

1.第一段階ゾンビ工場の製作

pragma solidity ^0.4.19;
//버전을 정해준다. 
contract ZombieFactory {
//ZombieFactory라는 기본 컨트랙트를 생성한다. 
    event NewZombie(uint zombieId, string name, uint dna);//이벤트 추가

    uint dnaDigits = 16;//부호 없는 정수형 자료
    uint dnaModulus = 10 ** dnaDigits;//10의 제곱승

    struct Zombie {
        uint dna;
        string name;
    }//구조체 선언 (Zombie라는 구조체는 dna라는 uint와 name이라는 string변수를 가진다. )
    
    Zombie[] public zombies;
    //상태 변수가 블록체인에 영구적으로 저장이 된다. 구조체의 동적 배열을 생성하면 DB처럼 구조화된 데이터를 저장하는데 유용함
    //zombies라는 이름의 public 배열임. Zombie 구조체의 배열이다. 
    
    //이건 챕터 8내용
    // function createZombie (string _name, uint _dna){
    // //createZombie라는 이름의 함수를 만든다. 이는 _name과 _dna라는 이름의 지역변수를 사용한다.
    // //솔리디티는 함수에 받는 인자값의 타입도 정해준다.
    //     zombies.push(Zombie(_name, _dna));
    //     //앞서 선언한 zombies라는 public 배열에 Zombie구조체에 함수에 받은 인자값을 넣어서 구조체를 만든것을 넣는다. 

    // }
    
    //챕터 9 private 함수 선언-> private 함수는 함수명 앞에 _를 붙인다.
    function _createZombie(string _name, uint _dna) private {
        // zombies.push(Zombie(_name, _dna)); //zombies 동적 배열에 인자값으로 받은 name과 dna를 넣은 Zombie를 넣어 만든다.
        uint id = zombies.push(Zombie(_name, _dna))-1;
        NewZombie(id, _name, _dna);
    }

    function _generateRandomDna (string _str) private view returns (uint) {
    //uint 값을 반환함.
    //컨트랙트 변수를 보지만 변경하지는 않을 것이기에 view 선언
    //private 함수
    //return 이 아니라 returns임에 주의!

    //챕터 11 형변환
        uint rand = uint(keccak256(_str));
        //형을 맞추어주어야 한다. keccak256의 형태를 uint형을 맞추어준다. 
        return rand % dnaModulus;

    }

    //챕터 12 
    // 모든 내용을 종합하는 public 함수 만들기
    //좀비의 이름을 입력값으로 받아 랜덤 DNA를 가진 좀비를 만드는 함수 
    function createRandomZombie(string _name) public {
       uint randDna = _generateRandomDna(_name);
       _createZombie(_name,randDna);
    }

    //챕터 13 이벤트


}   
https://share.cryptozombies.io/ko/lesson/1/share/わかりません。

2.ゾンビ攻撃犠牲者


2-1. ZombieFactory2.sol

//좀비에게 다른 생명체를 먹여서 좀비 군대의 규모를 늘리는 방법

pragma solidity ^0.4.19;

contract ZombieFactory {

    event NewZombie(uint zombieId, string name, uint dna);

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    // 챕터 2 여기서 매핑 선언
    mapping (uint => address) public zombieToOwner;
    mapping (address => uint) ownerZombieCount;
    //mapping(key=>value) 이름 

    //매핑은 기본적으로 키-값 저장소로 데이터를 저장하고 검색하는데 이용됨.
    //기본적으로 구조화된 데이터를 저장하는 방법: 구조체&배열 , 매핑(key-value)


    

    function _createZombie(string _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        //챕터 3 msg.sender
        //_createZombie를 호출하는 모든 이에게 좀비 소유권을 부여하는 작업
        //함수를 호출한 사람의 주소를 가르킴 msg.sender
        //컨트랙트는 항상 누군가가 함수릃 호출할 때까지 아무것도 안하고 있을 것임. 그래서 항상 msg.sender가 필요함
        zombieToOwner[id]= msg.sender;
        //zombieToOwner 매핑을 id에 대해 msg.sender가 저장되게 함
        ownerZombieCount[msg.sender]++;
        NewZombie(id, _name, _dna);
    } 

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }
    //chapter 9. external internal
    //external: 함수가 컨트랙트 바깥에서만 호출될 수 있고 컨트랙트 내의 다른 함수에 의해 호출될 수 없다.
    //internal: 함수가 컨트랙트를 상속하는 컨트랙트에서도 접근이 가능하다. 거의 private와 흡사함. 
    function createRandomZombie(string _name) internal {

        /*챕터 4. Require===============
        특정 조건이 참이 아닐 때 함수가 에러메세지를 발생하고 멈추게 된다. 
        */
        require(ownerZombieCount[msg.sender] == 0);
        //0이 아닐때 에러값이 출력. 맞아야지만 계속 코드가 진행됨
        //==============================*/
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

contract ZombieFeeding is ZombieFactory {
    
}

2-2. zombieFactory2-1.sol

pragma solidity ^0.4.19;

// 여기에 import 구문을 넣기
import "./zombiefactory2.sol";


//chapter 10. 다른 컨트랙트와 상호작용하기
//인터페이스를 정의해야함.
contract KittyInterface {
  function getKitty(uint256 _id) external view returns (
    bool isGestating,
    bool isReady,
    uint256 cooldownIndex,
    uint256 nextActionAt,
    uint256 siringWithId,
    uint256 birthTime,
    uint256 matronId,
    uint256 sireId,
    uint256 generation,
    uint256 genes
  );
}

contract ZombieFeeding is ZombieFactory {

    //chapter11. 인터페이스 활용하기
    address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;
    // `ckAddress`를 이용하여 여기에 kittyContract를 초기화한다
    KittyInterface kittyContract = KittyInterface(ckAddress);
    //챕터 7. Storage vs Memory
    //Storage는 영구적으로 저장되는 변수
    //함수 외부에 선언된 변수는 상태변수라고 하는데 storage로 선언이 된다.
    //Memory는 임시적으로 저장되는 변수
    //험수 내부에 선언된 변수는 memory로 자동 선언이 된다.
    //rnwhcpdhk qodufdmf cjflgkf Eo 
    // function feedAndMultiply(uint _zombieId, uint _targetDna) public {
    
    //CHAPTER13.IF문 >>javascript와 동일함
    // 여기에 있는 함수 정의를 변경:
    function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) public {
        require(msg.sender == zombieToOwner[_zombieId]);
        //아예 다른 파일에 있는 함수를 그대로 가져올 수 있음. 
        //import한 파일의 구문을 그대로 가져올 수 있다.
        newDna = newDna - newDna % 100 + 99;//챕터 13
        //챕터 8
        Zombie storage myZombie = zombies[_zombieId];
        _targetDna = _targetDna % dnaModulus;
        uint newDna = (myZombie.dna + _targetDna) /2;

        //챕터 13 if문 추가
        if(keccak256(_species) == keccak256("kitty")){
            newDna = newDna - newDna % 100 + 99;
        }
        _createZombie("NoName", newDna);
  }
    //chapter12. 다수의 반환값 처리하기
    //고양이 유전자를 얻어내는 함수 작성하기
        function feedOnKitty(uint _zombieId, uint _kittyId) public {
        uint kittyDna;
        (,,,,,,,,,kittyDna)= kittyContract.getKitty(_kittyId);
        //함수에서 return 선언하는 것이 아니라 쓰는데에서 쓰는 함수가 여러개의 인자값을 반환하면 
        //쓸 때 아예 변수로 지정하고 쓰는 것이다. 
        //genes를 kittyDna에 담는 것이 (,,,,,,,,,kittyDna)로 표현이 된다. 
        feedAndMultiply(_zombieId, kittyDna,"kitty");//챕터 13에서 kitty추가
    }

}
https://share.cryptozombies.io/ko/lesson/2/share/わかりません。