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