manastole03/Blockchain-based-e-voting-system

GitHub: manastole03/Blockchain-based-e-voting-system

基于 Hyperledger Fabric 的电子投票平台,通过智能合约驱动选举生命周期管理,实现透明、可审计且防篡改的投票流程。

Stars: 1 | Forks: 2

# 基于区块链的电子投票系统 一个安全、透明且可审计的电子投票平台,结合了**生产级自定义区块链后端** (Node.js + TypeScript + PostgreSQL) 与用于许可选举管理的 **Hyperledger Fabric 智能合约架构**。 本项目通过从高层概念框架转向结构更清晰的、由智能合约和 REST API 驱动的架构,增强了选举控制、投票完整性、可审计性和部署就绪性,从而扩展了先前基于区块链投票的研究工作。 ## 目录 1. [研究基础](#1-research-foundation) 2. [项目描述](#2-project-description) 3. [高级版本的改进](#3-what-is-improved-in-this-advanced-version) 4. [目标](#4-objectives) 5. [主要特性](#5-key-features) 6. [技术栈](#6-tech-stack) 7. [项目结构](#7-project-structure) 8. [高级架构](#8-high-level-architecture) 9. [快速开始 — 自定义区块链后端](#9-quick-start--custom-blockchain-backend) 10. [Docker](#10-docker) 11. [配置](#11-configuration) 12. [API 参考](#12-api-reference) 13. [区块链实现](#13-blockchain-implementation) 14. [共识算法](#14-consensus-algorithms) 15. [数据库](#15-database) 16. [测试](#16-tests) 17. [Hyperledger Fabric 链码](#17-hyperledger-fabric-chaincode) 18. [部署](#18-deployment) 19. [项目截图](#19-project-screenshots) ## 1. 研究基础 本代码库基于以下研究工作: - **论文:** *Hyperledger-Based Blockchain Technology for Data Security in E-Voting Systems* - **摘要 / 初始项目名称:** *A Framework to Make Voting System Using Blockchain Technology* 该研究提出基于区块链的投票,是因为区块链提供了: - 去中心化 - 不可篡改性 - 透明性 - 可审计性 - 安全的数字交易 该论文提议使用 **Hyperledger Fabric**,因为它具有许可架构、访问控制支持、组织、节点、通道以及基于链码的执行模型。它还进一步通过使用 **Next.js**、**Node.js**、Fabric SDK 以及云平台上的容器化托管,将该系统映射到 Web 架构。 ## 2. 项目描述 传统投票系统和许多电子投票的实施面临着重大挑战,例如: - 篡改风险 - 缺乏透明度 - 可审计性弱 - 集中控制 - 选举设置和计票期间的操作复杂性 - 选民之间的信任赤字 现有项目是一个 **Next.js + TypeScript** 应用。本后端保留了相同的 Node/TypeScript 技术栈,并增加了: - 带有 PostgreSQL 持久化的专用 Express REST API - 具有可插拔共识的模块化区块链服务 - Docker 支持和结构化的测试 Hyperledger Fabric 层引入了由智能合约驱动的架构,具有以下特点: - 显式的**选举生命周期管理** - 更严格的**一人一票强制执行** - **代币化选票发放** - 结构化的**链码接口** - 改进的**审计事件和结果最终确定** - 更好的跨组件职责分离 - 具备部署就绪能力的项目结构 ## 3. 此高级版本中的改进 与原始概念模型相比,本代码库引入了以下改进: ### 3.1 显式选举阶段 - 注册 - 候选人审批 - 投票开启 - 投票关闭 - 计票最终确定 ### 3.2 一人一票强制执行 - 每位选民都有一个经过验证的身份记录。 - 每位选民在一次特定的选举中只能投出一票。 ### 3.3 隐私感知的选票存储 - 系统不再直接存储明文投票选择,而是在链上存储一个**选票承诺哈希**。 - 这在保持可审计性的同时,减少了敏感投票信息的暴露。 ### 3.4 可审计的结果最终确定 - 所有状态转换和主要投票动作都会被记录在账本中。 - 最终计票可以根据已提交的投票事件进行独立验证。 ### 3.5 更清晰的智能合约结构 - 为选举创建、选民登记、候选人登记、投票、计票和查询操作提供独立的函数。 ### 3.6 选举生命周期状态机 - 草案 - 注册开启 - 投票开启 - 投票关闭 - 结果最终确定 ### 3.7 显式智能合约接口 - 更清晰的签名 - 更易于测试 - 更明确的标准对齐 ### 3.8 投票完整性控制 - 每位选民限投一票的限制 - 不可篡改的链上交易日志 - 特定选举的投票验证 ### 3.9 可审计性 - 关键操作的事件触发 - 透明的选举结束和结果发布 ### 3.10 未来的隐私增强 - 投票承诺哈希 - 可选的匿名凭证支持 - 未来版本中可选的零知识或承诺-揭示(commit-reveal)设计 ## 4. 目标 本项目的主要目标是构建一个基于区块链的投票系统,该系统: - **安全** — 投票在提交后无法被更改 - **透明** — 流程可验证且可审计 - **隐私** — 保护选民身份和投票秘密 - **可追溯** — 可检查授权的审计事件 - **可扩展** — 适用于机构级或部门级选举 - **可延伸** — 可以改进为生产级选举平台 ## 5. 主要特性 ### 5.1 当前 / 计划特性 - 选民登记和资格验证 - 候选人登记 - 选举创建和调度 - 向合格选民发放选票/代币 - 一次性投票 - 防止双重投票 - 由区块链支持的不可篡改投票记录 - 选举状态跟踪 - 投票计票和结果最终确定 - 审计日志生成 - 通过 Hyperledger Fabric 身份进行许可访问 - 用于前端集成的 REST API 中间件 - 使用 Docker 的容器化部署 ### 5.2 自定义区块链后端特性 - 在 `secp256k1` 上进行 ECDSA 签名的交易 - 可插拔共识:工作量证明、权益证明、PBFT - 带有挂起交易管理的内存池 - 每个区块的 Merkle 根计算 - 链验证(哈希、签名、前一个哈希链接、共识规则) - 从 `sha256(publicKey)` 派生的钱包地址 - 结构化的 Pino 日志记录、Helmet、CORS 和速率限制 ## 6. 技术栈 ### 自定义区块链后端 - Node.js + TypeScript - Express REST API - PostgreSQL 数据库 - 在 `secp256k1` 上的原生 Node `crypto` ECDSA 签名 - Zod 请求验证 - Pino 结构化日志 - Helmet、CORS 和速率限制 - Vitest + Supertest - Docker + Docker Compose ### Hyperledger Fabric 层 - Hyperledger Fabric(许可区块链) - JavaScript / Node.js 链码 - Fabric SDK (Node.js) - Next.js 前端 - Docker + Docker Compose ## 7. 项目结构 ### 7.1 自定义区块链后端 ``` src/ app.ts Express app composition server.ts API server entrypoint config/ environment, logger, database pool controllers/ HTTP request handlers database/ migration runner middleware/ validation, rate limit, error handling models/ blockchain domain types repositories/ Postgres and in-memory data adapters routes/ REST route definitions and schemas services/ blockchain, wallet, tx, node, validator logic services/consensus/ PoW, PoS, PBFT consensus adapters utils/ hashing, signing, Merkle root helpers database/schema.sql database schema and indexes tests/ unit and integration tests ``` ### 7.2 Hyperledger Fabric 层 ``` hyperledger-evoting-advanced-starter/ ├── README.md ├── github_repository_link.txt ├── .gitignore ├── docs/ │ ├── architecture.md │ ├── algorithm_advancements.md │ └── rubric_mapping.md └── chaincode-javascript/ ├── package.json ├── index.js └── lib/ └── election-contract.js └── frontend/ ``` ## 8. 高级架构 ``` flowchart TD U[Voter / Election Officer / Auditor] --> F[Frontend - Next.js / Web App] F --> A[API Layer - Node.js / Express] A --> SDK[Hyperledger Fabric SDK] SDK --> CC[Chaincode / Smart Contract] CC --> L[(Ledger + World State)] subgraph Fabric Network O1[Org 1 - Election Authority] O2[Org 2 - Voter Organization] O3[Org 3 - Candidate Organization] O4[Org 4 - Auditor / Observer] end SDK --> O1 SDK --> O2 SDK --> O3 SDK --> O4 ``` ### 8.1 Fabric 组织和选举通道设计 下图代表了研究论文中提出的架构的面向部署的解析。选举主管机构管理选举,候选人节点被逻辑分组,选民节点属于不同的部门/组织,投票交易通过许可的 Fabric 通道和智能合约执行。 ``` flowchart TB subgraph EA[Org 1 - Election Authority] Admin[Admin Peer] CA[Certificate Authority] end subgraph CO[Org 2 - Candidate Organization] Cand1[Candidate Peer 1] Cand2[Candidate Peer 2] end subgraph VO1[Org 3 - Department 1 / Voter Org] V1[Voter Peer 1] end subgraph VO2[Org 4 - Department 2 / Voter Org] V2[Voter Peer 2] end subgraph VO3[Org 5 - Department 3 / Voter Org] V3[Voter Peer 3] end Orderer[Ordering Service] Contract[Election Smart Contract / Chaincode] Ledger[(Ledger + World State)] Admin --> Contract V1 --> Contract V2 --> Contract V3 --> Contract Cand1 --> Contract Cand2 --> Contract Contract --> Orderer Orderer --> Ledger V1 -. Private Election Channel .- Cand1 V2 -. Private Election Channel .- Cand1 V3 -. Private Election Channel .- Cand2 Admin -. Governance / Control Access .- CA ``` ## 9. 快速开始 — 自定义区块链后端 复制环境默认配置: ``` cp .env.example .env ``` 安装依赖项: ``` npm install ``` 启动 Postgres,应用模式,然后运行后端: ``` docker compose up -d postgres npm run db:migrate npm run backend:dev ``` API 运行在 `http://localhost:4000/api`。 ## 10. Docker 使用一条命令运行完整的后端和数据库: ``` docker compose up --build ``` 后端容器在启动 API 之前会应用 `database/schema.sql`。PostgreSQL 数据持久化在 `postgres_data` Docker 卷中。 ## 11. 配置 重要的环境变量: ``` PORT=4000 DATABASE_URL=postgres://evoting:evoting_password@localhost:5432/evoting CONSENSUS_ALGORITHM=pow POW_DIFFICULTY=3 MINING_REWARD=10 MAX_TRANSACTIONS_PER_BLOCK=100 ``` 通过将 `CONSENSUS_ALGORITHM` 设置为 `pow`、`pos` 或 `pbft` 来切换共识。 ## 12. API 参考 所有响应使用: ``` { "success": true, "data": {} } ``` 错误使用: ``` { "success": false, "error": { "code": "ERROR_CODE", "message": "..." } } ``` ### 健康检查 ``` curl http://localhost:4000/api/health ``` ### 创建钱包 ``` curl -X POST http://localhost:4000/api/wallets \ -H "Content-Type: application/json" \ -d '{ "label": "voter-1" }' ``` 私钥仅返回一次。将其在客户端存储;服务器仅保留公钥和地址。 ### 获取钱包余额 ``` curl http://localhost:4000/api/wallets/0xabc123.../balance ``` ### 签名交易 ``` curl -X POST http://localhost:4000/api/transactions/sign \ -H "Content-Type: application/json" \ -d '{ "type": "VOTE", "fromAddress": "0xabc123...", "amount": 0, "payload": { "electionId": "student-council", "candidateId": "candidate-1" }, "privateKey": "-----BEGIN PRIVATE KEY-----..." }' ``` ### 创建交易 使用签名响应中的 `signingPayload`、`signature` 和 `publicKey`: ``` curl -X POST http://localhost:4000/api/transactions \ -H "Content-Type: application/json" \ -d '{ "type": "VOTE", "fromAddress": "0xabc123...", "toAddress": null, "amount": 0, "payload": { "electionId": "student-council", "candidateId": "candidate-1" }, "nonce": 1710000000000, "timestamp": "2026-04-27T12:00:00.000Z", "signature": "base64-signature", "publicKey": "-----BEGIN PUBLIC KEY-----..." }' ``` ### 验证交易 ``` curl -X POST http://localhost:4000/api/transactions/validate \ -H "Content-Type: application/json" \ -d '{ "hash": "64-char-transaction-hash" }' ``` ### 挂起交易 ``` curl http://localhost:4000/api/transactions/pending ``` ### 挖矿或创建区块 ``` curl -X POST http://localhost:4000/api/blocks/mine \ -H "Content-Type: application/json" \ -d '{ "minerAddress": "0xabc123..." }' ``` ### 查看区块链 ``` curl http://localhost:4000/api/blockchain ``` ### 按高度或哈希查看区块 ``` curl http://localhost:4000/api/blocks/1 curl http://localhost:4000/api/blocks/000abc... ``` ### 验证区块链 ``` curl http://localhost:4000/api/blockchain/validate ``` ### 注册节点 ``` curl -X POST http://localhost:4000/api/nodes \ -H "Content-Type: application/json" \ -d '{ "url": "http://node-2:4000", "metadata": { "region": "us-west" } }' ``` ### 注册验证者 权益证明 和 PBFT 必需: ``` curl -X POST http://localhost:4000/api/validators \ -H "Content-Type: application/json" \ -d '{ "address": "0xabc123...", "publicKey": "-----BEGIN PUBLIC KEY-----...", "stake": 100, "nodeUrl": "http://node-1:4000" }' ``` ## 13. 区块链实现 - 区块存储高度、前一个哈希、时间戳、Merkle 根、随机数、难度、共识类型、验证者、元数据和交易。 - 交易是经过 ECDSA 签名的载荷。交易哈希根据规范的 JSON 载荷计算得出。 - 钱包地址从 `sha256(publicKey)` 派生,并仅与公钥一起存储。 - 投票交易需要 `payload.electionId` 和 `payload.candidateId`。 - 挂起交易作为状态为 `PENDING` 的数据库行存储在内存池中。 - 挖矿验证挂起交易,拒绝无效交易,添加可选的奖励交易,计算 Merkle 根,并持久化已确认的区块。 - 链验证重新计算区块哈希、Merkle 根、交易哈希、签名、前一个哈希链接和共识规则。 ## 14. 共识算法 ### 工作量证明 根据 `POW_DIFFICULTY` 挖出带有前导零的区块哈希。 ### 权益证明 根据权益权重从活跃验证者中选择,并验证区块验证者。 ### PBFT 为本地验证者集建立模型,进行准备/提交仲裁持久化。它需要至少四个活跃验证者,并存储共识事件以供审计。接口被隔离,以便真实的网络传输可以替代本地适配器。 ## 15. 数据库 `database/schema.sql` 创建以下表: - `wallets` - `transactions` - `blocks` - `validators` - `network_nodes` - `consensus_events` 包含用于区块查找、挂起交易读取、钱包余额查询、验证者选择和共识事件查找的索引。 ## 16. 测试 ``` npm test ``` 覆盖范围包括: - 交易签名和验证 - 区块创建 - 链验证 - PoW 挖矿 - PoS 验证 - PBFT 仲裁行为 - 通过 REST API 的集成流程 ## 17. Hyperledger Fabric 链码 ### 17.1 设置 #### 必需软件 - Node.js 18+ - npm 9+ - Docker - Docker Compose (或 Docker Desktop) - Hyperledger Fabric 测试网络或 Fabric 部署环境 #### 可选但推荐 - Git - VS Code - Postman / Bruno,用于 API 测试 - Fabric CA 设置,用于基于证书的身份签发 #### 链码设置 ``` cd chaincode-javascript npm install ``` ### 17.2 智能合约概述 智能合约定义了一个名为 `ElectionContract` 的 Fabric 链码组件。 #### 主要接口 / 签名 | 函数 | 描述 | |---|---| | `InitLedger(ctx)` | 引导账本 | | `CreateElection(ctx, electionId, title, startTime, endTime, adminId)` | 创建新选举 | | `RegisterVoter(ctx, electionId, voterId, voterNameHash, department, eligibilityHash)` | 注册合格选民 | | `RegisterCandidate(ctx, electionId, candidateId, candidateName, partyName)` | 注册候选人 | | `OpenVoting(ctx, electionId)` | 将选举转为投票开启状态 | | `CastVote(ctx, electionId, voterId, candidateId, ballotCommitment)` | 投票(每人限投一次) | | `CloseVoting(ctx, electionId)` | 关闭投票阶段 | | `FinalizeTally(ctx, electionId)` | 计算并发布最终结果 | | `GetElection(ctx, electionId)` | 查询选举详情 | | `GetCandidate(ctx, election, candidateId)` | 查询候选人详情 | | `GetVoter(ctx, electionId, voterId)` | 查询选民记录 | | `GetResults(ctx, electionId)` | 查询最终结果 | | `GetElectionAuditTrail(ctx, electionId)` | 查询完整审计轨迹 | ## 18. 部署 ### 18.1 本地草案使用 本代码库包含 Hyperledger 链码的**入门草案**以及生产级 Express 后端。您可以通过三个步骤使用链码层: 1. 查看 `chaincode-javascript/lib/election-contract.js` 中的智能合约草案 2. 针对您的机构或选举模型定制账本模式和验证规则 3. 将链码部署到 Hyperledger Fabric 测试网络 ### 18.2 典型部署流程 1. 启动 Hyperledger Fabric 网络 2. 打包并安装 JavaScript 链码 3. 批准并提交链码定义 4. 使用 Fabric SDK、CLI 或中间件 API 调用链码方法 5. 在 Next.js / React 中构建 Web 应用,并通过 Node.js 后端连接 ### 18.3 未来部署架构示例 | 层 | 技术 | |---|---| | 前端 | Next.js / React 门户,用于管理员、选民和候选人仪表板 | | 后端 / API | Node.js / Express / Fabric SDK | | 区块链 | Hyperledger Fabric peers, orderers, CAs | | 存储 | 账本状态 + 可选的加密链下元数据存储 | | 基础设施 | AWS / GCP / 本地服务器集群上的 Docker 化服务 | ## 19. 项目截图 ![截图 1](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/db68ce2b41162212.png) ![截图 2](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/0058750ade162215.png) ![截图 3](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/fa62b261da162218.png) ![截图 4](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/4a606de6d6162220.png) ![截图 5](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/c4e4848bf1162223.png) ![截图 6](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/e4bb3d6388162226.png) ![截图 7](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/5c1cc41fcd162228.png) ![截图 8](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/ed71255cf1162231.png) ![截图 9](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/d011ac1d5d162233.png) ![截图 10](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/e1a8cb708e162236.png)
标签:CISA项目, Docker, GNU通用公共许可证, Hyperledger Fabric, MITM代理, Node.js, PostgreSQL, REST API, TypeScript, 共识算法, 区块链, 去中心化, 可审计性, 后端开发, 学术研究, 安全插件, 安全防御评估, 智能合约, 测试用例, 电子投票, 联盟链, 请求拦截, 选举系统, 透明度, 链码, 防篡改