Moonbase Alpha v2: Uudet sopimustapahtumat ja Pub / Sub

(Alberto Viera) (13. lokakuuta 2020)

Äskettäin PureStake ilmoitti Moonbase Alpha v2: n -julkaisulla, johon olemme juuri ilmoittaneet, lisäämme uusia ja jännittäviä ominaisuuksia, jotka auttavat Moonbeamia siirtymään lähemmäksi ensisijaista tavoitettaan tarjota saumaton kokemus Ethereumin hankkeille Polkadot-ekosysteemille. Yksi pääominaisuuksista on kyky tilata Ethereumin älykkäiden sopimusten tapahtumat ja muut estoketjutiedot.

Sopimustapahtumat ovat erittäin tärkeä osa Ethereumin dAppsia, koska ne helpottavat älykkäiden sopimusten ja niiden käyttöliittymät. Tapahtumia voidaan pitää asynkronisina laukaisijoina tietojen kanssa. Kun sopimus lähettää tapahtuman, se voi myöhemmin johtaa toimintaan käyttöliittymän puolella.

Käytä tapauksia tapahtumiin

Yksinkertainen esimerkki seuraamastasi tapahtumasta on siirtää. Oletetaan, että käyttäjä aloittaa siirron dApp-sovelluksen käyttöliittymän kautta, jolloin tapahtumahajautus saadaan, kun se on lähetetty. Mutta voidakseen vakuuttaa käyttäjälle, että maksu lähetettiin, dApp voi kuunnella tapahtumaa (sopimuksen aiheuttama), kun tapahtuma on sitoutunut estoketjuun. Tämä voi siten käynnistää näyttöviestin käyttäjälle, joka ilmoittaa heille, että hänen toimintonsa onnistui.

Toinen tehokas tapahtumien käyttötapa on halvempi tallennus. Lokit maksavat keskimäärin 8 kaasua tavua kohti, kun taas sopimuksen varastointi maksaa 20 000 kaasua 32 tavua kohden. Siksi tapahtumat voivat toimia työkaluna tarvittavien tietojen, kuten siirtolokien, tallentamiseen ja noutamiseen. Niitä ei kuitenkaan voida käyttää tallennustilana kaikissa käyttötapauksissa, koska niitä ei voi käyttää esimerkiksi muilla älykkäillä sopimuksilla.

Pub / Sub-merkitys

Kaiken tämän kontekstin perusteella olemme nyt valmiita puhumaan pubista / sub-ryhmästä.

Publish-tilaa tai lyhyesti pub / sub on asynkroninen viestipalvelu, joka toimii väliohjelmana viestien julkaisijoiden välillä, ja heitä tilaavat ihmiset. Yleisesti ottaen julkaisijat luokittelevat nämä viestit luokkiin ja julkaisevat ne tietämättä kuka on tilannut ne. Vastaavasti tilaajat ilmoittautuvat kiinnostaviin luokkiin ja saavat vain kyseiseen luokkaan liittyvät viestit tietämättä kuka heidän julkaisijansa on.

Julkaisemalla Moonbase Alpha v2 , pubi / alipalvelu, joka on yhteensopiva Ethereum-tyylisten tapahtumien kanssa, on nyt saatavilla.

Opetusohjelma: Kuinka käyttää pubia / subia Moonbeamissa

Koska kuva on tuhannen sanan arvoinen, siirrytään muutamiin esimerkkeihin esittelemään, kuinka pub / sub toimii Moonbeamissa.

Tämän demon seuraamiseksi tarvitset seuraavaa:

Tapahtumalokien tilaaminen Moonbasessa Alpha v2

Kaikki ERC-20-merkkistandardia noudattavat sopimukset lähettävät tapahtumien, jotka liittyvät merkkien siirtoon, eli event Transfer(address indexed from, address indexed to, uint256 value). Tässä esimerkissä tilataan tällaisten tapahtumien lokit. Web3 JS -kirjastoa käytettäessä tarvitaan seuraava koodikappale:

