ChainShot Solidity课程Game合约测试未通过问题求助
ChainShot Solidity入门课程Game合约问题:偶数参与者allowTeams验证失败
问题背景
正在学习ChainShot的Solidity智能合约入门课程,完成Game合约练习时遇到问题:需求为构造函数存储participants数量,仅当参与者为偶数时allowTeams设为true。当前代码通过12个测试中的9个,但3个偶数参与者(2、4、6人)的“should allow teams”测试未通过。IDE限制不可修改构造函数参数或新增函数,求修改方案。
相关代码
UIntFunctions库代码
library UIntFunctions { function isEven(uint x) public pure returns(bool) { return (x % 2 == 0); } }
我的Game合约代码
import "./UIntFunctions.sol"; contract Game { using UIntFunctions for uint; uint public participants; bool public allowTeams; constructor(uint _participants) { participants = _participants; } function isEven(uint _participants) public returns(bool) { if (_participants.isEven()) { return allowTeams = true; } else return allowTeams; } }
问题原因
测试失败的核心原因:
- 构造函数仅存储了participants,但未根据其奇偶性初始化allowTeams,导致allowTeams默认保持
false,而测试可能直接在合约部署后检查该状态,未调用isEven函数。 - 现有
isEven函数依赖传入的参数而非合约存储的participants判断奇偶性,逻辑不符合需求(需求要求allowTeams由构造函数存储的参与者数量决定)。
修改方案
在不修改构造函数参数、不新增函数的前提下,调整两处代码:
- 构造函数中初始化allowTeams为合约存储participants的奇偶性结果。
- 修改
isEven函数逻辑,基于合约存储的participants判断奇偶性并更新allowTeams,忽略传入参数(确保逻辑符合需求)。
修改后的Game合约代码
import "./UIntFunctions.sol"; contract Game { using UIntFunctions for uint; uint public participants; bool public allowTeams; constructor(uint _participants) { participants = _participants; // 初始化时直接根据参与者数量设置allowTeams allowTeams = participants.isEven(); } function isEven(uint _participants) public returns(bool) { // 基于合约存储的participants判断,更新并返回allowTeams状态 allowTeams = participants.isEven(); return allowTeams; } }
说明
- 构造函数初始化allowTeams后,合约部署时allowTeams就处于正确状态,满足测试直接检查的场景。
- 修改后的
isEven函数始终基于合约存储的参与者数量判断,确保无论传入什么参数,都符合需求逻辑,同时更新allowTeams状态。
内容的提问来源于stack exchange,提问作者Syd97A7X
相关产品推荐
相关产品推荐

