Логування даних зі смарт-контрактів за допомогою подій
У Solidity події — це відправлені сигнали, які можуть генерувати смарт-контракти. Децентралізовані застосунки (dapps) або будь-що, підключене до API JSON-RPC Етеріуму, може прослуховувати ці події та діяти відповідно. Подія також може бути проіндексована, щоб історію подій можна було шукати пізніше.
Події
Найпоширенішою подією в блокчейні Етеріуму на момент написання цієї статті є подія Transfer, яка генерується токенами ERC-20, коли хтось здійснює переказ токенів.
event Transfer(address indexed from, address indexed to, uint256 value);
Підпис події оголошується всередині коду контракту і може бути згенерований за допомогою ключового слова emit. Наприклад, подія transfer логує, хто відправив переказ (from), кому (to) і скільки токенів було переказано (value).
Якщо ми повернемося до нашого смарт-контракту Counter і вирішимо логувати кожну зміну значення. Оскільки цей контракт не призначений для розгортання, а слугує базою для створення іншого контракту шляхом його розширення, він називається абстрактним контрактом. У випадку нашого прикладу з лічильником це виглядало б так:
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.
Логи дуже корисні для зневадження ваших смарт-контрактів, але вони також важливі, якщо ви створюєте застосунки, якими користуються різні люди, оскільки вони полегшують аналітику для відстеження та розуміння того, як використовується ваш смарт-контракт. Логи, згенеровані транзакціями, відображаються в популярних оглядачах блоків, і ви також можете, наприклад, використовувати їх для створення позамережевих скриптів, які прослуховують певні події та виконують дії, коли вони відбуваються.
