28일 - 추상 계약 및 인터페이스

특사-VC / 30일의 견고함


스마트 계약 개발을 배우기 위한 30일간의 Solidity 단계별 가이드.




Solidity Series의 28 중 Day30입니다.
오늘 저는 Solidity에서 추상 계약 및 인터페이스에 대해 배웠습니다.

추상 계약



추상 계약은 구현 없이 최소한 하나의 기능을 포함하는 계약입니다. 이러한 계약은 기본 계약으로 사용됩니다. 일반적으로 추상 계약에는 구현된 기능과 추상 기능이 모두 포함됩니다. 파생 계약은 추상 기능을 구현하고 필요할 때 기존 기능을 사용합니다.

예시-

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

abstract contract Calculator {
   function getResult() virtual public returns(uint);
}
contract Test is Calculator {
   function getResult() override public  pure returns(uint) {
      uint a = 1;
      uint b = 2;
      uint result = a + b;
      return result;
   }
}



상호 작용



스마트 계약과 관련하여 인터페이스는 뼈대 또는 백본입니다. 계약의 기능과 이를 트리거하는 방법을 정의합니다.

이러한 방식으로 Dapp 또는 기타 스마트 계약은 인터페이스가 알려져 있기 때문에 특정 인터페이스를 구현하는 모든 스마트 계약과 상호 작용하는 방법을 알 수 있습니다.

가장 관련성이 높은 예는 단연 인기 있는 ERC20 token standard 입니다. 이 인터페이스 표준은 토큰을 나타내는 계약에 대한 표준 기능을 정의합니다. OpenZeppelin에서 가져온 Solidity 코드는 이러한 함수가 수행해야 하는 작업을 꽤 잘 설명합니다.

ERC20 토큰이 너무 많습니다! 그리고 그들 모두는 같은 방식으로 상호 작용할 수 있습니다.
  • 소유하고 있는 토큰 X의 수를 알고 싶습니까? balanceOf(...) 함수를 호출합니다.
  • 일부 토큰 X를 누군가에게 전송하고 싶습니까? transfer(...) 함수를 호출합니다.

  • 스마트 계약이 특정 인터페이스를 기반으로 한다는 것을 알면 다음과 같은 작업이 쉬워집니다.
  • 계약이 무엇을 할 수 있는지 이해하고
  • 계약과 상호 작용하는 방법을 알고 있습니다.

  • 실제 기능 자체의 복잡성을 이해할 필요가 없습니다. 간단히 말해서 다음을 기억하십시오.

    Interface contracts do not focus on process or behaviour (how a function does a specific job). > But instead, focus on “what the contract can do”.



    카운터 인터페이스의 예ICounter.sol
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.7;
    
    interface ICounter {
        function decrement() external;
        function increment() external;
    }
    


    그리고 본계약Counter.sol
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.13;
    
    import "./ICounter.sol";
    
    contract Counter is ICounter {
        uint private count;
    
        function increment() public virtual override {
            count += 1;
        }
    
        function decrement();() public virtual override {
            count -= 1;
        }
    }
    


    계약이 모든 기능을 구현하지 않는 경우(즉, 일부 기능 구현이 누락된 경우) 추상 계약으로만 사용할 수 있으며 직접 배포할 수 없습니다.

    여기에서 파생되는 다른 계약은 구현이 누락된 기능을 구현해야 합니다.

    인터페이스 내부에 선언된 모든 함수는 암시적입니다virtual. 인터페이스 내의 정의에 virtual 키워드를 포함하지 않더라도 기본적으로 가상입니다.

    이를 재정의하는 함수(= 실제 함수 구현)에는 override 키워드가 필요하지 않습니다. 이 특이성은 Solidity 문서에서 다음과 같이 Solidity 0.8.8에서 소개되었습니다.

    Solidity 0.8.8부터는 인터페이스 기능을 재정의할 때 override 키워드가 필요하지 않습니다...

    그러나 항상 그런 것은 아닙니다. 예외가 있습니다.

    ... 함수가 여러 기반으로 정의된 경우는 제외합니다.

    이러한 함수 구현에 대한 또 다른 규칙은 "함수가 나중에 상속된 계약에서 자동으로 다시 재정의될 수 있는 인터페이스에 정의된 함수를 재정의하기 때문이 아닙니다."입니다. 이는 재정의 기능이 가상으로 표시된 경우에만 가능합니다.

    또 다른 오해는 상태가 변경되는 함수에 대해서만 함수 정의를 정의하는 것입니다. ❓

    인터페이스의 함수 부분도 보기 함수가 될 수 있습니다. 실제로 매우 인기 있는 IERC20 interfacetotalSupply(...)balanceOf(...)의 두 가지 뷰 함수를 정의합니다.

    좋은 웹페이지 즐겨찾기