This project aims to develop a digital electoral directory for the student elections conducted at Ruhr-University Bochum. It is important to note that the scope of this initiative does not encompass the creation of a standalone digital voting system. Rather, Campus Vote serves as a centralized voter registry system.
This shows the terminal gRPC client Evans that connects by authenticating with TLS certificates. CockRoachDB and Campus Vote running in the background. The video demonstrate the essential functions of campus vote:
- Creating Students / Voters: At setup time of the election the registry is filled with a list of students. Each entry (student) is stored AES256 GCM encrypted.
- Viewing Voters data and allow checking the student ID on real-world ballotbox.
- Register Votes and avoid double voting. The API will return a status code 3 (in the end, the GUI will show way more handy status messages / indicators).¹
- Counting statistics: In the end of the video, there is a giant JSON object that holds the number of counts for each ballotbox.²
¹ The status code 0 with message "no error" is shown when the student is listed in the registry, but doesn't had voted already
² For efficiency, gRPC represents zeros with no bytes. The GUI will show it in a more human-readable way. The number of total votes is three because I recored the video multiple times.
Drawing from the parliamentary procedures governing the organization of student elections at Ruhr-University Bochum and official documentation, several requirements must be met to achieve this goal.
- It must be ensured that every vote is recorded and that multiple voting is excluded.
- It must not be possible to draw any conclusions about the order in which eligible voters cast their votes from the registration of votes without knowing further information.
- The time at which votes are recorded should be generalized to at least the morning or afternoon of a day.
- The data must be consistent at all times when it can be accessed, and errors must be reliably identifiable. Data loss due to system crashes must be prevented.
The election is designed in a peer-to-peer design. Each ballotbox and the central election committee has a local database (based on CockRoachDB) that sync with each other node. The privilidges of ballotboxes and the election committee nodes differ in the way how they insert data.
flowchart LR
BB1(["BallotBox 1"])
BB2(["BallotBox 2"])
BB3(["BallotBox 3"])
BBN(["BallotBox N"])
EC{{"Election Committee"}}
BB1 <-.sync.-> BB2
BB1 <-.sync.-> EC
BB1 <-.sync.-> BB3
BB2 <-.sync.-> BBN
EC <-.sync.-> BBN
BB3 <-.sync.-> BBN
BB2 <-.sync.-> EC
EC <-.sync.-> BB3
Ballotboxes are the decentral points the voters insert there choice.
flowchart LR
subgraph BB["BallotBox"]
subgraph CR1["CockRoachDB"]
R{{"Voter Registry Table"}}
V{{"Voted Table"}}
end
API(["BallotBox API"])
GUI(["GUI"])
end
R -.read voter data.-> API
V -.check allready voted.-> API
API -.set voted status.-> V
API <--> GUI
flowchart LR
subgraph BB["Election Committee"]
subgraph CR1["CockRoachDB"]
R{{"Voter Registry Table"}}
V{{"Voted Table"}}
end
API(["Committee API"])
GUI(["GUI"])
end
R -.read voter data.-> API
API -.initially set.-> R
V -.check allready voted.-> API
API <--> GUI