Solidity Interface

Interface

인터페이스는 다른 컨트랙트와 상호작용하기 위해 사용된다.

자식 컨트랙트를 위한 틀이며, 추상 함수로만 구성되어야 한다.

해당 내용을 구현하지는 않고 이를 상속하는 쪽에서 구현하게 하되, 다른 컨트랙트들에게 이 컨트랙트는 이런 함수들을 포함하니 안심하고 호출하라는 정보를 주는 역할을 한다.

Interface in Solidity

아래는 간단한 인터페이스 예시이다.

ICalculator를 이용해서 계산기에 대한 인터페이스를 만들었고, contract Calculator is ICalculator 구절은 Calculator 컨트랙트가 해당 인터페이스를 상속받도록 만든다.

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

interface ICalculator {
    function Add(uint256 a, uint256 b) external pure returns (uint256 result);

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result);

    function Div(uint256 a, uint256 b) external pure returns (uint256 result);

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
}

contract Calculator is ICalculator {
    function Add(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a + b;
    }

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a - b;
    }

    function Div(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a / b;
    }

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a * b;
    }
}

만약에 상속받는 컨트랙트가 여러 개가 된다면 어떻게 할까?

아래와 같이 작성할 수 있다.

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

interface ICalculator {
    function Add(uint256 a, uint256 b) external pure returns (uint256 result);

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result);

    function Div(uint256 a, uint256 b) external pure returns (uint256 result);

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
}

interface IGetter {
    function Get() external view returns (uint256 result);
}

contract Calculator is ICalculator, IGetter {
    uint256 data = 10;

    function Add(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a + b;
    }

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a - b;
    }

    function Div(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a / b;
    }

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result) {
        result = a * b;
    }

    function Get() external view returns (uint256 result) {
        return data;
    }
}

그렇다면 한 걸음 더 나아가서, 같은 메소드를 가진 두 개의 인터페이스를 상속받는 경우에는 어떻게 처리해야 할까?

아래와 같이 override로 명시해줌으로써 상속을 받아 구현할 수 있다.

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

interface ICalculator {
    function Add(uint256 a, uint256 b) external pure returns (uint256 result);

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result);

    function Div(uint256 a, uint256 b) external pure returns (uint256 result);

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
}

interface IGetter {
    function Get() external view returns (uint256 result);
}

interface ICalculatorTwo {
    function Add(uint256 a, uint256 b) external pure returns (uint256 result);

    function Sub(uint256 a, uint256 b) external pure returns (uint256 result);

    function Div(uint256 a, uint256 b) external pure returns (uint256 result);

    function Mul(uint256 a, uint256 b) external pure returns (uint256 result);
}

contract Calculator is ICalculator, IGetter, ICalculatorTwo {
    uint256 data = 10;

    function Add(
        uint256 a,
        uint256 b
    )
        external
        pure
        override(ICalculator, ICalculatorTwo)
        returns (uint256 result)
    {
        result = a + b;
    }

    function Sub(
        uint256 a,
        uint256 b
    )
        external
        pure
        override(ICalculator, ICalculatorTwo)
        returns (uint256 result)
    {
        result = a - b;
    }

    function Div(
        uint256 a,
        uint256 b
    )
        external
        pure
        override(ICalculator, ICalculatorTwo)
        returns (uint256 result)
    {
        result = a / b;
    }

    function Mul(
        uint256 a,
        uint256 b
    )
        external
        pure
        override(ICalculator, ICalculatorTwo)
        returns (uint256 result)
    {
        result = a * b;
    }

    function Get() external view returns (uint256 result) {
        return data;
    }
}

Last updated