Moonbase Alpha v2: Nye kontraktbegivenheder og Pub / Sub

(Alberto Viera) (13. okt 2020)

Med udgivelsen af ​​Moonbase Alpha v2 , som netop blev annonceret af PureStake, tilføjer vi nogle nye og spændende funktioner, der hjælper Moonbeam med at komme tættere på sit primære mål at give en problemfri oplevelse til projekter fra Ethereum på Polkadot-økosystemet. En af de vigtigste funktioner, der tilføjes, er evnen til at abonnere på Ethereum-smarte kontrakterhændelser og andre blockchain-oplysninger.

Kontrakthændelser er en super vigtig del af dApps i Ethereum, da de letter kommunikationen mellem smarte kontrakter og deres brugergrænseflader. Begivenheder kan betragtes som asynkrone udløsere med data. Når en kontrakt udsender en begivenhed, kan dette efterfølgende resultere i en handling på front-end-siden.

Brug sager til begivenheder

Et simpelt eksempel på en begivenhed, du kunne spore, er en overførsel. Lad os sige, at en overførsel initieres af en bruger ved hjælp af frontend af en dApp, hvor en transaktionshash opnås, når denne er indsendt. Men for at sikre brugeren, at betalingen blev sendt, kan dApp lytte til en begivenhed (udsendt af kontrakten), når transaktionen er forpligtet til blockchain. Dette kan derfor udløse en displaybesked til brugeren, der underretter dem om, at deres handling var vellykket.

Et andet kraftigt anvendelses tilfælde af begivenheder er billigere lagerplads. I gennemsnit koster logfiler 8 gas pr. Byte, mens kontraktoplagring koster 20.000 gas pr. 32 byte. Derfor kan begivenheder også tjene som et værktøj til at gemme og hente nødvendige oplysninger såsom overførselslogfiler. De kan dog ikke bruges som lager til alle brugssager, fordi de f.eks. Ikke kan få adgang til andre smarte kontrakter.

Betydningen af ​​pub / sub

I betragtning af al denne kontekst er vi nu klar til at tale om pub / sub.

Publish-subscribe, eller pub / sub for kort, er en asynkron messaging-tjeneste, der fungerer som en middleware mellem udgivere af meddelelser, og folk, der abonnerer på dem. Generelt kategoriserer udgivere disse meddelelser i klasser og udgiver dem uden virkelig at vide, hvem der abonnerer på dem. På samme måde tilmelder abonnenter sig i de klasser, der er af interesse, og modtager kun beskeder, der er knyttet til denne klasse, uden at vide, hvem deres udgiver er.

Med frigivelsen af ​​ Moonbase Alpha v2 , en pub / sub-tjeneste, der er kompatibel med begivenheder i Ethereum-stil, er nu tilgængelig.

Selvstudie: Sådan bruges Pub / Sub på Moonbeam

Siden et billede er tusind ord værd, lad os springe ind i nogle eksempler for at vise, hvordan pub / sub fungerer på Moonbeam.

For at følge denne demo skal du have følgende:

Abonnement på begivenhedslogfiler i Moonbase Alpha v2

Enhver kontrakt, der følger ERC-20-tokenstandarden, udsender en begivenhed relateret til en overførsel af tokens, dvs. event Transfer(address indexed from, address indexed to, uint256 value). I dette eksempel abonnerer vi på logfiler for sådanne begivenheder. Ved hjælp af Web3 JS-biblioteket har vi brug for følgende stykke kode:

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);
});

Bemærk, at vi opretter forbindelse til WebSocket-slutpunktet for Moonbase Alpha. Vi bruger metoden web3.eth.subscribe("logs", options [, callback]) til at abonnere på logfilerne, filtreret efter de givne muligheder. I vores tilfælde er valgmulighederne kontraktens adresse, hvor begivenhederne udsendes fra, og emnerne, der bruges til at beskrive begivenheden. Flere oplysninger om emner kan findes i (dette Medium-indlæg). Hvis der ikke er inkluderet emner, abonnerer du til alle begivenheder, der udsendes af kontrakten. Men for kun at filtrere overførselshændelsen, skal vi medtage underskriften af ​​begivenheden, beregnet som:

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

Resultatet af den tidligere beregning er, hvad der er vist i kodestykket fra før. Vi vender tilbage til filtrering efter emner senere. Resten af ​​koden håndterer tilbagekaldsfunktionen.Når vi udfører denne kode, får vi et abonnements-id, og terminalen venter på enhver begivenhed gennem dette abonnement:

Derefter sendes en ERC20-tokenoverførsel med følgende parametre:

  • Fra adresse: 0x6Be02d1d3665660d22FF9624b7BE0551ee1Ac91b
  • Til adresse: 0xfcB0B397BB28046C01be6A3d66c7Eda99Fb0f344
  • Værdi (tokens): 10000000000000000000 – det vil sige 10 med

Når vi har sendt transaktionen, vises loggen på begivenheden, der udsendes af transaktionen, i terminalen:

