본문 바로가기
개발 학습/블록체인

S4: 다른컨트랙트 와 상호작용하기

by StelthPark 2021. 12. 2.

블록체인상에 올라와있는 다른 컨트랙트와 상호작용하여 해당 컨트랙트 내부에 있는 함수를 사용할 수 있다.

contract NumberInterface {
  function getNum(address _myAddress) public view returns (uint);
}

다음과 같이 컨트랙트에서 인터페이스를 이용할 수 있지:

contract MyContract {
  address NumberInterfaceAddress = 0xab38...
  // ^ 이더리움상의 FavoriteNumber 컨트랙트 주소이다
  NumberInterface numberContract = NumberInterface(NumberInterfaceAddress)
  // 이제 `numberContract`는 다른 컨트랙트를 가리키고 있다.

  function someFunction() public {
    // 이제 `numberContract`가 가리키고 있는 컨트랙트에서 `getNum` 함수를 호출할 수 있다:
    uint num = numberContract.getNum(msg.sender);
    // ...그리고 여기서 `num`으로 무언가를 할 수 있다
  }
}

예시

1. 블록체인에 업로드 되어있는 크립토키티의 컨트랙트에서(외부) 크립토키티의 데이터를 가져올수 있도록

KittyInterface로 인터페이스를 만들고 크립토키티내부에 있는 getKitty함수를 그대로 작성해서 인터페이스를 완성시킨다.

 

2. 사용할 함수 내부에 크립토키티의 컨트랙트 주소를 사전에 만든 인터페이스의 인자로 넣어 KittyInterface로 kittyContract 를 정의한다. 

이 과정을 통해 kittyContract로 크립토키티의 컨트랙트를 사용할 수있게 되고 kittycontract.getKitty로 함수를 사용할수 있게 된다.

 

3. getKitty의 리턴값으로 여러 값을 리턴 받을 수 있는데(솔리디티 특징) 차례대로 총 10개의 리턴값을 받을 수 있다.

받을 값만을  (, , , , , , , , , kittyDna) = kittyContract.getKitty(_kittyId); 

, 쉼표로 구분하여 맨뒷 값 genes를 변수명 kittyDna로 받게 되는것이다.

kittyDna = genes

 

댓글