brunch
매거진 개발실습

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

스마트 컨트랙트 공부

by SKKRYPTO


1*2fu6l5fK-vz7vHWWnngeog.jpeg


지난 Lesson 2에 이어서 Lessson 3 바로 시작하겠습니다.

레슨 3에서는 고급 솔리디티 개념에 대해서 배운다고 하네요


1*P-ocuJt4yZKvEKBaZoX28A.png


챕터 1은 컨트랙트의 불변성에 대해서 이야기 하고 있습니다. 스마트 컨트랙트가 한번 배포하게 되면 고칠 수 있는 방법이 없다고 하네요. 또한 외부 의존성으로 저번 레슨 2에서 크립토 키티 컨트랙트 주소를 고정으로 좀비 컨트랙트에 넣었는데 이 크립토 키티 컨트랙트가 문제가 생길 시 주소를 바꿀 수 있도록 다른 함수를 만들어 본다고 합니다.


1*FVeTH71zGcOH78em6y8Utw.png


그래서 다음과 같이 키티 인터페이스의 주소를 바꿀 수 있게 외부에서 어드레스를 받아 올 수 있는 함수를 추가하였습니다.


1*Pz4uLXIm0KBpBblfxOXnRw.png


여기선 방금 전에 만든 코드의 취약점을 설명하면서 누구든 키티 컨트랙트 주소를 바꿀 수 있으므로 컨트랙트 소유자만이 바꿀 수 있게 하는 방법을 알려줍니다. 바로 Ownable 컨트랙트를 통해서 말이죠.


1*4iX6aUfBHvqvBDn9qrFJvQ.png


다음과 같이 코드를 바꾸어 줍시다.


1*NMWJkuZIQDrCFd5lEJ7rSw.png


챕터 3에서는 함수 제어자에 대해서 설명하고 있습니다. 함수 제어자가 어떤 flow로 실행되는지 설명하고 있네요. 설명들을 한번 읽은 후 코드에다가 제어자를 추가해 줍니다.


1*ZkALX6KQVPFIsnlBYjPCjg.png



1*6ThRLyXAF5cf33nhCHqpDg.png


챕터4 에서는 가스에 대해서 소개하면서 가스가 무엇이고 왜 필요한지, 가스를 아끼기 위한 방법이 무엇인지에 대해서 알려줍니다. uint 같은 경우 struct의 안을 빼고는 uint8, uint16 등등 아무거나 써도 상관없다고 합니다!


1*c5oebWPHQoSPVpDr1_9Ozw.png


구조체에다가 직접 해보기 코드를 작성해 줍니다.

1*9_s2lHLPzsKwmhc9dLuZGA.png


챕터 5에서는 시간단위에 대해서 설명하면서 솔리디티에서 기본적으로 제공하는 now에 대한 설명과, 직접 해보기에서 좀비들이 공격하거나 먹이를 먹은 후에 1일이 지나야만 다시 공격할 수 있는 쿨타임 같은 것들을 만드는 것을 해봅니다.


1*TNeY0tIqx052i3agD2-83A.png


쿨다운타임이라는 변수를 만들고 전 챕터에서 만든 레벨과 레디타임을 새로운 좀비를 만들때 인수로 전달해 주기 위해 넣어줍시다.


1*EIvObpGul627bV3nG-67Sw.png


챕터 6에서는 좀비 재사용 대기시간을 구현하는 것과 구조체를 인수로 전달하는 방법에 대해서 소개합니다.

1*gZ_9fWlYgqlAtYJKuilqKQ.png


좀비 구조체를 인수로 전달하여서 그 구조체 안에 존재하는 좀비의 readytime을 설정해주고 밑의 isReady함수에서는 bool 형식을 반환하여서 좀비 레디타임이 충분한 시간이 지나 다시 먹거나 공격할 수 있느 시간이 되면 true를 반환하고 그렇지 않으면 false를 반환합니다.


1*u0nuDywlr34mwHUbEKnwvA.png


챕터 7에서는 기존 feedAndMultiply 함수가 public으로 되어 있어서 아무나 사용 할 수 있기 때문에 internal로 만들어 다른 함수에 의해서만 만드는 방법을 소개하여 직접 해보기에서 만드는 과정을 볼 수 있습니다.


1*RFNX6w0LsmfbcPEOyuvoaQ.png


다음과 같이 코드를 짜 줍시다.


1*m6hEO_TnrXGALaTc7GR_mw.png


챕터 8에서는 인수를 가지는 함수 제어자에 대해서 소개하고 있네요. 인수를 받아서 제어자가 어떤 조건을 만족시킬때 실행되게 할수 도 있습니다.


1*RHjxFOOWE9XJDWEoxY-dqw.png


1*JXfVZxS0Td2MiH_7o--bIw.png


챕터 9에서는 전에 만든 제어자를 통해서 좀비 제어자를 만듭니다.


1*vX0dNeRE7fSML5HlOYY9ug.png


좀 전에 만든 aboveLevel을 통해 레벨이 2 이상인 경우에만 이름을 바꾸고 레벨이 20 이상인 경우에만 좀비 Dna를 바꿀 수 있게 합니다.


1*G6kum9bp5JqVBHKJvH_TYQ.png


챕터 10에서는 가스를 소모하지않고 좀비 군대를 볼 수 있는 view 함수에 대해서 소개합니다.


1*XohYoPWcFpe4dMLqmPe-LA.png


함수를 만들어 줍시다.

1*tPVW3imJsytEc3eOzb95lA.png


챕터 11에서는 storage와 memory의 차이에 대해서 설명하고 있습니다. storage의 경우 블록체인에 영구적으로 기록되는 것이고 memory의 경우 함수가 끝날 때 까지만 존재하므로 가스 소모 측면에서 우세합니다.

1*7JX2WHYMPVENS4gfbz9lnQ.png


external view 를 통해 가스비를 쓰지 않고 특정 사용자가 소유한 모든 좀비를 uint[] 배열 형식으로 볼 수 있게 다음과 같이 코드를 적어줍니다.


1*uItzfhUw_CqZEDpKoKp_mA.png


챕터 12에서는 함수 내에서 배열을 다룰 때 storage가 아닌 for문을 써야 하는 이유에 대해서 좀비의 주인이 바뀌었을 때 특정 사용자의 좀비 요소에만 접근해서 볼 수 있게 하여 가스비를 for문을 통해 줄이는 방법에 대해서 이야기합니다.


1*izdqFNJZ1kBnL9WbXZsmGw.png


따라서 다음과 같이 for 문을 작성하여 좀비중에 _owner의 좀비가 맞는지 확인하여 맞으면 그 좀비의 ID를 result배열에 추가해줍니다.


1*5_Y8TUpue2rwDqVmS76yxA.png


챕터 13에서는 지금까지 한 실습 내용의 요약과 좀비의 이름을 바꿀 수 있게 해주는 창이뜹니다. 한번 씩 해보시면 오른쪽 좀비의 이름이 바뀌시는 것을 볼 수 있을 것입니다.

이것으로 Lesson3 를 마치고 Lesson4로 찾아오겠습니다. 감사합니다.




이정민(dlwoabsdk@gmail.com)

keyword
매거진의 이전글[크립토 좀비 실습] - Lesson 2