In the spirit of moonshot design, here’s a question about the desired functionality of coin-holding-time-weighted voting (critique aside).
The straightforward way to measure coin holding time is: how long have the coins been untouched as of the cutoff time. Or more technically: how long ago has each (unspent) note been created.
(I’ll be talking about Zcash notes. This is all true for Bitcoin-style UTOXs too, but we want privacy, so let’s focus on a shielded design.)
The problem is that measured this way, holding time is reset when funds are moved within a user’s wallet or between their self-owned wallets. For example, all of the following may reset the user’s holding period:
- making a payment, even a tiny one (that spends the note, even if sends most of the funds back to the same address)
- moving funds from a wallet app to a better one
- moving some funds from a hardware/cold wallet to phone app wallet, or vice versa
- moving funds to a fresh wallet because the old one (or its backup) was compromised
- merging notes for efficiency
This means that in order to achieve a large voting weight, voters needs need to be not merely “long ZEC” in their financial exposure (as proponents desire), but also effectively need to avoid using and securing their ZEC funds. That’s bad.
There is a mechanism that addresses this, by making it possible to move funds while annotating the transaction as sending-to-myself, meaning it does not reset the holding period. This can be done on-chain by privacy-preserving consensus rules. (I can elaborate, but let’s first see if want it.)
So when your wallet software sends change to itself, or when you make a transfer and check the box saying “sending to myself”, your holding period will be maintained. When you later cast a vote using these coins, its weight will be automatically computed according to the holding period going back to the last transfer that wasn’t marked as sending-to-myself.
Conversely, when you send funds to someone else, you leave the “sending to myself” box unchecked, and this causes the holding period to be reset, so the recipient doesn’t enjoy an extra weight to their future votes just because you happened to hold your coins for a long time.
- This weakens fungibility. Coins are worth more, because of increased voting power, if they already have a long holding period and their owner is willing to mark them as “sending to myself” when selling them.
UX complexity: it’s another decision to make when sending funds, which complicates the UI and requires users’ attention and education.
There’s a compromise option, which automatically considers funds to be “sent to myself” if, and only if, they are sent and received by the same address. This covers the most common case: keeping the holding period of change (from a payment or fund transfer) that’s sent back to the original wallet. It doesn’t cover the other cases, involving multiple addresses owned by the same user.
What do you think? Which would you choose? Do you have a better idea?
Let me even make a straw poll:
How should coin-holding-time-weighted voting compute the holding period?
- Reset the holding period whenever the wallet is used
(more precisely: when a note is spent; see above)
- Sending back change does not reset the holding period; anything else does
- Allow manual “send-to-myself” which does not reset the holding period
- I have an even better idea, and will post it below