Moonbase Alpha v2: Nuovi eventi di contratto e Pub / Sub

(Alberto Viera) (13 ottobre 2020)

Con il rilascio di Moonbase Alpha v2 , appena annunciato da PureStake, stiamo aggiungendo alcune nuove ed entusiasmanti funzionalità che aiutano Moonbeam ad avvicinarsi al suo obiettivo principale di fornire unesperienza senza interruzioni per i progetti di Ethereum sullecosistema Polkadot. Una delle caratteristiche principali aggiunte è la possibilità di iscriversi a eventi di contratti intelligenti di Ethereum e altre informazioni sulla blockchain.

Gli eventi di contratto sono una parte estremamente importante delle dApp in Ethereum, poiché facilitano la comunicazione tra contratti intelligenti e le loro interfacce utente. Gli eventi possono essere considerati trigger asincroni con i dati. Quando un contratto genera un evento, ciò può successivamente comportare unazione sul lato front-end.

Casi duso per eventi

Un semplice esempio di un evento che potresti monitorare è un trasferimento. Supponiamo che un trasferimento venga avviato da un utente utilizzando il front-end di una dApp, dove viene ottenuto un hash della transazione una volta inviato. Ma per assicurare allutente che il pagamento è stato inviato, la dApp può ascoltare un evento (emesso dal contratto) quando la transazione è impegnata nella blockchain. Ciò può di conseguenza attivare un messaggio di visualizzazione allutente che lo informa che la sua azione ha avuto successo.

Un altro potente caso duso degli eventi è larchiviazione più economica. In media, i log costano 8 gas per byte, mentre lo stoccaggio a contratto costa 20.000 gas per 32 byte. Pertanto, gli eventi possono fungere da strumento per salvare e recuperare anche le informazioni necessarie come i registri di trasferimento. Tuttavia, non possono essere utilizzati come spazio di archiviazione per tutti i casi duso, perché non possono essere utilizzati da altri smart contract, ad esempio.

Limportanza di Pub / Sub

Dato tutto questo contesto, ora siamo pronti a parlare di pub / sub.

Publish-subscribe, o pub / sub in breve, è un servizio di messaggistica asincrona che funge da middleware tra gli editori di messaggi, e le persone che si iscrivono a loro. In termini generali, gli editori classificano questi messaggi in classi e li pubblicano senza sapere veramente chi è iscritto. Allo stesso modo, gli iscritti si iscrivono ai corsi di interesse, ricevendo solo i messaggi associati a quel corso, senza sapere chi sia il loro editore.

Con il rilascio di Moonbase Alpha v2 , è ora disponibile un servizio pub / sub compatibile con eventi in stile Ethereum.

Tutorial: come utilizzare Pub / Sub su Moonbeam

Da unimmagine vale più di mille parole, passiamo ad alcuni esempi per mostrare come funziona pub / sub su Moonbeam.

Per seguire questa demo, avrai bisogno di quanto segue:

Iscrizione ai log degli eventi in Moonbase Alpha v2

Qualsiasi contratto che segue lo standard dei token ERC-20 emette un evento relativo al trasferimento di token, ovvero event Transfer(address indexed from, address indexed to, uint256 value). Per questo esempio, ci iscriveremo ai log di tali eventi. Utilizzando la libreria JS Web3, abbiamo bisogno della seguente parte di codice:

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

Notare che ci stiamo connettendo allendpoint WebSocket di Moonbase Alpha. Usiamo il metodo web3.eth.subscribe("logs", options [, callback]) per iscriverti ai log, filtrati dalle opzioni fornite. Nel nostro caso, le opzioni sono lindirizzo del contratto da cui vengono emessi gli eventi e gli argomenti utilizzati per descrivere levento. Maggiori informazioni sugli argomenti possono essere trovate in (questo articolo medio). Se non sono inclusi argomenti, ti iscrivi a tutti gli eventi emessi dal contratto. Ma per filtrare solo levento Transfer, dobbiamo includere la firma dellevento, calcolata come:

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

Il risultato del calcolo precedente è ciò che è mostrato nello snippet di codice di prima. Torneremo al filtraggio per argomenti più avanti. Il resto del codice gestisce la funzione di callback.Una volta eseguito questo codice, otterremo un ID sottoscrizione e il terminale attenderà qualsiasi evento tramite tale sottoscrizione:

Successivamente, verrà inviato un trasferimento di token ERC20 con i seguenti parametri:

  • Dallindirizzo: 0x6Be02d1d3665660d22FF9624b7BE0551ee1Ac91b
  • Allindirizzo: 0xfcB0B397BB28046C01be6A3d66c7Eda99Fb0f344
  • Valore (token): 100000000000000 con 18 –

Una volta inviata la transazione, nel terminale apparirà il log dellevento emesso dalla transazione:

Nei log vengono fornite molte informazioni, ma potresti chiederti: dove sono le informazioni nellevento emesso? E la risposta è: nei log!

