Acte M1 exécuté : 8727315 en ligne (30/10, 15h45), Raison d'être publiée ; note du vote Ğ1 mise à jour après recherche

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-10-30 15:59:10 +01:00
co-authored by Claude Opus 5.5
parent 1593e50a29
commit a3a3ee5826
2 changed files with 115 additions and 51 deletions
+78 -50
View File
@@ -1,60 +1,88 @@
# Voter avec sa clé Ğ1 — lier, signer, inscrire sur la chaîne
# 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 : liaison
> avec une transaction de 1 Ğ1 pour une inscription sur la chaîne ? autre moyen ? plugin
> obligatoire ? complicité de Ğecko pour l'affichage ?
> 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.
## Le constat
## La décision d'Yvv (2026-10-30)
Dans Monnaie libre, seuls les membres de la toile votent : une personne, une voix
(CHANTIER.md). Le serveur ne reconnaît un membre que par la connexion Ğ1, qui passe par
connect.monnaie-libre.fr. Cette connexion attend l'inscription de libreDecision auprès de
poka (`DEMANDE-CONNECT.md`). D'ici là, toute identité vient d'une invitation, et **personne ne
peut voter dans Monnaie libre**. C'est ce qu'Yvv a vu : « je ne peux pas voter dans l'ux ».
- **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.
## Vérifié le 2026-10-30 sur l'indexeur (indexer.duniter.org)
**« 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.
- Les commentaires de transaction sont indexés (`TxComment` : `remark`, `authorId`,
`blockNumber`, et les transferts qui le portent). Exemple réel : « Bienvenue dans la June ! »,
bloc 3396077.
- Un compte mène à son identité (`Account.identity`, `linkedIdentity`), donc au statut de
membre.
- Le serveur lit déjà la chaîne et l'indexeur pour la taille de la toile (`wot.rs`).
## Ce qui est vérifié
Donc, sans plugin : une transaction commentée, faite depuis Ğecko ou Cesium², se lit côté
serveur. On y retrouve le compte qui l'a signée, l'identité de ce compte et son statut de
membre.
- **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 ».
## Non vérifié
## L'architecture proposée
- Qu'un portefeuille puisse envoyer un commentaire seul, sans transfert (une « remarque »).
Tous les commentaires observés accompagnent un transfert.
- Qu'un portefeuille accepte un virement vers soi-même.
- Ce que Ğecko affiche d'une remarque sans transfert.
- **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.
## Les voies
## À trancher
| Voie | Ce que fait la personne | Coût | Ce qu'on prouve | Dépend de |
|---|---|---|---|---|
| 1. Connexion Ğ1 (connect) | signe la connexion dans Ğecko | rien | la clé à chaque session ; les votes restent sur le serveur | poka |
| 2. **Liaison par transaction** | une fois : un petit virement commenté d'un code à usage unique, vers un compte désigné | un virement, une fois | la clé, une fois pour toutes ; ensuite on vote ici | un compte destinataire |
| 3. Une transaction par vote | un virement commenté par vote | un virement par vote ; un vote groupé = autant de virements | chaque vote, sur la chaîne, visible dans Ğecko | rien de plus, mais lourd |
| 4. Bulletins signés, ancrés | signe ses bulletins (portefeuille ou extension) ; le serveur inscrit l'empreinte des bulletins par une remarque | presque rien | chaque vote, vérifiable par tous | la signature de messages par les portefeuilles (travaux de 1000i100 sur sso-connect, extension) |
## Recommandation
- **Maintenant : la voie 2.** Elle débloque le vote sans attendre personne, garde une
personne, une voix (une identité Ğ1 ne se lie qu'à une identité ici) et marche avec les
portefeuilles d'aujourd'hui. Le virement apparaît dans l'historique Ğecko de la personne.
- **Quand connect répond : la voie 1** s'ajoute. Une identité déjà liée retrouve ses votes.
- **Plus tard : la voie 4**, pour qu'on puisse vérifier chaque vote hors de notre serveur. Les
votes sont déjà publiés avec le texte sur le dépôt git.
- **La voie 3 est écartée** : un vote groupé (tout un document) coûterait des dizaines de
virements.
## À trancher pour la voie 2
- Le compte destinataire et le montant (1 Ğ1 ?) : un compte libreDecision qu'Yvv crée dans
Ğecko. Seule son adresse publique va dans la configuration du serveur.
- La durée de vie du code (proposé : 24 h) et le délai de lecture (l'indexeur suit la chaîne à
quelques blocs près).
- 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.