[몰라도 해보는 cryptoZombie] Lesson1. 좀비 공장 만들기 - 4

in #kr6 years ago


https://cryptozombies.io/ko/course

챕터 10: 함수 더 알아보기

함수 더 알아보기라고는 하는데… 더 알아보는건 아니고 덜가르친 내용을 마저 가르쳐주는 챕터이다.

return

일단 함수에는 return 값이라는 게 있다. 함수가 실행되고 밖으로 뛰쳐나오게 되는 값이 return이다. Solidity의 return은 함수를 선언할 때 반환값의 데이터 타입을 설정해줄 수 있다는 것, 여러 개의 반환값을 가질수 있다는 것이 가장 큰 특징이다. 그래서 함수를 public이냐 private이냐 선언해주고 return이라 적지 않고 returns 라고 적는다. 그 뒤로는 괄호를 열어 반환할 데이터의 타입명을 적는다. 복수일 경우 콤마(,)로 구분해준다.

함수 제어자(x) 상태 제어자(o)

returns까지 힘들게 이해했는데 갑자기 앞에 view를 붙이고 pure를 붙이고 하면서 함수제어자라 가르쳐준다. 함수 제어자라고 불러야하나 상태제어자라고 불러야하나… 중요한건 호칭이 아니라 이걸 쓰는 이유이다.

앞서 챕터를 진행하면서 데이터를 블록체인에 세기는 스토리지와 잠깐 기억했다 날라가는 메모리에 대해 언급한적이 있다. 차후 설명하겠지만 이더리움의 소스를 실행하기 위해서는 gas라는 자원이 필요하다. 왜 이게 필요한지는 설명하지 않겠다. 하지만 매우 중요한 문제를 해결하기 위해 필요한 개념이다. 아무튼 프로그램을 실행시키면 가스를 소모하는데 가스가 부족하면 프로그램이 실행되다가 멈춰버린다. ‘가스 = 돈’ 이다. 블록체인 상에 데이터를 올리거나 가져다 쓸수록 가스비가 많이 들기 때문에 내 프로그램이 소모하는 가스를 줄이기 위해서는 필요할 때만 블록체인 상의 데이터를 다루게 해야한다.

이번 챕터에서 나온 view는 ‘우리 함수는 블록체인 데이터를 보기만 할께’라는 선언이고, pure는 ‘우리 함수는 블록체인 데이터 보지도 않어’라는 말이다. 즉, gas비를 줄이고 싶을 때, 블록체인까지 굳이 데이터를 세길 필요가 없다면 함수를 선언할 때 ‘가스비 안쓰는 함수야!’라고 선언을 해주는 거다.

이걸 어떻게 결정하는가..는 프로그램을 짤 때 생각해봐야하는 문제인데, 스토리지에 데이터를 저장할 필요가 없는 경우, 단순히 메모리만 사용해도 상관없는 경우라면 view나 pure를 선언해주면 된다. 챕터에서 요구한데로 코드를 짜보자.

function _generateRandomDna(string _str) private view returns (uint) {
        
}

뜯어서 읽어보면.. 함수를 선언하는데.. 함수명이 '_'이걸로 시작한다. 명명규칙이라 했다. Private을 쓴거 보니 아무나 이 함수를 쓰는게 싫은거다. Zombiefactory라는 contract에서만 사용하는 함수라고 못을 박은 거다. 함수이름을 보니 랜덤한 DNA를 만드는 함수인 것 같다. (함수명으로 함수의 기능까지 알 수 있게 지은 아주 좋은 이름이다.)

이 함수를 블록체인 상.. 그러니까 스토리지에 세길필요가 있을까? 단순한 랜덤 dna를 만드는 함수고 필요하다면 나중에 좀비 구조체안에 집어넣어 블록체인 상에 세기는 것이 가스비를 절약할 수 있는 방법일 것이다. 그래서 view를 쓴다. ‘블록체인 데이터 안 만져요. 보기만 할께요.’ 그리고 returns (uint)로 반환 하는 값이 숫자.

앞서 DNA는 16자리 숫자로 이루어져있다고 예전부터 노래를 불러왔으니..
그래서 이 함수는 아마 문자열을 입력받아 랜덤한 16자리 숫자를 만드는 역할을 할 것이다.

