brunch

매거진 개발실습

You can make anything
by writing

C.S.Lewis

by SKKRYPTO Mar 06. 2020

[크립토 좀비 실습] - Lesson 2

스마트 컨트랙트 공부



지난 레슨1 에서는 랜덤 좀비 생성기 까지 만들어 보았습니다.            



이번에는 좀 더 재미있는 방식으로 좀비를 먹여서 좀비를 만든다고 합니다. 위의 그림에서 인간을 클릭하게 되면 좀비가 변하는 모습을 볼 수 있는데요 한 번씩 클릭해본 뒤 바로 다음으로 넘어 갔습니다.            



이 챕터 2에서는 매핑과 주소에 대한 설명을 하고 있었습니다. 여기서 새로운 자료형인 mapping과 address라는 개념을 소개하는데요 우선 주소의 경우

0x0cE446255506E92DF41614C46F1d6df9Cc969183

이와 같은 형태를 띄며(크립토좀비 팀의 주소라고하네요) 주소는 특정 유저(혹은 스마트 컨트랙트)가 소유한다 라는 점을 현재로선 이해하면 됩니다.

매핑의 경우

// 금융 앱용으로, 유저의 계좌 잔액을 보유하는 uint를 저장한다

mapping (address => uint) public accountBalance;

//혹은 userID로 유저 이름을 저장/검색하는 데 매핑을 쓸 수도 있다

mapping (uint => string) userIdToName;

이와 같이 사용하기도 한다고 합니다.

직접해보기의 경우      



다음과 같이 코드를 작성하였습니다.            



챕터 3에서는 Msg. sender를 이용하여 _createZombie 메소드를 업데이트 하려고 합니다. 여기서 msg.sender란 현재 함수를 호출한 사람의 주소를 가리킵니다.

따라서 직접해보기의 경우 다음과 같이 코드를 작성해줍니다.            



zombieToOwner의 경우 uint => address가 매핑 되어있으므로 uint id , msg.sender를, ownerZombiCOunt의 경우 address => uint 로 매핑이 되어있으므로 msg.sender와 증가 한 수 만큼 저장합니다.            



챕터 4에서는 유저가 좀비를 무한히 발생시키지 못하도록 require를 활용하는 방법에 대해서 소개하고 있습니다. 그래서 우측 화면에 현재 함수를 호출한 사람의 msg.sender 좀비의 수가 0이면 좀비를 생성할 수 있도록 하기 위해 즉, 개인당 좀비를 한번씩만 만들 수 있게하기 위해 require를 이용하여 다음과 같이 작성해줍니다.      



챕터 5입니다.            



여기서는 상속에 관해 설명하고 있는데 좌측 화면의 예시를 통해 보면 이해가 더 잘가서 참고 하시길 바랍니다.      


ZombieFactory를 상속하는 ZombieFeeding 이라는 새로운 컨트랙트를 만들었습니다.

챕터 6입니다.            



Import에 대해서 소개하고 있는데요. 여러 파일로 나누어 정리해 관리하기 편하게 하기 위해 사용한다고 합니다.      



여기서 ./는 동일한 폴더를 의미하며 이곳에서 zombiefactory.sol 이라는 파일을 import해서 불러오게 됩니다.            



챕터 7에서는 솔리디티에서 변수를 저장하는 공간인 storage와 memory에 대해 소개하며 상태변수들은 storage에 저장되고 함수 내에 선언된 변수들은 memory에 자동 선언되어 함수 호출이 종료되면 사라집니다. 이 키워드들은 함수 내의 구조체와 배열을 처리할 때 사용해야 합니다.            



다음과 같이 함수를 작성하고 좀비 주인만이 먹이를 줄 수 있도록 하여 require을 사용하여 msg.sender와 좀비 주인을 비교하는 것을 코드로 작성한다음 먹이를 먹는 좀비 DNA를 storage에 저장하기 위해서 zombies 배열의 zombieId 인덱스가 가진 값을 Zombie 형 변수 myZombie 라는 포인터에 부여합니다.            



이 챕터8에서는 좀비가 먹이를 후에 새로운 좀비 DNA를 계산하는 방법으로 두 DNA의 평균으로써 코드를 작성하였습니다.            



새로운 Dna를 계산할 때에 myZombie라는 포인터에서 myZombie.dna 를 이용해 dna를 가져와서 둘이 더한후 나눠줍니다.            



챕터 9에서는 함수 접근 제어자에 관한 설명입니다. 접근 제어자와 관련하여 public, private, internal, external이 있는데 함수가 정의된 컨트랙트를 상속하는 컨트랙트에서도 접근이 가능하게 하려면 private 대신 internal을 써야 하며 external의 경우 함수가 컨트랙트 바깥에서만 호출될 수 있어서 public과 차이를 가집니다.

따라서 코드를 다음과 같이 private -> internal로 바꾸어 줍니다.      





챕터 10은 다른 컨트랙트(여기선 크립토 키티)와 상호작용하기 위해 인터페이스를 정의하는 법에 대해서 말하고 있습니다. 이는 컨트랙트를 정의하는 것과 유사한데요. 다만 함수 몸체를 정의하지 않고 함수 선언을 세미콜론으로 간단하게 끝낸다는 것이 차이입니다.            



이렇게 좀비피딩에다가 크립토키티 인터페이스를 붙여줍니다.            



챕터 11에서는 챕터 10에서 작성한 인터페이스를 활용하는 방법에 대해서 다루고 있고 상호작용 하는 함수는 public이나 external로 선언되어 있어야 함을 알려줍니다.            



다음과 같이 작성하여 키티 컨트랙트가 다른 컨트랙트를 가리키고 있도록 만들어줍니다. (ckaddress는 크립토 키티 컨트랙트 주소가 입력되어 있음)            



챕터 12에서는 다수의 반환값을 처리하는 방법에 대해서 알려줍니다.      



다수의 반환값을 처리하기 위해 코드를 쉼표를 이용하여 작성해주어서 kittyDna에 kittyinterface 안에 있는 genes를 저장해주고 feedAndMultiply 함수를 호출해 타겟 dna를 kittyDna 인자로 전달시켜줍니다.            



챕터 13에서는 보너스로 고양이 좀비를 만드는 방법으로 if 문을 사용해서 kitty라는 인자를 전달 받으면 그것이 keccak256를 활용해 맞는지 확인하여 newDna 마지막 두자리를 99로 설정합니다. 그래서 코드는 다음과 같이 됩니다.            





이 화면에서 이제 고양이를 눌러서 좀비에게 먹여 고양이 좀비를 탄생시킬 수 있으며 자바스크립트와 web3.js를 활용하여 컨트랙트와 상호작용하는 예시를 좌측 화면에서 볼 수 있습니다.            



이렇게 Lesson2 까지 마쳤습니다. 다음에는 Lesson3에서 뵙겠습니다. 감사합니다 





이정민(dlwoabsdk@gmail.com

매거진의 이전글 [크립토 좀비 실습] - Lesson 1
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari