Solidity / Interface

Interface

Interface нь contract-ын "гэрээ" юм — ямар функцүүд байх ёстойг тодорхойлдог боловч хэрэгжүүлэлтийг агуулдаггүй. Өөр өөр contract-уудыг нэг стандартаар харилцуулахад хэрэглэнэ.

Interface тодорхойлох

interface түлхүүр үгээр тодорхойлно. Бүх функц external байх ёстой бөгөөд биегүй байна.

solidity
// 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-д заасан бүх функцийг заавал тодорхойлох ёстой.

solidity
// 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 функц
solidity
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-тай хаягаар холбогдох.

solidity
// 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 нэгэн жигд ажиллаж чадна.

solidity
// 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-ийг ашиглаж болно:

solidity
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 ашиглан кодоо модульчлах аргыг судална.