Moonbase Alpha v2: New Contract Events and Pub / Sub (Română)

(Alberto Viera) (13 oct 2020)

Cu lansarea a Moonbase Alpha v2 , care tocmai a fost anunțată de PureStake, adăugăm câteva caracteristici noi și interesante care ajută Moonbeam să se apropie de obiectivul său principal de a oferi o experiență perfectă pentru proiectele din Ethereum pe ecosistemul Polkadot. Una dintre principalele caracteristici adăugate este abilitatea de a vă abona la evenimente de contracte inteligente Ethereum și alte informații despre blockchain.

Evenimentele contractuale sunt o parte foarte importantă a dApp-urilor din Ethereum, deoarece facilitează comunicarea între contractele inteligente interfețele lor de utilizator. Evenimentele pot fi considerate declanșatoare asincrone cu datele. Când un contract emite un eveniment, acest lucru poate duce ulterior la o acțiune din partea frontală.

Cazuri de utilizare pentru evenimente

Un exemplu simplu de eveniment pe care l-ați putea urmări este un transfer. Să presupunem că un transfer este inițiat de un utilizator utilizând front-end-ul unui dApp, unde se obține o tranzacție hash după ce acesta este trimis. Dar pentru a asigura utilizatorului că plata a fost trimisă, dApp-ul poate asculta un eveniment (emis de contract) atunci când tranzacția este dedicată blockchain-ului. În consecință, acest lucru poate declanșa un mesaj de afișare către utilizator, notificându-i că acțiunea lor a avut succes.

Un alt caz de utilizare puternic al evenimentelor este stocarea mai ieftină. În medie, jurnalele costă 8 gaze pe octet, în timp ce stocarea contractului costă 20.000 de gaze pe 32 de octeți. Prin urmare, evenimentele pot servi ca instrument pentru salvarea și recuperarea informațiilor necesare, cum ar fi jurnalele de transfer. Cu toate acestea, acestea nu pot fi utilizate ca stocare pentru toate cazurile de utilizare, deoarece nu pot fi accesate prin alte contracte inteligente, de exemplu.

Semnificația Pub / Sub

Având în vedere acest context, acum suntem gata să vorbim despre pub / sub.

Publish-subscribe, sau pub / sub pe scurt, este un serviciu de mesagerie asincron care acționează ca un middleware între editorii de mesaje, și persoanele care le subscriu. În termeni generali, editorii clasifică aceste mesaje în clase și le publică fără să știe cu adevărat cine este abonat la acestea. În mod similar, abonații se înscriu la cursurile care sunt de interes, primind doar mesaje asociate clasei respective, fără să știe cine este editorul lor.

Odată cu lansarea Moonbase Alpha v2 , un serviciu pub / sub compatibil cu evenimentele în stil Ethereum este acum disponibil.

Tutorial: Cum se folosește Pub / Sub pe Moonbeam

Dintr-o imagine merită o mie de cuvinte, să trecem la câteva exemple pentru a arăta cum funcționează pub / sub pe Moonbeam.

Pentru a urma această demonstrație, veți avea nevoie de următoarele:

Abonarea la jurnalele de evenimente din Moonbase Alpha v2

Orice contract care respectă standardul de jeton ERC-20 emite un eveniment legat de un transfer de jetoane, adică event Transfer(address indexed from, address indexed to, uint256 value). Pentru acest exemplu, ne vom abona la jurnalele unor astfel de evenimente. Folosind biblioteca J3 Web3, avem nevoie de următorul fragment de cod:

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

Rețineți că ne conectăm la punctul final WebSocket al Moonbase Alpha. Folosim metoda web3.eth.subscribe("logs", options [, callback]) pentru a vă abona la jurnale, filtrate de opțiunile date. În cazul nostru, opțiunile sunt adresa contractului de unde sunt emise evenimentele și subiectele utilizate pentru a descrie evenimentul. Mai multe informații despre subiecte pot fi găsite în (acest post mediu). Dacă nu sunt incluse subiecte, vă abonați la toate evenimentele emise de contract. Dar, pentru a filtra doar evenimentul de transfer, trebuie să includem semnătura evenimentului, calculată ca:

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

Rezultatul calculului anterior este ceea ce se arată în fragmentul de cod de mai înainte. Ne vom întoarce la filtrarea după subiecte mai târziu. Restul codului gestionează funcția de apel invers.Odată ce executăm acest cod, vom primi un ID de abonament, iar terminalul va aștepta orice eveniment prin acel abonament:

Apoi, va fi trimis un transfer de jeton ERC20 cu următorii parametri:

  • De la adresa: 0x6Be02d1d3665660d22FF9624b7BE0551ee1Ac91b
  • La adresă: 0xfcB0B397BB28046C01be6A3d66c7Eda99Fb0f344
  • Valoare (jetoane): 1000000000000000000000 – adică 10 cu 18 zerouri

Odată ce trimitem tranzacția, jurnalul evenimentului emis de tranzacție va apărea în terminal:

O mulțime de informații sunt furnizate în jurnale, dar s-ar putea să vă întrebați: unde sunt informațiile din evenimentul emis? Și răspunsul este: în jurnale!

