Wiki ZooBC
Transactions

Transactions

Une transaction est une instruction signée adressée à la chaîne : payer quelqu’un, émettre un jeton, passer un ordre, rattacher une adresse à un groupe. ZooBC n’a pas de machine virtuelle pour le code des utilisateurs. Chaque fonctionnalité est un type de transaction intégré, doté de règles fixes que chaque nœud applique exactement de la même manière : un portefeuille sait donc, avant de signer, tout ce qu’une transaction peut faire et quels seront ses frais minimaux.

Les types intégrés

À partir de la version 0.5.8, ZooBC définit 73 numéros de type de transaction, type 0 compris, répartis en douze familles.

Douze tuiles, une par famille de types de transaction, chacune avec son nombre de types, pour un total de 73
Douze tuiles, une par famille de types de transaction, chacune avec son nombre de types, pour un total de 73

Un numéro de type est un groupe plus 256 fois un sous-type, si bien que la numérotation est clairsemée : 2 est NodeRegistration, et 258 (groupe 2, sous-type 1) est sa mise à jour. Un numéro que la chaîne ne définit pas est refusé, et chaque type défini est accepté dès le bloc 1.

Deux numéros sont particuliers. Le type 0, Empty, ne déplace rien : il existe pour transporter un message, il doit quand même payer des frais supérieurs à zéro, et il n’incrémente pas le nonce de l’expéditeur, le compteur par expéditeur que tient la chaîne. Le type 53, CancelLongevity, est retiré : toutes les chaînes le refusent, et c’est CloseLongevity (309) qui est utilisé à la place.

La vie d’une transaction

  1. Un portefeuille construit l’enveloppe, la même disposition pour tous les types, et la signe pour une seule chaîne.
  2. Il soumet les octets signés avec POST /api/v1/transactions. Le code HTTP 202 signifie que le nœud a accepté la transaction dans son pool, et non qu’elle est dans un bloc. Renvoyer les mêmes octets est sans risque : la copie est marquée comme doublon.
  3. Les nœuds relaient la transaction, et un producteur de blocs l’inclut. Un bloc contient au plus 2 000 transactions et 524 288 octets de charge utile, et au plus une transaction de chaque compte (voir une transaction par compte et par bloc).
  4. GET /api/v1/transactions/<hash>/status indique sa progression : staging, mempool (avec sa position), confirmed (avec la hauteur du bloc), rejected (avec la raison) ou not_found.

Une transaction qu’aucun bloc n’inclut pendant sa fenêtre expire (voir l’expiration et les horodatages).

Quand l’état change entre-temps

Entre la signature et l’inclusion dans un bloc, d’autres transactions peuvent modifier ce dont une transaction dépend : un séquestre est réglé, une offre est prise par quelqu’un d’autre, un jeton expire. Une telle transaction devient une opération nulle payante : elle est incluse dans un bloc, elle paie ses frais, et elle ne change rien d’autre. Le bloc reste valide sur tous les nœuds, si bien que personne ne peut bloquer la chaîne en envoyant des transactions sur le point de se périmer.

Un bloc n’est invalide que pour des défauts que tous les nœuds voient de la même façon, comme une signature incorrecte, des frais inférieurs au plancher (voir les frais) ou un paiement supérieur au solde de l’expéditeur.

Articles de cette catégorie

Voir aussi

Articles de ce thème