Blockchain et données personnelles
Une blockchain publique est un registre répliqué sur des milliers de nœuds, lisible par tous et impossible à modifier rétroactivement. Ces propriétés font la transparence du tirage, mais elles se heurtent à deux principes du RGPD : la minimisation et le droit à l'effacement. Cette page décrit précisément ce que BlockLucky écrit sur la chaîne, ce qui reste hors chaîne, et les limites qui en découlent. Elle s'appuie sur la démarche recommandée par les lignes directrices 02/2025 du Comité européen de la protection des données (CEPD) : garder les données identifiantes hors chaîne et documenter ce qui ne peut pas être effacé. Elle ne constitue pas un avis juridique.
Principe retenu
flowchart LR
subgraph Hors["Hors chaîne : base du backend"]
E["Email"]
U["Identifiant de compte"]
K["Clé privée chiffrée"]
P["EtherPoints, préférences, tranche d'âge"]
L["Lien compte vers adresse"]
end
subgraph Sur["Sur la chaîne : public et immuable"]
A["Adresses de portefeuille"]
T["Achats, gains, remboursements"]
B["Badges POAP"]
end
L --> ALe lien entre une personne et son adresse de portefeuille n'existe que dans la base du backend (colonne User.walletAddress et colonnes de la table Ticket). Supprimer ce lien rend les données de la chaîne non rattachables à une personne par la Ville. Elles restent des données pseudonymes pour quiconque peut faire ce lien par d'autres moyens.
Ce qui est écrit sur la chaîne
Par le contrat BlockLucky
Les données ci-dessous viennent des événements et de l'état de smart-contract/contracts/BlockLucky.sol.
| Donnée | Où | Personnelle ? |
|---|---|---|
Adresse du joueur (player) et du payeur (payer), nombre de tickets, montant |
Événement TicketsPurchased, tableau ticketOwners, tables ticketsByPlayer et contributions |
Pseudonyme |
| Adresse du gagnant, ticket gagnant, montant du gain, commission, identifiant de la demande VRF | Événement WinnerPicked, structure Round |
Pseudonyme |
| Retrait du gain ou du remboursement | Événements PrizeClaimed, RefundClaimed |
Pseudonyme |
| Ouverture, demande de tirage, annulation d'un tour | Événements RoundOpened, DrawRequested, RoundCancelled |
Non |
| Trésorerie, configuration | Événements FeesWithdrawn, TreasuryUpdated, RoundConfigUpdated, VrfConfigUpdated |
Non (comptes de la Mairie) |
| Rôles | Événements RoleGranted, RoleRevoked d'AccessControl |
Non (comptes de service) |
Par le contrat BlockLuckyPOAP
| Donnée | Où | Personnelle ? |
|---|---|---|
| Adresse du participant, numéro du tour, numéro du badge | Événements BadgeMinted et Transfer (ERC-721), table badgeOf |
Pseudonyme |
| Métadonnées du badge | Servies par le backend (GET /api/lottery/poap/<tour>.json), générées par backend/src/blockchain/poap.metadata.ts |
Non : elles ne dépendent que du numéro du tour |
Par les transactions elles-mêmes
Chaque transaction publie son émetteur, son destinataire, son montant et son horodatage. Deux flux méritent attention :
| Flux | Ce qu'il révèle |
|---|---|
| Dotation de bienvenue : transfert du compte opérateur vers le portefeuille du citoyen | Que l'adresse appartient à un participant de BlockLucky, et la date approximative de son inscription |
Cadeau : buyTicketsFor(bénéficiaire, 1) signé par le portefeuille de l'expéditeur |
Un lien public entre deux adresses, donc entre deux participants qui se connaissent |
Ces informations restent pseudonymes, mais elles enrichissent le graphe des transactions, ce qui facilite une éventuelle réidentification par recoupement.
Ce qui n'est jamais écrit sur la chaîne
| Donnée | Emplacement |
|---|---|
User.email |
|
| Identifiant de compte | User.id |
| Clé privée | User.walletEncryptedKey, chiffrée |
| Tranche d'âge, source UTM | Table Analytics |
| EtherPoints, récompenses, codes promo | Tables User, PointTransaction, ClaimedReward |
| Préférences, quêtes | Redis |
| Messages du chat en direct | Diffusés par Socket.IO, ni stockés ni écrits sur la chaîne |
| Message personnel d'un cadeau | Email au bénéficiaire, s'il est envoyé |
Les messages de chat affichent l'adresse du portefeuille sous forme abrégée (0x1234...abcd, fonction anonymizeWallet), comme le classement public.
Immutabilité et droit à l'effacement
Une transaction inscrite dans un bloc ne peut ni être modifiée ni supprimée. Ni la Ville ni l'équipe ne peuvent effacer une adresse de la chaîne. Le droit à l'effacement est donc mis en œuvre hors chaîne :
| Action à l'anonymisation | Effet |
|---|---|
User.walletAddress remplacée par 0xdeleted_gdpr_<préfixe> |
La fiche du compte ne désigne plus l'adresse |
User.walletEncryptedKey mise à null |
La clé privée est détruite : plus personne, Ville comprise, ne peut signer pour cette adresse |
User.email mis à null |
Le compte n'est plus rattachable à la personne par la base |
Attention
L'anonymisation laisse intactes les colonnes Ticket.transactionHash et Ticket.payerWallet, qui pointent vers l'ancienne adresse. L'identifiant du compte reste donc relié à l'adresse dans la base, même si plus aucune donnée identifiante directe n'y figure. Pour que le lien soit réellement rompu, ces colonnes doivent être effacées ou remplacées lors de l'anonymisation. Voir RGPD.
Conséquences de la destruction de la clé :
- les fonds encore présents sur l'adresse deviennent définitivement inaccessibles ;
- un gain non réclamé ou un remboursement en attente ne peut plus être retiré.
Sur un réseau de test, ces fonds n'ont pas de valeur. Avec des fonds réels, il faudrait proposer au citoyen de retirer ses fonds vers une adresse de son choix avant l'effacement.
Information des personnes
La politique de confidentialité du web indique que seule l'adresse de portefeuille figure sur la chaîne et que l'email n'y est jamais inscrit. Pour être complète, l'information présentée à l'inscription devrait aussi préciser :
- que les transactions sont publiques et définitives ;
- que l'effacement du compte ne supprime pas les transactions déjà inscrites ;
- que la dotation et les cadeaux créent des liens visibles entre adresses ;
- que la clé est détruite à l'effacement, avec les fonds restants.
Ces ajouts sont repris dans Points à valider.
Transferts hors de l'Union européenne
Les nœuds d'Ethereum, de Sepolia comme du réseau principal, sont répartis dans le monde. Inscrire une adresse sur la chaîne revient à la rendre accessible hors de l'UE. Seules des données pseudonymes y sont publiées. La qualification de ce transfert au regard du chapitre V du RGPD, que les lignes directrices du CEPD abordent, est à faire valider par le DPO. Chainlink ne reçoit que des demandes d'aléa, sans donnée personnelle.
Recommandations pour une exploitation réelle
| Recommandation | Raison |
|---|---|
Effacer payerWallet et transactionHash des tickets à l'anonymisation |
Rompre le dernier lien en base |
| Proposer le retrait des fonds avant l'effacement | Éviter la perte des fonds avec la clé |
| Dotation depuis plusieurs comptes ou par contrat intermédiaire | Réduire la visibilité du lien entre l'opérateur et chaque citoyen |
| Réaliser une analyse d'impact | Traitement innovant, données publiques et immuables |