Quand on utilise Tezos pour la première fois, on peut être perdu, même quand on l’habitude de se servir d’autres protocoles crypto-économiques comme Bitcoin et Ethereum. Le système de Tezos est en effet assez original quand on le compare à d’autres cryptomonnaies : on peut notamment penser à son algorithme de consensus par preuve d’enjeu liquide ou son mécanisme de gouvernance interne unique. En particulier, le système de comptes utilisés dans Tezos s’avère légèrement plus complexe que ce qu’on a l’habitude de voir. C’est ce que nous allons étudier aujourd’hui.

Qu’est-ce qu’un compte ?

Dans Tezos, l’unité échangée est le tez, dont le sigle boursier est XTZ et le symbole ꜩ. Les échanges, qui sont enregistrés sur la chaîne de blocs, se font entre ce qu’on appelle des comptes. Ceux-ci sont usuellement représentés par des adresses publiques qui sont des chaînes de caractères alphanumériques de la forme tz1bE9mdK1pdFMEmep7jTFKbyAYZ9Sh9pwfU ou KT1KsAoPycq2cBrWQqAMEJhyJYBbEKGxiaBQ.

On distingue deux types de compte :

  • Les comptes implicites (implicit accounts) liés à une clé privée et servent aux boulangers. Leurs adresses commencent par tz.
  • Les comptes engendrés (originated accounts) qui peuvent héberger des contrats autonomes (smart contracts). Leurs adresses commencent par KT1.

D’un point de vue général, un compte est constitué des éléments suivants :

  • Son adresse publique conçue pour l’identifier sur le réseau.
  • Un montant, exprimé en tez (ꜩ) ou en mutez (µꜩ). Le mutez est l’unité la plus petite du protocole Tezos : 1 µꜩ = 0.000001 ꜩ.
  • Un compteur indiquant le nombre d’opérations réalisées. Celui-ci est global pour les comptes implicites et local pour les comptes engendrés.
  • Diverses informations comme le type du compte, le caractère dépensable des fonds qu’il contient, etc.
  • Pour les comptes engendrés : le code du contrat et l’espace de stockage correspondant.

Les transactions consistent à envoyer des tez, des paramètres, ou les deux. Elles servent notamment à interagir avec les contrats autonomes en déclenchant les mécanismes programmés. Au-delà de ces transferts, ces comptes peuvent également réaliser d’autres opérations telles que les révélations ou les délégations.

Les adresses des comptes sont des informations de 20 octets qui, comme on l’a dit, sont exprimées par des chaînes de caractères alphanumériques. Les adresses sont encodées en Base58Check, un format d’écriture en base 58 muni d’un système de somme de contrôle (checksum). Ce format, très en vogue dans le monde des cryptomonnaies, est particulièrement utile pour détecter les fautes de frappe et empêcher l’utilisateur d’envoyer des fonds à une adresse invalide.

Sans détailler le processus, on peut prendre l’exemple de l’adresse tz1bE9mdK1pdFMEmep7jTFKbyAYZ9Sh9pwfU qui est l’encodage en Base58Check de l’information :

06a19f aafdf009211c23e29037037db530957031338706

Le préfixe 0x06a19f est ajouté avant l’encodage pour obtenir le tz1 en base 58.

Notez que cette méthode d’encodage n’est pas utilisée que pour les adresses, mais aussi pour beaucoup d’autres éléments dans Tezos : clés privées, clés publiques, opérations, blocs, versions du protocole, etc.

Les comptes implicites

Les comptes implicites sont liés à une clé privée unique (donc a priori à un utilisateur unique). Ils sont l’équivalent des adresses P2PKH et P2WPKH dans Bitcoin et des EOA (Externally Owned Accounts) dans Ethereum. Ces comptes utilisent des adresses commençant par tz1, tz2 et tz3.

Ces comptes servent en particulier aux boulangers ou bakers qui doivent passer par eux pour valider (cuisson et approbation) les blocs.

