通过对Solidity官方文档的学习,发现投票案例代码有些不够严谨,简要做以下说明。

1. 调用者问题

vote函数中,如果是一个没有投票权的地址(假设A地址)调用了vote 函数,代码也能顺利执行。
首先,A地址虽然没有被chairperson 赋予投票权,但是代码也能正常获取Voter 对象sender ,只不过sender的所有属性值是对应类型的默认值,函数可以继续执行。

表1 Voter对象属性对应的默认值

类型 属性 取值
uint weight 0
bool voted false
uint vote 0
address delegate 0x0

接下来,代码将Avoted设为true (sender.voted = true;),权重被累加到了对应的提案票数上,我们会发现,这对于投票结果并没有什么影响(Aweight 值为0),但是因为此时A.voted = true ,当主持人chairperson 试图给A 赋予投票权时将无法正常执行,这就导致A永久不能拥有投票权,显然这是不合适的。

2. 提案不存在

同样在vote函数中,如果调用者输入的参数proposal 并不存在(即proposal >= proposals.length),导致数组越界,虽然这不会给合约的安全性带来问题,但是会造成调用执行失败,显然这不是我们希望看到的。

注意

delegate函数中也出现了上面两个问题,具体不再描述。

3. 提案票数相同

在获取最高票数的提案编号winningProposal 和提案名称winnerName 的方法中,如果出现两个或者多个提案的票数最高且相同时,只会返回编号靠前的提案编号。

代码优化请点这里查看

Solidity智能合约案例——投票存在的问题相关推荐

  1. Solidity智能合约库:区块链工程师的随身工具箱

    编者荐语: Solidity使用起来不如其他语言那般丝滑顺畅?安全事故难以避免?社区迎来适用于FISCO BCOS的Solidity智能合约库,轻松破解合约的各种小难题,让合约开发更加快速高效.省时省 ...

  2. 微众银行Solidity智能合约库:区块链工程师的随身工具箱

    区块链技术在经历了十余年的发展后,渐呈"燎原之势",不断在各行业落地生根.但同时,从技术的角度看,区块链应用开发仍然有着较高的门槛,存在不少痛点.为了提升应用开发各环节的用户体验, ...

  3. 【许晓笛】 EOS智能合约案例解析(1)

    详解 EOS 智能合约的 hpp 文件 为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不 ...

  4. 【许晓笛】 EOS 智能合约案例解析(2)

    详解 EOS 智能合约的 cpp 文件 之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能 ...

  5. 【许晓笛】 EOS智能合约案例解析(1) 1

    详解 EOS 智能合约的 hpp 文件 为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不 ...

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

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

  7. solidity智能合约implicit conversion异常

    问题场景 在使用^0.5.10版本的solidity时,如果使用this关键字会出现以下问题. 代码: require(tokenContract.balanceOf(this) >= _num ...

  8. 【许晓笛】EOS 智能合约案例解析(2)

    详解 EOS 智能合约的 cpp 文件 之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能 ...

  9. 【许晓笛】EOS智能合约案例解析(1)

    为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不是特别完善,个别功能还没有完成.但这个示 ...

  10. Solidity 智能合约入门

    Solidity 智能合约入门 存储合约示例 将一个数据放置在链上 // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 &l ...

最新文章

  1. 芯片刀片服务器,使用“刀片服务器”其实不难
  2. javascript中变量没有块级作用域---函数内申明的变量在整个函数中都有效!
  3. 【Homework】说出 == 和 equals 的区别
  4. oracle tns 代理配置_oracle数据库tns配置方法详解
  5. winform与数据库同步更新
  6. 清理autodesk产品注册表_卸载 AutoCAD 清理注册表
  7. java程序往微信群里发消息_通过java程序,给微信发送消息
  8. 银行对公业务和对私业务
  9. 近端策略优化(proximal policy optimization)算法简述
  10. ic卡信息保存在服务器,智能IC卡网络数据安全保密系统
  11. 干货 | 相机标定:机器人手眼标定
  12. 音视频开发--音视频基础
  13. python爬虫 下载视频网站视频
  14. 从零开始写一个小米便签
  15. 十大黑客电影-关于程序员或者关于电脑高手的电影
  16. python中的结束用语_python结束语句
  17. 铲雪车(snow) UVA10203 Snow Clearing 题解 优化版
  18. RiouxSvn 项目托管
  19. 一文彻底理解:训练集,验证集,测试集,交叉验证
  20. S2B2C社交电商系统怎么开发?

热门文章

  1. Javaweb阶段学习
  2. 一次性餐巾行业调研报告 - 市场现状分析与发展前景预测
  3. Matlab App Designer自学笔记(三):利息计算器案例
  4. [论文笔记] Sigcomm 2018 Elastic Sketch: Adaptive and Fast Network-wide Measurements
  5. 汽车零部件生产质量安全,路在何方?
  6. Python | Web Crawler
  7. Java:获取map的key和value
  8. 人工智能名片小程序如何开启连锁实体店全新移动电商新时代?
  9. 美,英,荷文元音及元音组合国际音标对照表
  10. zhu hao shi de shi