Solidity interface

외부 컨트랙트 함수와 상호작용하기 위해 함수의 틀을 정의한다.

잘못된 인터페이스 사용 시

실제 함수에서는 리턴 값이 있는데 인터페이스에는 정의되지 않은 경우, 호출자 측은 리턴 값을 무시하고 정상적으로 호출을 종료한다. 하지만 리턴 값이 없어야 하는데 인터페이스는 있다고 정의한 경우 트랜잭션이 실패한다.

함수 시그니처에는 리턴값 정보는 포함되지 않는다. 오로지 함수의 이름과 파라미터 자료형만 포함된다. 따라서 리턴값 정보가 없는 인터페이스를 이용하더라도 호출은 된다. 리턴값은 버려진다.

contract Token {
    function mint(address account, uint256 amount) external {
        return;
    }
    function burn(address account, uint256 amount) external returns (bool) {
        return true;
    }
}
 
interface WrongInterface {
    function mint(address account, uint256 amount) external returns (bool); // wrong interface
    function burn(address account, uint256 amount) external; // wrong interface
}
 
contract MintManager {
    WrongInterface token;
    constructor (WrongInterface _token){
        token = _token;
    }
 
    function mint(uint256 amount) external {
        token.mint(msg.sender, amount); // will revert
    }
 
    function burn(uint256 amount) external {
        token.burn(msg.sender, amount); // success
    }
    /*
    function burn2(uint256 amount) external {
        bool res = token.burn(msg.sender, amount); // cannot compile
    }
    */
}

tags: blockchain, smart contract, solidity