如何获取彩票智能合约的中奖者地址?Solidity开发求助
问题分析与解决方案
现存问题
- 你的
draw_daily函数中,lucky_winner是局部变量,没有赋值给全局结构体Daily的lucky_winner字段,导致开奖后链上不会存储中奖地址。 get_daily_winner函数返回值类型错误:结构体中的lucky_winner是单个address,但函数返回address[] memory(地址数组),类型不匹配会直接编译报错。
正确实现步骤
1. 修正结构体语法错误
你的lottery_draw结构体中,address lucky_winner末尾缺少分号,先补全:
address owner; struct lottery_draw{ uint256 price; uint256 time_start; uint256 time_end; address[] participants; uint256 total_amount; uint256 owner_share; address lucky_winner; // 补上分号,修正语法 } lottery_draw Daily; lottery_draw Weekly; lottery_draw Monthly;
2. 修改draw_daily函数,存储中奖地址到结构体
在函数中新增一行,把局部变量的中奖地址赋值给Daily.lucky_winner,确保数据持久化到链上:
function draw_daily(uint256 _randomness) public payable onlyOwner returns(address){ require(Daily.time_end < block.timestamp, 'Draw period not over'); uint256 index = generate_random(_randomness, (Daily.participants.length)); uint256 prize = Daily.total_amount - ((Daily.total_amount * Daily.owner_share)/100); address lucky_winner = Daily.participants[index]; Daily.lucky_winner = lucky_winner; // 新增:将中奖地址存入全局结构体 Daily.total_amount = 0; delete Daily.participants; return lucky_winner; }
3. 修正get_daily_winner函数的返回值类型
将返回值改为单个address,与结构体字段类型匹配:
function get_daily_winner() public view returns(address){ return Daily.lucky_winner; }
额外提示
- 每期开奖后,如果需要开启新一期,建议将
Daily.lucky_winner重置为address(0),避免旧中奖地址干扰新期数据。 - 确保
generate_random函数生成的索引范围在0到Daily.participants.length-1之间,防止数组越界报错。
内容的提问来源于stack exchange,提问作者user19329142
相关产品推荐
相关产品推荐

