Prüfen Sie ein Ergebnis selbst
Zu jedem veröffentlichten Ergebnis gehören die Stimmzettel, aus denen es gezählt wurde, und ein eigenständiges Programm, das sie noch einmal zählt. Sie müssen uns die Summe nicht glauben, und Sie brauchen zum Prüfen weder ein Konto noch ein Code-Repository noch irgendeine Installation.
Was Sie brauchen
Drei Dinge, die Sie mit ziemlicher Sicherheit schon haben.
- Die Adresse des veröffentlichten Ergebnisses. Ihr Verein hat sie herumgeschickt; es ist die Seite mit den Summen.
- Python 3 — bei macOS und jedem Linux dabei, unter Windows ein kostenloser Download. Das Werkzeug nutzt nur die Standardbibliothek: Es ist nichts zu installieren.
- Etwa fünf Minuten.
So gehen Sie vor
- Legen Sie einen leeren Ordner an und laden Sie die sechs Dateien des versiegelten Pakets von der Ergebnisseite dorthin herunter.
- Laden Sie das Nachzählwerkzeug in denselben Ordner.
- Starten Sie es mit diesem Ordner als Ziel. Es zeigt an, was es gefunden hat, und endet mit einer Zeile, ob alles zusammenpasst.
Die Befehle
Ersetzen Sie die Adresse in der dritten Zeile durch die Ihrer eigenen Ergebnisseite — den Teil vor /ballots.json. Alles andere wird unverändert übernommen.
mkdir check && cd check
# the six files that make up the sealed package
BASE=https://myelection.app/o/your-club/results/00000000-0000-0000-0000-000000000000
for f in ballots.json result.json summary.json receipts.txt ballots.csv MANIFEST.sha256; do
curl -fsSLO "$BASE/$f"
done
# the recount tool
curl -fsSL https://myelection.app/verify/recount.py -o recount.py
python3 recount.py .
Unter Windows ohne curl: Öffnen Sie die Ergebnisseite, speichern Sie jede der sechs Dateien mit „Ziel speichern unter“ in einen gemeinsamen Ordner, legen Sie recount.py daneben und führen Sie in diesem Ordner „python recount.py .“ aus.
Das Werkzeug
Eine einzige Datei, 428 Zeilen Python, 16468 Bytes. Es ist eine zweite Umsetzung der Zählregel, geschrieben in einer anderen Sprache als die Software, die das Ergebnis erzeugt hat, und ohne gemeinsamen Code mit ihr — ein Fehler in der einen würde von der anderen also nicht wiederholt. Es liest ausschließlich die Dateien, die Sie heruntergeladen haben, und stellt keinerlei Netzwerkanfrage.
Ihr SHA-256, damit Sie bestätigen können, dass Sie dieselbe Datei haben, die diese Seite beschreibt, und damit zwei Personen, die dieselbe Wahl prüfen, dasselbe Werkzeug verwendet haben:
f7f7a9592c2f56ce4ea97298e483ceae2de34df27c929611573fe15ec317a1b3
Was im versiegelten Paket steckt
Sechs Dateien, mit jedem Ergebnis veröffentlicht. Keine enthält einen Namen, eine Anschrift oder sonst etwas, das eine wählende Person identifiziert — das ergibt sich aus ihrer Konstruktion und ist nicht etwas, das beim Veröffentlichen entfernt wird.
| Datei | Was sie ist |
|---|---|
| ballots.json | Jeder anonyme Stimmzettel mit seiner Auswahl, dazu die geltenden Regeln: die Kandidierenden oder Optionen, die Sitze, wie viele jede Person wählen durfte, die Regel bei Stimmengleichheit und bei einem Antrag die Schwelle. Das ist die vollständige Eingabe der Auszählung. |
| result.json | Was die Anwendung ermittelt hat. Das Werkzeug vergleicht seine eigenen Summen Zeile für Zeile damit. |
| summary.json | Die Wahlberechtigten, die angenommenen Stimmzettel, die eingelösten Codes, die Beteiligung sowie die Hashwerte von Konfiguration und Verzeichnis zum Zeitpunkt des Einfrierens. |
| receipts.txt | Die Referenz, die jeder wählenden Person beim Absenden angezeigt wurde. Wenn Sie gewählt haben, steht Ihre darin. |
| ballots.csv | Dieselben Stimmzettel als Tabelle, falls Sie lieber in Excel zusammenzählen als etwas auszuführen. |
| MANIFEST.sha256 | Ein SHA-256 zu jeder der obigen Dateien und ein Hash über alle zusammen. Das macht eine Veränderung erkennbar. |
Das Prüfprotokoll ist das Einzige, was hier nicht veröffentlicht wird: Es nennt die Wahlverantwortlichen Ihres Vereins und ihre Handlungen und steht daher ihnen und einer bestellten prüfenden Person offen, nicht dem ganzen Internet. Sein Kopf-Hash wird mit dem Ergebnis veröffentlicht, was ein späteres Umschreiben erkennbar macht.
Was es prüft, und wie die Ausgabe zu lesen ist
Fünf Dinge, in dieser Reihenfolge. Jeder Fehlschlag wird mit einem Ausrufezeichen gedruckt und in der letzten Zeile mitgezählt.
- Die Dateien sind die, die das Manifest beschreibt. Es berechnet den SHA-256 jeder in MANIFEST.sha256 genannten Datei neu. Hat sich auch nur ein Byte geändert, schlägt das fehl.
- Es zählt die Stimmzettel selbst, allein aus ballots.json — und meldet jeden doppelt gezählten Stimmzettel, jeden mit einer unbekannten Kandidatur und jeden mit mehr Auswahlen, als die Regeln zuließen.
- Es ermittelt den Ausgang. Bei einer Wahl markiert es, welche Summen die Sitze besetzen, und meldet eine Stimmengleichheit an der Sitzgrenze, ohne sie aufzulösen. Bei einem Antrag wendet es die vereinbarte Schwelle an und sagt angenommen oder abgelehnt.
- Es vergleicht seine Summen mit result.json, Kandidatur für Kandidatur. Das ist die entscheidende Zeile: „AGREE: every candidate total matches.“
- Es gleicht ab. Angenommene Stimmzettel müssen den eingelösten Codes entsprechen; die eigene Stimmzettelzahl muss zur Zusammenfassung passen; die veröffentlichten Referenzen müssen eindeutig und so zahlreich wie die Stimmzettel sein; und die Konfiguration darf sich seit dem Einfrieren nicht geändert haben.
So sieht ein Durchlauf aus
Ein echter Durchlauf zu einer Vorstandswahl mit drei Sitzen, bei der es um den letzten Sitz Stimmengleichheit gab.
Sealed package: .
==================================================================
Manifest : 5 files, all hashes match
Package hash : a7f18f378be1afedad94d585bb0a29cf9e1fc9d32bafce2a364ac2e950139dbc
Independent recount
------------------------------------------------------------------
Ballots counted: 12 (blank: 1)
Anna Fields 10 <- fills a seat
Bob Marsh 8 <- fills a seat
Charles Okoro 6 <- tied for the last seat
Dana Reid 6 <- tied for the last seat
Eve Salter 2
Frank Tan 1
* the seat boundary fell inside a tie at 6 votes. The rule agreed beforehand
was: Lot drawn by the chair and secretary at the next committee meeting.
What the officers did about it is recorded on the published result page
and in the audit log.
Comparison with the application's result.json
------------------------------------------------------------------
AGREE: every candidate total matches.
Reconciliation
------------------------------------------------------------------
Accepted ballots : 12
Redeemed credentials : 12
==================================================================
RESULT: the count reconciles.
1 matter(s), marked * above, needed the officers' decision rather
than the count's.
Zwei Dinge sind zu lesen. „AGREE: every candidate total matches“ ist die Zeile, die besagt, dass dieses Programm und jenes, das die Seite erzeugt hat, unabhängig voneinander zu denselben Summen kamen. Und die letzte Zeile trennt zweierlei: Ein mit Ausrufezeichen markiertes Problem bedeutet, dass die Zahlen nicht aufgehen; ein mit Stern markierter Punkt bedeutet, dass die Auszählung vollständig war, eine Entscheidung aber den Wahlverantwortlichen oblag — genau das ist eine Stimmengleichheit. Eine Abstimmung ohne Stimmengleichheit endet schlicht mit „RESULT: everything reconciles“.
Wenn es abweicht
Gehen Sie nicht davon aus, dass Sie einen Fehler gemacht haben. Schicken Sie die Ausgabe an die Wahlverantwortlichen Ihres Vereins und bitten Sie sie, das Werkzeug selbst auszuführen; der ganze Sinn einer zweiten Umsetzung ist, dass sie abweichen darf. Können sie es nicht erklären, sollte das Ergebnis keinen Bestand haben.
Was ein sauberer Durchlauf beweist — und was nicht
Er beweist, dass die veröffentlichten Stimmzettel die veröffentlichten Summen ergeben und dass keine der veröffentlichten Dateien seit dem Versiegeln verändert wurde. Das ist etwas Handfestes und genau der Teil, der am ehesten durch einen Programmfehler statt durch Absicht schiefgeht.
Er beweist für sich genommen nicht, dass diese Stimmzettel die von den Wählenden abgegebenen sind. Dafür sorgen zwei weitere Dinge: der obige Abgleich, der verlangt, dass die Zahl der angenommenen Stimmzettel der Zahl der tatsächlich verwendeten Codes entspricht, und jede wählende Person, die prüft, ob ihre eigene Referenz in receipts.txt steht. Ein Verein, dessen Mitglieder das tun, hat die Lücke geschlossen; eine Nachzählung allein nicht.
Und er sagt nichts darüber aus, wie eine einzelne Person gewählt hat, denn nichts in diesen Dateien könnte das. Es gibt in diesem Dienst nirgends eine Spalte, die einen Stimmzettel mit einer Person verbindet.
Warum es so gebaut ist
Wie Namen und Stimmen getrennt bleiben, was verschlüsselt ist, wo die Daten liegen und wovor dieser Dienst Sie nicht schützt.