tallyard v0.4.5 David Florness (4): Check for nil pointer Ensure we process the start message before processing evals Ensure elections have more than voter Bump version to v0.4.5
tallyard v0.4.4 David Florness (4): contrib: add _incr_version script README: better wording Lazy load member state events Bump version to v0.4.4
tallyard v0.4.3 David Florness (2): Close files used in marshalling Bump version to v0.4.3
tallyard v0.4.2 This release greatly speeds up the marshalling done during startup time by storing zk proving+verifying keys in files separate from the main elections json file. The sync filter also now correctly includes state events in both rooms' state lists _and_ their timelines. David Florness (8): Actually use custom syncer and fix inheritance from DefaultSyncer Log reading and unmarshalling of elections file Control sync filter via the new custom syncer Correctly include state events in sync timeline Won't do TODO Speed up marshalling by storing keys in separate files Print helpful error message when the map schema is incompatible Bump version to v0.4.2
tallyard v0.4.1 This release fixes a message processing race condition, fixes a rare but fatal nil pointer panic, and adds extra logging. David Florness (8): README: mention need for libolm in source instructions README: "libolm ... library" is redundant Log sync errors Log sync exits Enable extra mautrix-go logging and bump mautrix-go for new logging Fix race condition in processing logic Fix panic when our device doesn't have election private keys Bump version to v0.4.1
tallyard v0.4.0 This major release changes the protocol to require that voters provide zero-knowledge proofs that their ballots are valid. David Florness (1): Bump version in README
tallyard v0.4.0-rc2 David Florness (4): site: put links on separate line from image and center those site: "dev mailing list" -> "mailing list" README: update mautrix-go URL Use gjson 1.10.2
tallyard v0.4.0-rc1 This is the first rc for the upcoming major release 0.4.0, which changes the protocol to require that voters provide zero-knowledge proofs that their ballots are valid. David Florness (44): Remove unused files Move device display name code out of main Set device name if it's changed Move TUI-specific auth code to main package Put election filter after main function Generalize ElectionsMap to work without a file Don't allow zero for inputs Don't participate in elections with fewer than two voters Don't participate in election if we didn't join Implement zero-knowledge proofs for evaluations and summations Upgrade gnark and gurvy (now gnark-crypto) Remove infinite retries for reading proving keys Redact all events (except Sum) we sent once the election is over Use one witness for evals circuits TUI: notify user when keys are being sent Do not proceed to ballot TUI if we're missing proving keys Fix lagrange test Fix voter JSON marshalling Use cached list of hash seeds Insert panic to help root out bug Use t.Fatal instead of panicking in tests Start and join events for keys msgs must belong to the same election Use syncer hooks instead of recurring updates for TUI Use logger and close TUI (if present) when handling panics README: update info on zk-SNARKS Bump dependencies Better filename and remove unneeded functions Move version.go to root module Don't lazy load member events zk: derive one hash seed by combining each "part" sent by voters Upgrade mautrix and tidy dependencies Properly display errors from Sync goroutine Allow disabling of message redactions Log uploads to file Properly close file Explicitly don't allow showing results of election we're not in TUI: properly handle panics inside goroutine Send human-readable event on election creation Don't panic in event handlers on nil event TUI: don't display user ID more than once if user rejoins Add hash commitments to messages to ensure integrity Upgrade gnark Upgrade dependencies Use fork of mautrix-go with bugfix
tallyard v0.3.1 Doc updates and dependency bumps David Florness (13): Fix clone URL in README Bump dependencies Delete old Nonce implementation Remove useless comment We don't need this return value to be named Set Matrix device display name to something reasonable tallyard.xyz: use symbolic Matrix room link tallyard.xyz: add links to mailing list and issue tracker tallyard.xyz: remove link to presentation in navigation links Remove TODO.org tallyard.xyz: revamp Contributing and Future Work sections with lists README: fix grammar README: update install-from-source instructions to use tarball
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