---
title: "Логирование данных из смарт-контрактов с помощью событий"
description: "Введение в события смарт-контрактов и то, как их можно использовать для логирования данных"
author: "jdourlens"
tags: ["смарт-контракты", "Remix", "Solidity", "события"]
skill: intermediate
breadcrumb: "Логирование событий"
lang: ru
published: 2020-04-03
source: EthereumDev
sourceUrl: https://ethereumdev.io/logging-data-with-events/
address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
---

В Solidity [события](/developers/docs/smart-contracts/anatomy/#events-and-logs) — это отправляемые сигналы, которые могут вызывать смарт-контракты. Децентрализованные приложения (dapp) или любые другие приложения, подключенные к API JSON-RPC Эфириума, могут прослушивать эти события и действовать соответствующим образом. Событие также может быть проиндексировано, чтобы историю событий можно было искать в дальнейшем.

## События {#events}

Самым распространенным событием в блокчейне Эфириума на момент написания этой статьи является событие Transfer, которое генерируется токенами ERC-20, когда кто-то совершает перевод токенов.

```solidity
event Transfer(address indexed from, address indexed to, uint256 value);
```

Подпись события объявляется внутри кода контракта и может быть вызвана с помощью ключевого слова emit. Например, событие transfer записывает в лог, кто отправил перевод (_from_), кому (_to_) и сколько токенов было переведено (_value_).

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

```solidity
pragma solidity 0.5.17;

contract Counter {

    event ValueChanged(uint oldValue, uint256 newValue);

    // Приватная переменная типа unsigned int для хранения количества подсчетов
    uint256 private count = 0;

    // Функция, увеличивающая наш счетчик
    function increment() public {
        count += 1;
        emit ValueChanged(count - 1, count);
    }

    // Геттер для получения значения счетчика
    function getCount() public view returns (uint256) {
        return count;
    }

}
```

Обратите внимание, что:

- **Строка 5**: мы объявляем наше событие и то, что оно содержит — старое и новое значения.

- **Строка 13**: когда мы увеличиваем нашу переменную count, мы генерируем событие.

Если теперь мы развернем контракт и вызовем функцию increment, то увидим, что Remix автоматически отобразит его, если вы нажмете на новую транзакцию внутри массива с именем logs.

![Remix screenshot](./remix-screenshot.png)

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