Tapahtumien kuuntelu
Tilatkaa lokit.
Tapahtumien kuuntelu on ilmainen Web3:n ja DApp-sovellusten kehityksen perusteet-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Web3:n ja DApp-sovellusten kehityksen perusteet-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Web3:n ja DApp-sovellusten kehityksen perusteet-kurssilla on yhteensä 4 oppituntia.
Mitä tapahtumat ovat
Älysopimukset lähettävät tapahtumia lokitiedoksi siitä, että jotain tapahtui — esimerkiksi siirto, hyväksyntä tai äänestys. Tapahtumat kirjoitetaan transaktion lokeihin.
- Ne ovat edullisempia kuin tallennus.
- Ketjun ulkopuoliset sovellukset tilaavat niitä pysyäkseen ajan tasalla.
Tapahtumat ABIssa
Tapahtumien dekoodaamista varten ethers tarvitsee niiden määritelmät ABIssa:
const abi = [
"event Transfer(address indexed from, address indexed to, uint256 value)",
];
const contract = new ethers.Contract(address, abi, provider);indexed-avainsana merkitsee kentät, joiden perusteella voitte suodattaa.
const abi = [
"event Transfer(address indexed from, address indexed to, uint256 value)",
];
const contract = new ethers.Contract(address, abi, provider);Reaaliaikainen kuuntelu
Tilatkaa uusia tapahtumia on-metodilla. Callback suoritetaan aina, kun tapahtuma lähetetään:
contract.on("Transfer", (from, to, value, event) => {
console.log(from, "->", to, value);
});Tämä edellyttää tilauksia tukevaa provideria, kuten WebSocket-yhteyttä.
contract.on("Transfer", (from, to, value, event) => {
console.log(from, "->", to, value);
});WebSocket-providerit
Reaaliaikaiset tilaukset toimivat parhaiten pysyvän yhteyden kautta. Käyttäkää WebSocket-provideria:
const provider = new ethers.WebSocketProvider(
"wss://mainnet.example-rpc.io/KEY"
);HTTP-providerit voivat kysellä tapahtumia, mutta WebSocket välittää ne reaaliajassa.
const provider = new ethers.WebSocketProvider(
"wss://mainnet.example-rpc.io/KEY"
);Kertakuuntelu
Jos tarvitsette vain ensimmäisen esiintymän, käyttäkää once-metodia:
contract.once("Approval", (owner, spender, value) => {
console.log("First approval seen");
});Kuuntelija poistaa itsensä automaattisesti, kun se on suoritettu kerran.
contract.once("Approval", (owner, spender, value) => {
console.log("First approval seen");
});Aiemmat tapahtumat
Voitte lukea aiemmat tapahtumat käyttämällä queryFilter-metodia lohkoalueella:
const logs = await contract.queryFilter(
"Transfer",
19000000,
19000100
);
for (const log of logs) {
console.log(log.args.from, log.args.value);
}Jokainen loki sisältää puretut args-argumentit.
const logs = await contract.queryFilter(
"Transfer",
19000000,
19000100
);
for (const log of logs) {
console.log(log.args.from, log.args.value);
}Suodatus indeksoitujen kenttien perusteella
Luokaa suodatin, joka vastaa tiettyjä indeksoituja arvoja — esimerkiksi tiettyyn osoitteeseen tehtyjä siirtoja varten:
const filter = contract.filters.Transfer(null, myAddress);
const logs = await contract.queryFilter(filter);Arvon null välittäminen tarkoittaa, että kyseisessä kohdassa hyväksytään mikä tahansa arvo.
const filter = contract.filters.Transfer(null, myAddress);
const logs = await contract.queryFilter(filter);Suodatettujen tapahtumien reaaliaikainen kuuntelu
Voitte välittää suodattimen myös on-metodille, jolloin reagoitte vain olennaisiin tapahtumiin:
const filter = contract.filters.Transfer(null, myAddress);
contract.on(filter, (from, to, value) => {
console.log("Received:", value);
});Tämä estää käsittelemästä tapahtumia, joista ette ole kiinnostuneita.
const filter = contract.filters.Transfer(null, myAddress);
contract.on(filter, (from, to, value) => {
console.log("Received:", value);
});Kuuntelijoiden poistaminen
Pitkään käynnissä olevien sovellusten kannattaa siivota kuuntelijat muistivuotojen välttämiseksi:
contract.off("Transfer", myHandler);
// or remove all listeners for an event
contract.removeAllListeners("Transfer");Poistakaa kuuntelijat aina, kun komponentti poistuu käytöstä tai työ on valmis.
contract.off("Transfer", myHandler);
// or remove all listeners for an event
contract.removeAllListeners("Transfer");Uudelleenjärjestelyjen käsittely
Äskettäiset tapahtumat voidaan kumota, jos lohkoketju järjestäytyy uudelleen. Luotettavaa indeksointia varten:
- Odottakaa useita vahvistuksia, ennen kuin käsittelette tapahtumaa lopullisena.
- Seuratkaa lohkon numeroa ja käsitelkää tapahtumat uudelleen, jos havaitsette uudelleenjärjestelyn.
Näin ketjun ulkopuolinen tietokantanne pysyy yhdenmukaisena ketjun kanssa.
Provider-tason lokisuodattimet
Voitte myös tilata tapahtumia provider-tasolla ilman sopimusinstanssia käyttämällä aiheeseen perustuvaa raakaa lokisuodatinta:
provider.on({
address: tokenAddress,
topics: [ethers.id("Transfer(address,address,uint256)")],
}, (log) => {
console.log("Raw log:", log);
});Tämä on matalamman tason ratkaisu, mutta toimii samanaikaisesti useiden sopimusten kanssa.
provider.on({
address: tokenAddress,
topics: [ethers.id("Transfer(address,address,uint256)")],
}, (log) => {
console.log("Raw log:", log);
});Pikatarkistus
Testatkaa, miten hyvin ymmärrätte tapahtumien käsittelyn.
Kertaus
Opitte käsittelemään sopimusten tapahtumia.
- Tapahtumat kirjaavat ketjussa tapahtuvan toiminnan transaktiolokeihin.
ontilaa reaaliaikaiset tapahtumat (parhaiten WebSocket-providerin kautta);oncesuoritetaan vain kerran.queryFilterlukee aiemmat tapahtumat lohkoalueelta.- Luokaa suodattimet indeksoiduista kentistä; välittäkää
null, jos haluatte hyväksyä minkä tahansa arvon. - Poistakaa kuuntelijat muistivuotojen välttämiseksi ja odottakaa vahvistuksia uudelleenjärjestelyjen varalta.
Opi Web3:n ja DApp-sovellusten kehityksen perusteet tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 29
- Oppitunnit
- 105
Usein kysytyt kysymykset
Onko oppitunti ”Tapahtumien kuuntelu” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Web3:n ja DApp-sovellusten kehityksen perusteet-oppimispolun 3 oppituntia, myös oppitunnin “Tapahtumien kuuntelu”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Web3:n ja DApp-sovellusten kehityksen perusteet-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Tapahtumien kuuntelu”?
Tilatkaa lokit. Harjoittelet Web3:n ja DApp-sovellusten kehityksen perusteet-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Web3:n ja DApp-sovellusten kehityksen perusteet-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Web3:n ja DApp-sovellusten kehityksen perusteet-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Tapahtumien kuuntelu”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Web3:n ja DApp-sovellusten kehityksen perusteet-oppitunnilla?
Kyllä. Jokainen Web3:n ja DApp-sovellusten kehityksen perusteet-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Provideriin yhdistäminen
- Sopimuksen tietojen lukeminen
- Transaktioiden lähettäminen
- Tapahtumien kuuntelu