1. Ce este Polling-ul Civic

Polling-ul Civic MINOMO este un instrument pentru consultarea cetățenilor unui municipiu într-un mod structurat, anonim și verificabil. O consultare este o întrebare cu răspunsuri multiple, publicată de administrația locală (primar sau delegatul său) cu o perioadă de vot definită. Cetățenii rezidenți (înregistrați pe MINOMO și legați de acel oraș) primesc o notificare și pot vota cu un singur tap din aplicație, fără să descarce formulare sau să se autentifice din nou.

Cine poate crea o consultare

Doar primarul — sau un funcționar delegat de el — al unui municipiu activ în programul MINOMO. Numirea trece prin City Agent-ul nostru (reprezentant teritorial), nu există auto-înscriere. Un municipiu = un cont "municipal_admin". MINOMO SuperAdmin poate interveni ca backup în caz de probleme tehnice, dar nu modifică niciodată conținutul.

📋 Nici MINOMO, nici City Agent-ul nu moderează conținutul consultărilor: administrația locală este autonomă în texte, în limitele legii (DSA). Eventualele conținuturi ilegale sunt gestionate reactiv prin procedura DSA, nu preventiv.

2. Anonimat — cum funcționează

Anonimatul este garantat de o arhitectură "split-model" care separă "cine a participat" de "ce a votat".

Tabela A — participare (tranzitorie)

Când un cetățean votează, în tabela de participare se înregistrează doar faptul că a votat (pentru a împiedica votul dublu). Nicio informație despre alegerea exprimată.

Tabela B — agregat (permanent)

Concomitent, numărul opțiunii alese este incrementat într-o tabelă de agregate. Nicio informație despre cine a votat pentru ce.

🔒 La sigilarea consultării (închidere), Tabela A este ȘTEARSĂ atomic. Din acel moment există doar numărătoarea finală pe opțiune: reconstruirea celor care au votat ce este tehnic imposibilă, pentru că datele nu mai există în sistemele noastre.

Și notificările push civice sunt proiectate să nu lase urme: nu populează log-urile standard MINOMO, nu conțin pixeli de tracking, nu includ identificatori ai destinatarului.

3. Votul — partea cetățeanului

Cine poate vota

Cetățenii înscriși pe MINOMO care și-au indicat municipiul ca "oraș de interes" și care au făcut opt-in la programul "Voce Civică" din setările contului lor. Opt-in-ul este revocabil oricând — dezactivarea lui nu șterge voturile deja exprimate, pentru că acestea sunt deja agregate și anonime.

Cum se votează

O notificare push sosește la deschiderea consultării (și la jumătatea perioadei dacă este programată) pe dispozitivele celor cu drept de vot. Atingând notificarea se deschide direct cardul de vot, cu titlu, întrebare și opțiuni. Se atinge opțiunea aleasă, se confirmă. Asta-i tot — fără formular, fără autentificare suplimentară.

Se poate vota o singură dată pentru fiecare consultare. Sistemul verifică ca votantul să fie rezident în municipiul corect, să fi făcut opt-in și să nu fi votat deja. Toate aceste verificări au loc pe server, iar rezultatele rămân ascunse până la închiderea consultării.

4. Certificat de închidere

Când consultarea se închide, sistemul produce un certificat semnat care fotografiază rezultatul. Acest certificat este documentul oficial al consultării și conține exclusiv date agregate.

Ce conține certificatul

  • Identificatori ai consultării (UUID, oraș, perioadă, primarul emitent)
  • Întrebarea și opțiunile în cele 3 limbi MINOMO
  • Numărul de voturi pentru fiecare opțiune (inclusiv abținerea, dacă este prezentă)
  • Totalul participanților și totalul voturilor
  • Pragul de k-anonimat aplicat
  • Data și ora sigilării

Ce NU conține

  • Nicio identitate a vreunui votant (datele au fost deja șterse la sigilare)
  • Niciun timestamp per-vot (doar deschidere/închidere/sigilare a consultării în ansamblul ei)
  • Nicio informație despre cum au votat subgrupuri (cartier, vârstă etc.) — doar totalul pe opțiune

5. Semnătură criptografică și Merkle tree

Semnătură Ed25519

Certificatul este semnat cu o cheie privată Ed25519 (algoritm modern, larg standardizat — RFC 8032). Cheia publică corespunzătoare este publicată pe minomo.io/civic/verify/public-key. Oricine poate verifica semnătura cu instrumente standard open-source (libsodium, noble-ed25519 etc.). Rotația cheilor este suportată: fiecare certificat indică cu ce "public_key_id" a fost semnat.

Merkle root