const Web3 = require("web3");
const web3 = new Web3("wss://wss.testnet.moonbeam.network");

web3.eth.subscribe("logs", {
address: "ContractAddress",
topics: ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}, (error, result) => {
if (error)
console.error(error);
})
.on("connected", function (subscriptionId) {
console.log(subscriptionId);
})
.on("data", function (log) {
console.log(log);
});

Huomaa, että muodostamme yhteyden Moonbase Alpha -palvelimen WebSocket-päätepisteeseen. Tilataan lokit ilmoitettujen asetusten mukaan suodattamalla web3.eth.subscribe("logs", options [, callback]) -menetelmää. Meidän tapauksessamme vaihtoehdot ovat sopimuksen osoite, josta tapahtumat lähetetään, ja aiheet, joita käytetään kuvaamaan tapahtumaa. Lisätietoja aiheista löytyy (tästä Medium-postista). Jos aiheita ei sisälly, tilaat kaikkiin sopimuksen lähettämiin tapahtumiin. Mutta vain siirtotapahtuman suodattamiseksi meidän on sisällytettävä tapahtuman allekirjoitus laskettuna seuraavasti:

EventSignature = keccak256(Transfer(address,address,uint256))

Aikaisemman laskelman tulos on sama kuin edellisessä koodinpätkässä. Palataan suodattamiseen aiheiden mukaan myöhemmin. Loput koodista käsittelee soittopyynnön.Kun tämä koodi on suoritettu, saamme tilaustunnuksen, ja pääte odottaa tapahtumia tilauksen kautta:

Seuraavaksi lähetetään ERC20-tunnuksen siirto seuraavilla parametreilla:

  • Lähettäjäosoite: 0x6Be02d1d3665660d22FF9624b7BE0551ee1Ac91b
  • Osoitteeseen: 0xfcB0B397BB28046C01be6A3d66c7Eda99Fb0f344
  • Arvo (rahakkeet): 1000000000000000000 z – se on 10

Kun lähetämme tapahtuman, tapahtuman tapahtumaloki ilmestyy päätelaitteeseen:

Lokeissa on paljon tietoa, mutta voit kysyä itseltäsi: missä tiedot ovat tapahtuneessa tapahtumassa? Ja vastaus on: lokeissa!

Kohdetapahtumamme lähettää kaksi indeksoitua tietoa, ”lähettäjä” ja ”vastaanottajat” (siinä järjestyksessä), joita käsitellään aiheina. Toinen tapahtumamme jakama tieto on merkkien lukumäärä, jota ei ole indeksoitu. Siksi on yhteensä kolme aihetta (enintään neljä), jotka vastaavat opkoodia LOG3:

Tästä syystä näet, että ”lähettäjä” – ja ”-” – osoitteet sisältyvät lokien palauttamiin aiheisiin. Ethereum-osoitteet ovat 40 heksadesimaalimerkkiä (yksi heksamerkki on 4 bittiä, siis 160 bittiä tai H160-muoto). Näin ollen ylimääräisiä 24 nollaa tarvitaan täyttää aukko H256: een, joka on 64 heksadesimaalimerkkiä.

Entä merkkien lukumäärä? Indeksoimattomat tiedot palautetaan lokien ”data” -kenttään, mutta tämä on koodattu tavuina32 / hex. Sen purkamiseen voimme käyttää esimerkiksi tätä verkkotyökalua ja varmistaa, että ”data” on itse asiassa 10 (plus 18 nollaa).

Jos tapahtuma palauttaa useita indeksoimattomia arvoja, ne lisätään peräkkäin samassa järjestyksessä kuin tapahtuma lähettää ne. Siksi kukin arvo saadaan sitten purkamalla tiedot erillisiksi 32 tavun (tai 64 heksamerkin pituisiksi) kappaleiksi.

Tämä esimerkki osoitti, kuinka voimme tilata vain tietyn sopimuksen tapahtumalokit. Mutta Web3 JS -kirjasto tarjoaa muita tilaustyyppejä, joista käymme läpi seuraavissa osioissa.

Tilaa saapuvat odottavat tapahtumat

