tallyard v0.3.0
This release is very substantial. We've moved off of libp2p entirely and onto
the federated Matrix messaging network. This obviously took a huge amount of
effort (and many weekends), but it was well worth it because Matrix gives us
many things, including
1. authentication, which (once the zkproofs implementation is finished) solves
the problem of double-voting,
2. an easy way to find elections and limit who can join them by using Matrix
rooms, and
3. a simple RESTful HTTP API [0] to propagate messages between voters, replacing my
ad hock peer-to-peer solution.
I have nothing against libp2p; it is clearly very capable and I look forward to
seeing what that project becomes. I'm grateful that I got to play with it for a
few months when working on tallyard. However, I want tallyard, specifically, to
focus on being a system with strong homomorphic secret-sharing and
zero-knowledge proofs; these directly address the problems I'm trying to solve.
Learning the ins and outs of peer-to-peer networking was too much of a load for
me (especially for debugging). With Matrix, we're able to stand on the
shoulders of giants and solve a whole bunch of problems like the aforementioned,
and a bunch of little things like rate-limiting, end-to-end encryption, backups,
etc. with little to no effort. Also, the fully peer-to-peer dream seems to be
on the horizon with P2P Matrix [1].
This release also completely changes the look and behavior of messages in the
protocol. Messages are now versioned to facilitate future protocol upgrades,
which will be necessary for the zkproof changes. Messages also now require
references (in the form of event IDs) to previous messages to ensure the correct
ordering of events and to protect against a handful of replay attacks.
Much work is yet to be done, so I'll see you in the next release.
[0]: https://matrix.org/docs/spec/client_server/latest
[1]: https://matrix.org/blog/2020/06/02/introducing-p-2-p-matrix
David Florness (82):
Start Matrix client
Organize Matrix auth data logic
Start handling events and try to get decryption working
Switch to Matrix
Begin work on evals
Store local voter in data.json
Ensure elections exist before using them
Retrieve create election event if we haven't seen it yet
Wrong variable
A few fixes
Ignore redacted events
Store elections in data and use join_event_id for some messages
Always parse raw events
Be sure to set FinalVoters when starting election
Fix voters list in election TUI
TUI: don't update app's queue in input capture
Begin work on save functionality
Temporarily remove election saving
Exit gracefully on C-c
Remove commented functions from libp2p implementation
Use logrus for DebugCB
find . -name '*.go' | xargs gofmt -w
Revert "Temporarily remove election saving"
Only show election screen if local voter *hasn't* voted
Don't vote if election wasn't started
Cascade ElectionsMap's Save to Elections
Fix Election JSON marshalling
Don't create election if CreateElectionTUI form wasn't completed
Only fix Election.Joins on unmarshal if localvoter exists
Save election data in separate file
Don't set LocalVoter's eval until after potential error
Only send eval and sum when we need to
Actually use function we wrote
Don't need this function
Properly sort elections by room in TUI
Parse join election messages after parsing elections file
Ignore eval message if the local voter hasn't joined the election
Move event hook setup to msg.go
Remove deprecation comments
Put Matrix auth data in auth.json instead of data.json
Use .well-know/matrix/client to discover homeserver URL
Make the filter more strict
Create a mautrix store for saving rooms to disk
Reorder functions
Schulze method
Fix elections list update
Always make ~/.local/share/tallyard
Helpful message
Set titles for all of the TUI screens
We don't need to SetFocus after calling SetRoot with the same thing
Fix grammar in function doc
Stop using shortcuts for room/election TUI lists
Sort rooms by name in room list TUI
Move all program control flow to main function
Version the elections map
Use two dimensional array instead of map of maps
Use the elections map as our mautrix store
Store entire create event in election
Try to mitigate against replay attacks and refactor event retrieval
Send result event and use event store if possible
Don't store raw ballot in elections file
Throw away our private key for an election after it's over
Remove support for result message
Allow user to see results of past elections
Show candidates on election confirmation screen
Fix "Starting election..." text in election wait TUI
Assume that options left blank in the ballot TUI mean tied for last
Put rooms with elections at the top of the rooms TUI list
Fix room TUI Ltime bug
TUI: differentiate between waiting for results and showing them now
Properly handle ballot TUI errors
Slightly optimize onSumMessage loop
Calculate local voter's sum as soon as we have the final eval
Ignore room account data events in the sync filter
Set larger limit for filter
Don't process an event when it's already being processed
Update README
Update repo and presentation links on tallyard.xyz
Update go-import and go-source meta tags on tallyard.xyz
Add README section for contributing
Fix test failure for Println
Add note in README on git-send-email.io