Comme tous les autres protocoles crypto-économiques, Tezos se base sur un système de cryptographie sur courbes elliptiques. Une clé privée est un nombre choisi au hasard dans un intervalle très grand (typiquement entre 1 et 2256) de sorte qu’il soit en pratique impossible de la retrouver en essayant toutes les possibilités. Une adresse publique est alors calculée à partir de cette clé privée par le biais de fonctions à sens unique. La clé privée permet de signer des transactions émanant de l’adresse à laquelle elle correspond. C’est pour cela que le réel propriétaire des tez sur un compte implicite est celui qui en contrôle la clé privée.

Les trois types de compte implicite sont différenciés par les algorithmes de signature utilisés :

  • Les comptes tz1 font usage de l’algorithme EdDSA.
  • Les comptes tz2 utilisent ECDSA (Elliptic Curve Digital Signature Algorithm) sur la courbe secp256k1, exactement comme c’est fait dans Bitcoin, Ethereum et quantité d’autres systèmes de cryptomonnaie.
  • Les comptes tz3 appliquent ECDSA avec la courbe P-256 du NIST, l’institut américain des normes et des technologies. L’usage de ce type de compte est déconseillé, cette courbe étant la moins fiable des trois.

Le type de compte implicite le plus populaire est le type tz1 utilisant EdDSA, un algorithme de signature qui présente des propriétés supérieures à ECDSA. Il s’agit d’une une variante du schéma de signature de Schnorr qui se base sur les courbes d’Edwards tordues. L’algorithme implémenté dans Tezos est Ed25519, qui se base sur la courbe d’Edwards tordue d’équation :

– x2 + y2 = 1 – 121665121666 x2 y2

et qui utilise le nombre premier 2255 – 19 (d’où son nom).

Courbe d'Edwards tordue
Exemple de courbe d’Edwards tordue. Par Krishnavedala.

Lorsqu’elle est utilisée dans ce schéma de signature, la clé privée est exprimée en Base58Check et préfixée par edsk (pour EdDSA secret key). Par exemple :

k = edsk3iVa1rJbMMJH2JaGnfCTp7UPLiAKhKcW6zRBqHYZw5peXWTB9s

Notez que généralement cette clé est issue d’une phrase mnémotechnique choisie aléatoirement, conforme au standard défini par le BIP39. La clé ci-dessus provient ainsi de la phrase de 15 mots :

dad fashion slender fat regular cost innocent ride depart soon envelope ugly false gossip minor

Une clé publique est calculée à partir de la clé privée à l’aide de la courbe elliptique : en fait, cette clé publique est un point appartenant à la courbe.

La courbe elliptique ne s’applique pas à tous les nombres, mais se limite à un corps fini d’entiers. Une addition est définie sur cette courbe de sorte à ce que la somme de deux points de la courbe appartienne toujours à la courbe. En particulier, on peut additionner un point avec lui-même autant de fois qu’on le veut, et cela permet de multiplier un point de la courbe par un nombre entier. La clé publique est le résultat de la multiplication de la clé privée par un point générateur B prédéfini :

K = k × B

Cette multiplication est à sens unique : il est en pratique impossible de retrouver la clé privée à partir de la clé publique.

Dans Tezos, la clé publique est toujours compressée : on ne conserve que l’une des coordonnées car la courbe est symétrique. Lorsqu’on souhaite partager cette clé publique, celle-ci est aussi exprimée en Base58Check, avec le préfixe qui correspond (edpk). Dans notre cas, on a :

K = edpkuT9t1z56zf2UwKuuyUJwczEBRzYKhsF7QxTDqhFX1LaxhnU29M

Cette clé publique servira à vérifier que les signatures produites par la clé privée associée. C’est également par son biais qu’on peut calculer l’adresse publique.

L’adresse est dérivée de la clé publique par le biais de la fonction de hachage BLAKE2b. Tout comme pour le passage de la clé privée à la clé publique, l’opération se fait à sens unique et on ne peut pas retrouver la clé publique à partir de l’adresse. L’adresse obtenue est ensuite exprimée en Base58Check comme on l’a déjà décrit. Dans notre cas, on obtient :

A = tz1bE9mdK1pdFMEmep7jTFKbyAYZ9Sh9pwfU
Ed25519 clés adresse

