Web3 & DApp Development Fundamentals · Lekcja

Zdarzenia a storage

Kompromisy dotyczące gas

Lekcja 4 z 413 kroki

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.

Bezpłatny start

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

  1. Deklarowanie zdarzeń
  2. Parametry indeksowane
  3. Nasłuchiwanie zdarzeń
  4. Zdarzenia a storage
← Powrót do Web3 & DApp Development Fundamentals