본문 바로가기
솔리디티/크립토좀비

레슨2 챕터 10, 11, 12, 13 - 인터페이스

by 멸치김밥 2022. 2. 12.

인터페이스는 다른 컨트랙트에 있는 함수를 불러올 수 있는 길을 터주는 역할을 한다.

JS의 module.exports , require 와 비슷한 개념이다

인터페이스에 들어갈 함수는 { } 의 내용이 빠진채로 끝내주면 된다.

contract 인터페이슥 {
	function 함수다(매개변수) public returns (uint a, uint b);
}

이렇게 인터페이스가 정의 되면 다른 컨트랙트에서 가져다가 사용할 수 있다.

contract 멸치컨트랙트 {
	인터페이슥 인터컨트랙트;
	인터컨트랙트.함수다(매개매개);
}

 

크립토좀비에서 사용하고있는 형태에 의하면

나를 가리키고 있는 주소값을 다른 주소값으로 변경할 수도 있나보다.

contract 멸치컨트랙트 {
	address 남의주소 = 0xabc...
	인터페이슥 인터컨트랙트 = 인터페이슥(남의주소);
}

이렇게 하면 '인터컨트랙트'는 '내'가 아닌 '0xabc...'가 기준이 되게끔 초기화된다고 한다

그래서 msg.sender가 0xabc...를 가리키게 된다

 

그리고 반환하는 값이 두개 이상인 경우 반환받고 싶은 것만 골라서 받을 수 있다.

contract 멸치컨트랙트 {
	address 남의주소 = 0xabc...
	인터페이슥 인터컨트랙트 = 인터페이슥(남의주소);
	uint 골라담을변수;
	(,골라담을변수) = 인터컨트랙트.함수다(매개매개);
}

이렇게 하면 '함수다' 함수는 반환하는 값이 a와 b 두개이지만

b만 '골라담을변수'에 받을 수 있다.

 


챕터10 답

// getKitty 함수가 들어있는 인터페이스 정의
contract KittyInterface {
    function getKitty(uint256 _id) external view returns (
    bool isGestating,
    bool isReady,
    uint256 cooldownIndex,
    uint256 nextActionAt,
    uint256 siringWithId,
    uint256 birthTime,
    uint256 matronId,
    uint256 sireId,
    uint256 generation,
    uint256 genes
);
}

챕터11 답

// ckAddress주소로 초기화된 KittyInterface인터페이스를 kittyContract에 저장
KittyInterface kittyContract = KittyInterface(ckAddress);

챕터12 답

  function feedOnKitty(uint _zombieId, uint _kittyId) public {
    uint kittyDna; // 변수 선언
    // _kittyId를 매개변수로 전달한 getKitty 함수의 10개의 반환값 중
    // 앞의 9개는 반환받지 않고 10번째 반환값만 kittyDna에 담는다
    (,,,,,,,,,kittyDna) = kittyContract.getKitty(_kittyId);
    // 먹힌 kitty를 새로운 좀비로 만들기
    feedAndMultiply(_zombieId, kittyDna);
  }

챕터 13답 수정 전

  // 여기에 있는 함수 정의를 변경:
  function feedAndMultiply(uint _zombieId, uint _targetDna) public {
    require(msg.sender == zombieToOwner[_zombieId]);
    Zombie storage myZombie = zombies[_zombieId];
    _targetDna = _targetDna % dnaModulus;
    uint newDna = (myZombie.dna + _targetDna) / 2;
    // 여기에 if 문 추가
    _createZombie("NoName", newDna);
  }

  function feedOnKitty(uint _zombieId, uint _kittyId) public {
    uint kittyDna;
    (,,,,,,,,,kittyDna) = kittyContract.getKitty(_kittyId);
    // 여기에 있는 함수 호출을 변경: 
    feedAndMultiply(_zombieId, kittyDna);
  }

수정 후

  //                                                        매개변수 추가
  function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) public {
    require(msg.sender == zombieToOwner[_zombieId]);
    Zombie storage myZombie = zombies[_zombieId];
    _targetDna = _targetDna % dnaModulus;
    uint newDna = (myZombie.dna + _targetDna) / 2;
    // 전달받은 인자와 kitty의 해시값이 같으면
    if(keccak256(_species) == keccak256("kitty")){
        // DNA값 마지막 두자리를 99로 변경
        newDna = newDna - newDna % 100 + 99;
    }
    _createZombie("NoName", newDna);
  }

  function feedOnKitty(uint _zombieId, uint _kittyId) public {
    uint kittyDna;
    (,,,,,,,,,kittyDna) = kittyContract.getKitty(_kittyId);
    //                                   매개변수 추가
    feedAndMultiply(_zombieId, kittyDna, "kitty");
  }

댓글