Files
decision/docs/recherche/vote-g1-chaine.md
T

89 lines
5.9 KiB
Markdown

# Voter avec sa clé Ğ1 — une transaction par vote
> Note d'orch, 2026-10-30, pour la « grande question du vote » de la revue d'Yvv. Mise à jour
> le même jour après sa décision et une recherche dans le code des portefeuilles (clones de
> `trustinWallet/refs/`, dépôts git.duniter.org, indexeur, nœud rpc.duniter.org). Les sondes
> sont dans `/tmp/ld-recherche-vote/` sur le poste d'orch.
## La décision d'Yvv (2026-10-30)
- **Un vote = une transaction de 0,1 Ğ1**, signée par le portefeuille et embarquée dans le geste
de vote : un seul geste.
- Une personne, une voix. Cette voix s'exprime autant de fois que la personne le veut, et **le
dernier vote fait foi**.
- Seule la chaîne garantit l'intégrité d'un vote.
- **Totaux seulement** : les noms ne s'affichent pas.
- Portefeuilles visés : Ğ1Companion, Ğecko, et à terme trustinWallet.
**« Y a-t-il un autre moyen ? »** Signer son bulletin avec sa clé prouve qui a voté quoi. Mais
seule la chaîne date les votes de façon indépendante du serveur : c'est elle qui dit lequel est
« le dernier ». Elle empêche aussi le serveur d'oublier un vote. L'intuition tient.
## Ce qui est vérifié
- **Le commentaire d'un virement.** Les quatre portefeuilles (Cesium², Ğecko, Ğ1nkgo,
Ğ1Companion) envoient le virement et le commentaire en une transaction indivisible :
`utility.batchAll([balances.transferKeepAlive, system.remarkWithEvent(octets)])`.
- **Les frais.** Une transaction de moins de 256 octets ne coûte rien tant que la chaîne est peu
chargée. Mesuré sur le runtime 1101 : un virement de 0,1 Ğ1 avec un commentaire est gratuit
jusqu'à 106 octets de commentaire, puis coûte 0,05 Ğ1.
- **Le montant.** Le dépôt minimal est de 1 Ğ1. Un virement de 0,1 Ğ1 passe si le compte
destinataire existe déjà et si l'émetteur garde au moins 1 Ğ1 après le virement. Un virement
vers soi-même est refusé par les applis et ne laisse pas de trace de transfert.
- **L'indexeur.** Il retrouve un commentaire par son empreinte (`hash`, blake2-256 des
octets), avec son auteur et l'identité de l'auteur (index, nom, statut de membre), en environ
1 s. Un bloc sort toutes les 6 s et la finalité vient 2 ou 3 blocs plus tard : un vote se voit
en 6 à 12 s et devient définitif en 20 à 30 s.
- **Une remarque seule**, sans virement, est indexée elle aussi, avec son auteur.
- **L'indexeur de repli** configuré (`g1-squid.axiom-team.fr`) répond 502 le 30/10. Un seul
indexeur répond.
- **Ğ1Companion** (ManUtopiK, git.duniter.org/clients/g1companion, v0.1.5-test, dernier commit
le 2026-04-19) n'offre aux pages que `window.g1.login`, une connexion sans signature. Il ne
sait ni signer ni envoyer une transaction construite par une page. Un plan existe pour ajouter
l'interface standard des extensions (`docs/INJECTED_WEB3_PLAN.md`).
- **duniter-connect** (fork de polkadot{.js}, sur Firefox et Chrome) s'annonce comme une
extension standard et **signe ce que la page construit**. Chaque site est autorisé par la
personne. Ses limites :
- la fenêtre de confirmation est peu lisible tant que la demande de fusion !4 est ouverte ;
- elle affiche les adresses au format `5…` ;
- une faille de confidentialité (CVSS 4,8) laisse un site lire la liste des comptes.
- **Ğecko** accepte un lien profond et un QR code `g1://<adresse>?amount=0.1&comment=<texte>`,
aussi sur ordinateur s'il y est installé. Il ne rend pas la main à la page : la confirmation se
lit sur l'indexeur. Ğ1nkgo lit le même format, mais remplace par une espace tout signe hors
`[A-Za-z0-9 .;:!?()-_@&<>%]`.
- **g1vote** (git.duniter.org/tools/g1vote) fait voter par un virement vers une adresse « pour »
ou une adresse « contre ». Le choix y est public. Il a servi au vote de la Licence v0.3.0. Sa
liste de tâches prévoit « voter depuis l'interface grâce à duniter-connect ».
## L'architecture proposée
- **Le bulletin scellé.** Le serveur calcule `H = empreinte(scrutin, bulletins, sel aléatoire
de 128 bits)`. Le commentaire est `ld1:` suivi de 64 caractères hexadécimaux, soit 68 octets,
en Ascii : gratuit, et le filtre de Ğ1nkgo le laisse intact. La chaîne montre qui a voté, quand
et combien de fois, mais jamais le choix. Le serveur connaît les choix et n'affiche que les
totaux. Chacun peut vérifier son propre vote avec son sel. Sans sel, un choix entre trois
options se devinerait.
- **Un vote groupé** (tout un document, une section, un article) tient en **une** transaction :
l'empreinte couvre la liste des bulletins. Une seule remarque par transaction.
- **Le dernier fait foi**, article par article, dans l'ordre de la chaîne (bloc, puis rang de
l'événement).
- **Qui vote.** Le vote compte pour l'identité Ğ1 du compte qui signe la transaction, membre de
la toile. Il n'a donc plus besoin de la connexion Ğ1 : une personne venue par invitation vote
avec son portefeuille. L'appartenance à la toile se relit sur la chaîne.
- **Dans le navigateur** : la page construit la transaction avec polkadot-api (93 Ko gzip,
chargé seulement au moment du vote) et la fait signer par l'extension, qui montre sa fenêtre
de confirmation. La page l'envoie au nœud, puis le serveur la retrouve sur l'indexeur.
Ğ1Companion et trustinWallet s'y brancheront le jour où ils offriront l'interface standard.
- **Sur mobile** : un lien et un QR code Ğecko. Deux gestes (ouvrir, valider), puis la page
attend la confirmation de l'indexeur.
## À trancher
- La sécurité du vote face au secret : bulletin scellé (proposé) ou choix en clair.
- L'extension du geste unique : duniter-connect maintenant, ou une contribution à Ğ1Companion
d'abord.
- Le compte qui reçoit les 0,1 Ğ1 : à qui il appartient, et ce que deviennent les sommes. Un
seul compte pour tous les choix, sinon le choix se lit dans l'adresse. Il doit exister et
tenir au moins 1 Ğ1.
- Le premier essai réel est une vraie transaction : un acte « paye », du portefeuille d'Yvv.