Le pont et les monnaies enveloppées
Le pont relie ZooBC à Bitcoin et à Ethereum. Les pièces déposées à une adresse de garde sur ces chaînes apparaissent sur ZooBC sous forme de monnaies enveloppées, un pour un, et peuvent repartir par le même chemin. Aucune partie ne le gère seule : les nœuds enregistrés votent, et la chaîne ne frappe ou ne brûle que lorsque deux tiers des sièges non suspendus sont d’accord.
Le pont fait partie de ZooBC à partir de la version 0.5.8 : les gardiens attestent les dépôts et les retraits, et la chaîne frappe et brûle les monnaies enveloppées selon leurs votes. Les chaînes sont relancées en version 0.5.8 sans démarrer le service de pont.
Les pièces de pont
Quatre des quatorze pièces de genèse sont des pièces de pont :
| Pièce | Représente |
|---|---|
| ZBTC | le bitcoin |
| ZETH | l’ether |
| ZUSDC | l’USDC, un jeton ERC-20 sur Ethereum |
| ZUSDT | l’USDT, un jeton ERC-20 sur Ethereum |
Chacune a une adresse de garde sur sa chaîne d’origine, fixée dans la genèse et prise en compte dans le hachage de genèse. GET /api/v1/bridge/coins liste les quatre. Les dix autres pièces de genèse n’ont pas d’adresse de garde. Les symboles de 4 ou 5 caractères qui commencent ou finissent par Z sont réservés à cet espace de noms, si bien qu’aucun jeton utilisateur ne peut prendre le nom d’une pièce de pont (voir l’émission d’un jeton).
Gardiens et votes
Un nœud ZooBC ne surveille aucune chaîne étrangère. Un programme gardien (keeper) distinct, zbc-bridge, tourne à côté d’un nœud doté d’une configuration de pont. Il surveille les adresses de garde et vote sur ZooBC par des transactions AttestEvent (voir les déclencheurs et les attestations) : l’id d’événement d’un vote de dépôt commence par ZBRDEP1:, et celui d’un vote de retrait par ZBWDR1:. Chaque vote est un devoir sans frais, envoyé avec des frais d’exactement 0 depuis la propre clé du nœud.
Dépôt : les pièces entrent
- L’utilisateur envoie des pièces à l’adresse de garde sur Bitcoin ou sur Ethereum.
- Chaque gardien qui voit le dépôt confirmé envoie une attestation qui nomme le dépôt et une valeur : le jeton, le montant et le destinataire ZooBC.
- À la fin de chaque bloc, la chaîne compte les votes. Lorsque deux tiers des sièges comptés, les nœuds enregistrés qui ne sont pas suspendus (8 sur 11, par exemple), ont attesté exactement la même valeur, chaque nœud frappe ce montant pour le destinataire, un pour un et sans frais de pont, et l’événement est clos définitivement.
Les sièges suspendus ne votent pas et ne comptent pas. Deux garde-fous s’y ajoutent :
- Un plafond quotidien. Si un dépôt devait porter les frappes d’une pièce sur une journée (les 5 760 derniers blocs) au-dessus de la plus grande de ces deux valeurs, une pièce entière ou 10 % de son offre, il faudrait l’accord de chaque siège non suspendu, et jamais moins des deux tiers de tous les sièges.
- Le plancher du registre. Aucune décision du pont n’est prise tant que le registre compte moins que son plancher de max(3,
min_registry_size) sièges et propriétaires distincts (voir les règles des deux tiers).
Retrait : les pièces sortent
- L’utilisateur envoie la monnaie enveloppée au compte de garde par un TransferToken ordinaire, avec le message
ZBW1|suivi de l’adresse de destination. Ce transfert constitue la demande : aucun BurnToken n’intervient, et l’utilisateur n’envoie rien sur la chaîne étrangère. - Les gardiens n’agissent qu’une fois la demande finalisée, ce qui prend entre 3 heures environ et 27 heures environ après son bloc (voir la finalité et le retour arrière) ; un gardien parcourt la chaîne à partir du dernier bloc finalisé qu’il a traité. Le vote de chaque gardien nomme la demande, le jeton, le montant et la destination, et porte la signature de ce gardien pour la chaîne étrangère.
- Lorsque deux tiers sont d’accord, chaque nœud vérifie à nouveau la demande et brûle ces unités depuis le compte de garde.
- Les signatures recueillies des gardiens, lisibles par l’API, autorisent la libération des pièces vers la destination.
Un événement qui ne reçoit aucune nouvelle attestation pendant 720 blocs (3 heures) cesse d’être pris en compte.
Les monnaies enveloppées sur ZooBC
Une fois frappée, une monnaie enveloppée est un jeton de genèse ordinaire à 8 décimales : elle peut être envoyée, placée sous séquestre, versée en flux, proposée dans une offre d’échange ou négociée sur un marché. Son offre ne change que par le pont, et MintToken et BurnToken sont refusés sur elle. Les frappes du pont ne sont pas réparties par la politique de répartition du destinataire (voir les politiques de répartition et de transaction). Les brûlages de monnaies enveloppées sont comptés dans le compteur de brûlages de la chaîne, qui reste à zéro pour le ZBC lui-même.