这个例子相对复杂一些,用到了以太坊编程语言Solidity的很多特性。例子实现了一个投票智能合约。电子投票系统的一个主要问题是如何分配合理的权限给正确的人,并且要防止篡改。这个例子不能解决所有问题,但是实现了如何去委托投票,整个投票计数过程是自动且完全透明的。

功能上首先要为投票设立一个简称创建一个合约,发起者作为主席来给每一个独立的地址分配权限。每一个参与者可以自己投票或者委托给信任的人。程序最后会返回得票数最多的那个提议。

/ 一个有委托功能的投票系统
contract Ballot {// 定义一个复杂类型,后面作为变量来使用,// 代表一个投票人。struct Voter {uint weight; // weight在代表投票过程中会累积bool voted; // 如果值为true,代表这个投票人已经投过票address delegate; // 投票人地址uint vote; // 当前投票的索引}// 代表一份提议的数据结构 struct Posposal {bytes32 name; // 提议的名称uint voteCount; // 提议接受的投票数}// 定义投票发起人address public chairperson;// 这个状态变量存储了所有潜在投票人mapping(address => Voter) public voters;// 定义动态数组存储所以提议Posposal[] public proposals;// 传入提议名称来定义一个投票对象function Ballot(bytes32[] proposalNames){chairperson = msg.sender;voters[chairperson].weight = 1;// 把传入的提议名称创建一个提议,并加入到前面定义的提议数组for(uint i = 0; i < proposalNames.length; i++){// 创建一个临时提议对象,加入提议数组proposals.push(Proposal({name: proposalNames[i],voteCount: 0;}));}}// 给投票人分配投票权限,这个操作只有发起人(主席)才可以function giveRightToVote(address: voter){if(msg.sender != chairperson || voter.voted) {throw;}voters.weight = 1;}// 委托投票给另外一个投票人function delegate(address to){// 找出委托发起人,如果已经投票,终止程序Voter sender = voters[msg.sender];if(sender.voted)throw;while(voters[to].delegate != address[0] && voters[to].delegate != msg.sender){to = voters[to].delegate;}// 发起人、委托人不能是同一个,否则终止程序if(to == msg.sender){throw;}// 标识发起人已经投过票sender.voted = true;sender.delegate = to;Voter delegate = voters[0];if (delegate.voted) {// 投票成功,投票总数加上相应的weightproposals[delegate.vote].voteCount += sender.weight;}else {// 如果还没投票,发起人weight赋值给委托人delegate += sender.weight;}}// 投票给某个提议function vote(uint proposal) {Voter sender = voters[msg.sender];if (sender.voted) throw;sender.voted = true;sender.voter = proposal;proposals[proposal].voteCount += sender.weight;}// 找出投票数最多的提议function winningProposal() constant returns (winningProposal){uint winningVoteCount = 0;for (uint p = 0; p < voteCount; p++) {if (proposals[p].voteCount > winningVoteCount){winningVoteCount = proposals[p].voteCount;winningProposal = p;}}}}

以上就是完整的投票智能合约,对新人有点复杂,需要花点时间学习,后面我们通过更多例子加深对代码的理解。

以太坊投票智能合约案例相关推荐

  1. 以太坊solidity智能合约-生成随机数

    Solidity随机数生成 在以太坊的只能合约中,没有提供像其他面向对象编程一样的生成随机数的工具类或方法.其实,所谓的随机数也是伪随机的,没有哪一种语言能够真正的生成随机数. 对于solidity来 ...

  2. java计步器算法_区块链+计步运动项目,主要采用以太坊、智能合约、springboot以及小程序等技术...

    runlife_api 项目介绍 区块链+计步运动项目,主要采用以太坊.智能合约.springboot以及小程序等技术 兑换步数算法 按照每总量剩余一半的时候兑换难度增加一倍,如目前按照平均步数511 ...

  3. 基于以太坊的智能合约开发教程Solidity modifier

    基于以太坊的智能合约开发教程Solidity modifier pragma solidity ^0.4.0;contract modifierTest{address owner;uint publ ...

  4. 以太坊EVM智能合约中的数据存储

    目录 EVM基本信息 数据管理 Stack Args Memory Storage 固定长度的值 动态长度数组 Mappings 复杂类型的组合 总结 EVM基本信息 以太坊是一种基于栈的虚拟机,基于 ...

  5. 区块链工作原理(区块链治理系统、比特币、以太坊、智能合约)

    文章目录 Blockchain Governance System On-Chain Governance Off-Chain Governance BitCoin Blockchain Ethere ...

  6. python如何使用web3py与以太坊投资智能合约交互

    在以太坊和其他区块链中,仍有很多被证明的概念正在实施,开发人员在尝试如何应对这些新概念.作为dInvest 系列文章一部分,我也在研究以太坊并尝试在区块链中实施对冲基金.在上一篇文章中,我讨论了如何在 ...

  7. 以太坊系列 - 智能合约开发与调试

    本文默认智能合约所需要的相关环境Geth.Truffle.Solidity.Ganache等都是完备的! 主要介绍: Remix IDE环境如何与指定的链进行连接: 编译 部署与调试智能合约 使用 z ...

  8. 以太坊Python智能合约开发指南

    在以太坊上获得一个基本的智能合约是一个很简单的事,只需google查询"ERC20代币教程",你会发现有关如何做到这一点的大量信息.以编程方式与合约交互完全是另一回事,如果你是一个 ...

  9. 使用C# 和基于.Net的以太坊库Nethereum以太坊及智能合约交互实战篇(一)

    官网:Nethereum官网 Github地址:Github上的Nethereum库 简介: Nethereum是用于Ethereum的.Net集成库,可简化智能合约管理以及与以太坊节点的交互,无论这 ...

最新文章

  1. Android onAttach 的使用
  2. TSQL 聚合函数忽略NULL值
  3. 每个程序员都应该了解的内存知识(3)-虚拟内存
  4. The server time zone value is unrecognized or repr
  5. poj3254 Corn Fields
  6. MCMC 和 Gibbs采样
  7. 在matlab中使用spm8,在matlab中同时使用spm2,spm5,spm8
  8. 网络编程多人聊天c语言,socket网络编程--简单的多人聊天
  9. C#进阶系列——WebApi 路由机制剖析:你准备好了吗?
  10. 五子棋大在线对战 java_五子棋可蓝牙对战版
  11. 为什么你996猝死,你老板007都没事?
  12. OpenHarmony短信验证码及倒计时实现
  13. 浅谈辅助功能 AccessibilityService
  14. 第三章 关系数据模型
  15. 微信 发送图片 服务器上,公安提醒:微信发照片,千万别传原图”!5个步骤教你隐藏位置信息...
  16. 私募量化策略超额收益来源分析
  17. 学习笔记:曲线插值法
  18. 使用requests库用cookie登录简书账号
  19. 我们是“前端offer收割机”
  20. There is insufficient memory for the Java Runtime Environment to continue IDEA闪退

热门文章

  1. Matlab车牌识别
  2. 论文对比实验图神器MulimgViewer
  3. Notepad++运行JAVA代码
  4. hex文件、out文件、bin文件、map文件解析
  5. ios下video标签无法播放视频
  6. python爬虫基础(二)
  7. 数据结构实验报告—学生成绩管理系统(Java实现)
  8. RPG游戏-小地图系统
  9. 苹果账号改区 数据会转移服务器吗,Apple ID国家或地区如何更改 无法成功转区的解决方法...
  10. 基于SSM的商城项目项目源码+实验报告