Перейти к основному содержанию
Change page

Введение в умные контракты

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

Что такое смарт-контракт?

«Смарт-контракт» — это просто программа, работающая на блокчейне Ethereum. Это набор кода (его функции) и данных (его состояние), который находится по определенному адресу в цепочке блоков Ethereum.

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

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

Если вы только начинаете или ищете менее техническое введение, мы рекомендуем наше введение в смарт-контракты.

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

Цифровой торговый автомат

Возможно, лучшей метафорой для смарт-контракта является торговый автомат, как его описал Ник Сабо (opens in a new tab). При правильном вводе гарантирован определенный результат.

Чтобы купить закуску в торговом автомате:

1money + snack selection = snack dispensed

Эта логика запрограммирована в торговый автомат.

В смарт-контракт, как в торговый автомат, заложена логика. Вот простой пример того, как этот торговый автомат мог бы выглядеть, если его запустить с помощью Solidity:

1pragma solidity 0.8.7;
2
3contract VendingMachine {
4
5 // Объявление переменных состояния контракта
6 address public owner;
7 mapping (address => uint) public cupcakeBalances;
8
9 // Когда контракт 'VendingMachine' развернут:
10 // 1. установить адрес развертывания как владельца контракта
11 // 2. установить баланс кексов развернутого смарт-контракта на 100
12 constructor() {
13 owner = msg.sender;
14 cupcakeBalances[address(this)] = 100;
15 }
16
17 // Разрешить владельцу увеличивать баланс кексов смарт-контракта
18 function refill(uint amount) public {
19 require(msg.sender == owner, "Только владелец может пополнять.");
20 cupcakeBalances[address(this)] += amount;
21 }
22
23 // Разрешить любому покупать кексы
24 function purchase(uint amount) public payable {
25 require(msg.value >= amount * 1 ether, "Вы должны заплатить не менее 1 ETH за кекс");
26 require(cupcakeBalances[address(this)] >= amount, "Недостаточно кексов на складе для совершения этой покупки");
27 cupcakeBalances[address(this)] -= amount;
28 cupcakeBalances[msg.sender] += amount;
29 }
30}
Показать все

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

Без разрешений

Кто угодно может написать смарт-контракт и развернуть его в сети. Вам просто нужно научиться программировать на языке смарт-контрактов и иметь достаточно ETH для развертывания вашего контракта. Развертывание смарт-контракта технически является транзакцией, поэтому вам нужно платить за газ так же, как вы платите за газ для простого перевода ETH. Однако стоимость газа для развертывания контракта намного выше.

В Ethereum есть удобные для разработчиков языки для написания смарт-контрактов:

  • Solidity
  • Vyper

Подробнее о языках

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

Компонуемость

Смарт-контракты общедоступны в Ethereum и могут рассматриваться как открытые API. Это означает, что вы можете вызывать другие смарт-контракты в своем собственном смарт-контракте, чтобы значительно расширить его возможности. Контракты могут даже использовать другие контракты.

Узнайте больше о компонуемости смарт-контрактов.

Ограничения

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

Однако для блокчейн-приложений важно иметь возможность использовать оффчейн-данные. Решением являются оракулы — инструменты, которые принимают оффчейн-данные и делают их доступными для смарт-контрактов.

Еще одним ограничением смарт-контрактов является максимальный размер контракта. Смарт-контракт может быть размером не более 24 Кб, иначе у него закончится газ. Эту проблему можно обойти, используя The Diamond Pattern (opens in a new tab).

Контракты с мультиподписью

Мультиподписные контракты (контракты с несколькими подписями) - это учетные записи смарт-контрактов, которые для выполнения транзакции требуют несколько действительных подписей. Это очень полезно, чтобы избежать единичных точек отказа для контрактов, содержащих существенное количество Эфира или других токенов. Мультиподписи также разделяют ответственность за выполнение контракта и управление ключами между многими сторонами и предотвращают потерю одного закрытого ключа, ведущую к необратимой потере денежных средств. По этим причинам мультиподписные контракты могут быть использованы для простого управления DAO. Мультиподписи требуют N подписей из M возможных приемлемых подписей (где N ≤ M и M > 1) для выполнения. Часто используются N = 3, M = 5 и N = 4, M = 7. Мультиподпись 4/7 требует четыре из семи возможных действительных подписей. Это значит, что денежные средства всё ещё можно восстановить, даже если три подписи потеряны. В этом случае это также означает, что большинство держателей ключей должны согласиться и подписать контракт, чтобы он выполнился.

Ресурсы по смарт-контрактам

OpenZeppelin Contracts — Библиотека для безопасной разработки смарт-контрактов.

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

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