Ledger Active Encrypted 4/4 Nodes Synced

Technical Architecture Visualizer

The Journey of
Every Vote

Watch how a single democratic decision is encrypted, validated, and permanently etched into an immutable blockchain — from biometric capture to tamper-proof ledger.

B#1881
B#1882
B#1883
NEW

The 5-Node Vote Pipeline

Click any node to explore — or press Begin Journey to animate automatically

BiometricEncryptValidateLedgerAudit
VOTE
01
T

Biometric
Verification

Face landmarks captured, PII discarded — cryptographic Voter Token issued

Waiting
JWT + Token
02

E2EE
Encryption

RSA/AES hybrid encrypts the ballot before it leaves the browser — no one can intercept

Waiting
Ciphertext
03

ZKP &
Fraud Gate

Zero-Knowledge Proof confirms eligibility without revealing identity. Double-vote blocked.

Waiting
Valid TX
04
#1883 HASH:a3f9... PREV:7c2b...

Hyperledger
Fabric Ledger

Consensus among peers locks the block. Immutable. Hash-linked to previous block.

Waiting
Committed
05

Decentralized
Audit & Tally

Anyone can verify totals against ledger entries. Anonymity preserved via ZKP proofs.

Waiting

Immutable Chain of Blocks

Each block cryptographically links to the previous — tampering any block breaks the entire chain

#1880
a3f9c2d1
prev: 7c2b…
42 votes
✓ Confirmed
#1881
e7d3a1f0
prev: a3f9…
38 votes
✓ Confirmed
#1882
b2c89e4f
prev: e7d3…
55 votes
✓ Confirmed
#1883
????????
prev: b2c8…
0 votes
⏳ Forming…

Double-Vote Prevention

The chaincode maintains a VoterRegistry in the state database. Before appending any ballot, it queries this registry using the Voter Token as a key.

1 Voter Token arrives at chaincode
2 Query: getState(voterToken)
? Token exists in ledger?
NO
Vote committed + Token recorded
YES
TX rejected — "VOTER_ALREADY_VOTED"
chaincode > ballot.ts
// Awaiting transaction...
async castVote(ctx, voterId, candidateId) {
  // Step 1: Check voter registry
  const existing = await ctx.stub
    .getState(voterId);
  
  if (existing && existing.length > 0) {
    throw new Error(
      'VOTER_ALREADY_VOTED'
    );
  }
  
  // Step 2: Record on ledger
  await ctx.stub.putState(
    voterId,
    Buffer.from('VOTED')
  );
}