Przejdź do głównej zawartości

Rejestrowanie danych z inteligentnych kontraktów za pomocą zdarzeń

smart kontrakty
remix
solidity
zdarzenia
Średnio zaawansowany
jdourlens
3 kwietnia 2020
2 minuta czytania

W Solidity zdarzenia to wysyłane sygnały, które inteligentne kontrakty mogą emitować. Dapki lub wszystko, co jest połączone z API JSON-RPC Ethereum, może nasłuchiwać tych zdarzeń i odpowiednio działać. Zdarzenie można również zindeksować, aby później można było przeszukiwać historię zdarzeń.

Zdarzenia

Najczęstszym zdarzeniem na blockchainie Ethereum w momencie pisania tego artykułu jest zdarzenie Transfer, które jest emitowane przez tokeny ERC20, gdy ktoś przenosi tokeny.

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

Sygnatura zdarzenia jest deklarowana w kodzie kontraktu i może być emitowana za pomocą słowa kluczowego emit. Na przykład zdarzenie transferu rejestruje, kto wysłał transfer (from), do kogo (to) i ile tokenów zostało przeniesionych (value).

Jeśli wrócimy do naszego inteligentnego kontraktu Counter i zdecydujemy się rejestrować za każdym razem, gdy wartość się zmieni. Ponieważ kontrakt ten nie jest przeznaczony do wdrożenia, ale służy jako podstawa do zbudowania kolejnego kontraktu poprzez jego rozszerzenie: nazywa się go kontraktem abstrakcyjnym. W przypadku naszego przykładu z licznikiem Counter wyglądałoby to tak:

1pragma solidity 0.5.17;
2
3contract Counter {
4
5 event ValueChanged(uint oldValue, uint256 newValue);
6
7 // Prywatna zmienna typu unsigned int do przechowywania liczby zliczeń
8 uint256 private count = 0;
9
10 // Funkcja, która zwiększa nasz licznik
11 function increment() public {
12 count += 1;
13 emit ValueChanged(count - 1, count);
14 }
15
16 // Getter do pobrania wartości licznika
17 function getCount() public view returns (uint256) {
18 return count;
19 }
20
21}
Pokaż wszystko

Zauważ, że:

  • Wiersz 5: deklarujemy nasze zdarzenie i to, co zawiera: starą i nową wartość.

  • Wiersz 13: Kiedy zwiększamy naszą zmienną count, emitujemy zdarzenie.

Jeżeli teraz wdrożymy kontrakt i wywołamy funkcję increment, zobaczymy, że Remix automatycznie to wyświetli, gdy klikniemy nową transakcję w tablicy o nazwie logs.

Zrzut ekranu z Remix

Logi są bardzo przydatne do debugowania inteligentnych kontraktów, ale są również ważne, jeśli tworzysz aplikacje używane przez różne osoby, ponieważ ułatwiają przeprowadzanie analiz w celu śledzenia i zrozumienia, w jaki sposób używane są Twoje inteligentne kontrakty. Logi generowane przez transakcje są wyświetlane w popularnych eksploratorach bloków i można je również wykorzystać, np. do tworzenia skryptów offchain do nasłuchiwania określonych zdarzeń i podejmowania działań w momencie ich wystąpienia.

Strona ostatnio zaktualizowana: 14 lutego 2026

Czy ten samouczek był pomocny?