[TIL] Part2 - DAY41 Solidity - visibility, 인스턴스, 상속, TEST4(방게임)

박동우·2023년 5월 16일

블록체인 스쿨 3기

목록 보기
39/72

[TIL] 2023-05-16 DAY41


Solidity - visibility, 인스턴스, 상속, TEST4(방게임)

GIT 주소 : https://github.com/dowoo303/SOLIDITY


오늘 배운것들

  1. 다른 컨트랙트에 있는 변수를 변경시키는 것이 목적
    1) VISIBILITY
    - public
    - private
    - internal
    - external
    2) 인스턴스
    3) Estate(상속)
  2. TEST4
  3. TEST3 풀이

각종 팁

회고

  1. 다음 문제
    은행지기: 생성자 이용해서 오너 설정하고 private를 이용해서 오너만 접근이 가능하도록 만들기
  2. 복습할 때는 0번 코드 보고 하기



💻 Solidity 코딩

✅ VISIBILITY

  1. private와 internal로 선언할 경우 컨트랙트 실행창에서 보이지 않는다.
  2. private와 internal을 사용하기 위해서는 public함수 안에 넣어서 사용해야한다.
  3. 변수에도 internal(default), public, private가 설정 가능하다. -> 사용할때는 함수처럼 사용한다.
    ex) 인스턴스변수.변수();
  4. 변수화(인스턴스)시켜서 받으면 외부에서 접근한다고 여기고, 상속에서 접근하면 내부에서 접근한다고 인식한다.

✅ 상속(is)

  1. 다중상속: 부모는 여러개 있을 수 있다.
  2. 손자 상속: 만약 위 아이를 또 다른 아이에게 상속하면 부모, 아이 함수 모두 물려받는다.
  3. 자주 상속할 것 같은 함수의 경우 virtual을 미리 붙이는 것이 좋다. 그러면 상속받은 컨트랙트에서 override를 사용하여 부모 함수의 input갯수와 이름이 같은 함수를 상속받은 컨트랙트에서도 사용할 수 있다.
  4. virtual와 override는 동시에 사용할 수 있다.
  5. 부모로부터 받은 함수명이 둘다 같은 경우 override(함수명1, 함수명2)로 override 동시 표기가 가능하다.
  6. super: 부모 컨트랙트의 특정함수를 이용하고 싶을 때 사용.(상속받은 컨트랙트가 여러개일 경우 마지막에 적은 컨트랙트가 super가 된다)
  7. 상속받은 특정 함수를 이용하고 싶다면 인풋값 맞춰줘야함.
  8. internal은 컨트랙트 안에서만 쓸 수 있는 함수인데, 만약 이 컨트랙트를 상속 받았을 경우에 internal도 사용 가능하다. -> 다만 private는 상속을 받았어도 당연히 불가능 + external 또한 불가능해진다.
  9. 기본적으로 상속이라는 기능은 정말 그 컨트랙트의 정보를 전부 주는 것이 아닌 껍데기만 받아오는 것이다.

형태: 컨트랙트이름(아이) is 상속 컨트랙트 이름(부모)

🟥 코드: 상속과 인스턴스 했을 때 address 비교하기

/*
실습가이드
1. DAD의 getAddress() -> 제 지갑 주소
2. MOM의 husbandAddress(), husbandAddress2() -> MOM의 주소
3. CHILD의 fathersAddress(), fathersAddress2() -> 내 지갑 주소
4. CHILD의 daddyGetMsgSender(), daddyGetMsgSender2(), daddyGetMsgSender3() -> CHILD의 주소
*/

contract DAD {

    function getAddress() public view returns(address) {
        return address(this);
    }
}

contract MOM {
    DAD husband = new DAD();

    function getWallet() public view returns(uint) {
        return husband.wallet();
    }

    function husbandAddress() public view returns(address) {
        return address(husband);
    }

    function husbandAddress2() public view returns(address) {
        return husband.getAddress();
    }
}

contract CHILD is DAD {

    function fathersAddress() public view returns(address) {
        return DAD.getAddress();
    }

    function fathersAddress2() public view returns(address) {
        return super.getAddress();
    }

    DAD daddy = new DAD();
    DAD daddy2 = new DAD();

    function fathersWallet2() public view returns(uint) {
        return daddy.wallet();
    }

    function getDaddyAddress() public view returns(address) {
        return address(daddy);
    }

    function getDaddyAddress2() public view returns(address) {
        return daddy.getAddress();
    }

    function getDaddy2Address() public view returns(address) {
        return address(daddy2);
    }

    function getDaddy2Address2() public view returns(address) {
        return daddy2.getAddress();
    }
}

🟥 코드: 상속과 인스턴스 했을 때 지갑주소 비교하기

/*
실습가이드
1. DAD의 getMsgSender() -> 제 지갑 주소
2. MOM의 husGetMsgSender() -> MOM의 주소
3. CHILD의 dadGetMsgSender() -> 내 지갑 주소
4. CHILD의 daddyGetMsgSender(), daddyGetMsgSender2() -> CHILD의 주소
*/

contract DAD {
    uint a;

    uint public wallet=100; // 공개한 지갑 잔액
    uint internal crypto=1000; // 메모장에 private key가 있는 크립토 잔액
    uint private emergency=10000; // 진짜 비상금

    function getMsgSender() public view returns(address) {
        return msg.sender;  // 현재 내 지갑 주소가 나옴
    }
}

contract MOM {
    DAD husband = new DAD();
    
    function husGetMsgSender() public view returns(address) {
        return husband.getMsgSender();      // 현재 지갑 주소가 아닌 MOM 컨트랙트 주소가 나옴
    }
}

contract CHILD is DAD {

    function dadGetMsgSender() public view returns(address) {
        return super.getMsgSender();    // 현재 내 지갑 주소가 나옴
    }

    DAD daddy = new DAD();
    DAD daddy2 = new DAD();

    function daddyGetMsgSender() public view returns(address) {
        return daddy.getMsgSender();    // 현재 지갑 주소가 아닌 CHILD 컨트랙트 주소가 나옴
    }  
}

✅ 인스턴스

  1. 컨트랙트도 변수처럼 인스턴스화 시켜서 사용이 가능하다.
  2. 인스턴스화(변수화) 시킨 컨트랙트 주소와 실제 그 컨트랙트 주소는 다르다.

형태: (컨트랙트이름) (변수명) = new (컨트랙트이름());


profile
HELLO!

0개의 댓글