Перейти к основному контенту
Change page

Подробнее о смарт-контрактах

Последнее обновление страницы: 15 апреля 2026 г.

Смарт-контракт - это программа, которая запускается на определенном адресе на Ethereum. Они состоят из данных и функций, которые могут выполняться при получении транзакции. Вот обзор того, что представляет из себя смарт-контракт.

Предварительные условия

Сначала убедитесь, что вы прочитали о смарт-контрактах. Эта статья предполагает, что вы уже знакомы с языками программирования, такими как JavaScript или Python.

Данные

Любые данные контракта должны быть присвоены местоположению: либо storage, либо memory. Модифицировать хранилище в смарт контракте - дорогостоящая операция, поэтому вам необходимо подумать заранее, где ваши данные должны храниться.

Хранилища

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

// Пример Solidity
contract SimpleStorage {
    uint storedData; // Переменная состояния
    // ...
}
Пример на Vyper

Если вы уже программировали объектно-ориентированные языки, то вы, скорее всего, будете знакомы с большинством типов. Однако, address может быть для вас в новинку, если вы новичок в разработке на Ethereum.

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

Другие типы включают:

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

Для более подробного объяснения, ознакомьтесь с документацией:

Память

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

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

Переменные среды

В дополнение к переменным, которые вы определяете по вашему контракту, есть некоторые специальные глобальные переменные. Они в основном используются для предоставления информации о блокчейне или текущей транзакции.

Примеры:

СвойствоПеременная состоянияОписание
block.timestampuint256Текущая метка времени начала блоков
msg.senderадресОтправитель сообщения (текущий вызов)

Функции

В наиболее упрощенных терминах функции могут получать информацию или устанавливать информацию в ответ на входящие транзакции.

Существует два типа вызовов функций:

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

Они также могут быть public или private

  • Функции public можно вызывать внутренне из контракта или внешне с помощью сообщений
  • Функции private видны только для контракта, в котором они определены, и не видны в производных контрактах

Функции и переменные состояний могут быть общедоступными или частными

Вот функция обновления переменной состояния по контракту:

// Пример солидарности
function update_name(string value) public {
    dapp_name = value;
}
  • Параметр value типа string передается в функцию: update_name
  • Она объявлена как public, что означает, что любой может получить к ней доступ
  • Она не объявлена как view, поэтому может изменять состояние контракта

Функции просмотра

Эти функции обещают не изменять состояние данных контракта. Типичными примерами являются функции "получения" - вы можете использовать их, например, для получения баланса пользователя.

// Пример твердости
функция balanceOf (address _owner) в публичном представлении возвращает (uint256 _balance) {
     вернуть 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 example

@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).

Hello world

Токен

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

Дополнительные материалы

Ознакомьтесь с документацией Solidity и Vyper для более полного обзора смарт-контрактов:

Была ли эта статья полезной?