You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取彩票智能合约的中奖者地址?Solidity开发求助

问题分析与解决方案

现存问题

  1. 你的draw_daily函数中,lucky_winner是局部变量,没有赋值给全局结构体Daily的lucky_winner字段,导致开奖后链上不会存储中奖地址。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:36:07