---
title: "Логування даних зі смарт-контрактів за допомогою подій"
description: "Вступ до подій смарт-контрактів та як їх можна використовувати для логування даних"
author: "jdourlens"
tags:
  - смарт-контракти
  - Remix
  - Solidity
  - події
skill: intermediate
breadcrumb: "Логування подій"
lang: uk
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) — це відправлені сигнали, які можуть генерувати смарт-контракти. Децентралізовані застосунки (dapps) або будь-що, підключене до 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)

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