shnae·2024년 1월 3일
0
post-thumbnail

Solidity

상속

기능들만 물려주는 것이지 속 내용까지 물려주는 것이 아니다. 기능 제공용으로만 사용되는 경우가 많다.
-> 상속 받은 것은 상속해주는 것을 바꿀 수 없다!

IS 뒤에 마지막으로 선언된 컨트랙트가 모든 것을 오버라이드한다.

virtual 함수 이름이 중복된 경우

override(//오버라이드할 함수를 적는다)

function who() override(DAD,MOM) public pure returns (string memory) {
	return 
}

Super

위에 있는 것을 뜻하는 것
virtual-override를 빼고 super만 사용해도 된다

손자상속

virtual

덮어쓰기용으로 제공되는 함수
덮어쓰는 함수에 override와 함께 사용된다

visibility

내부란?

컨트랙트 안

  • 외부에서 내부 함수에 접근할 때에는 외부 함수를 통해 접근하는 방법을 사용한다

Internal

Private

오로지 컨트랙트 안에서만 접근할 수 있다.
상속된 컨트랙트에서 사용할 수 없다.

외부란?

컨트랙트 밖 ex) 실행하는 위치

Public

External

상속된 컨트랙트에서 사용할 수 없다.

변수

internal 함수를 절대 건드리면 안된다

  • 유저가 아닌 오너가 변경할 확률이 높고, 외부에서 접근할 수 없도록 설정하는 경우가 대부분이다.

같은 컨트랙트 내에서는 상태변수의 visibility는 상관이 없다. 컨트랙트 내에서는 다 접근 가능하다. 외부에서 접근하는 시점부터 적용이 된다.

상태변수는 slot 으로 구분된다. 자리와 이름으로 위치가 지정된다.


컨트랙트 주소 생성 방법

컨트랙트 주소는 결정론적이다!!
만든사람 주소 + 논스 + 코드
새로고침했을 때 논스값이 0이다.
같은 지갑 주소에 논스값에 코드를 배포를 하면 스마트컨트랙트 주소가 동일하다.

원지갑주소에서 A를 변수를 보려면

컨트랙트 어드레스도 체인에 기록된다
상태변수도 체인에 기록된다

function setHusband(address _a) public {
   DAD husband = new DAD();
}
  • 선언과 동시에 주소를 생성할 때
    function setHusband(address _a) public {
        husband = DAD(_a);
    }
  • 컨트랙트를 이미 생성한 후에 주소만 불러올 때

Visibility & 타 컨트랙트 관리

web3.js 를 사용하면 특정 컨트랙트에 있는 함수와 상태 변수를 가져올 수 있다.
현재: DAD(address)

잘 사용할 줄 알면 필요한 상태변수를 가져와서 간단한 버전 또는 응용버전을 만들 수 있다.

0개의 댓글