DAPP:以太坊智能合约投票系统(solidity)+java后台(springboot+。。。

更新时间:2023-06-10 23:21:57 阅读: 评论:0

DAPP:以太坊智能合约投票系统(solidity)+java后台(springboot+。。。DAPP:投票系统
1. 项⽬背景
工作月总结怎么写为巩固近期学习过的区块链相关知识,我们利⽤⼏天时间开发了⼀套可以实际应⽤的基于以太坊智能合约的投票系统。
2. 技术选型
1. 智能合约编写:solidity
2. 私链环境:ganache-cli
3. 前端:thymeleaf模板引擎
4. 后端:springboot+mybatis
五年级上册英语单词表
5. 核⼼依赖jar包:web3j
项⽬⼤体框架如下(由于前端内容较少,且仅⽤作展⽰实现基本功能,实际开发过程中没有采⽤vue):
3. solidity合约代码
pragma solidity ^ 0.4.26;
contract Ballot {
string public name; //投票的名称,name of the Ballot
address public chairman; //合约拥有者的地址
bool public clod; // 记录投票是否结束
// 获胜票数⽐例假如我是一朵云
uint public proportion; // 获胜时得票数占总票数的最低⽐例, 例如50%就赋值为50
uint public totalVotes; // 总票数
// 加投票权集合, 表⽰哪些⼈有投票权
address[] voters;
struct Proposal { // 候选⼈信息的结构体
bytes32 name;
bytes32 name;
uint voteCount;  // 候选⼈的得票数
}
Proposal[] public proposals;  // 候选⼈的结构体(可变长)数组
mapping(address => bool) voteRecords; // 投票者是否投票(默认fal)
渗透造句uint[] winningProposals = [0];
bytes32[] winningProposalsName; // 记录winning候选⼈名字的数组
constructor(string _name, bytes32[] _proposals, uint _proportion, address[] _voters) public { // 合约的构造函数        chairman = msg.nder; // 记录合约的拥有者
clod = fal; // 合约默认处于打开
name = _name; // 投票的名称,如 "选举学⽣会主席"
for(uint i = 0; i < _proposals.length; i++) {
proposals.push(Proposal({
企业财务状况
name: _proposals[i],
voteCount: 0
}));
}
proportion = _proportion;
voters = _voters;
totalVotes = voters.length;
}
function tChairman(address _chairman) external { // 更换合约拥有者时⽤
chairman = _chairman;
}
function vote(uint proposal) public { //给候选⼈投票, 需传⼊候选⼈的序号及投票者的地址
address voterAddress = msg.nder;
require(!clod, "the ballot is already clod."); // 保证合约没有关闭,即投票没有结束
// 看投票者的地址是否在合法名单中
bool legal = fal;
for(uint i = 0; i < voters.length; i++){
if(voters[i] == voterAddress){
legal = true;
break;
}
}
require(legal, "the voter is illeagal!");
require(proposal < proposals.length, "the prosal is invalid!");
require(!voteRecords[voterAddress], "Already voted."); // 保证投票者没有投过票
voteRecords[voterAddress] = true;
proposals[proposal].voteCount += 1; // 候选⼈得票数加⼀
}
function cloBallot() public { // 关闭投票
require(chairman == msg.nder, "only the chairman can clo the ballot."); // 只有拥有者可以关闭投票
clod = true;
}
function getWinningProposals() internal { //统计投票的获胜者
winningProposals.length = 0;
uint winningVoteCount = 0;
for(uint i = 0; i < proposals.length; i++) {
if(proposals[i].voteCount * 100 / totalVotes >= proportion) {
winningProposals.push(i);
}
}
if(winningProposals.length == 0){民办高校
for(i = 0; i < proposals.length; i++){
if(proposals[i].voteCount > winningVoteCount){
winningVoteCount = proposals[i].voteCount;
}
}
}
for(i = 0; i < proposals.length; i++){
if(proposals[i].voteCount == winningVoteCount){
winningProposals.push(i);
}
}
}
}
function winnerName() public view returns (bytes32[]) { // 返回得票数最⾼的候选⼈的名字        require(clod, "only when the ballot is clod can you examine the winner");上公交车英语
getWinningProposals();
for(uint i = 0; i < winningProposals.length; i++){
winningProposalsName.push(proposals[winningProposals[i]].name);
}
return winningProposalsName;
}
function getProposalNumber() public view returns (uint){
return proposals.length;
}
}
4.功能展⽰
1.投票列表界⾯
即已
1. 点击左上⾓“发起投票”可以新建⼀次投票;
2. 在已有投票列表中,可以对未结束的投票进⾏投票选举;
3. 仅有合约拥有者可以终⽌投票,该过程需要输⼊私钥签名验证。
2.添加投票页⾯
在此页⾯可以新建⼀个投票,并需要提供私钥,部署并注册为合约拥有者。
3.查看票数及投票页⾯
投票时需要输⼊私钥签名,且每个账户地址仅可投票⼀次。
4.数据库表

本文发布于:2023-06-10 23:21:57,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/924153.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:投票   合约   候选
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图