Il nostro evento di destinazione invia due parti di informazioni indicizzate, gli indirizzi “da” e “a” (in questordine), che vengono trattati come argomenti. Laltro dato condiviso dal nostro evento è il numero di token, che non è indicizzato. Pertanto, sono presenti un totale di tre argomenti (il massimo è quattro), che corrispondono al codice operativo LOG3:

Di conseguenza, puoi vedere che gli indirizzi “da” e “a” sono contenuti allinterno degli argomenti restituiti dai log. Gli indirizzi Ethereum sono lunghi 40 caratteri esadecimali (1 carattere esadecimale è di 4 bit, quindi 160 bit o formato H160). Pertanto, i 24 zeri extra sono necessari per colmare il divario con H256, che è lungo 64 caratteri esadecimali.

E il numero di token? I dati non indicizzati vengono restituiti nel campo “dati” dei log, ma sono codificati in bytes32 / hex. Per decodificarlo possiamo utilizzare ad esempio questo strumento online e verificare che i “dati” siano effettivamente 10 (più 18 zeri).

Se levento restituisce più valori non indicizzati, questi verranno aggiunti uno dopo laltro nello stesso ordine in cui levento li emette. Pertanto, ogni valore viene quindi ottenuto decostruendo i dati in parti separate di 32 byte (o 64 caratteri esadecimali).

Questo esempio ha mostrato come potremmo iscriverci solo ai log degli eventi di un contratto specifico. Ma la libreria Web3 JS fornisce altri tipi di abbonamento che esamineremo nelle sezioni seguenti.

Iscriviti a transazioni in sospeso in entrata

Per iscriverti a transazioni in sospeso, possiamo utilizzare il metodo web3.eth.subscribe("pendingTransactions", [, callback]), implementando la stessa funzione di callback per verificare la risposta. È molto più semplice del nostro esempio precedente e restituisce lhash delle transazioni in sospeso.

Possiamo verificare che lhash della transazione è lo stesso di quello mostrato in MetaMask (o Remix).

Iscriviti alle intestazioni di blocco in entrata

Un altro tipo disponibile nella libreria JS Web3 è quello di iscriversi a nuove intestazioni di blocco. Per fare ciò, utilizziamo il metodo web3.eth.subscribe("newBlockHeaders" [, callback]), implementando la stessa funzione di callback per verificare la risposta. Questa sottoscrizione fornisce le intestazioni dei blocchi in entrata e può essere utilizzata per tenere traccia delle modifiche nella blockchain.

Nota che nellimmagine è mostrato solo un blocco di intestazione. Questi messaggi vengono visualizzati per ogni blocco prodotto, in modo che possano riempire il terminale abbastanza rapidamente.

Controlla se il nodo è sincronizzato con la rete

Con pub / sub è anche possibile per verificare se un particolare nodo, a cui sei iscritto, è attualmente sincronizzato con la rete. Per questo, possiamo sfruttare il metodo web3.eth.subscribe("syncing" [, callback]), implementando la stessa funzione di callback per verificare la risposta. Questa sottoscrizione restituirà un oggetto quando il nodo viene sincronizzato con la rete.

Limitazioni attuali

Limplementazione pub / sub in Frontier è ancora in fase di sviluppo attivo. Questa prima versione consente agli sviluppatori di dApp (o agli utenti in generale) di iscriversi a tipi di eventi specifici, ma ci sono ancora alcune limitazioni. Dagli esempi precedenti, potresti aver notato che alcuni dei campi non mostrano le informazioni corrette, e questo perché alcune proprietà devono ancora essere supportate da Frontier.

Unaltra limitazione è relativa ai log del evento. Su Ethereum, puoi utilizzare caratteri jolly e passare più indirizzi di input, ad esempio, per filtrare log specifici. Supponiamo di voler sottoscrivere tutti gli eventi di un contratto che hanno due indirizzi specifici nel campo “topic\_1” (ricorda che topic\_0 è riservato alla firma dellevento).Quindi potremmo passare il seguente argomento come input:

topics: [null, [address1, address2]]

Qui, utilizzando il carattere jolly null al suo posto per la firma dellevento, stiamo ascoltando tutti gli eventi emessi dal contratto che abbiamo sottoscritto. Ma con questa configurazione, possiamo anche utilizzare un secondo campo di input, ovvero topic\_1, per definire un filtro per indirizzo come menzionato prima.

Lattuale Frontier non supporta queste funzionalità. In alternativa si possono creare più abbonamenti per tutti gli eventi del contratto e per i diversi indirizzi, ma questo aumenta il numero di operazioni da effettuare. Tuttavia, ci si aspetta che questo sia supportato nelle versioni future di Moonbase TestNet.

Contattaci

Se hai commenti riguardanti Moonbase Alpha v2, pub / sub o qualsiasi altro Argomento correlato a Moonbeam, sentiti libero di visitare il nostro sito web o contattaci tramite il nostro server Discord .

Originariamente pubblicato su https://www.purestake.com il 13 ottobre 2020.