L’enveloppe de la transaction
Toute transaction ZooBC, quel que soit son type, est une seule suite d’octets organisée de la même façon, appelée l’enveloppe. Les données propres au type se trouvent dans un seul champ, le corps ; tout le reste (qui envoie, qui reçoit, les frais, l’heure, un message facultatif) est commun aux 73 types. Connaître l’enveloppe suffit pour lire, tarifer et vérifier n’importe quelle transaction.
Les champs dans l’ordre
| Champ | Taille | Remarques | |
|---|---|---|---|
| type | 4 octets, petit-boutiste (little-endian) | le numéro de [[transactions | type de transaction]] |
| version | 1 octet | 1, 2 ou 3 | |
| horodatage | 8 octets | secondes Unix | |
| expéditeur | une adresse | ||
| destinataire | une adresse | ou le marqueur vide de 4 octets 02 00 00 00 | |
| frais | 8 octets | en unités atomiques | |
| survie | 8 octets | versions 2 et 3 | |
| expiration | 4 octets | version 3 | |
| corps | longueur sur 4 octets, puis le corps | au plus 65 536 octets | |
| partie séquestre | variable | ou le marqueur vide de 4 octets | |
| message | longueur sur 4 octets, puis le message | facultatif | |
| signature | variable | toujours en dernier |
Une adresse est un numéro de type sur 4 octets suivi d’une charge utile : 36 octets au total pour un compte natif ZBC_, 24 pour un compte Ethereum (voir les comptes et adresses). Chaque montant est un nombre entier d’unités atomiques, et 1 ZBC en vaut 100 000 000.
Ce qui n’y figure pas
Il n’y a pas de limite de gas, car il n’y a pas de machine virtuelle dont il faudrait mesurer la consommation : chaque type est une règle fixe, et son prix est connu avant la signature. Il n’y a pas de champ d’identifiant de chaîne : la signature couvre à la place le hachage du bloc de genèse de la chaîne (voir la signature d’une transaction). Et il n’y a pas de champ de nonce : la chaîne conserve le nonce de chaque expéditeur dans son propre état.
Les versions
- La version 1 n’a pas de champ de survie.
- La version 2 ajoute le champ de survie.
- La version 3 ajoute en plus le champ d’expiration, qui fixe combien de temps la transaction reste valide (voir l’expiration et les horodatages).
Une transaction de version 1 qui indique un dépôt de survie est refusée, tout comme une transaction de version 1 ou 2 qui indique une expiration : leurs octets n’ont pas de place pour ces champs.
Survie, corps, partie séquestre et message
- La survie vaut soit 0, soit au moins 10 000 000 unités atomiques (0,1 ZBC). Elle ouvre un enregistrement de longévité qui conserve la transaction au-delà de l’élagage ordinaire, et elle n’est jamais remboursée (voir la longévité). Une transaction qui porte dans son message une transaction signée d’une chaîne étrangère ne peut pas en payer.
- Le corps contient au plus 65 536 octets, organisés comme son type le définit.
- La partie séquestre ne peut être portée que par SendZBC et TransferToken ; elle transforme le paiement en séquestre.
- Le message contient au plus 256 octets en clair, sans octet nul ; au plus 320 octets lorsqu’il est chiffré (un message chiffré commence par « ZBE1 ») ; et au plus 4 096 octets lorsqu’il porte une transaction native d’une chaîne étrangère, issue d’Ethereum, de Solana ou de Bitcoin.
Le champ des frais
Les frais sont déclarés en unités atomiques et doivent atteindre au moins le plancher de la transaction : des frais d’action de base de 0,025 ZBC multipliés par l’échelle de frais sur laquelle votent les nœuds enregistrés, plus une charge pour les octets du corps et du message que chaque nœud enregistré conserve. Comme le plancher ne dépend que de la transaction et des paramètres de la chaîne, un portefeuille peut le demander à n’importe quel nœud avant de signer, avec GET /api/v1/blockchain/estimate-fee.
Des frais inférieurs au plancher sont refusés, et un bloc qui en contient est invalide. Tout ce qui est déclaré au-dessus du plancher revient au payeur dans le même bloc : payer trop par erreur ne coûte donc rien. Le type Empty, qui ne déplace rien, doit quand même payer des frais supérieurs à zéro, tandis que quelques devoirs que les nœuds enregistrés accomplissent pour le réseau, comme les preuves de stockage et les attestations d’événements, doivent déclarer des frais d’exactement 0. L’article sur les frais explique la formule, le remboursement et la destination des frais.