1. Cos'è il Polling Civico
Il Polling Civico MINOMO è uno strumento per consultare i cittadini di un Comune in modo strutturato, anonimo e verificabile. Una consultazione è un quesito a risposte multiple, pubblicato dall'amministrazione comunale (sindaco o suo delegato) con un periodo di voto definito. I cittadini residenti (registrati su MINOMO e legati a quella città) ricevono una notifica e possono votare con un tap dall'app, senza scaricare moduli o autenticarsi nuovamente.
Chi può creare una consultazione
Solo il sindaco — o un funzionario da lui delegato — di un Comune attivo nel programma MINOMO. La nomina passa dal nostro City Agent (rappresentante territoriale), non c'è auto-iscrizione. Un Comune = un account "municipal_admin". Il MINOMO SuperAdmin può intervenire in backstop in caso di problemi tecnici, ma non modifica mai contenuti.
📋 Né MINOMO né il City Agent moderano il contenuto delle consultazioni: l'amministrazione comunale è autonoma nei testi, fermi i limiti di legge (DSA). Eventuali contenuti illeciti sono gestiti reattivamente con la procedura DSA, non preventivamente.
2. Anonimato — come funziona
L'anonimato è garantito da un'architettura "split-model" che separa il "chi ha partecipato" dal "che cosa ha votato".
Tabella A — partecipazione (transitoria)
Quando un cittadino vota, viene registrato in una tabella di partecipazione il solo fatto che ha votato (per impedire doppio voto). Nessuna informazione sulla scelta espressa.
Tabella B — aggregato (permanente)
Contestualmente, il conteggio dell'opzione scelta viene incrementato in una tabella di aggregati. Nessuna informazione su chi ha votato per cosa.
🔒 Al sigillo della consultazione (chiusura), la Tabella A viene CANCELLATA atomicamente. Da quel momento esiste solo il conteggio finale per opzione: ricostruire chi ha votato cosa è tecnicamente impossibile, perché il dato non esiste più nei nostri sistemi.
Anche le notifiche push civiche sono progettate per non lasciare tracce: non popolano i log standard di MINOMO, non contengono pixel di tracciamento, non includono identificatori del destinatario.
3. Voto — il lato del cittadino
Chi può votare
I cittadini iscritti a MINOMO che hanno indicato il proprio Comune come "città di interesse" e che hanno fatto opt-in al programma "Voce Civica" dalle impostazioni del proprio account. L'opt-in è revocabile in qualunque momento — disattivarlo non cancella i voti già espressi, perché essi sono già aggregati e anonimi.
Come si vota
Una notifica push arriva all'apertura della consultazione (e a metà periodo se programmata) sui dispositivi degli aventi diritto. Toccando la notifica si apre direttamente la scheda voto, con titolo, domanda e opzioni. Si tappa l'opzione scelta, si conferma. Tutto qui — niente form, niente autenticazione aggiuntiva.
Si può votare una sola volta per consultazione. Il sistema verifica che il votante sia residente nel Comune giusto, abbia fatto opt-in, e non abbia già votato. Tutti questi controlli avvengono lato server e i risultati restano nascosti finché la consultazione non si chiude.
4. Certificato di chiusura
Quando la consultazione si chiude, il sistema produce un certificato firmato che fotografa il risultato. Questo certificato è il documento ufficiale della consultazione e contiene esclusivamente dati aggregati.
Cosa contiene il certificato
- Identificatori della consultazione (UUID, città, periodo, sindaco emettente)
- Domanda e opzioni nelle 3 lingue MINOMO
- Conteggio voti per ciascuna opzione (compresa l'astensione, se presente)
- Totale partecipanti e totale voti
- Soglia di k-anonimato applicata
- Data e ora del sigillo
Cosa NON contiene
- Nessuna identità di nessun votante (i dati sono già stati cancellati al sigillo)
- Nessun timestamp per-voto (solo apertura/chiusura/sigillo della consultazione nel suo complesso)
- Nessuna informazione su come hanno votato sottogruppi (quartiere, fascia di età, ecc.) — solo il totale per opzione
5. Firma crittografica e Merkle tree
Firma Ed25519
Il certificato viene firmato con una chiave privata Ed25519 (algoritmo moderno, ampiamente standardizzato — RFC 8032). La chiave pubblica corrispondente è pubblicata su minomo.io/civic/verify/public-key. Chiunque può verificare la firma con strumenti open-source standard (libsodium, noble-ed25519, ecc.). La rotazione delle chiavi è supportata: ogni certificato indica con quale "public_key_id" è stato firmato.
Merkle root
Oltre alla firma, viene calcolato un Merkle root sui dati aggregati seguendo lo standard RFC 6962 (domain separation con prefissi 0x00 per le foglie e 0x01 per i nodi). Questo permette di verificare i singoli elementi (es. il conteggio di una specifica opzione) senza ricostruire tutto il certificato — utile per scenari di audit selettivi.
6. Ancoraggio temporale Bitcoin (OpenTimestamps)
La firma Ed25519 dimostra l'autenticità del certificato (è stato emesso da MINOMO usando una chiave nota). Ma non dimostra quando: in teoria, MINOMO potrebbe ritrasmettere a posteriori un certificato falso con un timestamp manipolato.
Per risolvere questo, ogni certificato viene "ancorato" alla blockchain Bitcoin tramite il protocollo open OpenTimestamps. In pratica, l'hash SHA-256 del certificato viene incluso (insieme a milioni di altri hash di tutto il mondo) in un Merkle tree pubblico che viene ancorato a un blocco Bitcoin. Il blocco Bitcoin viene confermato da migliaia di miner indipendenti nel giro di poche ore.
⛓ Una volta confermato, l'ancoraggio dimostra che il certificato esisteva esattamente in quella forma prima del blocco N di Bitcoin. Modificare il certificato dopo richiederebbe di "riscrivere" la blockchain Bitcoin — un'operazione che richiederebbe più potenza di calcolo di tutto il network mondiale combinato.
OpenTimestamps è gratuito e usato a livello mondiale per certificazione temporale. MINOMO non paga nulla per usarlo, e nemmeno tu paghi nulla per verificarlo.
7. Disponibilità decentralizzata (IPFS)
Anche se la firma + l'ancoraggio Bitcoin garantiscono autenticità e ordine temporale, restava un problema: dove si conserva il certificato? Se MINOMO chiudesse, i certificati ospitati solo sui nostri server diventerebbero irraggiungibili.
Per questo ogni certificato viene anche pubblicato su IPFS (Inter-Planetary File System), la rete peer-to-peer di archiviazione content-addressed. Su IPFS un file è identificato dal suo hash crittografico (CID): chiunque conosca il CID può recuperare quel file da qualunque nodo IPFS che lo conserva.
Pubblichiamo ogni certificato su almeno 2 mirror indipendenti: il nostro nodo IPFS self-host (per controllo + GC) + un mirror su Pinata (servizio commerciale free, ridondanza esterna). Se MINOMO chiudesse, il certificato resterebbe accessibile finché almeno un nodo al mondo lo conserva.
Sulla pagina di verifica trovi link diretti a 4 gateway pubblici per scaricare il certificato senza installare nulla (ipfs.io, cloudflare-ipfs.com, dweb.link, gateway.pinata.cloud). Sono URL HTTP standard — basta cliccare.
8. Cosa puoi verificare tu stesso
Tutto il sistema è progettato perché tu non debba fidarti di MINOMO sulla parola. Ecco le 4 verifiche indipendenti che chiunque può fare:
Verifica sul browser (1 click)
Apri la pagina /verify/civic-poll/{uuid} di una consultazione sigillata e clicca "Verifica ora". Il tuo browser ricalcola Merkle, SHA-256 e verifica la firma Ed25519 contro la chiave pubblica MINOMO. Nessun dato viene inviato a noi.
Verifica offline con il cert JSON
Scarica il file cert.json dalla verify page. Usando librerie open-source standard (Python pynacl, JavaScript noble-ed25519, Go ed25519, ecc.) puoi: calcolare SHA-256 hex del JSON canonico → verificare la firma → ricalcolare Merkle root. I valori devono corrispondere esattamente.
Verifica OpenTimestamps
Scarica il file cert.ots e il cert.json. Installa opentimestamps-client (pip install opentimestamps-client). Esegui: ots verify -d <payload_sha256> cert-<uuid>.ots. Lo strumento contatta il network OpenTimestamps e ti conferma se l'hash è ancorato a un blocco Bitcoin valido (e quale blocco).
pip install opentimestamps-client && ots verify -d <payload_sha256> cert-<uuid>.ots
Verifica IPFS (anche con MINOMO offline)
Prendi il CID dalla pagina di verifica. Aprilo via uno qualunque dei gateway pubblici: https://ipfs.io/ipfs/<CID>. Scarica il certificato. Confronta byte-per-byte con il cert.json scaricato dal nostro server: devono essere identici. Se non lo sono, c'è un'incoerenza grave.