DEV Community

PULSE Protocol
PULSE Protocol

Posted on

What If Your Banking App Could Run a Referendum?

Your bank already knows who you are.

Biometrics, KYC, multi-factor auth — banks spent decades and billions on identity verification. Yet on election day we hand out paper ballots and hope for the best.

Here's what a semantic voting protocol on top of existing banking infrastructure could look like — and why PULSE Protocol is the missing piece.

The architecture

Citizen → Banking App (already authenticated)
  → PULSE message: ACT.VOTE + encrypted ballot
  → Cryptographic signature (bank proves identity without revealing vote)
  → Tallying Center
  → PULSE ACK with receipt_id
  → Public audit log
Enter fullscreen mode Exit fullscreen mode

Three guarantees that matter:

Anonymity — the bank knows who voted but not how. The tallying center knows how but not who. Cryptographic separation at the protocol level.

Non-duplication — every PULSE envelope carries a unique nonce. Replay attacks are caught automatically. One citizen, one vote, provably.

Verifiability — each voter gets a receipt_id. Anyone can verify their vote was counted in the public audit log without exposing how they voted.

What a PULSE vote message looks like

{
  "envelope": {
    "version": "1.0",
    "message_id": "uuid-here",
    "timestamp": "2026-03-22T09:00:00Z",
    "nonce": "random-unique-string",
    "sender": "bank-node-kz-001",
    "signature": "hmac-sha256-of-payload"
  },
  "type": "REQUEST",
  "content": {
    "action": "ACT.VOTE",
    "object": "ENT.BALLOT",
    "parameters": {
      "election_id": "referendum_2026_03",
      "candidate_hash": "sha256-of-choice",
      "voter_receipt": "public-receipt-id"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

The candidate_hash is a one-way hash — the tallying center can count it without knowing the raw value until polls close. The voter_receipt is derived from the voter's identity but reveals nothing about them.

Why semantic protocol, not just encryption

Encryption solves confidentiality. It doesn't solve interoperability.

A voting system involves banks, government tallying centers, audit observers, and potentially multiple vendors across different infrastructure. Every party needs to read, verify, and process the same message.

Without a shared semantic standard, you end up with custom integrations between every pair of systems. That's how you get bugs, gaps, and the kind of "technical errors" that nobody can explain afterward.

ACT.VOTE is unambiguous. ENT.BALLOT is unambiguous. The protocol defines what every field means — not the vendor, not the government IT department.

The realistic use case today: corporate governance

Governments won't adopt new election infrastructure overnight. That's fine.

Corporate shareholder voting is a different story.

Millions of retail investors hold shares through their brokers. Most never vote on shareholder resolutions — not because they don't care, but because the process is broken. Separate apps, paper mailings, proxy services that charge fees.

The broker already has the identity. The broker already has the share count. The missing piece is a standard protocol for casting and tallying votes that any broker can implement without custom integration.

from pulse_vote import VoteMessage, TallyingClient

# Cast a shareholder vote
vote = VoteMessage(
    election_id="shareholder_agm_2026",
    candidate_hash=hash_choice("approve_merger"),
    weight=shares_held  # weighted by shareholding
)

client = TallyingClient(endpoint="https://tallying.exchange.com")
receipt = client.cast(vote, signed_by=bank_node)

print(f"Vote cast. Receipt: {receipt.id}")
# Citizen can verify later: client.verify(receipt.id)
Enter fullscreen mode Exit fullscreen mode

Security properties from PULSE

PULSE Protocol already implements what you need:

  • HMAC-SHA256 signatures on every message — tampering is detectable
  • Nonce + timestamp validation — 5-minute replay window, duplicate nonces rejected
  • Audit log — every message logged with tamper-proof trail
  • Semantic validation — malformed vote messages rejected before they reach the tallying center

None of this is new cryptography. It's applying existing, proven security patterns through a standard semantic layer.

What's missing

pulse-vote doesn't exist yet as a package.

The protocol layer is there. The security model is there. What's needed is:

  • ACT.VOTE and ENT.BALLOT concepts added to the vocabulary
  • A TallyingServer implementation with anonymization
  • A reference BankingAdapter showing how a bank node signs and submits votes
  • A public audit log interface

If you're working in civic tech, fintech, or digital governance — this is an open problem with an open-source foundation ready to build on.

PULSE Protocol: github.com/pulseprotocolorg-cyber/pulse-python

The cryptography for honest elections exists. The semantic standard to connect the pieces doesn't — yet.

Top comments (0)