智能合约投票部署后仅返回单一计数,如何获取两方投票的完整结果?
问题根因分析
- 从你给出的合约代码来看,投票结束后仅将存储赞成票的
finalResult设置为了public可见性,存储反对票的totalFalse大概率没有声明public,外部无法直接读取该变量值,所以只能拿到单个主体的计数。 - 合约未暴露统一查询两方票数的公开方法,也无法在投票过程中主动获取实时计数。
- 虽然
voteEnded事件在触发时会同时返回两方票数,但如果未主动监听链上事件日志,也无法获取到对应数值。
修复方案
场景1:合约尚未部署,可修改代码后重新部署
- 给
totalFalse变量添加public可见性,和finalResult保持一致,合约会自动生成对应变量的getter方法供外部调用:
// 原变量定义修改为 uint256 public finalResult; uint256 public totalFalse;
- 可选新增实时票数查询方法,无需等待投票结束即可获取两方计数:
function getBothVoteCounts() public view returns (uint256 approveCount, uint256 rejectCount) { return (countResult, countRe); }
- 部署修改后的合约即可,后续可直接调用
finalResult()、totalFalse()或者getBothVoteCounts()获取两方投票结果。
场景2:合约已上链部署,无法修改代码
- 调取链上历史事件日志,查找投票结束时触发的
voteEnded事件,该事件参数中已经包含了赞成票finalResult和反对票totalFalse两个数值,可直接提取。 - 如果votes数组声明为public,可遍历读取数组内所有投票记录的
choice值,自行累加统计两方票数。
内容的提问来源于stack exchange,提问作者ramane Pari
相关产品推荐
相关产品推荐

