본문 바로가기
블록체인교육/솔리디티

[솔리디티] 8.이벤트(events), 생성자(constructor), 상속

by Danny_Kim 2022. 6. 9.

 

[NEW] 누구나 쉽게 따라하는 솔리디티 강의(솔리디티 버전 0.8.13)

1. Helloworld, 카운터컨트랙트, 데이터타입

2. 변수, 상수, 불변, 상태변수 읽고 쓰기

3. 이더 단위, 가스와 가스가격

4. 조건문, 반복문, 맵핑(mapping)

5. 배열, 열거형(enum), 구조체(calldata,memory) 

6. 데이터 저장공간, 함수(view,pure 속성)

7. 에러(error), 함수수정자(modifier)

8. 이벤트(events), 생성자(constructor), 상속

9. 상속, 섀도잉,super키워드 함수 속성들

10. 인터페이스(interface), payable, 이더전송,받기 관련

11. Fallback, Call, Delegate(솔리디티 업그레이드 기법)

12. 함수 선택자(function selector), 다른 컨트랙트 사용 및 생성기법

13. Try Catch, Import(임포트), Library(라이브러리)

14. ABI 디코드, hash 함수, 서명검증, 가스최적화

 

 

1. 이벤트(Events)

 - Events는 이더리움 블록체인에 기록을 남김. 

 - 이벤트 수신 및 사용자 인터페이스 업데이트를 위해서 사용됨

 - 스토리지에 저장시 비교적 저렴

 

- 아래 예제에서, indexed 로 선언된 매개변수는 향후에 해당 로그를 찾아서 사용하는데 유용함

  (Dapp에서 해당 이벤트를 찾아서 사용할때 indexed 활용)

- indexed 파라미터는 3개까지 허용됨.

 

소스파일

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Event {
    // Event declaration
    // Up to 3 parameters can be indexed.
    // Indexed parameters helps you filter the logs by the indexed parameter
    event noindexLog(address sender, string message);
    event Log(address indexed sender, string message);
    event AnotherLog();

    function test() public {
        emit Log(msg.sender, "Hello World!");
        emit noindexLog(msg.sender, "Hello EVM!");
        emit AnotherLog();
    }
}

 

2. 생성자(constructor)

 - 생성자는 컨트랙트 생성시 실행되는 선택적인 함수임

 - 생성자는 아래와 같이 정의하고 사용함.

 

- 부모 컨트랙트로부터 상속받아서 생성자를 초기화하는 방법에는 아래와 같이 2가지 방법이 있음

 1) X와 Y의 컨트랙트에 파라미터 입력 후 B의 컨트랙트를 생성

 2) X,Y를 상속받아서 C의 컨트랙트에서 생성자를 새롭게 만드는 방법

 

- 부모 생성자는 항상 상속받은 순서대로 호출됨(리스트 순서에 상관없음- 아래 예제 E 컨트랙트 참고)

- 아래의 예에서는 X,Y,D 순서(X,Y,E)대로 생성자가 생성됨.

전체소스

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

// Base contract X
contract X {
    string public name;

    constructor(string memory _name) {
        name = _name;
    }
}

// Base contract Y
contract Y {
    string public text;

    constructor(string memory _text) {
        text = _text;
    }
}

// There are 2 ways to initialize parent contract with parameters.

// Pass the parameters here in the inheritance list.
contract B is X("Input to X"), Y("Input to Y") {

}

contract C is X, Y {
    // Pass the parameters here in the constructor,
    // similar to function modifiers.
    constructor(string memory _name, string memory _text) X(_name) Y(_text) {}
}

// Parent constructors are always called in the order of inheritance
// regardless of the order of parent contracts listed in the
// constructor of the child contract.

// Order of constructors called:
// 1. X
// 2. Y
// 3. D
contract D is X, Y {
    constructor() X("X was called") Y("Y was called") {}
}

// Order of constructors called:
// 1. X
// 2. Y
// 3. E
contract E is X, Y {
    constructor() Y("Y was called") X("X was called") {}
}

 

3. 상속(inheritance)

 - 솔리디티는 다중상속을 지원함, 컨트랙트는 is 키워드를 사용하여 다른 컨트랙트를 상속할 수 있음

 - 자식계약에 의해서 오버라이딩 될 함수에 대한 정의는 virtual로 정의되어야 함

 - 부모 함수를 오버라이딩 할 함수들은 override 키워드를 사용해야 함

 - 상속의 순서는 중요함 (가장 가까운 부모로부터 가장 먼 부모로 차례대로 상속 is A, B, C..(A가 가장 가까운 부모임)

 

 * 아래 예시의 그래프를 참고!

3.1 상속예) A를 B,C가 상속하는 방법. 

 - 키워드 is를 사용하여 상속

 - B,C는 A의 함수 foo()를 사용할 수 있음

3.2 D,E가 B,C를 상속받는 방법

 - 컨트랙트는 다양한 부모컨트랙트로부터 상속받을 수 있음

 - 2개 이상 상속받을 경우 오른쪽에서 왼쪽 순서대로 우선순위가 있음.

 

3.3 상속의 순서 : 가장 가까운 곳부터 먼곳으 부모로 순서대로 상속받아야 함.

   그렇지 않은 경우, 오류 발생 (아래 예시 참고)

 

3.4 상속 과제!!

  - 오픈제플린 라이브러리 ERC20, ERC20Capped를 상속받고, ERC20의 최대 Cap수를 설정하여 토큰을 발행하세요!!

 

 

소스참고 https://solidity-by-example.org/

 

반응형

댓글0