This is part 2 in a series titled "Politics for Software Engineers." Subscribe now so you don't miss future installments. Read part 1 here.
It's the 4th of July, so America and our democracy is on my mind. 2021 has been a difficult year for our electoral system. From Donald Trump's sycophants refusing to honor the results of a free and fair election, to New York City's Department of Elections giving a masterclass in how to undermine faith in the voting process — America has had it rough.
Typically, this is when technologists start thinking of technical solutions to what are political or organizational problems. Surely, you say, if we assign everyone a private key and have them emit a hash of their ballot on the blockchain, we can not only prove that every vote was counted, but we can also vote online!
I hope most of you are already running for the hills.
Voting on the blockchain
I'm not an anti-blockchain person. In fact, I'm a huge fan and I've been following Bitcoin since around 2014. I have some Bitcoin and some Ethereum. But it is an absolutely terrible technology for running an election.
Blockchains are designed to solve the problem of "how do I coordinate across a communication network I can't trust". By distributing competing nodes around the world, run by many disparate organizations and individuals, and using a proof-of-work solution to the Byzantine Generals problem, it allows cryptographic tokens to be exchanged with extremely high confidence that no one can tamper with the network or steal your tokens. This is an admittedly weak explanation, so if you want a better understanding, please read the original Bitcoin whitepaper (it’s short and easy to understand, I promise).
You'll notice there are a lot of things in there that don't apply to elections: zero trust, many disparate organizations, a widespread communication network. Despite being at what feels like a low point in trust in the integrity of elections, America is still a high-trust society. Most people have a general understanding and belief that corruption exists, is discoverable, and will be punished. We've built systems and institutions designed to deal with the icky human problems of trust. We're even ranked 25th least corrupt nation in the world!
But beyond the general feeling of trust in our society, a democratic government derives its power from the popular belief in its legitimacy. When people lose trust in elections, the government will either reform or be toppled (eventually, hopefully, after turning into an authoritarian state).
Blockchain voting addresses how to vote in a trust-less society, but a trust-less society cannot have a functioning democracy.
And this is all to say nothing of the sheer complexity and technical woowoo involved in communicating how blockchains work to the general public. You really, really, really don't want the average voter to believe their voting systems use the same technology that enables ransomware attacks and may be controlled by China. But people can easily understand and intuitively trust "Fill in the circle, the scantron counts it. If the machine fails we'll have a human look at it. And we randomly double check ballots to check for issues."
To get a really good feel for the wide variety of wrong opinions about blockchain voting, just peruse this Hacker News thread.
However, I will admit one great use for a key component of blockchains: Merkle trees. There is a decent argument to have the ballot scanners update a publicly accessible Merkle tree as votes are counted, so individuals can verify that their ballot was processed in real time. But that's a topic for another essay.
Simplicity is more important that provably correct
I want to drive home this point: when dealing with complex human systems that have thousands of moving parts across millions of people that they all need to both understand and trust, the most important thing is simplicity. Sure, if you're building an alternative currency you need provably correct cryptography and fault tolerance. But voting is literally as simple as writing down your choice and having it counted.
I think where most software engineers fail at politics, it's in understanding that key point. We tend to over engineer our systems and never need to explain the inner workings to anyone who is non-technical. This isn't restricted to just software engineers, of course. Any sufficiently advanced technology is difficult to explain in terms a non-expert can understand. But we do, at least, understand that we need to tailor the front-end user experience to the target demographic.
I understand how cars work, but I couldn't tell you what 98% of the things under the hood do. But I know gasoline explodes, moves a piston, turns a crank, and turns the wheels. When I press the gas pedal I go forward and when I press the brake I stop. I have a functional understanding of the car and enough trust in the systems that built it to get behind the wheel.
Voting, and indeed democracy itself, are technologies like any other. They're old technologies, they're fairly simple, and they are implemented via social networks. (I like to quip that politics is just a social network for alcoholics, and I'm only kind of joking...) And in any social network, trust is essential. But how do you build enough trust in a common voting system for people who vehemently disagree? By being as simple and as easy to explain as possible.
Blockchain voting fails at the most basic test of social technology: can you explain how it works to someone skeptical of the people in power in a way that makes them trust the system?
Please, abandon dreams of blockchain voting and focus on how you can make paper ballots provably counted. Start with a technology people trust, and then prove it works.