forked from yvv/decision
89 lines
5.9 KiB
Markdown
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.
|