diff --git a/actes/2026-10-30-m1-mise-en-ligne.md b/actes/2026-10-30-m1-mise-en-ligne.md index 383c73f..42704b0 100644 --- a/actes/2026-10-30-m1-mise-en-ligne.md +++ b/actes/2026-10-30-m1-mise-en-ligne.md @@ -1,7 +1,7 @@ # Acte — Mise en ligne M1 (revue du 30/10 : entrée, DA, menu, listes, Raison d'être, versions) Classe : déploie Projet : libreDecision Date : 2026-10-30 -**État : FIGÉ (2026-10-30, 14 h 50)** sur `8727315` — relecture « 8727315 : ok » inscrite (sous-agent neuf, 30/10 14 h 45) +**État : EXÉCUTÉ** — armé le 30/10/2026 à 15 h 29 par Yvv (« pousse déploie »), sur `8727315`, relecture « 8727315 : ok » inscrite ## Intention @@ -147,3 +147,39 @@ reste en base, et le commit du dépôt des textes reste publié. demanderait un amendement inverse, écrit et relu comme celui-ci. - **Le commit publié** dans le dépôt des textes : **IMPOSSIBLE à retirer sans réécrire l'historique** de ce dépôt (geste « supprime »). On publierait par-dessus. + +## Exécution + +Acte exécuté le 30/10/2026, 15h29-15h52, par orch (session libreDecision), sur le mot d'Yvv +« pousse déploie ». + +- Prémisses revérifiées à 15 h 29 : + - santé `{"build":"dc2de094","ok":true}` ; + - `prod/main` et `origin/main` à `dc2de09` ; + - aucun écart de configuration ; + - relecture inscrite ; + - copie fraîche de la base : I1 rend exactement les trois lignes attendues. +- Commandes : `git push prod 8727315:main` (`dc2de09..8727315`), + `git push origin 8727315:main` (`dc2de09..8727315`), + `git push origin chantier/acte-certification` (`68111c3..1593e50`), à 15 h 35. +- Pipeline : + - le site est injoignable un instant à 15 h 44 min 52 s ; + - l'ancienne version répond encore à 15 h 45 min 09 s ; + - `{"build":"87273156","ok":true}` à 15 h 45 min 45 s. +- Vérifications : + - [x] santé `87273156` ; + - [x] `/` répond 200 et la page cite la favicon (4 occurrences) ; + - [x] journaux du conteneur, à 14:45:32Z : + - `seed amendment applied … group=essai unit="I1"` ; + - `seed amendment applied … group=monnaie-libre unit="I1"` ; + - [x] publication à 14:45:36Z : `published doc=0a4c0663… commit="35864eb3dccebf8c7e38accb69107fa3823f8ab4"`, la + Raison d'être est publiée dans le dépôt des textes ; + - [x] maquette.decision.librodrome.org répond 200 ; + - [ ] vérification à l'écran par Yvv (accueil, Monnaie libre, Raison d'être, versions + groupées). +- Image de retour : `libredecision-app:previous` (la version `dc2de09`), gardée par le + pipeline. +- Redémarrage à froid : celui du pipeline, qui recrée le conteneur (`up --force-recreate`). + Aucun autre, il n'était pas au dossier. +- Copies de la base de production (`/tmp/ld-prod-copie`, `/tmp/ld-prod-recette`) retirées du + poste à 15 h 52. diff --git a/docs/recherche/vote-g1-chaine.md b/docs/recherche/vote-g1-chaine.md index 401d793..a3abc6b 100644 --- a/docs/recherche/vote-g1-chaine.md +++ b/docs/recherche/vote-g1-chaine.md @@ -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://?amount=0.1&comment=`, + 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.