크립토 좀비 1-1. 좀비 공장 만들기

2022. 3. 30. 10:35개발 잡부/블록체인

728x90

블록체인에 대한 기초적인 지식을 위해
이 튜토리얼을 공부해보기로 했다.
(무려 한국어 지원도 해준다)


1. 레슨 개요

3줄요약하면

1. 공장에서 좀비를 만들 것이다.
2. 각 좀비는 랜덤하고 독특한 외형을 가진다.
3. 이 새로운 좀비를 만드는 함수를 만들것이다.

끝!


2. 컨트랙트

솔리디티 코드는 컨트랙트 안에 싸여있다.
컨트랙트는 이더리움 어플리케이션의 기본적인 요소다.

모든 변수와 함수는 한 컨트랙트에 속하게 된다.


Version Pragma

모든 솔리디티 코드는 'pragma solidity'로 시작해야하는데,
버전에 따라 컴파일 내용이 바뀔수 있기 때문에 적는 것이다.


정답

pragma solidity ^0.4.19;

contract ZombieFactory {

}

3. 상태 변수 & 정수

상태 변수란 컨트랙트 저장소에 영구적으로 저장된다.
즉 글로벌하며, 데이터베이스에 데이터를 쓰는 것과 같다.


자료형

uint: 부호없는 정수
int: 부호 있는 정수


정답

pragma solidity ^0.4.19;

contract ZombieFactory {

    // 여기서 시작
    uint dnaDigits = 16;
}

4. 수학 연산

덧셈, 뺄셈, 곱셈, 나눗셈, 나머지, 지수연산은
자바스크립트와 동일하다.

덧셈: x + y;
뺄셈: x - y;
곱셈: x * y;
나눗셈: x / y;
나머지: x % y;
지수연산: x ** y; (x^y와 같음. 5 ** 2 = 5^2 = 25)

정답

pragma solidity ^0.4.19;

contract ZombieFactory {

    uint dnaDigits = 16;
    // 여기서 시작
    uint dnaModulus = 10 ** dnaDigits;
}

5. 구조체

C와 문법이 유사한데,
여러가지 프로퍼티를 가지는 자료형이다.

struct Person {
  uint age;
  string name;
}

정답

...

    // 여기서 시작
    struct Zombie {
        string name;
        uint dna;
    }

...

6. 배열

정적 배열과 동적배열에 대해 알아보자.

정적 배열은 크기가 정해져있으며, 자료형 뒤에 [n]과 같이 적는다.
동적 배열은 크기가 사용할수록 늘어나며, 자료형 뒤에 []와 같이 적는다.


public 키워드

자료형 뒤, 이름 앞에 public을 붙여서 다른 컨트랙트가
이 변수에 접근할 수 있도록 한다.

Person[] public people;

정답

...

    // 여기서 시작
    Zombie[] public zombies;

...

7. 함수 선언

솔리디티의 함수 선언은 자바스크립트와 유사하다.

// 선언
function eatHambergers(string _name, uint _amount) {

}

// 호출
eatHamburgers("vitalik", 100);

정답

...

    // 여기서 시작
    function createZombie(string _name, uint _dna) {
        
    }

...

8. 구조체와 배열 활용하기

구조체를 통해 객체 생성하기

Person satoshi = Person(172, "Satoshi");

생성자를 이용하지만 new 키워드는 사용하지 않는다.

그리고 생성자의 인자는 곧 구조체에 등록된 변수의 순서와 같다.
즉, a, b, c로 구조체 A가 선언이 되었다면 A(a, b, c)의 순서로 넣어야 한다.


배열에 객체 넣기

Person[] public people;
people.push(satoshi);

자바스크립트와 마찬가지로
배열에 추가한다.


정답

...

    function createZombie(string _name, uint _dna) {
        // 여기서 시작
        zombies.push(Zombie(_name, _dna));
    }

...

9. private / public 함수

기본 선언값은 public이다.
하지만 외부에서 접근이 가능하므로
외부에서 사용할 함수가 아니라면
private으로 작성해야한다.


선언

function _ABC() private {

}

함수 뒤에 private / public 키워드를 붙인다.

또한 private함수는 함수명 앞에 _를 붙이는게 관례다.


정답

...

    function _createZombie(string _name, uint _dna) private {
        zombies.push(Zombie(_name, _dna));
    }

...

10. 함수 더 알아보기

반환값과 함수 제어자에 대해 알아보자.


반환값

function sayHello() public returns (string) {
  return greeting;
}

선언할 때 public / private뒤에 returns (자료형)으로 표시한다.

선언에는 값이 아닌 자료형만을 선언하며
함수 내부에서 실제 값을 반환한다.


함수 제어자

view는 값을 변경하지 않고 참조만 하는 경우에 사용된다.
pure은 앱에서 참조도 하지 않고, 인자값에 따라서만 작동한다.

public / private 뒤, returns 앞에 배치한다.

// view
function sayHello() public view returns (string) {
  return greetings;
}

// pure
function _multiply(uint a, uint b) private pure returns (uint) {
  return a * b;
}

정답

...

    // 여기서 시작
    function _generateRandomDna(string _str) private view returns (uint) {
        
    }

...

11. keccak256과 형변환

keccak256

keccak256은 SHA3의 한 버전인 내장 해시 함수다.
해시 함수는 랜덤한 256비트 16진수로 매칭한다.

단, 이 함수는 안전하지 않지만
이 예제에서는 쓸 수 있으니 그대로 진행한다.

안전한 의사 난수를 발생하는 방법을
따로 찾아 공부해보자.


형변환

변환하고자 하는 형식을 생성자처럼 사용한다.

uint8 a = 5;
uint b = 6;
uint8 c = a * uint8(b);

정답

...

    function _generateRandomDna(string _str) private view returns (uint) {
        // 여기서 시작
        uint rand = uint(keccak256(_str));

        return rand % dnaModulus;
    }

...

12. 종합하기

정답

...

    // 여기서 시작
    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }
    
...

13. 이벤트

이벤트는 컨트랙트가 블록체인 상에서
앱의 사용자가 액션을 했을 때 발생하는 것이다.

이벤트를 구독하면,
해당 이벤트가 발생했을 때 함수를 실행할 수 있다.

event IntegersAdded(uint x, uint y, uint result);

function add(uint _x, uint _y) public {
  uint result = _x + _y;
  
  IntegersAdded(_x, _y, result);
  return result;
}

정답

...

    // 여기에 이벤트 선언
    event NewZombie(uint zombieId, string name, uint dna);

...

    function _createZombie(string _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        // 여기서 이벤트 실행
        NewZombie(id, _name, _dna);
    }
    
 ...

14. Web3.js

사용자가 사용할 수 있게 자바스크립트 코드를 적어야 한다.

코드의 흐름은 다음과 같이 진행된다.

1. 주소, abi 입력
2. 버튼 클릭 시 새 좀비 생성
3. 좀비 생성시 이벤트(NewZombie)가 발생, 화면을 재구성함.

후기

확실히 자바스크립트와 유사해서 쉬웠던 것 같다.
하지만 다른 부분도 많기 때문에 익숙해져야 할 것 같다.