Zdarzenia a storage
Kompromisy dotyczące gas
Zdarzenia a storage to bezpłatna lekcja Web3 & DApp Development Fundamentals na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Web3 & DApp Development Fundamentals, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Web3 & DApp Development Fundamentals zawiera 4 lekcji w sumie.
Dwa sposoby rejestrowania danych
Gdy coś dzieje się w kontrakcie, możesz zapisać to w pamięci trwałej albo w logu zdarzeń. Umiejętny wybór jest podstawą optymalizacji zużycia gasu.
W tej lekcji porównamy kompromisy, aby wiedzieć, kiedy używać każdego z tych rozwiązań.
Podsumowanie pamięci trwałej
Pamięć trwała to permanentny stan kontraktu. Są to jedyne dane, które sam kontrakt może później ponownie odczytać, ale ich zapis jest bardzo kosztowny.
<code>mapping(address => uint256) public balances; // contract can read this</code>Podsumowanie zdarzeń
Zdarzenia zapisują dane w logu transakcji. Są znacznie tańsze, ale kontrakt nie może ich ponownie odczytać w łańcuchu — mogą to zrobić tylko klienci działający poza łańcuchem.
<code>event BalanceChanged(address indexed who, uint256 newBalance);
// off-chain apps read this; the contract cannot</code>Różnica w koszcie gasu
Zapis nowego slotu pamięci trwałej (operacja SSTORE z wartości zero) kosztuje około 20 000 gasu. Emisja tematu logu lub słowa kosztuje zaledwie kilkaset jednostek gasu. Zdarzenia mogą być o rząd wielkości tańsze.
Złota zasada
Prosta zasada:
- Przechowuj dane, które kontrakt musi odczytać lub wykorzystać w przyszłej logice
- Emituj tylko dane potrzebne światu zewnętrznemu (historii, interfejsowi użytkownika, analityce)
Nie przechowuj danych wyłącznie na potrzeby wyświetlania — zamiast tego je emituj.
Co musi znajdować się w storage
Salda, informacje o własności, limity oraz wszelkie wartości wykorzystywane w sprawdzeniach require lub przyszłych obliczeniach muszą znajdować się w storage, ponieważ kontrakt je odczytuje.
<code>function transfer(address to, uint256 amt) public {
require(balances[msg.sender] >= amt); // needs storage
balances[msg.sender] -= amt;
balances[to] += amt;
}</code>Co może być tylko zdarzeniem
Historia transakcji, ścieżka audytu lub kanał powiadomień doskonale nadają się do obsługi za pomocą zdarzeń. Kontrakt nie musi ponownie odczytywać tych danych, więc ich przechowywanie powodowałoby niepotrzebne zużycie gazu.
<code>event Logged(address indexed user, string action, uint256 time);
function act(string memory a) public {
emit Logged(msg.sender, a, block.timestamp); // no storage
}</code>Używanie obu mechanizmów razem
Najczęstszy wzorzec polega na tym, aby zapisać nowy stan i wyemitować zdarzenie opisujące zmianę. Wartość w storage napędza logikę, a zdarzenie pozwala zachować synchronizację interfejsu użytkownika.
<code>function deposit() public payable {
balances[msg.sender] += msg.value; // storage for logic
emit BalanceChanged(msg.sender, balances[msg.sender]); // event for UI
}</code>Logów nie można odczytywać on-chain
Istnieje kluczowe ograniczenie: inny kontrakt nie może odczytać wyemitowanych przez Ciebie logów. Jeśli kontrakt B potrzebuje danej wartości, kontrakt A musi udostępnić ją za pomocą storage lub wartości zwracanej — nigdy za pomocą zdarzenia.
Unikaj przechowywania danych na potrzeby historii
Częstym błędem początkujących jest dodawanie każdej operacji do tablicy w storage w celu utworzenia historii. Taka tablica rośnie bez ograniczeń i staje się niezwykle kosztowna. Zamiast tego emituj zdarzenia i pozwól indeksatorowi off-chain odtworzyć historię.
<code>// Anti-pattern: unbounded, costly
// historyArray.push(record);
// Better:
emit ActionRecorded(msg.sender, block.timestamp);</code>Lista kontrolna decyzji
Zadaj sobie pytanie: Czy jakiś kod on-chain odczyta tę wartość później?
- Tak — storage (opcjonalnie możesz również emitować zdarzenie)
- Nie, wartość służy tylko do wyświetlania lub audytu — tylko zdarzenie
To jedno pytanie rozstrzyga większość decyzji projektowych.
Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat zdarzeń i storage.
Podsumowanie
Poznałeś(-aś) kompromis między storage a zdarzeniami:
- Storage można odczytywać on-chain, ale jest kosztowny (~20 tys. gazu za nowy slot)
- Zdarzenia są tanie, ale mogą je odczytywać tylko klienci off-chain
- Przechowuj to, czego potrzebuje kontrakt; emituj to, czego potrzebuje tylko świat zewnętrzny
- Typowy wzorzec: aktualizuj storage I emituj zdarzenie
Nigdy nie przechowuj danych wyłącznie na potrzeby historii lub wyświetlania.
Ucz się Web3 & DApp Development Fundamentals dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 29
- Lekcje
- 105
Często zadawane pytania
Czy lekcja „Zdarzenia a storage” jest bezpłatna?
Tak — pełny tekst „Zdarzenia a storage” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Web3 & DApp Development Fundamentals, przejdź na CoddyKit PRO. Kurs Web3 & DApp Development Fundamentals zawiera 4 lekcji w sumie.
Co nauczysz się w „Zdarzenia a storage”?
Kompromisy dotyczące gas Ćwiczysz Web3 & DApp Development Fundamentals z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Web3 & DApp Development Fundamentals?
Nie wymagamy żadnego doświadczenia. Web3 & DApp Development Fundamentals w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Zdarzenia a storage”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Web3 & DApp Development Fundamentals?
Tak. Każda lekcja Web3 & DApp Development Fundamentals zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Deklarowanie zdarzeń
- Parametry indeksowane
- Nasłuchiwanie zdarzeń
- Zdarzenia a storage