v0.3.0 9 days ago

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