Evenimentul nostru țintă trimite două bucăți de informații indexate, adresele „de la” și „către” (în această ordine), care sunt tratate ca subiecte. Cealaltă informație partajată de evenimentul nostru este numărul de jetoane, care nu este indexat. Prin urmare, există un total de trei subiecte (maximul este de patru), care corespund opcode LOG3:

În consecință, puteți vedea că adresele „de la” și „către” sunt conținute în subiectele returnate de jurnale. Adresele Ethereum au 40 de caractere hexagonale (1 caracter hex este 4 biți, deci 160 de biți sau formatul H160). Astfel, sunt necesare cele 24 de zerouri suplimentare pentru a umple golul până la H256, care are 64 de caractere hexagonale.

Dar numărul de jetoane? Datele neindexate sunt returnate în câmpul „date” al jurnalelor, dar acestea sunt codificate în bytes32 / hex. Pentru a-l decoda, putem folosi, de exemplu, acest instrument online și putem verifica dacă „datele” sunt de fapt 10 (plus 18 zerouri).

Dacă evenimentul returnează mai multe valori neindexate, acestea vor fi adăugate una după alta în aceeași ordine în care le emite evenimentul. Prin urmare, fiecare valoare este apoi obținută prin deconstruirea datelor în bucăți separate de 32 de octeți (sau 64 de caractere hexagonale).

Acest exemplu a arătat cum ne-am putea abona doar la jurnalele de evenimente ale unui contract specific. Dar biblioteca Web3 JS oferă alte tipuri de abonament pe care le vom trece în secțiunile următoare.

Abonați-vă la tranzacțiile în așteptare primite

Pentru a vă abona la tranzacțiile în așteptare, putem folosi metoda web3.eth.subscribe("pendingTransactions", [, callback]), implementând aceeași funcție de apel invers pentru a verifica răspunsul. Acest lucru este mult mai simplu decât exemplul nostru anterior și returnează hash-ul tranzacției pentru tranzacțiile în așteptare.

Putem verifica dacă această tranzacție hash este aceeași cu cea afișată în MetaMask (sau Remix).

Abonați-vă la anteturile blocului de intrare

Un alt tip disponibil în biblioteca Web3 JS este să vă abonați la noi anteturi de bloc. Pentru a face acest lucru, folosim metoda web3.eth.subscribe("newBlockHeaders" [, callback]), implementând aceeași funcție de apel invers pentru a verifica răspunsul. Acest abonament oferă anteturi de bloc primite și poate fi utilizat pentru a urmări modificările din blockchain.

Rețineți că în imagine este afișat un singur antet de bloc. Aceste mesaje sunt afișate pentru fiecare bloc produs, astfel încât să poată umple terminalul destul de repede.

Verificați dacă nodul este sincronizat cu rețeaua

Cu pub / sub este de asemenea posibil pentru a verifica dacă un anumit nod, la care sunteți abonat, este sincronizat în prezent cu rețeaua. Pentru aceasta, putem utiliza metoda web3.eth.subscribe("syncing" [, callback]), implementând aceeași funcție de apel invers pentru a verifica răspunsul. Acest abonament va returna un obiect atunci când nodul este sincronizat cu rețeaua.

Limitări actuale

Implementarea pub / sub în Frontier este încă în dezvoltare activă. Această primă versiune permite dezvoltatorilor dApp (sau utilizatorilor în general) să se aboneze la anumite tipuri de evenimente, dar există încă unele limitări. Din exemplele anterioare, este posibil să fi observat că unele dintre câmpuri nu afișează informații adecvate și acest lucru se datorează faptului că anumite proprietăți nu sunt încă acceptate de Frontier.

O altă limitare este legată de jurnalele din eveniment. Pe Ethereum, puteți utiliza metacaractere și trece în mai multe adrese de intrare, de exemplu, pentru a filtra jurnale specifice. Să presupunem că am dori să ne abonăm la toate evenimentele unui contract care au două adrese specifice în câmpul „topic\_1” (nu uitați că topic\_0 este rezervat semnăturii evenimentului).Apoi am putea trece subiectul următor ca intrare:

topics: [null, [address1, address2]]

Aici, utilizând metacaracterul null pentru semnarea evenimentului, ascultăm toate evenimentele emise de contractul la care ne-am abonat. Dar cu această configurație, putem folosi și un al doilea câmp de intrare, adică topic\_1, pentru a defini un filtru după adresă, așa cum s-a menționat anterior.

Implementarea Frontier nu acceptă aceste caracteristici. Ca alternativă, puteți crea mai multe abonamente pentru toate evenimentele contractului și pentru diferitele adrese, dar acest lucru mărește numărul de operațiuni care trebuie efectuate. Cu toate acestea, se așteaptă ca acest lucru să fie acceptat în versiunile viitoare ale Moonbase TestNet.

Contactați-ne

Dacă aveți feedback despre Moonbase Alpha v2, pub / sub sau orice alt Subiect legat de Moonbeam, nu ezitați să vizitați site-ul nostru sau să contactați prin dezvoltarea noastră oficială Server Discord .

Publicat inițial la https://www.purestake.com pe 13 octombrie 2020.