Solidity案例详解(四)投票智能合约

该合约为原创合约,功能要求如下

在⼀定时间能进⾏投票超过时间投票截⽌,并投赞同票超过50%则为通过。

  • 使⽤safeMath库,使⽤Owner 第三⽅库

  • 拥有参与投票权的⽤户在创建合约时确定

  • Voter 结构 要有时间戳、投票是否同意等;

  • struct 结构体

Proposal 提案

提案编号、提案时间、提案内容、提案⼈、提案截⽌时间、结果等。

  • Voter 投票

投票时间 、态度等(也可以增加委托投票)

  • 功能(必要功能)

  • vote 投票

getResult 结果

  • 事件

Vote

Result 产⽣结果

首先我们来测试其功能

1.选择三个投票账户进行部署

2.各函数功能概述

constructor: 构造函数用于初始化合约。接收一个包含初始选民地址的数组,将这些地址添加到 eligibleVoters 映射中,表示这些地址是合适的选民。

submitProposal: 提交提案的函数。只有合适的选民才能提交提案。该函数创建一个新的提案对象,将其存储在 proposals 映射中。

vote: 进行投票的函数。只有合适的选民才能投票,且投票时间必须在提案截止时间之前。投票结果存储在 votes 映射中,并更新提案的赞成和反对数量。

getResult: 获取提案结果的函数。只有在投票截止时间之后才能调用该函数。计算赞成票的百分比,并判断提案是否通过,然后更新提案的状态并触发相应的事件。

getNextProposalId: 私有函数,用于生成下一个提案的唯一标识符。在示例中,它总是返回1,实际应用中可能需要更复杂的逻辑

3.提交提案

4.投票

账号1,2,3分别投票

5.根据提案查看结果

未点击getResult

点击getResult

6.根据用户地址查看用户投票情况

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2302_77339802/article/details/134370557

文章来源:CSDN 博主「发呆...」

文章原标题:《Solidity案例详解(四)投票智能合约》

旨在传播区块链相关技术,如有侵权请与我们联系删除。

### 常见智能合约漏洞类型 智能合约的安全性和可靠性一直是区块链技术领域的重要课题。常见的智能合约漏洞可以分为几类,主要包括逻辑错误、权限管理不当以及外部交互风险等问题。 #### 重入攻击 (Reentrancy Attack) 重入攻击是指恶意合约通过反复调用目标合约的函数来破坏其状态或窃取资金的行为[^1]。这种类型的漏洞通常发生在合约在完成内部状态更新之前就进行了外部调用的情况下。 ```solidity // 不安全的例子 function withdraw() public { require(balance[msg.sender] >= amount); msg.sender.call.value(amount)(); // 外部调用可能触发重新进入 balance[msg sender] -= amount; } ``` 为了防止此类攻击,开发者应遵循“检查-生效-互动”模式(Checks-Effects-Interactions Pattern),即先修改本地状态再执行任何外部调用[^2]。 #### 整数溢出/下溢 (Integer Overflow/Underflow) 当操作数值型数据时如果超出该类型的最大范围就会发生整数溢出;反之则称为下溢。这可能导致意外的结果甚至被利用来进行非法转账等活动。 解决方案之一是在算术运算期间引入边界条件验证或者使用专门库比如OpenZeppelin提供的SafeMath来自动处理这些问题: ```solidity using SafeMath for uint256; uint256 totalSupply = ... ; totalSupply = totalSupply.add(value); // 安全加法 ``` ### 解决方案概述 对于上述提到的各种潜在威胁点,除了采用最佳实践编码之外还需要建立完整的生命周期管理体系包括但不限于形式化验证(Formal Verification),静态分析工具的应用以及动态模糊测试(Fuzz Testing) 。此外,在部署之后也要持续监控网络行为并对发现的新问题及时响应修补。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值