pragma solidity ^0.4.0;
contract Ballot { //投票类

struct Voter { //投票人
uint weight; //权重
bool voted; //该投票人是否投票,true表示已投票,false表示未投票
uint8 vote; //给谁(提案索引号)投票
address delegate; //委托的投票代表
}
struct Proposal { //提案
uint voteCount; //提案累计获得票数
}

address chairperson; // 投票主持人
mapping(address => Voter) voters; //声明一个状态变量voters,保存每个独立地址的Voter结构体
Proposal[] proposals; //声明一个存储Proposal结构的动态数组

/// Create a new ballot with $(_numProposals) different proposals. //用_numProposals个不同提案创建一个新的投票
function Ballot(uint8 _numProposals) public {
chairperson = msg.sender; //合约发送者为投票主持人
voters[chairperson].weight = 1; //主持人权重为1
proposals.length = _numProposals; //提案个数
}

/// Give $(toVoter) the right to vote on this ballot.
/// May only be called by $(chairperson).//投票主持人给每个投票者投票权,只能由投票主持人调用
function giveRightToVote(address toVoter) public {
if (msg.sender != chairperson || voters[toVoter].voted) return; //若合约发送者不是主持人或者投票者已经投票,则返回
voters[toVoter].weight = 1; // 给每个投票者各自投票权限
}

/// Delegate your vote to the voter $(to). //将自己(该函数的调用者)的投票权委托给委托人to
function delegate(address to) public {
Voter storage sender = voters[msg.sender]; // assigns reference 指定引用
if (sender.voted) return;
while (voters[to].delegate != address(0) && voters[to].delegate != msg.sender)
to = voters[to].delegate;//当委托人的票也委托给了别人时,将委托人to指向委托人的委托人。
if (to == msg.sender) return;//当委托人的委托人是自己时,返回。这里不允许自己委托给自己。
sender.voted = true;//自己已投票
sender.delegate = to;//将自己的委托人设为委托人to
Voter storage delegateTo = voters[to];//将委托人的信息保存到delegateTo中
if (delegateTo.voted)//若委托人已投票,则将自己的权重赋给委托人的票数
proposals[delegateTo.vote].voteCount += sender.weight;
else
delegateTo.weight += sender.weight; //若委托人未投票,则将自己的权重增加到委托人权重上。
}

/// Give a single vote to proposal $(toProposal).//这里自己(调用函数者)给提案投票,包括委托的票。
function vote(uint8 toProposal) public {
Voter storage sender = voters[msg.sender];//指定引用
if (sender.voted || toProposal >= proposals.length) return;//若自己已经投票或要投的提案索引范围超过给定提案数组范围,则返回
sender.voted = true;//自己已投票
sender.vote = toProposal;//自己给提案索引toProposal投票
proposals[toProposal].voteCount += sender.weight; //给提案索引为toProposal的票数加上自己的权重
}

//根据当前所有的投票计算出胜出的提案
function winningProposal() public constant returns (uint8 _winningProposal) {
uint256 winningVoteCount = 0;
for (uint8 prop = 0; prop < proposals.length; prop++)
if (proposals[prop].voteCount > winningVoteCount) {
winningVoteCount = proposals[prop].voteCount;
_winningProposal = prop;
}
}

}

msg.sender表示当前执行函数者的地址