În plus față de semnătură, se calculează un Merkle root pe datele agregate urmând standardul RFC 6962 (domain separation cu prefixe 0x00 pentru frunze și 0x01 pentru noduri). Acest lucru permite verificarea elementelor individuale (ex. numărul unei opțiuni specifice) fără reconstrucția întregului certificat — util pentru scenarii de audit selective.

6. Ancorare temporală Bitcoin (OpenTimestamps)

Semnătura Ed25519 demonstrează autenticitatea certificatului (a fost emis de MINOMO folosind o cheie cunoscută). Dar nu demonstrează când: teoretic, MINOMO ar putea retransmite ulterior un certificat fals cu un timestamp manipulat.

Pentru a rezolva acest lucru, fiecare certificat este "ancorat" la blockchain-ul Bitcoin prin protocolul open OpenTimestamps. În practică, hash-ul SHA-256 al certificatului este inclus (împreună cu milioane de alte hash-uri din toată lumea) într-un Merkle tree public care este ancorat la un bloc Bitcoin. Blocul Bitcoin este confirmat de mii de mineri independenți în câteva ore.

Odată confirmată, ancorarea demonstrează că certificatul exista exact în acea formă înainte de blocul N al Bitcoin. Modificarea ulterioară a certificatului ar necesita "rescrierea" blockchain-ului Bitcoin — operație care ar necesita mai multă putere de calcul decât tot network-ul mondial combinat.

OpenTimestamps este gratuit și folosit la nivel mondial pentru certificare temporală. MINOMO nu plătește nimic pentru a-l folosi, iar nici tu nu plătești nimic pentru a-l verifica.

7. Disponibilitate descentralizată (IPFS)

Chiar dacă semnătura + ancorarea Bitcoin garantează autenticitatea și ordinea temporală, mai rămânea o problemă: unde se păstrează certificatul? Dacă MINOMO ar închide, certificatele găzduite doar pe serverele noastre ar deveni inaccesibile.

De aceea fiecare certificat este și publicat pe IPFS (Inter-Planetary File System), rețeaua peer-to-peer de stocare bazată pe conținut. Pe IPFS, un fișier este identificat prin hash-ul său criptografic (CID): oricine cunoaște CID-ul îl poate recupera de la orice nod IPFS care îl păstrează.

Publicăm fiecare certificat pe cel puțin 2 mirror-uri independente: nodul nostru IPFS self-host (pentru control + GC) + un mirror pe Pinata (serviciu comercial free, redundanță externă). Dacă MINOMO ar închide, certificatul ar rămâne accesibil atât timp cât cel puțin un nod din lume îl păstrează.

Pe pagina de verificare găsești link-uri directe către 4 gateway-uri publice pentru a descărca certificatul fără să instalezi nimic (ipfs.io, cloudflare-ipfs.com, dweb.link, gateway.pinata.cloud). Sunt URL-uri HTTP standard — doar dă click.

8. Ce poți verifica tu

Întregul sistem este proiectat astfel încât să nu trebuiască să crezi MINOMO pe cuvânt. Iată cele 4 verificări independente pe care oricine le poate face:

Verificare în browser (1 click)

Deschide pagina /verify/civic-poll/{uuid} a unei consultări sigilate și apasă "Verifică acum". Browser-ul tău recalculează Merkle, SHA-256 și verifică semnătura Ed25519 contra cheii publice MINOMO. Nicio dată nu este trimisă către noi.

Verificare offline cu cert JSON

Descarcă fișierul cert.json de pe pagina de verificare. Folosind biblioteci standard open-source (Python pynacl, JavaScript noble-ed25519, Go ed25519 etc.) poți: calcula SHA-256 hex al JSON-ului canonic → verifica semnătura → recalcula Merkle root. Valorile trebuie să corespundă exact.

Verificare OpenTimestamps

Descarcă fișierul cert.ots și cert.json. Instalează opentimestamps-client (pip install opentimestamps-client). Execută: ots verify -d <payload_sha256> cert-<uuid>.ots. Instrumentul contactează rețeaua OpenTimestamps și îți confirmă dacă hash-ul este ancorat la un bloc Bitcoin valid (și ce bloc).

pip install opentimestamps-client && ots verify -d <payload_sha256> cert-<uuid>.ots

Verificare IPFS (chiar cu MINOMO offline)

Ia CID-ul de pe pagina de verificare. Deschide-l prin oricare dintre gateway-urile publice: https://ipfs.io/ipfs/<CID>. Descarcă certificatul. Compară byte-cu-byte cu cert.json descărcat de pe serverul nostru: trebuie să fie identice. Dacă nu sunt, există o inconsistență gravă.