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 토큰이 너무 많습니다! 그리고 그들 모두는 같은 방식으로 상호 작용할 수 있습니다.
balanceOf(...)
함수를 호출합니다. 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 interface은
totalSupply(...)
및 balanceOf(...)
의 두 가지 뷰 함수를 정의합니다.
Reference
이 문제에 관하여(28일 - 추상 계약 및 인터페이스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/envoy_/day-28-abstract-contract-and-interface-5dkg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)