Comme abordé dans la dernière visio dev, il va falloir discuter des événements qu’on veut avoir en blockchain car cela sera assez structurant dans la conception des indexeurs et des clients.
La doc substrate n’est pas très fournie au sujet des événements, mais voici en gros ce qu’il faut retenir :
Substrate provides a default implementation of how to deposit an event.
The default behavior of this function is to call
deposit_event
from the FRAME system, which writes the event to storage.This function places the event in the System pallet’s runtime storage for that block. At the beginning of a new block, the System pallet automatically removes all events that were stored from the previous block.
Events deposited using the default implementation are directly supported by downstream libraries like the Polkadot-JS API. However, you can implement your own
deposit_event
function if you want to handle events differently.
Donc les événements sont des éléments du storage écrits dans un bloc et supprimés au début du suivant.
On peut distinguer deux catégories d’événements :
- ceux émis suite à l’appel d’extrinsic (généralement à l’initiative d’un utilisateur)
- ceux émis suite à une action automatique en blockchain
Dans l’app polkadotjs, les premiers apparaissent en face de l’extrinsic et les derniers dans la catégorie “system events”.
on voit en haut
- event count 11
- extrinsic count 2
puis les deux extrinsics et les événements associés
puis les system events
et aussi des logs
En gros, sans événements, difficile de voir ce qui se passe en blockchain.
Je vois deux cas d’usage des événements :
- savoir quel est le résultat d’un extrinsic soumis (succès / échec) et plus précisément, quel a été son effet
- observer la blockchain dans son intégralité et être informé des modifications du storage (en dehors des événements)
Plus concrètement :
1. résultat d’un extrinsic
Je soumets une certification :
- elle peut échouer (avec un message d’erreur)
- elle peut réussir et dans ce cas :
- ça peut être une nouvelle certification
- ça peut être un renouvellement de certification
ou
Je soumets un extrinsic pour lier mon compte à mon identité :
- cela peut échouer (→ message d’erreur)
- cela peut réussir
- le compte est déjà lié (no-op)
- le compte est désormais lié
2. observation de la blockchain
Je veux savoir quand un nouveau DU a été créé je regarde l’événement UniversalDividend.NewUdCreated
Je veux savoir quand un virement de A → B est réalisé je regarde l’événement Balances.Transfer
.
Mais pour savoir l’évolution du solde de mon compte, je peux aussi faire directement une souscription pour les changements de la valeur dans le storage, pas besoin d’un événement pour ça.
Les événements peuvent contenir les informations qu’on veut, et on peut les organiser comme on veut. C’est le but de cette discussion. Je vais ajouter à la documentation automatisée une liste exhaustive des événements. En attendant, on peut utiliser celle que j’avais fait manuellement ici : Why we need a full featured indexer?.