Voidaksesi tilata odottavia tapahtumia voimme käyttää web3.eth.subscribe("pendingTransactions", [, callback]) -menetelmää toteuttamalla sama takaisintoiminto vastauksen tarkistamiseksi. Tämä on paljon yksinkertaisempi kuin edellinen esimerkkimme, ja se palauttaa odottavien tapahtumien tapahtumahajautuksen.

Voimme varmistaa, että tämä tapahtuman hash on sama kuin MetaMask (tai Remix).

Tilaa saapuvien lohkojen otsikot

Toinen Web3 JS -kirjastossa käytettävissä oleva tyyppi on tilata uudet lohkootsikot. Tätä varten käytämme web3.eth.subscribe("newBlockHeaders" [, callback]) -menetelmää toteuttamalla sama takaisintoiminto vastauksen tarkistamiseksi. Tämä tilaus tarjoaa saapuvat lohkootsikot ja sitä voidaan käyttää lohkoketjun muutosten seuraamiseen.

Huomaa, että kuvassa näkyy vain yksi lohkon otsikko. Nämä viestit näytetään jokaiselle tuotetulle lohkolle, joten ne voivat täyttää päätelaitteen melko nopeasti.

Tarkista, onko solmu synkronoitu verkon kanssa

Pub / sub-toiminnolla on myös mahdollista tarkistaa, onko tietty tilaamasi solmu synkronoitu tällä hetkellä verkon kanssa. Tätä varten voimme hyödyntää web3.eth.subscribe("syncing" [, callback]) -menetelmää toteuttamalla saman takaisinsoittotoiminnon vastauksen tarkistamiseksi. Tämä tilaus palauttaa objektin, kun solmu synkronoidaan verkon kanssa.

Nykyiset rajoitukset

Pubin / alakehityksen toteutus Frontierissa on edelleen aktiivista kehitystä. Tämän ensimmäisen version avulla dApp-kehittäjät (tai käyttäjät yleensä) voivat tilata tiettyjä tapahtumatyyppejä, mutta joitain rajoituksia on edelleen. Aikaisemmista esimerkeistä saatat huomata, että joillakin kentillä ei ole oikeaa tietoa, ja siksi, että Frontier ei vielä tue tiettyjä ominaisuuksia.

Toinen rajoitus liittyy kentän lokeihin. tapahtuma. Ethereumissa voit käyttää jokerimerkkejä ja syöttää useita syöttöosoitteita esimerkiksi tiettyjen lokien suodattamiseen. Oletetaan, että haluamme tilata kaikki sopimuksen tapahtumat, joilla on kaksi erityistä osoitetta ”aihe\_1” -kentässä (muista, että topic\_0 on varattu tapahtuman allekirjoitukselle).Sitten voisimme syöttää seuraavan aiheen syötteeksi:

topics: [null, [address1, address2]]

Täällä käyttämällä yleismerkkiä null paikallaan tapahtuman allekirjoitusta varten kuuntelemme kaikkia tilaamamme sopimuksen aiheuttamia tapahtumia. Mutta tässä kokoonpanossa voimme käyttää myös toista syöttökenttää, toisin sanoen topic\_1, suodattimen määrittämiseksi osoitteen mukaan, kuten aiemmin mainittiin.

Nykyinen Frontier -toteutus ei tue näitä ominaisuuksia. Vaihtoehtoisesti voit luoda useita tilauksia kaikille sopimuksen tapahtumille ja eri osoitteille, mutta tämä lisää suoritettavien toimintojen määrää. Tätä odotetaan kuitenkin tukevan Moonbase TestNetin tulevissa versioissa.

Ota yhteyttä

Jos sinulla on palautetta Moonbase Alpha v2: sta, pubista / subista tai mistä tahansa muusta Moonbeamiin liittyvä aihe, voit käydä verkkosivustollamme tai ottaa yhteyttä viralliseen kehityskeskukseen Discord-palvelin .

Alun perin julkaistu osoitteessa https://www.purestake.com 13. lokakuuta 2020.