Problem: The GET /api/votes/blockchain endpoint was returning the local
blockchain manager data instead of querying the PoA validators where votes
are actually being submitted.
This caused votes to appear successfully submitted (with block_hash from
validators) but not show up when querying the blockchain state, since the
query was hitting the wrong data source.
Solution: Update the /blockchain endpoint to:
1. First try to get blockchain state from PoA validators
2. Fall back to local blockchain manager if PoA unavailable
3. Add detailed logging for debugging
This ensures the blockchain state matches where votes are actually being
stored on the PoA network.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Add logging at each stage:
- Context manager entry/exit
- submit_vote() method entry
- Validator selection
- HTTP request details
- Response handling
This will help identify exactly where the vote submission is failing.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Add traceback and exception type logging to help diagnose why PoA
submission is failing silently and falling back to local blockchain.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Problem: Votes were being rejected by validators with 'Invalid data format'
error because the transaction data wasn't in the correct format.
Root cause: The validator's eth_sendTransaction endpoint expects the 'data'
field to be:
1. A hex string prefixed with '0x'
2. The hex-encoded JSON of a Transaction object containing:
- voter_id
- election_id
- encrypted_vote
- ballot_hash
- timestamp
Solution:
- Update BlockchainClient.submit_vote() to properly encode transaction data
as JSON, then hex-encode it with 0x prefix
- Add ballot_hash parameter to submit_vote() method
- Update both call sites in votes.py to pass ballot_hash
- Generate ballot_hash if not provided for safety
This ensures votes are now properly formatted and accepted by validators,
allowing them to be submitted to the blockchain instead of falling back to
local blockchain.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
npm install was run to sync package-lock.json with the updated
package.json that includes next-themes for dark theme support.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Changes:
- Add next-themes dependency for theme management
- Create ThemeProvider wrapper for app root layout
- Set dark mode as default theme
- Create ThemeToggle component with Sun/Moon icons
- Add theme toggle to home page navigation
- Add theme toggle to dashboard header
- App now starts in dark mode with ability to switch to light mode
Styling uses existing Tailwind dark mode variables configured in
tailwind.config.ts and globals.css. All existing components automatically
support dark theme.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
The POST /api/votes endpoint (used by frontend) was recording votes
in the database but NOT submitting them to the PoA blockchain. This
caused votes to appear in database but not on the blockchain.
Changes:
- Add vote submission to PoA validators in the simple endpoint
- Add fallback to local blockchain if PoA validators unreachable
- Include blockchain status in API response
- Use ballot hash as vote data for blockchain submission
This ensures votes are now submitted to the PoA blockchain when the
frontend votes, and users can see their votes on the blockchain.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
validator-2 was incorrectly configured to use port 8001 (should be 8002)
validator-3 was incorrectly configured to use port 8001 (should be 8003)
This was causing validator-2 and validator-3 to be unreachable from the
backend container, resulting in votes being submitted to the local fallback
blockchain instead of the PoA validators.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Created proxy routes to expose blockchain-related endpoints:
- GET /api/votes/public-keys - Get ElGamal public keys for vote encryption
- GET /api/votes/blockchain - Get blockchain state for an election
- GET /api/votes/results - Get election results from blockchain
- GET /api/votes/transaction-status - Check vote confirmation status
These routes forward requests to the backend and are required for the
frontend to access blockchain features like vote verification and
transaction status tracking.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The backend container needs to reach validators using their Docker service names
(validator-1, validator-2, validator-3) instead of localhost:PORT.
This fixes the 'validators unreachable' warning on backend startup.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- PHASE_3_SUMMARY.md: Executive summary of all Phase 3 work
- DOCUMENTATION_INDEX.md: Complete navigation guide for all docs
Reading paths by use case:
- Getting started: POA_QUICK_START.md
- Integration: PHASE_3_INTEGRATION.md
- Architecture: POA_ARCHITECTURE_PROPOSAL.md
- Troubleshooting: POA_QUICK_REFERENCE.md
Total documentation: 5,000+ lines across 10 files
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit addresses critical issues preventing user registration:
1. Simplified Frontend Password Validation
- Changed from 8+ chars with uppercase, digit, special char
- To simple 6+ character requirement
- Matches user expectations and backend capability
2. Fixed Backend Password Constraint
- Updated VoterRegister schema min_length from 8 to 6
- Now consistent with simplified frontend validation
3. Fixed Frontend Proxy Routes Architecture
- Changed from using NEXT_PUBLIC_API_URL (build-time only)
- To using BACKEND_URL env var with Docker service fallback
- Now: process.env.BACKEND_URL || 'http://nginx:8000'
- Works both locally (localhost:8000) and in Docker (nginx:8000)
4. Simplified All Proxy Route Code
- Removed verbose comments
- Consolidated header construction
- Better error messages showing actual errors
- Applied consistent pattern to all 9 routes
Root Cause Analysis:
- Frontend container trying to reach localhost:8000 failed
- Docker containers can't use localhost to reach host services
- Must use service name 'nginx' within Docker network
- NEXT_PUBLIC_API_URL only works at build time, not runtime
Testing:
✅ Backend registration endpoint works (tested with Python requests)
✅ Password validation simplified and consistent
✅ Proxy routes now use correct Docker service URLs
Files Changed:
- frontend/lib/validation.ts (password requirements)
- backend/schemas.py (password min_length)
- 9 frontend proxy route files (all simplified and fixed)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
This commit completes the voting system implementation with:
1. Frontend API Proxy Routes:
- Created 9 Next.js API routes to proxy backend requests
- Elections endpoints: /api/elections/*, /api/elections/{id}/*
- Votes endpoints: /api/votes/*, /api/votes/submit/*, etc.
- Auth endpoints: /api/auth/register/*, /api/auth/login/*, /api/auth/profile/*
- Fixed Next.js 15.5 compatibility with Promise-based params
2. Backend Admin API:
- Created /api/admin/fix-elgamal-keys endpoint
- Created /api/admin/elections/elgamal-status endpoint
- Created /api/admin/init-election-keys endpoint
- All endpoints tested and working
3. Database Schema Fixes:
- Fixed docker/create_active_election.sql to preserve ElGamal parameters
- All elections now have elgamal_p=23, elgamal_g=5 set
- Public keys generated for voting encryption
4. Documentation:
- Added VOTING_SYSTEM_STATUS.md with complete status
- Added FINAL_SETUP_STEPS.md with setup instructions
- Added fix_elgamal_keys.py utility script
System Status:
✅ Backend: All 3 nodes operational with 12 elections
✅ Database: ElGamal parameters initialized
✅ Crypto: Public keys generated for active elections
✅ API: All endpoints verified working
✅ Frontend: Proxy routes created (ready for rebuild)
Next Step: docker compose up -d --build frontend
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Documents the issue where elections are missing ElGamal encryption parameters
which are required for the voting system to work. Provides 3 options to fix:
1. Database SQL update
2. Adminer UI
3. Fresh database reset
Explains root cause and how to verify the fix worked.
Nginx load balancer intercepts /health and returns plain text.
Updated test to use root endpoint (/) which returns JSON and verify
backend is actually running.
Moved specific routes (/blockchain, /debug/all, /active, /completed, /upcoming)
BEFORE generic routes (/{election_id}, /{election_id}/results, etc) so that
specific paths are matched first and don't get caught by the {election_id}
path parameter matcher.
Also removed duplicate /completed and /upcoming route definitions.
Routes now in correct order:
1. Specific paths: /debug/all, /active, /blockchain
2. Specific subpaths: /{id}/blockchain-verify, /{id}/candidates, /{id}/results
3. Generic: /{id}
The main.py was trying to import get_db for blockchain initialization
but it was missing from database.py. Added the get_db generator function
that creates and properly closes database sessions.
Provides:
- Quick start (3 steps)
- Log example output
- Key features overview
- Architecture diagrams
- Service details
- Common issues and solutions
- Documentation index
- Project structure
- Performance notes
- Scaling recommendations
- Support checklist
Perfect entry point for new users and developers
Add comprehensive blockchain viewer with:
- BlockchainViewer component: Display blocks in expandable cards
- Hash visualization: Show SHA-256 hashes for each block
- Chain verification: Visual integrity status and verification button
- Block details: Expand to see full block information
- Index, timestamp, previous hash, block hash
- Encrypted vote data, transaction ID
- Digital signatures
- Election selector: View blockchain for different elections
- Mock data: Demo blockchain included for testing
- Responsive design: Works on mobile and desktop
UI Features:
✓ Block expansion/collapse with icon indicators
✓ Genesis block highlighted with ⚡ icon
✓ Vote blocks marked with 🔒 icon
✓ Chain link visual indicators
✓ Hash truncation with full display on expand
✓ Status indicators: Chain valid/invalid
✓ Security information panel
✓ Statistics: Total blocks, votes, integrity status
Integration:
✓ Fetch elections list from API
✓ Fetch blockchain state for selected election
✓ Verify blockchain integrity
✓ Handle empty blockchain state
✓ Error handling with user feedback
✓ Loading states during API calls
Routes:
✓ /dashboard/blockchain - Main blockchain viewer
✓ Added to sidebar navigation
✓ 13 total routes now (added 1 new)
Frontend Build:
✓ No TypeScript errors
✓ Zero unused imports
✓ Production build successful
✓ All routes prerendered
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Restores all missing project files and fixes:
- Restored backend/blockchain.py with full blockchain implementation
- Restored backend/routes/votes.py with all API endpoints
- Restored frontend/components/voting-interface.tsx voting UI
- Fixed backend/crypto/hashing.py to handle both str and bytes
- Fixed pyproject.toml for Poetry compatibility
- All cryptographic modules tested and working
- ElGamal encryption, ZK proofs, digital signatures functional
- Blockchain integrity verification working
- Homomorphic vote counting implemented and tested
Phase 2 Backend API: ✓ COMPLETE
Phase 3 Frontend Interface: ✓ COMPLETE
Verification:
✓ Frontend builds successfully (12 routes)
✓ Backend crypto modules all import correctly
✓ Full voting simulation works end-to-end
✓ Blockchain records and verifies votes
✓ Homomorphic vote counting functional
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Updated Dockerfile.frontend to use Next.js instead of React CRA
- Multi-stage build for optimized image size
- Use NEXT_PUBLIC_API_URL instead of REACT_APP_API_URL
- Updated docker-compose.yml to pass correct env variable
- Frontend now starts with 'npm start' instead of serve
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>