챕터 11: keccak256과 형 변환

Keccak256

뭐야 이 처음보는 단어는. 하지만 걱정할 필요 없다. Keccak256은 이더리움이 제공하는 해시함수 중 하나이다. 해시함수가 뭐냐고? 일종의 암호화라고 생각하면 된다. 내가 입력한 값을 난수로 바꾸어준다. 내가 어떤 정보를 입력하든 알아볼 수 없는 더러운 코드로 바꿔준다. 재미있는건 내가 같은 값을 입력하면.. 나오는 난수값은 같다.
Keccak256(“aaaab”); //를 입력했을 때
//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
//이런 수가 나왔다면, 100번 새로 시도해도 계속 위에 수가 나온다.

해쉬함수의 특징은 https://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98 위키백과를 통해 정리해보자.
아무튼 크립토좀비는 이 keccak256 함수를 사용해서 16자리의 random한 DNA를 만들려는 생각이다.

형변환

영어로는 casting이라고 하는데… 데이터 타입을 다른 걸로 바꿔주는 걸 형변환 이라고 한다. 여기서는 uint 데이터타입을 uint8로 바꿔준다.
uint는 알겠는데 uint8은 또 뭔가 싶다. 변수는 흔히 무언가를 담는 상자에 비유된다. uint 뒤에 붙는 숫자는 상자의 크기라고 생각하면 된다. 숫자가 클수록 큰 상자를 쓰는거라 생각하면되고, 8, 16, 32, 64, 128, 256 같은 숫자가 뒤에 붙을수 있다. 아무것도 안붙은 uint의 경우 그냥 제일 큰 상자 가져온 경우이다.

Q. 상자크기를 왜 구분해요?
A. 효율적으로 공간을 관리하기 위해서다. 과대포장하면 욕먹지 않는가? 그거랑 같다. 작은 상자로 해결할 수 있는걸 큰 상자를 쓰게되면 나중에 프로그램이 피곤해진다. 그래서 적당한 크기의 상자 사용이 중요하다.
캐스팅은 연산하는데 문제가 생기지 않게 상자의 종류를 맞춰주는 작업이다. 해보면 어렵지 않다.

그러면 크립토좀비의 함수를 완성해보자.

function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
}

_str을 따라 가보면 keccak256에 들어가 난수화 되고, 그 난수는 uint 형으로 형변환(캐스팅)된다. 그 이후 rand라는 변수 안에 저장된다. dnaMoulus에 무엇이 들어있는지 기억나는가? 0이 16개 붙어있는 10,000,000,000,000,000라는 숫자가 저장되어 있다. 얘로 rand를 나눈 나머지는 결국 16자리 숫자가 나오게 되는데.. 16자리 숫자로된 DNA를 구하는 함수를 이렇게 구성했다. 함수 구현 성공. 이제 우리는 문자열을 입력해서 랜덤한 16자리 DNA를 만들 수 있다.

챕터 12: 종합하기

배운걸 총동원해서 코드를 짜보라고 한다.
그래서 짰다.

function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}

_generateRandomDna에 입력받은 _name을 넘겨 random한 16자리 dna를 만들고 그걸 _createZombie 함수에 넘겨줘서 함수를 만든다.

가만.. 좀비랑 dna는 아무나 못만들게할려고 private을 달아줫으면서 createRandomZombie는 왜 public이지?????


참고문헌
https://d2fault.github.io/2018/03/19/20180319-about-solidity-1/
https://github.com/KimHunJin/Blockchain/wiki/Solidity-Tutorial

코어 이더리움 프로그래밍 – 박재현, 오재훈, 박혜영

Sort:  

챕터를 벌써 12까지 진행하셨어요~~ 와 빠르시네요.

한번할때마다 3챕터씩하다보니ㅋㅋ 내일이면 lesson1이 끝나요!! : )

챕터3개씩 주욱주욱 나가시는군요. 마지막 레슨까지 완료하고 나시면 스마트 컨트랙트 마스터가 되시겠어요~~

짱짱맨 출석부 호출로 왔습니다.

누추한곳에 방문해주셔서 감사합니다 : )

Coin Marketplace

STEEM 0.17
TRX 0.13
JST 0.027
BTC 60881.23
ETH 2600.77
USDT 1.00
SBD 2.56