인터페이스는 다른 컨트랙트에 있는 함수를 불러올 수 있는 길을 터주는 역할을 한다.
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");
}
'솔리디티 > 크립토좀비' 카테고리의 다른 글
레슨3 챕터2, 3 - 소유 가능한 컨트랙트, 함수제어자(modifier) (0) | 2022.02.17 |
---|---|
레슨3 챕터1 - 컨트랙트 불변성(Immutable) (0) | 2022.02.17 |
레슨2 챕터9 - 함수 접근 제어자 (0) | 2022.02.12 |
레슨2 챕터 7, 8 - storage, memory (0) | 2022.02.12 |
레슨2 챕터 5, 6 - 상속 / import (0) | 2022.02.12 |
댓글