Interface
Interface нь contract-ын "гэрээ" юм — ямар функцүүд байх ёстойг тодорхойлдог боловч хэрэгжүүлэлтийг агуулдаггүй. Өөр өөр contract-уудыг нэг стандартаар харилцуулахад хэрэглэнэ.
Interface тодорхойлох
interface түлхүүр үгээр тодорхойлно. Бүх функц external байх ёстой бөгөөд биегүй байна.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface ICalculator {
function add(uint256 a, uint256 b) external pure returns (uint256);
function subtract(uint256 a, uint256 b) external pure returns (uint256);
function multiply(uint256 a, uint256 b) external pure returns (uint256);
}
Interface хэрэгжүүлэх
Contract нь is түлхүүр үгээр interface-ийг хэрэгжүүлнэ. Interface-д заасан бүх функцийг заавал тодорхойлох ёстой.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface ICalculator {
function add(uint256 a, uint256 b) external pure returns (uint256);
function subtract(uint256 a, uint256 b) external pure returns (uint256);
function multiply(uint256 a, uint256 b) external pure returns (uint256);
}
contract Calculator is ICalculator {
function add(uint256 a, uint256 b) external pure override returns (uint256) {
return a + b;
}
function subtract(uint256 a, uint256 b) external pure override returns (uint256) {
require(a >= b, "Сөрөг үр дүн гарна");
return a - b;
}
function multiply(uint256 a, uint256 b) external pure override returns (uint256) {
return a * b;
}
}
Interface-ийн хязгаарлалт
Interface дотор дараах зүйлс байж болохгүй:
- State variable (хадгалалтын хувьсагч)
- Constructor
- Функцийн биелэлт (зөвхөн гарын үсэг)
privateэсвэлinternalфункц
interface IExample {
// ✅ Зөв
function getValue() external view returns (uint256);
function setValue(uint256 val) external;
// ❌ Буруу — state variable байж болохгүй
// uint256 public value;
// ❌ Буруу — биелэлт байж болохгүй
// function getValue() external view returns (uint256) { return 0; }
}
Өөр contract-ыг interface-ээр дуудах
Interface-ийн гол давуу тал: байрлуулсан contract-тай хаягаар холбогдох.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface ICalculator {
function add(uint256 a, uint256 b) external pure returns (uint256);
}
contract App {
ICalculator public calculator;
constructor(address _calculatorAddress) {
// Байрлуулсан Calculator contract-ын хаягаар холбогдоно
calculator = ICalculator(_calculatorAddress);
}
function addNumbers(uint256 a, uint256 b) public view returns (uint256) {
return calculator.add(a, b);
}
}
App нь Calculator-ын кодыг мэдэхгүй — зөвхөн interface-ийг мэддэг. Ингэснээр contract-уудыг бие биеэсээ тусгаарлана.
IERC20 — жишээ болгон
Ethereum-ийн хамгийн алдартай interface бол IERC20 — ERC-20 токений стандарт. Бүх ERC-20 токен энэ interface-ийг хэрэгжүүлдэг тул ямар ч DEX, wallet нэгэн жигд ажиллаж чадна.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
Дурын ERC-20 токений хаягаар энэ interface-ийг ашиглаж болно:
pragma solidity ^0.8.0;
interface IERC20 {
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
}
contract TokenSender {
function sendToken(address tokenAddress, address to, uint256 amount) public {
IERC20 token = IERC20(tokenAddress);
require(token.transfer(to, amount), "Илгээхэд алдаа гарлаа");
}
function getBalance(address tokenAddress, address account) public view returns (uint256) {
return IERC20(tokenAddress).balanceOf(account);
}
}
Interface vs Abstract contract
| | Interface | Abstract contract | | -------------- | -------------------- | ------------------ | | State variable | ❌ | ✅ | | Constructor | ❌ | ✅ | | Хэрэгжүүлэлт | ❌ | ✅ (заримд нь) | | Олон өвлөлт | ✅ | ✅ | | Хэрэглэх үе | Стандарт тодорхойлох | Хагас хэрэгжүүлэлт |
Дараагийн хичээлд:
Library ашиглан кодоо модульчлах аргыг судална.