Grunnleggende om Web3- og DApp-utvikling · leksjon

Lytte til hendelser

Abonnere på logger

Leksjon 4 av 413 trinn

Lytte til hendelser er en gratis leksjon i Grunnleggende om Web3- og DApp-utvikling på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Grunnleggende om Web3- og DApp-utvikling, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Grunnleggende om Web3- og DApp-utvikling inneholder totalt 4 leksjoner.

Hva er hendelser

Smartkontrakter sender ut hendelser for å logge at noe har skjedd – en overføring, en godkjenning eller en stemme. Hendelser skrives til transaksjonens logger.

  • De er billigere enn lagring.
  • Apper utenfor kjeden abonnerer på dem for å holde seg synkronisert.

Hendelser i ABI-en

For å dekode hendelser trenger ethers definisjonene deres i ABI-en:

const abi = [ "event Transfer(address indexed from, address indexed to, uint256 value)", ]; const contract = new ethers.Contract(address, abi, provider);

Nøkkelordet indexed markerer felter De kan filtrere på.

const abi = [
  "event Transfer(address indexed from, address indexed to, uint256 value)",
];
const contract = new ethers.Contract(address, abi, provider);

Lytte i sanntid

Abonner på nye hendelser med on. Tilbakekallfunksjonen kjøres hver gang hendelsen sendes ut:

contract.on("Transfer", (from, to, value, event) => { console.log(from, "->", to, value); });

Dette krever en provider som støtter abonnementer, for eksempel en WebSocket-tilkobling.

contract.on("Transfer", (from, to, value, event) => {
  console.log(from, "->", to, value);
});

WebSocket-providere

Live-abonnementer fungerer best over en vedvarende tilkobling. Bruk en WebSocket-provider:

const provider = new ethers.WebSocketProvider( "wss://mainnet.example-rpc.io/KEY" );

HTTP-providere kan spørre etter hendelser med jevne mellomrom, men en WebSocket sender dem i sanntid.

const provider = new ethers.WebSocketProvider(
  "wss://mainnet.example-rpc.io/KEY"
);

Lytte én gang

Hvis De bare er interessert i den første forekomsten, kan De bruke once:

contract.once("Approval", (owner, spender, value) => { console.log("First approval seen"); });

Lytteren fjerner automatisk seg selv etter at den er utløst én gang.

contract.once("Approval", (owner, spender, value) => {
  console.log("First approval seen");
});

Spørring etter tidligere hendelser

Bruk queryFilter over et blokkområde for å lese historiske hendelser:

const logs = await contract.queryFilter( "Transfer", 19000000, 19000100 ); for (const log of logs) { console.log(log.args.from, log.args.value); }

Hver logg viser dekodede args.

const logs = await contract.queryFilter(
  "Transfer",
  19000000,
  19000100
);
for (const log of logs) {
  console.log(log.args.from, log.args.value);
}

Filtrering etter indekserte felt

Bygg et filter for å finne bestemte indekserte verdier — for eksempel overføringer til én adresse:

const filter = contract.filters.Transfer(null, myAddress); const logs = await contract.queryFilter(filter);

Hvis De sender inn null, samsvarer det med alle verdier på den aktuelle plasseringen.

const filter = contract.filters.Transfer(null, myAddress);
const logs = await contract.queryFilter(filter);

Filtrert lytting i sanntid

De kan også sende et filter til on for å reagere bare på relevante hendelser:

const filter = contract.filters.Transfer(null, myAddress); contract.on(filter, (from, to, value) => { console.log("Received:", value); });

Da unngår De å behandle hendelser De ikke er interessert i.

const filter = contract.filters.Transfer(null, myAddress);
contract.on(filter, (from, to, value) => {
  console.log("Received:", value);
});

Fjerne lyttere

Apper som kjører lenge, bør rydde opp i lyttere for å unngå lekkasjer:

contract.off("Transfer", myHandler); // or remove all listeners for an event contract.removeAllListeners("Transfer");

Fjern alltid lyttere når en komponent avmonteres eller en jobb er ferdig.

contract.off("Transfer", myHandler);
// or remove all listeners for an event
contract.removeAllListeners("Transfer");

Håndtering av reorganiseringer

Nylige hendelser kan bli omgjort hvis kjeden reorganiseres. For pålitelig indeksering:

  • Vent på flere bekreftelser før en hendelse behandles som endelig.
  • Følg med på blokknummeret, og behandle dataene på nytt hvis De oppdager en reorganisering.

Dette holder databasen utenfor kjeden konsistent med kjeden.

Loggfiltre på providernivå

De kan også abonnere på providernivå uten en kontraktinstans ved å bruke et råloggfilter etter topic:

provider.on({ address: tokenAddress, topics: [ethers.id("Transfer(address,address,uint256)")], }, (log) => { console.log("Raw log:", log); });

Dette er på et lavere nivå, men fungerer på tvers av mange kontrakter samtidig.

provider.on({
  address: tokenAddress,
  topics: [ethers.id("Transfer(address,address,uint256)")],
}, (log) => {
  console.log("Raw log:", log);
});

Kort kontroll

Test forståelsen Deres av hendelseshåndtering.

Oppsummering

De har lært å arbeide med kontrakthendelser.

  • Hendelser logger aktivitet på kjeden i transaksjonslogger.
  • on abonnerer på hendelser i sanntid (best med en WebSocket-provider); once utløses én gang.
  • queryFilter leser historiske hendelser over et blokkområde.
  • Bygg filtre fra indekserte felt; send inn null for å samsvare med alle verdier.
  • Fjern lyttere for å unngå lekkasjer, og vent på bekreftelser for å håndtere reorganiseringer.
Gratis å komme i gang

Lær deg Grunnleggende om Web3- og DApp-utvikling med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
29
Leksjoner
105

Ofte stilte spørsmål

Er leksjonen «Lytte til hendelser» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Grunnleggende om Web3- og DApp-utvikling, inkludert «Lytte til hendelser», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Grunnleggende om Web3- og DApp-utvikling inneholder totalt 4 leksjoner.

Hva lærer jeg i «Lytte til hendelser»?

Abonnere på logger Du øver på Grunnleggende om Web3- og DApp-utvikling med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Grunnleggende om Web3- og DApp-utvikling?

Ingen tidligere erfaring er nødvendig. Grunnleggende om Web3- og DApp-utvikling på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Lytte til hendelser»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Grunnleggende om Web3- og DApp-utvikling-leksjonen?

Ja. Alle Grunnleggende om Web3- og DApp-utvikling-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Koble til en provider
  2. Lese kontraktdata
  3. Sende transaksjoner
  4. Lytte til hendelser
← Tilbake til Grunnleggende om Web3- og DApp-utvikling