CryptoZombies #1 비망록

안녕하세요. 사토미입니다.
평소에는 dapps 개발, 블록체인 리서치 등을 하고 있습니다.
블록체인만 트위트하는 계정을 최근에 만들었습니다.
dapps, 해외 블록 체인 뉴스 ... etc => @ 사토민 _에서 v

이 항목은 CryptoZombies 비망록입니다.

CryptoZombies란?





Loom Network이 제공하는 Solidity 게임 감각으로 배울 수 있는 서비스.
※ Solidity: Ethereum에 배포하는 스마트 계약을 작성하기 위한 언어

아마 dapps 개발자가 한 번은 만지는 것이며 더 이상 통과 의례적인 서 위치.

개요



여섯 가지 수업이 있습니다.
  • 좀비 공장 만들기
  • 좀비가 인간을 공격한다
  • Solidity의 고급 개념
  • 좀비 전투 시스템
  • ERC721 및 크립트 모음
  • 앱 프런트 엔드 및 Web3.js

  • 6회로 나누어 각각의 정리를 두어 둡니다.

    1. 좀비 팩토리 만들기



    Solidity 컴파일러 버전의 선언.
    ※ CryptoZombies에서는 0.4.19를 지정한다.
    pragma solidity ^0.4.19;
    
    contract ZombieFactory {
    }
    

    이유: 향후 컴파일러 버전으로 인해 코드가 손상되는 것을 방지

    상태 변수 정의
    ※ 상태 변수: Ethereum 블록체인에 기록된다.
    pragma solidity ^0.4.19;
    
    contract ZombieFactory {
        uint dnaDigits = 16;
    }
    

    uint : 부호없는 정수 데이터 형식으로 256bit 별칭

    - 구조체



    여러 속성을 가진 데이터 형식을 만들 수 있습니다.
    pragma solidity ^0.4.19;
    
    contract ZombieFactory {
        uint dnaDigits = 16;  
        uint dnaModulus = 10 ** dnaDigits;
    
        struct Zombie {
            string name;
            uint dna;
        }
    }
    

    여기에서는 Zombie라고 하는 구조체를 작성해, string형의 name과 uint형의 dna를 가져오고 있다.

    - 배열



    메모리를 낭비하지 않도록 두 가지 유형의 배열이 있습니다.
    고정 길이 배열
    uint[2] fixedArray;
    

    가변 길이 배열
    uint[] dynamicArray;
    
    zombies 라는 배열을 만들고 createZombie function 안에서 새로운 Zombie를 배열에 저장한다.
    pragma solidity ^0.4.19;
    
    contract ZombieFactory {
    
        uint dnaDigits = 16;
        uint dnaModulus = 10 ** dnaDigits;
    
        struct Zombie {
            string name;
            uint dna;
        }
    
        Zombie[] public zombies;
    
        function createZombie(string _name, uint _dna) {
            zombies.push(Zombie(_name, _dna));
        }
    
    }
    
    

    - Private/Public



    Public : 누구나 계약의 함수를 두드려 실행할 수 있습니다.
    Private: 정의된 계약 내에서만 사용할 수 있습니다.
    ※ 디폴트는 Public 로 설정되어 있다.

    createZombie 함수를 Private 로 한다.
    그 때, createZombie => _createZombie 로 변경하는 것이 통례.

    - View/Pure



    View : 블록체인에 기록, 값의 변경, 쓰기를 할 수 없지만, 읽을 수 있다.
    Pure : 쓰기, 읽기 모두 할 수 없다.

    _generateRandomDna 함수를 private
    pragma solidity ^0.4.19;
    
    contract ZombieFactory {
    
        uint dnaDigits = 16;
        uint dnaModulus = 10 ** dnaDigits;
    
        struct Zombie {
            string name;
            uint dna;
        }
    
        Zombie[] public zombies;
    
        function _createZombie(string _name, uint _dna) private {
            zombies.push(Zombie(_name, _dna));
        } 
    
        function _generateRandomDna(string _str) private view returns (uint) {
            uint rand = uint(keccak256(_str));
            return rand % dnaModulus;
        }
    
    }
    
    

    returns (type) : 함수 선언에 반환 값의 유형 포함
    keccak256():16진수로 변환한 해시값을 구한다(같은 문자로부터는 같은 해시값)
    uint() : 형 캐스트

    지금까지 만들어 온 함수를 view 함수에 정리한다.
    pragma solidity ^0.4.19;
    
    contract ZombieFactory {
    
        uint dnaDigits = 16;
        uint dnaModulus = 10 ** dnaDigits;
    
        struct Zombie {
            string name;
            uint dna;
        }
    
        Zombie[] public zombies;
    
        function _createZombie(string _name, uint _dna) private {
            zombies.push(Zombie(_name, _dna));
        } 
    
        function _generateRandomDna(string _str) private view returns (uint) {
            uint rand = uint(keccak256(_str));
            return rand % dnaModulus;
        }
    
        function createRandomZombie(string _name) public {
            uint randDna = _generateRandomDna(_name);
            _createZombie(_name, randDna);
        }
    
    }
    
    

    - 이벤트



    ・ 계약상에서 발생한 것을 Dapps 등의 클라이언트에 통지할 수 있다.
    · 전달 된 매개 변수는 트랜잭션 로그에 보관됩니다.

    이벤트 선언은 이런 느낌.
    event EventName(type params);
    
    createRandomZombie 라는 이벤트를 선언하고 지정된 매개 변수를 전달합니다.
    NewZombie 함수 내에서 _createZombie 배열에 추가되면 이벤트를 발화시킵니다.

    좀비의 zombies 에는, 배열의 인덱스를 부여시킨다.id 함수가 배열의 요소수를 돌려주는 것을 이용해 array.push() 그리고 대응.
    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;
    
        function _createZombie(string _name, uint _dna) private {
            uint id = zombies.push(Zombie(_name, _dna)) - 1;
            NewZombie(id, _name, _dna);
        } 
    
        function _generateRandomDna(string _str) private view returns (uint) {
            uint rand = uint(keccak256(_str));
            return rand % dnaModulus;
        }
    
        function createRandomZombie(string _name) public {
            uint randDna = _generateRandomDna(_name);
            _createZombie(_name, randDna);
        }
    
    }
    
    

    DONE입니다, 고마워요.



    다음 번 : "좀비가 인간을 공격한다"



    bportal



    좋은 웹페이지 즐겨찾기