Перейти до основного вмісту
Change page

Докладніше про розумні контракти

Останнє оновлення сторінки: 15 квітня 2026 р.

Розумний контракт - це програма, що працює за адресою в Ethereum. Вони складаються з даних та функцій, які можуть виконуватися після отримання транзакції. Ось огляд того, що формує розумний контракт.

Передумови

Переконайтеся, що ви спочатку прочитали про смарт-контракти. Цей документ передбачає, що ви вже знайомі з такими мовами програмування, як JavaScript чи Python.

Дані

Будь-які дані контракту мають бути призначені до розташування: або в сховище (storage), або в пам’ять (memory). Варто змінити зберігання в розумному контракті, тож вам слід подумати, де повинні міститися ваші дані.

Сховище

Постійні дані називають сховищем та представлені змінними стану. Ці значення постійно зберігаються в блокчейні. Вам слід оголосити тип таким чином, щоб контракт міг відстежувати, скільки пам’яті в блокчейні йому потрібно під час компіляції.

// Приклад на Solidity
contract SimpleStorage {
    uint storedData; // Змінна стану
    // ...
}
# Приклад на Vyper
storedData: int128

Якщо ви вже запрограмували об'єктно-орієнтовані мови, ймовірно, ви знайомі з більшістю типів. Однак тип address буде для вас новим, якщо ви новачок у розробці на Ethereum.

Тип address може містити адресу Ethereum, що дорівнює 20 байтам або 160 бітам. Він повертається у шістнадцятковій системі запису з провідним 0x.

До інших типів належать:

  • логічний
  • цілий
  • числа фіксованих точок
  • байтові масиви фіксованого розміру
  • масиви байтів динамічного розміру
  • раціональні та цілочисельні літерали
  • рядкові літерали
  • шістнадцяткові літерали
  • перелічення

Для додаткового пояснення зверніться до документів:

Пам’ять

Значення, які зберігаються лише протягом усього терміну виконання функції контракту, називаються змінними пам’яті. Оскільки вони не зберігаються у блокчейні назавжди, їх використання набагато дешевше.

Дізнайтеся більше про те, як EVM зберігає дані (сховище, пам’ять і стек) у документації Solidity (opens in a new tab).

Змінні середовища

На додаток до змінних, які ви виділяєте у вашому контракті, є деякі особливі глобальні змінні. Насамперед, вони використовуються для надання інформації про блокчейн чи поточну транзакцію.

Приклади:

ВластивістьЗмінна стануОпис
block.timestampuint256Поточна часова позначка блоку
msg.senderaddressВідправник повідомлення (поточний дзвінок)

Функції

Простіше кажучи, функції можуть отримувати інформацію або задавати інформацію у відповідь на вхідні транзакції.

Існує два типу виклику функції:

  • internal – вони не створюють виклик EVM
    • Внутрішні функції та змінні стану можуть бути доступні лише всередині (тобто з поточного контракту або контрактів, що є його похідними).
  • external – вони створюють виклик EVM
    • Зовнішні функції є частиною інтерфейс договору, що означає, що їх можна викликати з інших договорів і за допомогою транзакцій. Зовнішню функцію f не можна викликати всередині (тобто виклик f() не спрацює, а this.f() спрацює).

Вони також можуть бути public або private

  • Функції public можна викликати зсередини контракту або ззовні через повідомлення.
  • Функції private видимі лише для контракту, у якому вони визначені, і не видимі для похідних контрактів.

Обидві функції і змінні стану можуть бути публічними чи приватними

Ось функція оновлення змінної стану за договором:

// Приклад на Solidity
function update_name(string value) public {
    dapp_name = value;
}
  • Параметр value типу string передається у функцію update_name.
  • Її оголошено як public, тобто до неї може отримати доступ будь-хто.
  • Її не оголошено як view, тому вона може змінювати стан контракту.

Функції View

Ці функції обіцяють не змінювати стан даних договору. Поширеними прикладами є функції "getter" – наприклад, ви можете використовувати її, щоб отримати баланс користувача.

// Приклад на Solidity
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

Що вважається змінами стану:

  1. Запис до змінних стану.
  2. Генерація подій (opens in a new tab).
  3. Створення інших контрактів (opens in a new tab).
  4. Використання selfdestruct.
  5. Надсилання через дзвінки.
  6. Виклик будь-якої функції, не позначеної як view або pure.
  7. Використання дзвінків низького рівня.
  8. Використовуючи вбудовану збірку, що містить деякі коди.

Функції-конструктори

Функції constructor виконуються лише один раз, під час першого розгортання контракту. Подібно до constructor у багатьох об’єктно-орієнтованих мовах програмування, ці функції часто ініціалізують змінні стану, присвоюючи їм зазначені значення.

# Приклад на Vyper

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

Вбудовані функції

На додаток до змінних та функцій, які ви визначаєте у вашому договорі, є ще деякі спеціальні вбудовані функції. Найбільш наочний приклад:

  • address.send() – Solidity
  • send(address) – Vyper

Вони дозволяють договорам відправляти ETH на інші облікові записи.

Написання функцій

Потреби функцій:

  • змінна параметра та тип (якщо він приймає параметри)
  • оголошення внутрішнього/зовнішньої
  • оголошення чистий/перегляд/платний
  • тип повернення (якщо повертає значення)

Повний контракт може виглядати приблизно так. Тут функція constructor надає початкове значення для змінної dapp_name.

Події та журнали

Події дають змогу вашому смарт-контракту обмінюватися даними з інтерфейсом або іншими підписаними застосунками. Після того, як транзакція буде підтверджена та додана до блоку, смарт-контракти можуть генерувати події та реєструвати інформацію, яку фронтенд може потім обробити та використати.

Приклади з коментарями

Деякі приклади написані в Solidity. Якщо ви хочете поекспериментувати з кодом, ви можете взаємодіяти з ним у Remix (opens in a new tab).

Привіт, світе

Токен

Унікальний цифровий актив

Для подальшого читання

Перевірте документацію Solidity і Vyper's для більш повного огляду смарт-контрактів:

Ця стаття була корисною?