블록체인 공부 시작 방법 / 크립토 좀비 / Crypto Zombie / 이더리움 solidity Lesson 1 해석
본문 바로가기
Block Chain

블록체인 공부 시작 방법 / 크립토 좀비 / Crypto Zombie / 이더리움 solidity Lesson 1 해석

by 쏠수있어ㅤ 2022. 2. 10.
반응형

 

오늘부터 블록체인 개념을 잡기위해, 이더리움 언어인 솔리디티를 공부하려고 한다. 

솔리디티 언어는 2014년 이더리움 팀에서 만든 언어인데 현재 이더리움 프로젝트의 의 주요 언어라고 한다. 

솔리디티 언어를 재밌게 공부할 수 있는 크립토 좀비, Crypto Zombie 사이트를 추천받았다. 

 

이더리움 언어를 배울 수 있는 게임만들기st 사이트 

https://cryptozombies.io/ko

 

#1 Solidity Tutorial & Ethereum Blockchain Programming Course | CryptoZombies

CryptoZombies is The Most Popular, Interactive Solidity Tutorial That Will Help You Learn Blockchain Programming on Ethereum by Building Your Own Fun Game with Zombies — Master Blockchain Development with Web3, Infura, Metamask & Ethereum Smart Contracts

cryptozombies.io

쪼렙 개발자 내가 Lesson1 15챕터를 모두 끝내는데 한시간 반 정도가 걸렸으니 JavaScript나 언어 하나 이상 할 수 있는 분들은 30분 내로 가능할 듯 하다. 게임을 하며 solidity 언어를 물 흐르듯 자연스럽게(?) 배울 수 있었다.

Lesson1은 어떤 프로그래밍 언어든 간에 사칙연산, 변수, 함수, 클래스 등의 기본 개념만 알아도 쉽게 배울 수 있을 것 같다. 

 

 

Lesson 1 에서 완성한 코드 

// 해당 코드가 이용해야하는 솔리디티 버전 -> 새로운 컴파일러 버전이 나와도 기존 코드가 깨짐을 예방한다.
pragma solidity ^0.4.19; 

// 모든 코드는 항상 contract 컨트랙트 뼈대 안에 있다. 
contract ZombieFactory { 
	
    // 이벤트 실행 (나의 컨트랙트가 블록체인 상에서 나의 앱 사용자 단에 무언가 액션이 발생했을 때 알기 위함. 
    // 원하는 액션이 발생하면 -> 이벤트로 알려서 -> 그 이후의 작업을 진행할 수 있음. 
    event NewZombie(uint zombieId, string name, uint dna);

	// 아래 변수들은 블록체인에 영구적으로 ** 기록/저장된다. 
    // uint = unsigned integer = 0 ~ 2^256 values, 부호없는 정수 
    // int = integer = int256
    uint dnaDigits = 16; // uint 타입의 dnaDigits라는 변수에 16을 부여한다. 
    uint dnaModulus = 10 ** dnaDigits; // uint 타입의 dnaModulus라는 변수에 10의 16승 값을 부여한다.

    struct Zombie { // 클래스와 비슷한 struct. 여러개의 동일한 형태를 반복해서 만드는 경우 필요
        string name;  // string => " " 쌍따옴표 안에 있는 문자열을 말한다.
        uint dna;
    }

    // Zombie struct을 사용한 [] 배열인데 public 외부에 공개하며 이 배열의 이름은 zombies이다.
    // public = 다른 컨트랙트들이 이를 읽을 수 있다는 뜻 (쓸 수는 없고 only reading!) 
    Zombie[] public zombies; 

	// _createZombie라는 이름의 function = 함수이다. private 함수일 경우 "_" 언더바를 함수명 앞에 붙이는 게 관례
    // private이 있는 이유는 해당 함수는 공개하지 않는다. 
    // solidity의 함수는 기본이 public이므로 공개원치않을 경우 꼭 private 작성해주기
    // 인자값에 "_" <- 언더바를 붙이는 이유는 전역 변수와 구별하기 위한 관례
    function _createZombie(string _name, uint _dna) private {
    	
        // zombies라는 배열에 Zombie struct를 사용한 객체를 push 넣는다. 
        // 이에 대한 결과 값은 배열의 길이를 준다. -> 배열 길이에 -1 을 하면 마지막 요소의 index값이 나온다.
        // 여기에서는 그 값을 id라는 변수에 넣었다. (id는 0,1,2,3... 이렇게 만들어지게 됨)
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        
        // zombies 배열에 새로운 요소(새로운 좀비)가 push 되면 아래 이벤트를 실행한다. 
        NewZombie(id, _name, _dna);  // 
    }
	
    // 아래 함수 역시 private이어서 함수명 앞에 "_" 언더바가 붙었다. 
    // view = 함수가 데이터를 보기만 하고 변경하지 않는 경우이다. 아래 함수에서 보는 데이터는 dnaModulus
    // pure라는 것도 view의 자리에 쓸 수 있는데 pure는 함수가 앱에서 어떤 데이터도 접근하지 않는 것을 의미
    // 즉, 해당 함수 내용이 함수 인자값으로만 구성된 경우, 외부의 다른 변수를 사용하지 않는 경우
    // returns (타입) -> 이 함수는 해당 타입으로 반환한다.
    function _generateRandomDna(string _str) private view returns (uint) {
    
        // 이더리움이 내장 해시 함수로 가지고 있는 keccak256을 사용한다. 해시 함수 : 입력된 스트링을 랜덤 256비트 16진수로 매핑함
        uint rand = uint(keccak256(_str));
        
        // 해당 값을 10의 16승으로 나눈 나머지 값을 반환한다. (= 16자리만 반환한다.)
        return rand % dnaModulus;
    }

    function createRandomZombie(string _name) public {
    
    	// unsigned integer 타입의 randDna라는 이름의 변수에 인자값으로 받은 _name을 _generateRandomDna 함수에
        // 다시 인자값으로 넣어주어 반환된 16자리의 랜덤 해시 값을 담는다. 
        uint randDna = _generateRandomDna(_name);
        
        // _name과 위에서 만들어진 해시값을 _createZombie 함수 인자값으로 넣어 실행시킨다. -> zombies배열에 push -> 이벤트 알림
        _createZombie(_name, randDna);
    }

}

JavaScript와 비슷한 것 같다가도 타입을 앞에 적어주는 것이 JAVA 같기도 하다.  

Lesson 2 를 나가기 전 위의 내용을 잘 복습하고 공부해야겠다.

 

 

만약 틀린 점이 있다면 댓글 남겨주시면 감사하겠습니다 🙀

 

반응형

댓글