February 6, 2020 Reading Time: 3 minutes

Iowa Democrats could have simply transferred a predetermined sum of Bitcoin to signal which candidate received their precinct’s delegates. Had they done so, the blockchain’s public ledger would have conveyed the necessary information in a transparent, easily verified way. And because the DNC would just be sending Bitcoin to itself, the process wouldn’t have cost it much of anything.

For example, the Dems could have agreed that a win for X in a precinct would entail sending Y mBTC (.001 of a Bitcoin).


Biden 1 mBTC
Buttigieg 2 mBTC
Klobuchar 3 mBTC
Sanders 4 mBTC
Warren 5 mBTC

And so forth. (And Bloomberg can buy his own Bitcoin.)

This year, the Dems are also promising to report raw vote counts from the first and second alignment rounds. Nobody seems to care, perhaps due to the delegate reporting snafu, but they could report those numbers in the same fashion by adding satoshi (millionths of a Bitcoin) to the candidate’s assigned mBTC.

Knowing that politicians could never do something so simple and transparent, the young prodigy who told me about the simple system described above, my 19-year-old son Alexander, drafted about 60 lines of Solidity code (the most popular of the magical words and squiggles that run Ethereum) that would have achieved the same result, and earned him, or some other programmer, a fee that would, knowing what transpired on Monday, look like a bargoooon today.

This hasn’t been tested, so it might be a little buggy, but it ain’t rocket science folks. It just looks like rocket science:

pragma solidity >=0.5.0 <0.6.0;
import "./ownable.sol";

contract PrecinctVoting is Ownable{
    event precinctCandidateReport(uint16 precinctId, uint8 candidateId);
    event precinctAdded(uint16 precinctId);
    event precinctRemoved(uint16 precinctId);
    event precinctValidated(uint16 precinctId);
    event candidateAdded(uint8 candidateId);
    event candidateRemoved(uint8 candidateId);
    event candidateValidated(uint8 candidateId);
    struct Precinct{
        string name;
        uint16 voteId;
        bool invalid;
    struct Candidate{
        string name;
        uint16 votes;
        bool invalid;
    Precinct[] public precincts;
    Candidate[] public candidates;
    uint8[] public candidateReporting;
    mapping (uint16 => address) precinctToOwner;
    function createPrecinct(string memory name, address owner) public onlyOwner{
        uint16 id = uint16(precincts.push(Precinct(name, 0, false)) - 1);
        precinctToOwner[id] = owner;
        emit precinctAdded(id);
    function createCandidate(string memory name) public onlyOwner{
        uint8 id = uint8(candidates.push(Candidate(name,0,false)) - 1);
        emit candidateAdded(id);
    function removePrecinct(uint16 id) public onlyOwner{
        precincts[id].invalid = true;
        emit precinctRemoved(id);
    function removeCandidate(uint8 id) public onlyOwner{
        candidates[id].invalid = true;
        emit candidateRemoved(id);
    function validatePrecinct(uint16 id) public onlyOwner{
        if(precincts[id].voteId > 0){
            candidates[candidateReporting[precincts[id].voteId]].votes --;
        precincts[id].invalid = false;
        emit precinctValidated(id);
    function validateCandidate(uint8 id) public onlyOwner{
        candidates[id].invalid = false;
        emit candidateValidated(id);
    function precinctReport(uint16 precinctId, uint8 candidateId) public{
        require(precinctToOwner[precinctId] == msg.sender);
        require(precincts[precinctId].invalid == false);
        require(candidates[candidateId].invalid == false);
        precincts[precinctId].voteId = uint16(candidateReporting.push(candidateId));
        candidates[candidateId].votes ++;
        precincts[precinctId].invalid = true;
        emit precinctCandidateReport(precinctId, candidateId);
    function viewResults(uint id) external view returns(uint8){

He told me he could have written the program in fewer lines, but didn’t have time to. (Actually, the incentive to.)

In the United States, about 3.5 million people work as software developers, some 30,000 in Iowa alone. Not all code in Solidity or other blockchain languages but this stuff is far from esoteric at this point.

So why the snafu?

I was struck by a line in a recent review of a history book written by somebody regularly counted as a major historian. As the reviewer pointed out, the book in question is riddled with basic factual errors, including the claim that Virginia was a BORDER state during the Civil War (i.e., a slave state that remained in the Union!), and a long list of other guffaws. And don’t get me started on the home state of this year’s Super Bowl victors. C’mon people, I know it is flyover country but you’ve seriously never heard of KCMO (Kay See Moe)? What do you think the MO stands for? More?

Anyway, the line is: “Those who claim the right to run society are not nearly as knowledgeable or as skilled as they presume.”

The world is a big, scary, complex place, too complex for any one of us to grasp, let alone control. That is why nobody should presume to be able to control it and all of the candidates in both parties, with a partial pass for Bill Weld, deserve the caucus results initially reported:

Robert E. Wright

Robert E. Wright

Robert E. Wright is the (co)author or (co)editor of over two dozen major books, book series, and edited collections, including AIER’s The Best of Thomas Paine (2021) and Financial Exclusion (2019). He has also (co)authored numerous articles for important journals, including the American Economic ReviewBusiness History ReviewIndependent ReviewJournal of Private EnterpriseReview of Finance, and Southern Economic Review. Robert has taught business, economics, and policy courses at Augustana University, NYU’s Stern School of Business, Temple University, the University of Virginia, and elsewhere since taking his Ph.D. in History from SUNY Buffalo in 1997. Robert E. Wright was formerly a Senior Research Faculty at the American Institute for Economic Research.

Find Robert

  1. SSRN: https://papers.ssrn.com/sol3/cf_dev/AbsByAuth.cfm?per_id=362640
  2. ORCID: https://orcid.org/0000-0003-3792-3506
  3. Academia: https://robertwright.academia.edu/
  4. Google: https://scholar.google.com/citations?user=D9Qsx6QAAAAJ&hl=en&oi=sra
  5. Twitter, Gettr, and Parler: @robertewright

Get notified of new articles from Robert E. Wright and AIER.