Key chain
this is Yar's suggestion on ensuring that the key can not be sold it is not currently incorporated into the rest of the system; significant review might be required also likely applicable for normal MACI
Idea:
Let's organize private keys in chains of unknown length. As a simplest example: let be some hash function, and use as a public key corresponding to a private key . Then, let's say that dominates if we know such integer that .
If we have provided the coercing party with a private key, it can not be known for sure whether this private key is dominated (whether it actually has a known preimage).
Then, let's give a dominating public key ability to "cancel" public key in our voting system (in a simplest version, this can even be used instead of keychanges). This not only gives non-coercibility, but also prevents key selling.
I.e., simplest (not very efficient) MACI-style voting system works like this: there is an initial registry of keys of height ; users send their (encrypted) transactions, which include signatures with keys of arbitrary non-negative height (possibly with zk-proof that the result of hashes gives the key from the registry to prevent DoS). Server nullifies all dominated votes and sums up all non-dominated.
Algorithm therefore becomes:
- sort transaction list by a 2-wide register: ASC by user, DESC by height, DESC by timestamp
- add padding element with idx 0
- for transaction with index add field as follows
- aggregate "valid" transactions into voting result
This seems to not require security deposit.