如何为赛事投注智能合约添加单场投注开启与关闭功能
赛事投注合约单场开关改造方案
改造核心思路
原合约仅通过单个全局布尔变量控制所有赛事的投注状态,要实现单场独立控制,只需新增赛事维度的投注状态映射、调整投注校验逻辑、新增单场控制接口即可完成改造。
具体实现步骤
- 第一步:新增单场投注状态存储变量
在合约状态变量定义区域新增映射,存储每个赛事ID对应的投注开关状态:
// 键为赛事ID,值为对应赛事是否开放投注 mapping(uint16 => bool) public matchBettingActive;
如果需要保留原有的全局投注总开关能力,可同时保留原有bettingActive全局变量,不需要的话可以直接删除该变量及对应的全局开关函数
- 第二步:调整投注函数的校验逻辑
在现有bet函数的校验部分新增指定赛事的投注开放状态校验:
function bet(uint16 _matchSelected, uint16 _resultSelected) public payable { // 原有校验逻辑保留 require(msg.value >= minimumBet); // 新增单场投注开关校验,如果保留全局开关可同时增加全局校验 require(matchBettingActive[_matchSelected], "当前赛事已关闭投注"); // 保留全局开关的话可新增下方校验行 // require(bettingActive, "全局投注已关闭"); // --- 以下原有业务逻辑完全保持不变 --- //Set the player informations : amount of the bet, match and result selected playerInfo[msg.sender].amountBet = msg.value; playerInfo[msg.sender].matchSelected = _matchSelected; playerInfo[msg.sender].resultSelected = _resultSelected; //Add the address of the player to the players array players.push(msg.sender); //Finally increment the stakes of the team selected with the player bet if ( _resultSelected == 1){ totalBetHome[_matchSelected] += msg.value; } else if( _resultSelected == 2){ totalBetAway[_matchSelected] += msg.value; } else{ totalBetDraw[_matchSelected] += msg.value; } }
- 第三步:新增单场投注开关控制函数
新增两个带onlyOwner权限修饰的函数,用于单独开启/关闭指定赛事的投注:
// 开启指定赛事的投注 function beginMatchBetting(uint16 _matchId) public onlyOwner returns(bool) { matchBettingActive[_matchId] = true; return true; } // 关闭指定赛事的投注 function closeMatchBetting(uint16 _matchId) public onlyOwner returns (bool) { matchBettingActive[_matchId] = false; return true; }
- 第四步:可选兼容处理
如果不需要保留原有的全局投注控制能力,可直接删除原来的beginVotingPeriod、closeVoting函数和对应的bettingActive全局变量。如果需要保留全局开关作为总闸,保留原有全局变量和函数,同时按第二步注释补充全局开关校验即可。
内容的提问来源于stack exchange,提问作者Lloyd Ramos
相关产品推荐
相关产品推荐

