반응형
오늘부터 블록체인 개념을 잡기위해, 이더리움 언어인 솔리디티를 공부하려고 한다.
솔리디티 언어는 2014년 이더리움 팀에서 만든 언어인데 현재 이더리움 프로젝트의 의 주요 언어라고 한다.
솔리디티 언어를 재밌게 공부할 수 있는 크립토 좀비, Crypto Zombie 사이트를 추천받았다.
쪼렙 개발자 내가 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 를 나가기 전 위의 내용을 잘 복습하고 공부해야겠다.
만약 틀린 점이 있다면 댓글 남겨주시면 감사하겠습니다 🙀
반응형
'Block Chain' 카테고리의 다른 글
[Klaytn] 클레이튼이란? 안전한가? 클레이 코인 시세 (0) | 2022.02.24 |
---|---|
[solidity Ganache-cli web3 solc] smart Contract 만들어 배포하기 (0) | 2022.02.21 |
[SPDX란?] Warning: SPDX license identifier not provided in source file (0) | 2022.02.21 |
[블록체인] 이더리움 solidity 공부 크립토 좀비 level 2 해설 (0) | 2022.02.16 |
[블록체인] 머클 트리란? (Merkle Trees) (0) | 2021.09.01 |
댓글