Der gives mange oplysninger i logfilerne, men du kan spørge dig selv: hvor er oplysningerne i den udsendte begivenhed? Og svaret er: i logfilerne!

Vores målbegivenhed sender to stykker indekseret information, “fra” og “til” adresserne (i den rækkefølge), der behandles som emner. Det andet stykke data, der deles af vores begivenhed, er antallet af tokens, der ikke er indekseret. Derfor er der i alt tre emner (maksimum er fire), der svarer til opkoden LOG3:

Derfor kan du se, at “fra” og “til” adresserne er indeholdt i de emner, der returneres af logfilerne. Ethereum-adresser er 40 sekskantede tegn (1 sekskant er 4 bit, derfor 160 bit eller H160-format). Således er de ekstra 24 nuller nødvendige for at udfylde hullet til H256, som er 64 hexadecimale tegn.

Hvad med antallet af tokens? Uindekserede data returneres i “data” -feltet i logfilerne, men dette er kodet i bytes32 / hex. For at afkode det kan vi f.eks. Bruge dette onlineværktøj og kontrollere, at “data” faktisk er 10 (plus 18 nuller).

Hvis begivenheden returnerer flere ikke-indekserede værdier, tilføjes disse efter hinanden i samme rækkefølge som begivenheden udsender dem. Derfor opnås hver værdi derefter ved at dekonstruere data i separate 32 bytes (eller 64 hex-tegn lange) stykker.

Dette eksempel viste, hvordan vi kun kunne abonnere på hændelseslogfiler for en bestemt kontrakt. Men Web3 JS-biblioteket leverer andre abonnementstyper, som vi gennemgår i de følgende sektioner.

Abonner på indgående ventende transaktioner

For at abonnere på ventende transaktioner kan vi bruge web3.eth.subscribe("pendingTransactions", [, callback]) -metoden, der implementerer den samme tilbagekaldsfunktion for at kontrollere svaret. Dette er meget enklere end vores tidligere eksempel, og det returnerer transaktionshash af de ventende transaktioner.

Vi kan kontrollere, at denne transaktionshash er den samme som vist i MetaMask (eller Remix).

Abonner på indgående blokoverskrifter

En anden type tilgængelig under Web3 JS-biblioteket er at abonnere på nye blokoverskrifter. For at gøre dette bruger vi web3.eth.subscribe("newBlockHeaders" [, callback]) -metoden og implementerer den samme tilbagekaldsfunktion til at kontrollere svaret. Dette abonnement indeholder indgående blokoverskrifter og kan bruges til at spore ændringer i blockchain.

Bemærk, at der kun vises en blokoverskrift i billedet. Disse meddelelser vises for hver produceret blok, så de hurtigt kan udfylde terminalen.

Kontroller, om noden er synkroniseret med netværket

Med pub / sub er det også muligt for at kontrollere, om en bestemt node, som du abonnerer på, i øjeblikket er synkroniseret med netværket. Til det kan vi udnytte web3.eth.subscribe("syncing" [, callback]) -metoden og implementere den samme tilbagekaldsfunktion for at kontrollere svaret. Dette abonnement returnerer et objekt, når noden synkroniseres med netværket.

Aktuelle begrænsninger

Implementeringen af ​​pub / sub i Frontier er stadig i aktiv udvikling. Denne første version giver dApp-udviklere (eller brugere generelt) mulighed for at abonnere på specifikke begivenhedstyper, men der er stadig nogle begrænsninger. Fra de tidligere eksempler har du muligvis bemærket, at nogle af felterne ikke viser korrekt information, og det er fordi visse egenskaber endnu ikke understøttes af Frontier.

En anden begrænsning er relateret til logfiler fra begivenhed. På Ethereum kan du bruge jokertegn og videregive flere inputadresser, for eksempel til at filtrere specifikke logfiler. Lad os sige, at vi gerne vil abonnere på alle begivenheder i en kontrakt, der har to specifikke adresser i feltet “topic\_1” (husk at topic\_0 er forbeholdt begivenhedens underskrift).Derefter kunne vi sende det følgende emne som input:

topics: [null, [address1, address2]]

Her ved at bruge jokertegnet null på plads til begivenhedens underskrift lytter vi til alle begivenheder, der udsendes af kontrakten, som vi abonnerede på. Men med denne konfiguration kan vi også bruge et andet indtastningsfelt, det vil sige topic\_1, til at definere et filter efter adresse som nævnt før.

Den aktuelle Frontier -implementering understøtter ikke disse funktioner. Som et alternativ kan du oprette flere abonnementer på alle begivenhederne i kontrakten og de forskellige adresser, men dette øger antallet af operationer, der skal udføres. Dette forventes dog at blive understøttet i fremtidige versioner af Moonbase TestNet.

Kontakt os

Hvis du har feedback om Moonbase Alpha v2, pub / sub eller enhver anden Moonbeam-relateret emne, er du velkommen til besøg vores hjemmeside eller nå ud gennem vores officielle udvikling Discord-server .

Oprindeligt offentliggjort på https://www.purestake.com den 13. oktober 2020.