基於區塊鏈的投票系統的代碼及前端頁面實現
本次報告將介紹基於區塊鏈的投票系統的實現過程,本系統的實現過程為:首先在總體設計及詳細設計的基礎上編寫智能合約,在本地搭建的以太坊私有鏈節點上部署我們的智能合約,並設計與投票系統交互的前端界面,通過以太坊提供的通過以太坊提供 Web3.js 庫的 JavaScript API 接口調用部署在區塊鏈上智能合約的相應方法,實現整個投票系統的流程。
1、系統運行流程及需求分析
1.1 系統運行流程

1.2 需求分析
我們設計的投票系統主要分為兩部分:投票發起者界面和投票者界面,分別在各自的節點上運行,實現不同的功能和操作。
(1) 投票發起者界面:投票發起者初始化整個投票過程。包括以下功能:部署投票項目智能合約、認證投票者、設置合格注冊碼、發起投票問題、設置注冊環節和投票環節的起止時間、查看投票結果等。
(2) 投票者界面:選民登錄注冊成為合格投票者進行投票。包括以下功能:登錄注冊、參與投票、提交選票、查看投票結果等。
2、智能合約的開發與實現
2.1 智能合約的開發
開發語言:solidity
編輯器:Atom
在線編譯器:Remix
交易橋梁:Metamask
2.2 智能合約的實現
(1)合約概述
| 合約名 |
合約內容 |
| Voting.sol |
投票智能合約,實現投票者注冊,投票,提交選票,自我計票等方法。
|
(2)Voting.sol合約實現的方法介紹:
| 方法及參數 |
功能 |
| VaildID() |
判斷投票者是否注冊 |
| projectSetup(string memory title, string memory select1, string memory select2, string memory select3) |
初始化投票項目 |
| registerIdSetup(bytes32 register1) |
設置注冊碼 |
| voteForCandidate(bytes32 candidate) |
投票給某個候選者 |
| TimeSetSetup(string memory register_start_time,string memory register_end_time, string memory vote_start_time, string memory vote_end_time) |
設置注冊時間、投票時間 |
| voteForCandidate(bytes32 candidate) |
投票給候選者 |
| totalVotesFor(bytes32 candidate) |
獲取候選者的所有選票 |
| someoneRegister(bytes32 registerId) |
投票者注冊 |
| VaildID() |
判斷投票者是否注冊 |
| isVoted() |
判斷投票者是否投過票 |
|
|
|
3、實驗結果與分析
3.1 管理員的工作流程
3.1.1 登錄(要求同時登錄metamask,不然會彈出賬號錯誤並重新返回登錄頁)

3.1.2 系統項目初始化

3.1.3 設置被授權的注冊碼(這里要修改為服務器生成公私鑰,將公鑰發給用戶,用戶使用公鑰加密注冊碼發送給服務器,下面展示的加密也需要修改)

3.1.4 設置各階段的工作時間

3.1.5 結果展示
投票未截止時查看投票結果:

投票時間截止后查看投票結果:

Metamask交易記錄:

3.2 投票者的工作流程
3.2.1 登錄

3.2.2 注冊
未注冊會先彈出注冊框:

注冊:

注冊成功:

3.2.3 投票

3.2.4 查看結果
投票成功:

結果:

Metamask的交易記錄:

4、小結
本次報告首先簡要概括了一下投票系統的運行流程與需求分析,然后介紹了智能合約的開發工具與我們的投票系統所涉及的合約方法;最后展示了投票系統的操作流程。系統中存在的主要問題就是合約信息更新較慢,導致需要等待一點時間,前端的頁面信息才會正常展示,下一步我打算着重解決這些系統出現的問題,並把前端的界面整體修改一下,使其更加美觀。
由於向我咨詢的人太多,我的時間真的有限!!着急的朋友可以通過掃描下面的二維碼關注我的微信公眾號,“區塊鏈Dapp小課堂”,直接跟我留言即可!有什么問題我都會立即回復哦!

