[몰라도 해보는 cryptoZombie] Lesson3. 고급 솔리디티 개념 – 1

in #kr6 years ago (edited)

image.png

https://cryptozombies.io/ko/course

챕터 1: 컨트랙트의 불변성

image.png

다른 프로그램과 달리 contract는 배포되면 수정할 수 없다! 그래서 애초에 프로그램을 짤 때 수정할 수 있는 상황을 고려해서 프로그래밍 해야한다. (말이야 편하지… 누가 그런걸 알 수 있단 말인가!) 크립토좀비에서는 크립토키티에서 치명적인 문제가 발생할 경우를 가정한다. 크립토키티에서 치명적인 문제가 발생할 경우 크립토키티의 함수를 불러오는 부분 자체를 사용하지 못하게 되니까! 그래서 크립토키티의 컨트랙트 주소를 직접 써넣는 방법대신 변수로 할당하여 상황에 따라 다른 컨트랙트 주소를 적을수 있게끔 코드를 다시 써야한다.

contract ZombieFeeding is ZombieFactory {

    address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;

    KittyInterface kittyContract = KittyInterface(ckAddress);

이런 contract를..

contract ZombieFeeding is ZombieFactory {

  KittyInterface kittyContract;

  function setKittyContractAddress(address _address) external {
        kittyContract = KittyInterface(_address);
  }

이렇게 고쳐야한다.

chAddress의 크립토키티 주소를 지우고, 해당 주소를 할당 받는 함수를 만들어 인터페이스에 집어넣는 식으로 컨트랙트를 고쳤다. 그런데 여기서 문제가 발생한다. 외부에서 이 함수를 사용할 수 있게 하려고 external을 선언했는데.. 그 결과 아무나 이 함수를 소환해서 우리가 참조하려는 컨트랙트의 주소를 마음대로 바꿀 수 있게 되었다. 이건 막아야 하지 않을까..

챕터 2: 소유 가능한 컨트랙트

image.png

그래서 크립토좀비에서 선택한 방법은 해당 컨트랙트를 소유가능하게 만들어서 나만의 것으로 만들어 버리는 것이다. external 선언으로 외부에서 접근할 수 있지만 나만이 쓸 수 있게끔 만들어 두는 것이다. 다행히도 이런 부분의 필요성을 느낀 누군가가 미리 만들어 두었다. OpenZeppelin라이브러리에서 Ownable 컨트랙트를 상속해서 내 컨트랙트로 만드는 것이다. (시간이 되면 Ownable 컨트랙트 내용을 읽어보는 것도 재밌다. 아직 배우지 않은 내용들이 나오지만 아는 부분만 읽어도 읽히는 재미가 있다)
함수를 상속하는 법은 예전에 다루었던 내용과 별반 다를 것 없다. import해오고 contract 선언부에 is로 상속!

pragma solidity ^0.4.19;

import "./ownable.sol";

// 2. 상속을 추가하게:
contract ZombieFactory is Ownable {

가뿐하다!

챕터 3: modifier

image.png

함수제어자.. 한글이 더 어렵다. 그냥 modifier라고 하지.. 우리가 원하는 함수자체에 require문을 추가해서 특정 조건이 만족할 때 만 실행되게 만드는 방법이 있지만, modifier를 통해 require문을 적용할 수 있다.
modifier의 선언은 함수 선언하듯 해주면 된다.

modifier onlyOwner() {
      require(msg.sender == owner);
      _;
}

이렇게 선언을 해주면 함수 작동하듯이 require문이 작동하게 된다. _; 이건 뭐지 싶다. _; 이 부분은 우리가 원래 동작시키려는 함수가 여기에 들어가면 된다고 알려주는 부분이다.

문제에서 요구하는 대로 함수제어자를 추가하자.

  function setKittyContractAddress(address _address) external onlyOwner {
      kittyContract = KittyInterface(_address);
  }

이렇게 선언을 해주게 되면 setKittyContractAddress 함수가 실행될 때 onlyOwner라는 modifier를 먼저 실행한다. 그리고 _;를 만나면 다시 setKittyContractAddress를 실행한다. 이름이 특이해서 그렇지 전혀 어려운 개념이 아니다. 함수 실행 전에 modifier부터 실행하고, 돌아와서 함수를 마무리하게 하는 명령어다.


참고문헌
https://d2fault.github.io/2018/03/19/20180319-about-solidity-1/

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

Sort:  

간만에 콜라보래이션

[골든티켓x짱짱맨x weee] 18-2차 현타토끼 이모티콘 증정 !
https://steemit.com/goldenticket/@goldenticket/x-x-weee-18-2

참여하세요!

짱짱맨 출석부 호출로 왔어요.

감사합니다~ : )

잘 읽었습니다 @could0222님 어렵지만 왠지 큰 도움이 될것 같네요

감사합니다!!ㅎㅎ 이건 제가 공부하겠다고 올리는거라.. 도움이 크게 되실지 ㅠㅠ 이렇게 응원해주시는 분들을 위해 쉽게 정리한 solidity 내용을 포스팅해야겠다는 다짐을 해봅니다!!

modifier를 함수제어자라고 하는군요. 잘봤습니다.

항상 감사합니다 ㅎㅎ

솔리디티로 만드는 크립토 좀비 강의글을 매일 올려주시는데,
편하게 보고 있는 제가 더 감사합니다.