Les comptes implicites ont deux particularités techniques par rapport à ce qu’on va pouvoir retrouver dans d’autres protocoles crypto-économiques.

Premièrement, la création d’un compte implicite (la première transaction vers celui-ci) nécessite de brûler 0,257 ꜩ (soit 26 centimes tout de même !) Cela est assez étonnant, mais c’est un choix délibéré pour décourager le spam sur le réseau et préserver ainsi sa décentralisation. On peut imaginer qu’à l’avenir ce seuil sera abaissé, voire supprimé.

Secondement, les comptes implicites tz1 doivent réaliser une opération de révélation de leur clé publique, dont les frais sont de 1268 µꜩ (montant négligeable). Notez que cela ne concerne que les comptes tz1 : avec ECDSA il est possible de faire en sorte que la clé publique puisse être retrouvée à partir de la signature (voir ici par exemple).

Les comptes engendrés

Les comptes engendrés (originated accounts) permettent deux choses qui les différencient des comptes implicites :

  • Déléguer des tez.
  • Contenir des contrats autonomes.

Ces comptes ont donc un rôle assez similaire aux adresses P2SH et P2WSH dans Bitcoin et aux comptes dédiés aux smart contracts dans Ethereum. Les comptes engendrés utilisent des adresse commençant par KT1 (KT comme contrat).

Comme leur nom l’indique, les comptes KT1 sont créés par une opération spéciale, appelée origination, provenant d’un compte implicite. L’origination d’un compte nécessite de brûler 0,257 ꜩ et de payer 1400 µꜩ de frais. L’adresse est obtenue à partir de l’identifiant de l’origination (empreinte et index). Par exemple, le compte KT1KsAoPycq2cBrWQqAMEJhyJYBbEKGxiaBQ a été créé par la première opération (index 0) de la liste d’opérations oor6KiK6KVc47KdMt87w5FXoMBA44YRoQHXZfJJaoUwsaobQkMo.

Les comptes engendrés sont liés à un compte gérant (manager) qui possède un rôle particulier. Si le compte ne possède pas de code Michelson, c’est la clé privée de ce compte gérant qui sert à signer les transactions. Dans ce cas une opération de révélation de la clé publique aura également lieu lors de la première transaction émise.

Actuellement, les comptes engendrés sont principalement utilisés pour déléguer des tez. Cela se fait par une opération appelée très logiquement délégation qui fait que tous les fonds du compte sont délégués au boulanger choisi. De plus, ce lien est persistant : tous les fonds reçus sur le compte seront automatiquement délégués par la suite.

Par ailleurs, certains comptes KT1 sont utilisés pour héberger le code Michelson et les stockage des contrats autonomes. Par exemple l’adresse KT1MKxoNmZEox462J45L4QGrUhLCJoaQkDFq contient un contrat minimal (qui ne fait rien) :

parameter string;
storage string;
code { CAR ; NIL operation ; PAIR }

et le mot world en stockage.

Conclusion

Ainsi, le système de comptes est plutôt complexe dans Tezos. Pour résumer :

  • Il existe deux types de comptes : les comptes implicites et les comptes engendrés. Il est possible de réaliser des transactions classiques à partir des deux types;
  • Les comptes implicites sont des comptes liés à une clé privée. Ils sont représentés par des adresses commençant par tz1, tz2 ou tz3 selon le système de courbe elliptique utilisé. Seuls les comptes implicites peuvent être utilisés par les boulangers (bakers) pour valider les blocs.
  • Les comptes engendrés sont des comptes créés par des comptes implicites. Ils sont représentés par des adresses commençant par KT1. Les comptes engendrés se différencient des comptes implicites par le fait qu’ils peuvent être utilisés pour déléguer des tez et qu’ils peuvent héberger des contrats autonomes.

Catégories : Protocole

Ludovic Lars

Ludovic est fasciné par les protocoles crypto-économiques et par l'impact qu'ils pourraient avoir sur nos vies. De formation scientifique, il s'attache à décrire leur fonctionnement technique de la façon la plus fidèle possible.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *