// 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学习-投票相关推荐

  1. Solidity学习记录——第二章

    Solidity学习记录 第一章 创建生产僵尸的工厂 第二章 设置僵尸的攻击功能 第三章 编写DAPP所需的基础理论 第四章 完善僵尸功能 第五章 ERC721 标准和加密资产 文章目录 Solidi ...

  2. Solidity学习记录——第四章

    Solidity学习记录 第一章 创建生产僵尸的工厂 第二章 设置僵尸的攻击功能 第三章 编写DAPP所需的基础理论 第四章 完善僵尸功能 第五章 ERC721 标准和加密资产 文章目录 Solidi ...

  3. solidity学习笔记第1天

    Solidity 学习笔记第1天 1. 什么是Solidity? 编写智能合约首选Solidity 语言,Solidity 是一门为实现智能合约而创建的高级编程语言.这门语言受到了 C++,Pytho ...

  4. 不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld

    有问题可以点击–>加群互相学习 本人本来想自己写公链,结果发现任重道远: 遂,开始写Dapp,顺便写的时候搞个教程吧... 通过系列教程学习将会: 1.基本使用solidity 语言开发智能合约 ...

  5. Solidity学习笔记

    学习视频来源: 基于以太坊的智能合约开发教程[Solidity] 读取数据不需要消耗燃料费Gas,修改数据需要消耗燃料费. pragma solidity ^0.4.0;contract Hellow ...

  6. Solidity学习(一)

    1.Solidity基础 友情提示:每一句话都非常重要,每一个点都是细节.再者本教程适合有一定编程基础的小伙伴快速入门 基本语法,整数溢出以及异常处理,字节数组,动态字节数组,字符串,字符串与字节数组 ...

  7. 以太坊环境以及Solidity学习笔记

    一.以太坊环境搭建 以太坊 私有链搭建 Geth+Mist钱包 以太坊 链私有链环境搭建(windows) S1:下载安装Geth.Mist客户端 S2:初始化创世纪节点 定义一个配置文件genesi ...

  8. 【机器学习】集成学习投票法:投票回归器(VotingRegressor) 投票分类器(VotingClassifier)

    前言 投票回归器和投票分类器都属于集成学习.在[机器学习]集成学习基础概念介绍中有提到过,集成学习的结合策略包括: 平均法.投票法和学习法.sklearn.ensemble库中的Voting Clas ...

  9. 《智能合约Solidity学习笔记 - 僵尸军团》Part1- 搭建僵尸工厂

    pragma solidity ^0.4.19; //指定版本号/**关卡1 : 创建 根据输入的姓名 创建随机僵尸学习网址: https://cryptozombies.io/zh **/// 创建 ...

  10. 《solidity学习笔记》chapter 3-solidity其他知识

    Ownable contracts OpenZeppelin Solidity库里的合约之一,可以通过继承使用. /*** @title Ownable* @dev The Ownable contr ...

最新文章

  1. numpy.random.choice用法
  2. 更改数据库对象所有者
  3. Stella Forum v2 线上版开发总结
  4. 读书笔记《锋利的jQuery》
  5. 要离开苏州,一大堆东西要处理(包括租的房子)
  6. 通俗易懂解释一下C++的构造函数是怎样的呢?
  7. 使用 Drools 规则引擎实现业务逻辑,可调试drl文件
  8. 标题栏打字效果_JS特效源码
  9. 10天时间做出php,php 最近10天的所有日期
  10. 纯数学教程 Page 325 例LXVIII (12)
  11. mat格式数据集转换为arff与txt格式
  12. Java基础知识笔记第八章:常用的实体类
  13. 附录B. Design Motivations【设计意图】
  14. 使用java编写中国象棋(内含源代码)
  15. python连接mysql orm_Python通过ORM方式操作MySQL数据库
  16. onenote怎么同步到电脑_OneNote 同步最佳做法
  17. Pest incidence forecasting based on Internet of Things and Long Short-Term Memory Network 论文精读
  18. 网吧用计算机性能配件清单,如何查看网吧电脑配置清单图文教程
  19. 计算机毕业设计 SSM学校图书借阅管理系统 图书馆借阅管理系统 图书借阅系统Java
  20. 荣耀magic3pro和华为p50pro对比哪个好

热门文章

  1. 【单位圆覆盖最多点】POJ 1981
  2. html div边框宽度,边框的宽度
  3. Go语言攻略:“面向对象”
  4. outlook html 格式签名,Outlook HTML电子邮件签名
  5. 功能测试 —— TPShop商城项目
  6. 手把手教你如何自制目标检测框架(从理论到实现)
  7. matlab蚁群算法解决vrp过程,蚁群算法MATLAB解VRP问题
  8. 监听电源键的单击或长按事件
  9. Linux du命令详解
  10. php监听input,js实时监听input中值变化