스마트 컨트랙트 공부
자 저번에 마지막으로 보여드렸던 화면부터 다시 시작하겠습니다.
이 레슨에서는 좀비 군대를 만들기 위한 좀비 공장을 만들고 다음과 같은 조건을 따른 다고 합니다.
좀비 군대 내 모든 좀비의 데이터베이스를 유지한다
새로운 좀비를 생성하는 함수를 가진다
각 좀비는 랜덤하고 독특한 외모를 가진다
또한 좀비 DNA가 활용되는 방법으로 좀비의 외모는 다음과 같은 16자리 정수인 8356281049284737 에 따라 달라집니다.
여기서 83은 좀비의 머리타입, 56은 좀비의 눈 모양 등등으로 개별 특성과 매핑 되어있습니다. 간단하게 우측화면에서 머리 유전자만 한번 7로 바꾸어 보겠습니다. (참고로 이 튜토리얼에서는 좀비의 머리 타입이 7개만 있어서 이러한 매핑을 하기 위해 83 % 7 + 1 = 7 이라는 연산을 하여 머리 타입을 7개만 둡니다.)
짜잔~ 다음과 같이 좀비의 모자가 산타모자로 바뀌었네요.
이제 본격적으로 한번 컨트랙트로 넘어가 보겠습니다. 방금 전 화면에서 우측 하단에 있는 NEXT 버튼을 누르면 다음과 같이 컨트랙트를 설명하는 Lesson1의 챕터2로 넘어오게됩니다.
좌측에는 컨트랙트에 대한 기초 설명이 나와있으며 우측에는 직접 실습을 해볼 수 있는 창이 존재합니다. 좌측 설명을 한번 읽고 컨트랙트에 대한 기초 개념을 익히고 직접 해보기에 지시된 사항들을 코드로 옮겨 보았습니다.
다음과 같이 작성 하였습니다.
여기에서 pragma solidity 의 경우 솔리디티 버전을 선언하는 것이며 새로운 컴파일러 버전이 나와도 기존 코드가 깨지지 않도록 하는 역할을 합니다.contract는 이더리움 앱의 기본적인 구성 요소로 모든 변수와 함수는 한 컨트랙트에 속하고 여기가 시작지점입니다.
직접 해보기에서 언급한대로 우선 버전 0.4.19를 쓰고 ZombieFactory라는 빈 컨트랙트를 작성한 후 정답 확인하기를 누르면
이런 화면이 뜨면서 다음 챕터로 넘어가 실 수 있습니다.
이 챕터는 상태 변수와 정수에 관한 내용입니다. 상태변수는 컨트랙트 저장소에 영구적으로 저장되며 uint 자료형과 int형 자료형에 대한 차이로 부호없는 정수, 부호있는 정수라고 설명을 하고 있습니다. 직접 해보기로 dnaDigits 라는 변수를 만들어 보았습니다.
곧 바로 다음 챕터로 넘어갈 수 있는 창이 뜨면서 다음과 같은 화면으로 이동하였습니다.
이 챕터에서는 솔리디티에서 수학 연산이 가능하다는 것을 보여주고 있고 지수연산까지도 가능하다고 합니다!
그래서 직접 해보기에서와 같이 코드를 작성하였습니다.
다음 챕터로 넘어가면
구조체에 대한 설명을 하고 있습니다. 구조체의 경우 복잡한 자료형을 필요로 할 때 많이 쓰이는데요. 여기서 처음 보는 string 자료형의 경우 임의의 길이를 가진 문자형 데이터를 위해 활용되는 자료형입니다.
직접 해보기에 지시한 대로 다음과 같이 또 코드를 작성하였습니다.
다음은 챕터 6입니다.
여기서는 솔리디티 배열에 관해서 설명하고 있는데요 정적 배열과 동적 배열의 예로 자료형 대괄호 안에 숫자를 지정해주면 정적 배열이 되고 자료형 대괄호 안에 숫자를 넣지 않으면 동적 배열이 된다고 합니다. 구조체에서 또한 배열을 생성할 수 있고, public을 사용하여서 getter 메소드를 자동적으로 생성해주고,이러한 변수를 읽을 수 있게 만들어 줍니다.
마찬가지로 코드를 작성해주었습니다.
챕터 7입니다.
여기서는 함수 선언에 관해 다루고 있습니다.
하다 보니 함수에서 인자로 전달 받는 부분이 자바스크립트와 매우 비슷한것 같았습니다.
챕터 8입니다.
여기에서는 구조체에다가 배열을 활용하여 새로운 구조체를 생성하는 것에 대해서 다루고 있습니다. 우측 코드로 말하면 기존에 만들어 두었던 struct Zombie와 Zombie[] public zombies 라는 배열을 이용해서 createZombie 함수에 인자를 전달받아서 새로운 Zombie를 생성합니다.
챕터 9입니다.
솔리디티 함수는 기본적으로 public으로 선언되는데, 그렇게 되면 컨트랙트가 공격에 취약해 질 수 있으므로 private이라는 함수에 대해서 소개합니다. private은 컨트랙트 내의 다른 함수들만이 함수를 호출하도록 만들어 주는데요. 아까 private 함수명은 언더바로 시작하는 것이 관례 라고합니다. 아까 언급을 하지 못하였는데 function으로 받는 인자값들도 전역변수와 다르게 언더바를 사용하여 구분하는 것이 관례라고 합니다.
챕터 10 입니다.
함수의 반환값과 함수 제어자에 대해서 설명하고 있네요
함수에서 어떤 값을 반환 받기 위해서는 함수를 선언하고 뒤에다가 returns를 붙이고 어떠한 자료형을 반환받을지 작성해야합니다.
ex) function blabla() public returns ('자료형') {}
함수 제어자의 경우 상태를 변화시키지 않는 경우, 즉 어떤 값을 변경시키지 않고 단지 보여주기만 하거나 그런 경우에 view 함수를 사용하여 데이터를 보기만 하고, pure라는 함수도 가지고 있는데 이는 어떤 데이터도 접근하지 않고 전달된 인자에 따라서 달라지는 경우에 사용한다고 합니다.
ex) function _multiply(uint a, uint b) private pure returns (uint) { return a * b; }
챕터 11입니다.
이곳에선 내장 해시 함수인 keccak256이 보통 의사 난수 발생기로 이용한다는 것을 설명하고 형 변환에 대해서 언급하며 자료형이 다를 때 어떻게 문법을 작성해 주어야 하는 지에 대해서 설명하고 있습니다.
직접 해보기의 경우 전달받은 문자열을 이용해서 keccak256을 사용하여 16진수로 매핑한 값을 rand에 저장시켜서 그것을 16자리 수로 다시 반환하게 dnaModulus 라는 값으로 % 해줍니다.
챕터 12입니다.
지금까지 한것을 종합하여 랜덤 좀비 생성기를 종합하는 public 함수를 생성합니다.
챕터 13입니다.
컨트랙트 이벤트에 대해서 설명하고 있군요.
이벤트란 컨트랙트가 사용자가 블록체인 상에서 어떤 액션을 발생 시켰을 시에 일어나게 됩니다. 예시에서는 add라는 함수가 실행 되었을 때 이벤트를 발생시켜서 이 함수가 실행되었음을 알리고 있네요.
챕터 14입니다.
솔리디티 컨트랙트가 web3.js라는 자바스크립트 라이브러리를 이용하여 상호작용 한다고 합니다. 여기서는 아직 자바스크립트와 관련된 코드를 잘 몰라도 된다고 합니다.
직접해보기로 Q라는 좀비를 생성해보았습니다.
귀엽네요 ㅎㅎ
바로 넥스트를 눌러서 다음으로 넘어갔습니다.
자 이렇게 Lesson1이 끝났습니다. 다음은 Lesson2로 찾아뵙겠습니다. 감사합니다.
이정민(dlwoabsdk@gmail.com)