| Voter | Authority | Sealer |
|---|---|---|
![]() |
![]() |
![]() |
The following must be installed on your machine in order to run the whole setup.
- Node 12+
- npm
- jq (see below)
- docker
- docker-compose
Install JQ (https://stedolan.github.io/jq/download/) to process JSON in the command-line:
# ubuntu
sudo apt-get install jq
# fedora
sudo dnf install jqThe pre-built docker images are hosted on Gitub Packages. Accessing the images is currently only possible when logged in to: docker.pkg.github.com.
You will need a Github personal access token with repo, package:read permission. Unlock this in your Github account.
Create a JSON file in the top-level folder (/github.json) which has the following structure, if it does not exist yet.
Insert your credentials and personal information in there.
{
"github": {
"user": "",
"token": ""
}
}To run a demo of the project with one voting authority and three sealers use the following command.
./docker-prebuilt-up.shVoting Authority Voting Authority Frontend on http://172.1.1.41:4001/
Access Provider (only backend) Access Provider on http://172.1.1.42:4002/
Sealers Sealer Frontend 1 on http://172.1.1.141:4011/ Sealer Frontend 2 on http://172.1.1.141:4012/ Sealer Frontend 3 on http://172.1.1.141:4013/
Voter Frontend Voter Frontend on http://172.1.1.30:3000/
Blockchain Explorer Blockchain Explorer on http://127.0.0.1:6001/
Once the demo is finished, everything can be shutdown with the following command:
./docker-prebuilt-down.shnpm run lerna:install to link packages in order for the husky hook to work
see #30 for more details
Each subproject is configured to set and wire the PORTS automatically for every service that this subproject needs. For example: with sealer/docker-start.sh, the needed environment variables are fetched from system.json and written to .env files. These .env files are then used in docker-compose.yml.
For both modes, the identity provider needs to be initialized after the containers are started. Every voter needs to have an eIdentity (username, password, and uuid v4; e.g., generated with https://www.uuidgenerator.net/). The eIdentities need to be added to identity-provider-backend/src/database/identities in the following format: uuidv4:username:password. By default, three voters are provided.
To initialize the identity provider, send the uuid of every eIdentity that is eligible to vote using the following command:
# request
curl -X POST \
http://localhost:4003/registerVoters \
-H 'Content-Type: application/json' \
-d '{
"voters": [
"9980280d-32d1-41e9-8959-7c483e43256b",
"afd948fe-7b48-421b-accb-389619f8456c",
"5342b7e8-3f8e-4520-ac4e-e0b54f1d1ead"
]
}'
# response
{"success":true,"msg":"Successfully registered voters!","alreadyRegistered":0,"newlyRegistered":3}Use ./docker-up.sh and ./docker-down.sh to start/stop all docker containers. This includes:
- one voting authority backend
- one voting authority frontend
- one identity provider backend
- one access provider backend
- three sealer/parity nodes
To use a production optimized mode, use ./docker-prod-up.sh to start all docker containers. This includes the same setup as in the development mode.
Mode=Development (localhost)
The frontend is not dockerized and will always be served on localhost.
cd voter-frontend
npm run start:localhost
# frontend will run on localhost:3000Mode=Development (localhost)
In development mode, the frontend and backend will run on localhost for a better DX.
cd voting-authority/backend
npm run serve:localhost
# backend will run on localhost:4001cd voting-authority/frontend
npm run start:localhost
# frontend will run on localhost:3001Mode=Docker (docker)
In docker mode, the frontend and backend will run in docker-containers in the network (172.1.1.0/24) e-voting. This network is automatically created in the run scripts if it does not exist yet.
docker network ls
NETWORK ID NAME DRIVER SCOPE
019cded65b2a e-voting bridge localcd voting-authority
./docker-start.sh
# backend will run on 172.1.1.41:4001
# frontend will run on 172.1.1.31:4001Mode=Development (localhost)
In development mode, the backend will run on localhost for a better DX.
cd access-provider-backend/
npm run serve:localhost
# backend will run on localhost:4002Mode=Docker (docker)
In docker mode, the backend will run on 172.1.1.42:4002.
cd access-provider-backend/
./docker-start.shMode=Development (localhost)
In development mode, the backend will run on localhost for a better DX.
cd identity-provider-backend/
npm run serve:localhost
# backend will run on localhost:4003Mode=Docker (docker)
In docker mode, the backend will run on 172.1.1.43:4003.
cd identity-provider-backend/
./docker-start.shMode=Development (localhost)
In development mode, the frontend and backend will run on localhost for a better DX.
cd sealer/backend
npm run serve:localhost
# backend will run on localhost:4011cd sealer/frontend
npm run start:localhost
# frontend will run on localhost:3011Mode=Docker (docker)
In docker mode, the frontend and backend will run in docker-containers in the network (172.1.1.0/24) e-voting. The frontends will run on 172.1.1.13[1-3]:301[1-3]. The backends will run on 172.1.1.14[1-3]:401[1-3].
cd sealer
./docker-start.sh <sealerNr>
# example
./docker-start.sh 1 # will create backend and frontend for sealer 1Always runs dockerized ... so there is no distinction between development and production mode.
Start 3 sealer nodes directly
cd poa-blockchain/scripts
./dev-chain-parity-nodes.shall this script does, is call the following 3 times:
sealer/docker-start.sh <sealerNr>the only thing that is different to starting all sealers on their own, is that ./dev-chain-parity-nodes.sh will also connect the nodes for you directly.
Project: contracts/
npm run compile # compile contracts
npm run test # run tests in /testThe contracts are inside contracts/contracts. There, we can test them isolated with the truffle framework. With npm run compile all contracts will be compiled and a JSON representation of the contract will be put inside contracts/compiled (e.g., Ballot.json).
These JSON objects contain important information to interface with the contract once it is deployed on a chain.
The compiled contract JSON files will be automatically put into the folders that need them.
More details in contracts/
chmod +x ./docker-start.sh
./docker-start.shmore details in: ethstats/
- Moritz Eck - meck93
- Alex Scheitlin - alexscheitlin
- Nik Zaugg - nikzaugg
This project is licensed under the MIT License.


