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