Moonbase Alpha v2: Nouveaux événements de contrat et Pub / Sub

(Alberto Viera) (13 octobre 2020)

Avec la version de Moonbase Alpha v2 , qui vient dêtre annoncée par PureStake, nous ajoutons de nouvelles fonctionnalités intéressantes qui aident Moonbeam à se rapprocher de son objectif principal de fournir une expérience transparente pour les projets dEthereum sur lécosystème Polkadot. Lune des principales fonctionnalités ajoutées est la possibilité de sabonner aux événements de contrats intelligents Ethereum et à dautres informations sur la blockchain.

Les événements de contrat sont une partie très importante des dApps dans Ethereum, car ils facilitent la communication entre les contrats intelligents et leurs interfaces utilisateur. Les événements peuvent être considérés comme des déclencheurs asynchrones avec des données. Lorsquun contrat émet un événement, cela peut entraîner une action du côté frontal.

Cas dutilisation des événements

Un exemple simple dévénement que vous pourriez suivre est un transfert. Disons qu’un transfert est initié par un utilisateur utilisant le front-end d’une dApp, où un hachage de transaction est obtenu une fois qu’il est soumis. Mais pour assurer à lutilisateur que le paiement a été envoyé, la dApp peut écouter un événement (émis par le contrat) lorsque la transaction est validée dans la blockchain. Cela peut par conséquent déclencher un message daffichage à lutilisateur linformant que son action a réussi.

Un autre cas dutilisation puissant des événements est le stockage moins cher. En moyenne, les journaux coûtent 8 gaz par octet, tandis que le stockage sous contrat coûte 20 000 gaz par 32 octets. Par conséquent, les événements peuvent servir doutil pour enregistrer et récupérer les informations nécessaires telles que les journaux de transfert. Cependant, ils ne peuvent pas être utilisés comme stockage pour tous les cas dutilisation, car ils ne sont pas accessibles par dautres contrats intelligents, par exemple.

Limportance de Pub / Sub

Compte tenu de tout ce contexte, nous sommes maintenant prêts à parler de pub / sub.

Publish-subscribe, ou pub / sub en abrégé, est un service de messagerie asynchrone qui agit comme un middleware entre les éditeurs de messages, et les personnes qui y souscrivent. De manière générale, les éditeurs classent ces messages en classes et les publient sans vraiment savoir qui y est abonné. De même, les abonnés sinscrivent aux cours qui les intéressent, ne recevant que les messages associés à ce cours, sans savoir qui est leur éditeur.

Avec la sortie de Moonbase Alpha v2 , un service pub / sub compatible avec les événements de style Ethereum est désormais disponible.

Tutoriel: Comment utiliser Pub / Sub sur Moonbeam

Depuis une photo vaut mille mots, passons à quelques exemples pour montrer comment pub / sub fonctionne sur Moonbeam.

Pour suivre cette démo, vous aurez besoin des éléments suivants:

  • MetaMask installé et connecté à Moonbase
  • Avoir un compte avec des fonds, que vous pouvez obtenir de Mission Control
  • Déployez votre propre jeton ERC20 sur Moonbase, ce que vous pouvez faire en suivant notre Tutoriel Remix , mais en commençant par MetaMask to Moonbase
  • Installez NodeJS et la bibliothèque Web3 JS. Pour les systèmes sur Ubuntu 18.04 ou similaire, vous pouvez suivre la première partie de ce didacticiel

Sabonner aux journaux dévénements dans Moonbase Alpha v2

Tout contrat qui suit le standard de token ERC-20 émet un événement lié à un transfert de tokens, cest-à-dire event Transfer(address indexed from, address indexed to, uint256 value). Pour cet exemple, nous nous abonnerons aux journaux de tels événements. En utilisant la bibliothèque Web3 JS, nous avons besoin du morceau de code suivant:

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

Notez que nous nous connectons au point de terminaison WebSocket de Moonbase Alpha. Nous utilisons la méthode web3.eth.subscribe("logs", options [, callback]) pour nous abonner aux journaux, filtrés par les options données. Dans notre cas, les options sont ladresse du contrat à partir de laquelle les événements sont émis et les rubriques utilisées pour décrire lévénement. Vous trouverez plus dinformations sur les rubriques dans (ce message Medium). Si aucun sujet nest inclus, vous vous abonnez à tous les événements émis par le contrat. Mais pour filtrer uniquement lévénement Transfer, nous devons inclure la signature de lévénement, calculée comme suit:

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

Le résultat du calcul précédent est ce qui est indiqué dans lextrait de code précédent. Nous reviendrons au filtrage par sujets plus tard. Le reste du code gère la fonction de rappel.Une fois ce code exécuté, nous obtiendrons un identifiant dabonnement et le terminal attendra tout événement via cet abonnement:

Ensuite, un transfert de jeton ERC20 sera envoyé avec les paramètres suivants:

  • De ladresse: 0x6Be02d1d3665660d22FF9624b7BE0551ee1Ac91b
  • À ladresse: 0xfcB0B397BB28046C01be6A3d66c7Eda99Fb0f344
  • Valeur (jetons): 10000000000000000000 – soit 10 avec des zéros

Une fois la transaction envoyée, le journal de lévénement émis par la transaction apparaîtra dans le terminal:

De nombreuses informations sont fournies dans les journaux, mais vous pourriez vous demander: où se trouvent les informations dans lévénement émis? Et la réponse est: dans les journaux!

Notre événement cible envoie deux informations indexées, les adresses «de» et «à» (dans cet ordre), qui sont traitées comme des sujets. Lautre donnée partagée par notre événement est le nombre de jetons, qui nest pas indexé. Par conséquent, il y a un total de trois sujets (le maximum est de quatre), qui correspondent à lopcode LOG3:

Par conséquent, vous pouvez voir que les adresses «de» et «à» sont contenues dans les rubriques renvoyées par les journaux. Les adresses Ethereum ont une longueur de 40 caractères hexadécimaux (1 caractère hexadécimal correspond à 4 bits, donc 160 bits ou format H160). Ainsi, les 24 zéros supplémentaires sont nécessaires pour combler lécart avec H256, qui contient 64 caractères hexadécimaux.

Quen est-il du nombre de jetons? Les données non indexées sont renvoyées dans le champ «données» des journaux, mais elles sont codées en octets32 / hex. Pour le décoder, nous pouvons utiliser par exemple cet outil en ligne , et vérifier que les « données » sont en fait 10 (plus 18 zéros).

Si lévénement renvoie plusieurs valeurs non indexées, celles-ci seront ajoutées lune après lautre dans le même ordre que lévénement les émet. Par conséquent, chaque valeur est ensuite obtenue en déconstruisant les données en morceaux séparés de 32 octets (ou 64 caractères hexadécimaux).

Cet exemple a montré comment nous pouvions nous abonner uniquement aux journaux dévénements dun contrat spécifique. Mais la bibliothèque Web3 JS fournit dautres types dabonnements que nous aborderons dans les sections suivantes.

Sabonner aux transactions entrantes en attente

Afin de sabonner aux transactions en attente, nous pouvons utiliser la méthode web3.eth.subscribe("pendingTransactions", [, callback]), implémentant la même fonction de rappel pour vérifier la réponse. Ceci est beaucoup plus simple que notre exemple précédent et renvoie le hachage des transactions en attente.

Nous pouvons vérifier que ce hachage de transaction est le même que celui affiché dans MetaMask (ou Remix).

Sabonner aux en-têtes de bloc entrants

Un autre type disponible dans la bibliothèque Web3 JS est de sabonner à de nouveaux en-têtes de bloc. Pour ce faire, nous utilisons la méthode web3.eth.subscribe("newBlockHeaders" [, callback]), en implémentant la même fonction de rappel pour vérifier la réponse. Cet abonnement fournit des en-têtes de bloc entrants et peut être utilisé pour suivre les changements dans la blockchain.

Notez quun seul en-tête de bloc est affiché dans limage. Ces messages sont affichés pour chaque bloc produit, ils peuvent donc remplir le terminal assez rapidement.

Vérifier si le nœud est synchronisé avec le réseau

Avec pub / sub cest aussi possible pour vérifier si un nœud particulier auquel vous êtes abonné est actuellement synchronisé avec le réseau. Pour cela, nous pouvons utiliser la méthode web3.eth.subscribe("syncing" [, callback]), implémentant la même fonction de rappel pour vérifier la réponse. Cet abonnement renverra un objet lorsque le nœud sera synchronisé avec le réseau.

Limitations actuelles

Limplémentation pub / sub dans Frontier est toujours en développement actif. Cette première version permet aux développeurs dApp (ou aux utilisateurs en général) de sabonner à des types dévénements spécifiques, mais il existe encore quelques limitations. À partir des exemples précédents, vous avez peut-être remarqué que certains des champs naffichent pas les informations appropriées, et cest parce que certaines propriétés ne sont pas encore prises en charge par Frontier.

Une autre limitation est liée aux journaux du un événement. Sur Ethereum, vous pouvez utiliser des caractères génériques et transmettre plusieurs adresses dentrée, par exemple pour filtrer des journaux spécifiques. Supposons que nous souhaitons nous abonner à tous les événements dun contrat qui ont deux adresses spécifiques dans le champ « topic\_1 » (rappelez-vous que topic\_0 est réservé à la signature de lévénement).Ensuite, nous pourrions passer le sujet suivant en entrée:

topics: [null, [address1, address2]]

Ici, en utilisant le joker null en place pour la signature de lévénement, nous sommes à lécoute de tous les événements émis par le contrat auquel nous avons souscrit. Mais avec cette configuration, nous pouvons également utiliser un deuxième champ de saisie, qui est topic\_1, pour définir un filtre par adresse comme mentionné précédemment.

Le Frontier ne prend pas en charge ces fonctionnalités. Alternativement, vous pouvez créer plusieurs abonnements pour tous les événements du contrat et les différentes adresses, mais cela augmente le nombre dopérations à effectuer. Cependant, cela devrait être pris en charge dans les futures versions de Moonbase TestNet.

Contactez-nous

Si vous avez des commentaires concernant Moonbase Alpha v2, pub / sub, ou tout autre Sujet lié à Moonbeam, nhésitez pas à visiter notre site Web ou à contacter via notre développement officiel serveur Discord .

Publié à lorigine à https://www.purestake.com le 13 octobre 2020.