Soldes de tokens cachés : comment appliquer un gel ?
Prenons Alice : 100 tokens, dont 30 gelés, et aucun de ces chiffres n’est public. Comment le token l’empêche-t-il d’en envoyer 80 ?
EN 30 SECONDES
Un solde confidentiel est un solde de token conservé chiffré : de l’extérieur, personne ne lit le montant. Pour un token permissionné, cela change la façon d’appliquer un gel et ce qu’on voit d’un transfert. On suit ici un vrai contrôle de gel, pas à pas.
À RETENIR · 3
- Masquer les soldes change ce qu’on voit d’un transfert et qui connaît les montants. Les règles d’identité ou de conformité ne deviennent pas toutes impossibles pour autant.
- ERC7984Freezable v0.5.0 d’OpenZeppelin transfère un zéro chiffré quand le solde libre ne suffit pas. C’est un choix d’implémentation : le brouillon ERC-7984 autorise aussi un revert.
- Dans cette version, une transaction réussie ne prouve pas que le montant demandé a été transféré. Lisez le montant réel renvoyé.
Sur cette page
Le problème : un gel a besoin de chiffres que personne ne devrait voir
EN BREF Avec des soldes publics, chacun peut suivre le contrôle d’un gel. Avec des soldes masqués, le contrat doit l’appliquer sans montrer les chiffres à personne.
LES MOTS À CONNAÎTRE
- Token permissionné
- Un token que seuls des détenteurs approuvés peuvent recevoir, avec des contrôles de l’émetteur comme le gel. Le standard ERC-3643, au statut Final, en est un exemple.
- Gel
- Un contrôle de l’émetteur qui bloque tout ou partie des tokens d’un détenteur : cette part ne peut plus être transférée.
- Solde confidentiel
- Un solde conservé chiffré. Chacun voit qu’un transfert a eu lieu, pas son montant.
- FHE
- Le chiffrement entièrement homomorphe : une façon d’additionner et de comparer des nombres chiffrés sans les déchiffrer.
- Sélection chiffrée
- Le choix entre deux valeurs chiffrées, selon un oui ou un non lui-même chiffré, sans révéler laquelle a été retenue.
Un Token permissionné Un token que seuls des détenteurs approuvés peuvent recevoir, avec des contrôles de l’émetteur comme le gel. Le standard ERC-3643, au statut Final, en est un exemple. Voir le glossaire ne peut être reçu que par des détenteurs approuvés. Son émetteur peut aussi poser un Gel Un contrôle de l’émetteur qui bloque tout ou partie des tokens d’un détenteur : cette part ne peut plus être transférée. Voir le glossaire sur une partie des tokens d’un détenteur : cette part ne peut plus partir.
Soldes publics
- Solde 100, gel 30 : 70 peuvent partir.
- Un transfert de 80 est rejeté, et chacun voit pourquoi.
Soldes confidentiels
- Solde, montant gelé et montant du transfert sont tous chiffrés.
- Le contrat doit quand même appliquer le gel, sans révéler les chiffres.
Un Solde confidentiel Un solde conservé chiffré. Chacun voit qu’un transfert a eu lieu, pas son montant. Voir le glossaire est conservé chiffré. Le contrat ne peut plus lire 100 et retirer 30. Dans ERC-7984, une interface Ethereum encore à l’état de brouillon (Draft), chaque montant est un pointeur confidentiel vers des données cachées.
ADAM explique : Pensez à une enveloppe scellée pleine de billets, remise devant témoins : tout le monde voit la remise, personne ne voit les billets. L’image a une limite : une vraie enveloppe se soupèse, et quiconque s’en empare peut l’ouvrir.
Ici, seuls les comptes autorisés par le protocole peuvent déchiffrer. Une valeur peut aussi être rendue publique exprès. Tout cela repose sur du code, de la cryptographie et des hypothèses de sécurité, qui demandent chacun leur propre revue.
EN CLAIR
Masquer les soldes change ce qu’on voit d’un transfert et qui peut connaître les montants. Les règles d’identité ou de conformité ne deviennent pas toutes impossibles pour autant. Le gel compte toujours.
Je m’appuie sur des spécifications publiques et sur une version fixée d’une bibliothèque. Ce n’est pas un retour de production.
Dans la section suivante : Alors, comment un contrat compare-t-il des nombres qu’il ne peut pas lire ?
Comment fonctionne un gel chiffré, étape par étape
EN BREF Dans ERC7984Freezable v0.5.0 d’OpenZeppelin, un transfert supérieur au solde libre n’échoue pas pour ce motif : il transfère un zéro chiffré.
La version d’OpenZeppelin repose sur le FHE Le chiffrement entièrement homomorphe : une façon d’additionner et de comparer des nombres chiffrés sans les déchiffrer. Voir le glossaire, le chiffrement entièrement homomorphe. Il sert à calculer sur des nombres chiffrés sans les ouvrir. La comparaison et la Sélection chiffrée Le choix entre deux valeurs chiffrées, selon un oui ou un non lui-même chiffré, sans révéler laquelle a été retenue. Voir le glossaire ci-dessous marchent ainsi.
ÉTAPE PAR ÉTAPE
Étape 1. Demande. Un détenteur demande à envoyer un montant chiffré.
- Demande Un détenteur demande à envoyer un montant chiffré.
- Solde libre Le contrat calcule le solde moins le montant gelé, jamais sous zéro. Le résultat est chiffré.
- Comparaison Il vérifie si le solde libre suffit pour la demande. Le oui ou non est chiffré, lui aussi.
- Sélection Il garde le montant demandé si c’est oui, zéro si c’est non. Le statut public de réussite ne dit pas lequel.
- Mise à jour Les soldes varient du montant retenu, et la transaction réussit dans les deux cas. D’autres erreurs peuvent encore provoquer un revert.
- Résultat La fonction renvoie le montant réellement transféré, toujours chiffré. Les comptes autorisés peuvent le déchiffrer.
C’est le choix d’une bibliothèque, pour un cas, dans une version fixée. Le brouillon ERC-7984 autorise aussi un revert, un échec public, quand le solde ne suffit pas.
Lisez tout le code de cette version avant de vous fier à ce qu’il fait pour l’émission (la création de tokens), les transferts, les droits et les échecs.
Dans la section suivante : Et avec de vrais chiffres, cela donne quoi ?
Un exemple concret : un gel, deux transferts
EN BREF Demande couverte par le solde libre : tout part. Sinon, rien ne part. Le statut public de réussite reste le même.
UN EXEMPLE CONCRET
Chiffres illustratifs
VALIDÉAlice détient 100 tokens dont 30 gelés et en envoie 50
ENTRÉE
- Solde
- 100 (chiffré)
- Gelé
- 30 (chiffré)
- Demande
- 50 (chiffré)
CE QUI SE PASSE
- Solde libre : 100 moins 30, il reste 70.
- 70 suffisent pour 50 : la réponse chiffrée est oui.
- La sélection garde 50.
SORTIE
- Transaction
- réussie
- Montant réellement transféré
- 50 (chiffré)
ZÉRO TRANSFÉRÉMême solde de départ, elle demande 80 à la place
ENTRÉE
- Demande
- 80 (chiffré)
CE QUI SE PASSE
- 70 ne suffisent pas pour 80 : la réponse chiffrée est non.
- La sélection garde zéro.
SORTIE
- Transaction
- réussie
- Montant réellement transféré
- 0 (chiffré)
Un portefeuille (wallet) qui affiche « paiement terminé » après le second transfert d’Alice, vide, se trompe.
Le chiffrement cache le montant au public. Il n’empêche pas le détenteur de savoir ce qui s’est passé, si vous lui donnez un moyen autorisé de déchiffrer le résultat ou d’en obtenir une preuve.
OBJET OBTENU
Lisez le résultat, pas le statut
Sources : ERC-7984 (brouillon), ERC-3643, OpenZeppelin ERC7984Freezable v0.5.0.
NIVEAU TERMINÉ
Ce que vous savez maintenant
- Comment un contrat peut appliquer un gel à des soldes illisibles pour le public.
- Pourquoi, dans OpenZeppelin v0.5.0, un transfert réussi peut ne rien déplacer.
Vérifiez par vous-même
Touchez ou cliquez une question pour voir la réponse.
Chiffres illustratifs : sur ERC7984Freezable v0.5.0 d’OpenZeppelin, Bob détient 100 tokens, dont 40 gelés. Il veut en envoyer 70. La transaction échoue-t-elle ?
Pas pour cette raison. Seuls 60 sont libres : la sélection garde zéro. Sauf autre erreur, la transaction réussit et ne transfère rien. Le montant réel, déchiffré ou prouvé par une partie autorisée, le montre.
Ingénieur web3 x IA, ancien CTO d’Integra. Auteur nommé (1 sur 5) d’ERC-3643, premier auteur d’ERC-6960, co-auteur d’ERC-7410 et co-auteur d’ERC-8203, encore à l’état de brouillon.
Un projet à livrer ou un poste à pourvoir ?
Parlons de votre besoinSuivre les notes techniques
Recevez les nouveaux articles sur l’IA en production et les smart contracts par email.

