solidity学习-投票
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;contract Ballot2{struct Voter{uint weight; //投票权重bool voted; //标志位,标志是否投过票uint vote; //投票投给谁address delegate; //投票对象的地址}struct Proposal{ //提案bytes32 name; // 提案名称(最多 32 个字节)uint voteCount; //提案获得的票数} address public chairperson; //定义一个主席Proposal[] proposals; //保存所有的提案数组//地址和投票的映射mapping(address=>Voter) voters;constructor(bytes32[] memory proposalNames) {chairperson=msg.sender; //初始化主席是创建人voters[chairperson].weight=1; //初始化主席的权重为1for (uint i = 0; i < proposalNames.length; i++) {proposals.push(Proposal({name: proposalNames[i],voteCount: 0}));}}function giveRightToVote(address voter) public{ //主席投票权函数require(msg.sender==chairperson); //要求函数调用人是主席require(voters[voter].voted==false); //要求他的投票标志位为false,没有投过票给别人require(voters[voter].weight==0); //没有投票权voters[voter].weight=1; //?初始时已经是1了啊? 赋给投票权} function delegate(address to) public{ //代理函数,将自己的投票委托给“to”选民Voter storage sender = voters[msg.sender];require(!sender.voted); //自己没有投过票require(to !=msg.sender); //委托对象不能是自己while(voters[to].delegate!=address(0)&&voters[to].delegate!=msg.sender){ //被委托人不能是0地址,被委托人不能再委托给第一个委托人to=voters[to].delegate; }sender.voted=true; //投票标志为真sender.delegate=to; //投票地址为toVoter storage delegateTo=voters[to]; //??if(delegateTo.voted){ //如果委托人已经投过票proposals[delegateTo.vote].voteCount+=sender.weight; //委托人的票数增加,票数加上他的权重}else{delegateTo.weight += sender.weight; //没有投过票,增加委托人的投票权重 }}function vote(uint proposal)public{ //对提案投票函数,投自己和被委托的票Voter storage sender = voters[msg.sender];require(sender.weight!=0); //有投票权重require(!sender.voted); //没有投过票sender.voted=true;sender.vote=proposal;//注意:proposal是数组 不能溢出 否则会回滚proposals[proposal].voteCount+=sender.weight; //提案增加票数}function winningProposal() public view returns(uint winningProposal_){ //胜利的方案 只读 加viewuint winningCount=0; //winning提案票数 初始为0//循环所有提案,找出票数大于winning的提案,并赋值给winningfor(uint p=0;p<proposals.length;p++){ if(proposals[p].voteCount > winningCount){winningCount=proposals[p].voteCount;winningProposal_=p;}}}function winnerName() public view returns(bytes32 winnerName_){ //胜利的方案名winnerName_ = proposals[winningProposal()].name;}}
solidity学习-投票相关推荐
- Solidity学习记录——第二章
Solidity学习记录 第一章 创建生产僵尸的工厂 第二章 设置僵尸的攻击功能 第三章 编写DAPP所需的基础理论 第四章 完善僵尸功能 第五章 ERC721 标准和加密资产 文章目录 Solidi ...
- Solidity学习记录——第四章
Solidity学习记录 第一章 创建生产僵尸的工厂 第二章 设置僵尸的攻击功能 第三章 编写DAPP所需的基础理论 第四章 完善僵尸功能 第五章 ERC721 标准和加密资产 文章目录 Solidi ...
- solidity学习笔记第1天
Solidity 学习笔记第1天 1. 什么是Solidity? 编写智能合约首选Solidity 语言,Solidity 是一门为实现智能合约而创建的高级编程语言.这门语言受到了 C++,Pytho ...
- 不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld
有问题可以点击–>加群互相学习 本人本来想自己写公链,结果发现任重道远: 遂,开始写Dapp,顺便写的时候搞个教程吧... 通过系列教程学习将会: 1.基本使用solidity 语言开发智能合约 ...
- Solidity学习笔记
学习视频来源: 基于以太坊的智能合约开发教程[Solidity] 读取数据不需要消耗燃料费Gas,修改数据需要消耗燃料费. pragma solidity ^0.4.0;contract Hellow ...
- Solidity学习(一)
1.Solidity基础 友情提示:每一句话都非常重要,每一个点都是细节.再者本教程适合有一定编程基础的小伙伴快速入门 基本语法,整数溢出以及异常处理,字节数组,动态字节数组,字符串,字符串与字节数组 ...
- 以太坊环境以及Solidity学习笔记
一.以太坊环境搭建 以太坊 私有链搭建 Geth+Mist钱包 以太坊 链私有链环境搭建(windows) S1:下载安装Geth.Mist客户端 S2:初始化创世纪节点 定义一个配置文件genesi ...
- 【机器学习】集成学习投票法:投票回归器(VotingRegressor) 投票分类器(VotingClassifier)
前言 投票回归器和投票分类器都属于集成学习.在[机器学习]集成学习基础概念介绍中有提到过,集成学习的结合策略包括: 平均法.投票法和学习法.sklearn.ensemble库中的Voting Clas ...
- 《智能合约Solidity学习笔记 - 僵尸军团》Part1- 搭建僵尸工厂
pragma solidity ^0.4.19; //指定版本号/**关卡1 : 创建 根据输入的姓名 创建随机僵尸学习网址: https://cryptozombies.io/zh **/// 创建 ...
- 《solidity学习笔记》chapter 3-solidity其他知识
Ownable contracts OpenZeppelin Solidity库里的合约之一,可以通过继承使用. /*** @title Ownable* @dev The Ownable contr ...
最新文章
- numpy.random.choice用法
- 更改数据库对象所有者
- Stella Forum v2 线上版开发总结
- 读书笔记《锋利的jQuery》
- 要离开苏州,一大堆东西要处理(包括租的房子)
- 通俗易懂解释一下C++的构造函数是怎样的呢?
- 使用 Drools 规则引擎实现业务逻辑,可调试drl文件
- 标题栏打字效果_JS特效源码
- 10天时间做出php,php 最近10天的所有日期
- 纯数学教程 Page 325 例LXVIII (12)
- mat格式数据集转换为arff与txt格式
- Java基础知识笔记第八章:常用的实体类
- 附录B. Design Motivations【设计意图】
- 使用java编写中国象棋(内含源代码)
- python连接mysql orm_Python通过ORM方式操作MySQL数据库
- onenote怎么同步到电脑_OneNote 同步最佳做法
- Pest incidence forecasting based on Internet of Things and Long Short-Term Memory Network 论文精读
- 网吧用计算机性能配件清单,如何查看网吧电脑配置清单图文教程
- 计算机毕业设计 SSM学校图书借阅管理系统 图书馆借阅管理系统 图书借阅系统Java
- 荣耀magic3pro和华为p50pro对比哪个好