REMIX智能合约实例BALLOT分析相关推荐

  1. WeIdentity智能合约源码分析

    WeIdentity智能合约 介绍 本文结合WeIdentity智能合约文档对其源码进行阅读分析.当前,WeIdentity合约层面的工作目标主要包括两部分: WeIdentity DID智能合约,负 ...

  2. Token系列 - 加密猫智能合约源码分析

    GeneScienceInterface合约 这个合约没有源码,从名字看已经很明显,就是猫的基因工程,用于决定新出生猫的基因. 这里仅仅定义了一个接口,没有具体实现,后续的调用请看后续代码分析 /// ...

  3. 区块链游戏FOMO3D智能合约核心分析

    最近做一个区块链的项目,需要彻底分析FOMO3D的智能合约,顺便熟悉一下区块链的开发流程. 首先为了能跑FOMO3D的智能合约我尝试了truffle+galanche,对我来说不太理想,我就自己用py ...

  4. 区块链智能合约Coursera(第一周)智能合约基础

    课程链接 https://www.coursera.org/learn/smarter-contracts/home/week/1 这是区块链专项课程的第二门课 智能合约 Smart Contract ...

  5. eos源码赏析(十一):EOS之从“狼人游戏”看智能合约调用及权限分配(上)

    火了没几天的"狼人游戏"因某些原因遭到口诛笔伐而下线,后期参与的玩家可谓损失惨重,而这一切的操盘仿佛都指向一个并不算匿名的匿名团队,毕竟在区块链上任何动作的执行都是可追溯的.该游戏 ...

  6. 区块链安全-以太坊智能合约静态分析

    概述 目前,以太坊智能合约的安全事件频发,从The DAO事件到最近的Fomo3D奖池被盗,每次安全问题的破坏力都是巨大的,如何正确防范智能合约的安全漏洞成了当务之急.本文主要讲解了如何通过对智能合约 ...

  7. 这些智能合约漏洞,可能会影响你的账户安全!

    摘要:区块链联盟链智能合约形式化验证揭秘,解释了我们为什么要对区块链上的智能合约进行形式化验证,以及形式化验证的分类和业界针对每种分类所推出的形式化验证工具,最后作者描述了一下目前形式化验证的种种方法 ...

  8. 星云链智能合约开发(六):智能合约开发与部署

    编写智能合约 Nebulas实现了NVM虚拟机来运行智能合约,NVM的实现使用了JavaScript V8引擎,所以当前的开发版,我们可以使用JavaScript.TypeScript来编写智能合约. ...

  9. 智能合约(一)————智能合约入门

    1.智能合约的基本组成 1.1.程序版本 1.2. 合约声明 1.3.状态变量 1.4.合约方法 在这里constant相当于他声明这个局部变量不能更改,但是他并没有实际作用(实际就只是警示作用) 2 ...

  10. 使用ganache-cli和truffle构建以太坊智能合约,以实现“基于哈希锁定的跨链技术”为例

    目录 配置以太坊开发环境 部署智能合约 调用智能合约 配置以太坊开发环境 系统与工具的版本:Ubuntu 21.04 npm 7.5.2 Ganache CLI v6.12.2 (ganache-co ...

最新文章

  1. 【C++】Google C++编码规范(二):类
  2. 云服务器基础运维与管理
  3. python unicodeencodeerror_解决 Python UnicodeEncodeError 错误
  4. catia 创成钣金设计_8、钣金件设计-降低钣金成本的设计
  5. 最短路(遍历边)计蒜客—DD坐地铁
  6. 如何解决文件不存在_传奇微端配置Pak密码文件不存在怎么解决?传奇分享汇
  7. 求1到100的数字累加和(python)
  8. php多维数组key交换,php 根据key计算多维数组的和功能实例
  9. spring5.0学习笔记6
  10. mysql数据库管理与开发pdf_深入浅出mysql数据库开发、优化与管理维护.pdf
  11. qdir 自动创建多级目录_QDir 类 - 目录信息类
  12. 纯H5实现扫码:浏览器扫码
  13. OpenCv4在Win10 VS2019上环境搭建
  14. PS案例教程:photoshop路径运算和路径组合操作
  15. c语言程序设计第一次在线作业答案,20春地大《C语言程序设计(新)》在线作业一...
  16. PS:修复图片模糊(字体)
  17. 计算机右键无法新建excel2007,右键无法新建Excel
  18. 玩转Mysq数据库(一):数据库的基础操作——创建、删除、查看
  19. 根据oe抓取ebayno title fits
  20. python代码自动补全利器----Kite介绍安装使用教程

热门文章

  1. redis.conf文件下载与配置
  2. 学习MIT 6.824 部分笔记
  3. PS 超简单抠头发丝
  4. Python基础知识(二):序列结构---字符串、 列表、 元组、 字典、 集合
  5. python node.js ruby_Python/Ruby/Node.js/Perl - 随笔分类 - bluefrog - 博客园
  6. R语言使用order函数对dataframe数据进行排序、基于单个字段(变量)进行降序排序(DESCENDING)
  7. Youtube优质游戏开发UP主推荐:JayAnAm
  8. linux 跨网段ping,Linux中跨网段ping问题
  9. 美国计算机硕士毕业在美薪资,美国计算机硕士留学费用全都在这了!
  10. LOL手游诺手终极玩法,对线王者剑姬如何操作?国服第一推荐操作