Skip to content
Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Node.js CI


Anonymous Electronic Voting System on Public Blockchains

Hääl means voice in Estonian. Voice means power of people.

This code is a proof-of-concept of the protocol presented on the whitepaper located at the root folder. It describes a full process for an e-voting system, using public blockchains and without a mixnet or an oracle for tallying the votes.

The full protocol makes use of:

  • Zero-knowledge proofs (with zk-snarks verified on-chain)
  • Homomorphic encryption (Paillier protocol + zk)
  • Stealth addresses (as proposed by Peter Todd, but ported to ethereum)
  • Encrypted notes (e.g Zcash, AZTEC)
  • Cryptography challenges (based on Sigma protocol)
  • Digital signatures
  • Ethereum (or another blockchain capable of running dApps)
  • other technologies described on the whitepaper

Working in progress. No access control layers implemented in this PoC to avoid overhead, implement it as your needs. All contributions are welcome.



  • ganache-cli ^6.3.0 or Ganache ^1.2.2
  • Node 8
  • Solidity ^0.4.5
  • Yarn ^1.13.0


# yarn install && yarn truffle build && yarn ganache-cli


(on a new terminal)
# yarn truffle test

Manual installation (for debugging purposes)

Install and set the correct version of NodeJS.

$ apt-get install node npm
$ curl -o- | bash 
$ nvm install 8
$ nvm use 8

Download third-party dependencies.

$ curl -o /usr/bin/solc -fL
$ chmod u+x /usr/bin/solc

$ chmod +x ganache-1.2.2-x86_64.AppImage


$ npm install -Wno-cast-function-type 2> debug.log
$ node ./node_modules/truffle/build/cli.bundled.js build
$ ./ganache-1.2.2-x86_64.AppImage (on a new terminal)
$ node ./node_modules/truffle/build/cli.bundled.js test

Compiler warnings

Is expected to receive the warning below during contracts compilation:

haal/contracts/HAAL/haal.sol:2:1: Warning: Experimental features are turned on. Do not use experimental features on live deployments.
pragma experimental ABIEncoderV2;

That message appears because we're using an experimental method to fill arrays (bytes[]):

function addVote(
        bytes[] _president, 
        bytes[] _senator, 
        bytes[] _stateGovernor,

function getVotes(uint _index) view public returns(bytes[], bytes[], bytes[])

Apache License