如何获取去中心化彩票应用中奖者的地址



我用solid创建了一个彩票应用程序。所有的事情都工作得很好,但我想添加这个功能,当获胜者被选中时,它应该返回给我获胜者的地址。

我能做些什么?任何帮助将不胜感激,谢谢。这是我的代码。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Lottery_Application {
address public manager;
address payable[] public participants;
constructor() {
manager=msg.sender;
}
receive() external payable {
require(msg.value>=1 ether);
participants.push(payable(msg.sender));
}
function getbalance() public view returns(uint) {
require(msg.sender==manager);
return address(this).balance;
}
function random() public view returns(uint) {
return uint(keccak256(abi.encodePacked(block.difficulty,block.timestamp,participants.length)));
}
function selectwinner() public returns(address) {
require(msg.sender==manager);
require(participants.length>=3);
uint r=random();
address payable winner;
uint index=r% participants.length;
winner=participants[index];
winner.transfer(getbalance());
winner=address(msg.sender);
return winner;
}
}

状态更改函数无法返回任何内容。有两种方法。

  1. 创建和使用事件。

event WinnerSelected(address winner)

在winnerSelect函数的末尾,emit WinnerSelected(winner).

  1. 创建一个全局变量来存储最近的获胜者。address public recentWinner

在winnerSelect函数结束时,recentWinner = winner.

您可以声明一个公共变量,并在该变量中传递获胜者数组。查看下面的代码,注意被注释的行。

例如。

SPDX-License-Identifier: MIT pragma solidity ^0.8.9;

contract lotteryProject
{
address public  owner;
address public addressofwinner;   //public variable to store the address of winner
address payable []  public  part;
receive() external payable virtual {}
uint value;
constructor()
{
owner=msg.sender;
}
function depositEthers() public payable{
require( msg.value==10 ether , " 2Ethers are required to participate in this lottery: ");
// participants[msg.sender]= value;
part.push(payable(msg.sender));
}
function totalDeposits()public view returns(uint)
{   
require (msg.sender== owner, "Only owner is 
authorized to chech the total deposits");
return address(this).balance;
}
//ethers deposition has been completed 
//now ethers randomization is reamang 
function random()public view returns (uint) 
{
require(msg.sender==owner);
return uint(keccak256(abi.encodePacked(block.prevrandao,
block.timestamp , part.length)));
}
function winner()public
{
require(msg.sender==owner);
require(part.length>=3);
uint r = random();

uint index = r % part.length;
address payable  won ;
won= part[index]; 
addressofwinner=won;              //passing winner's address in the public variable 
won.transfer(totalDeposits());
part= new address payable[](0);   //TO empty the array after assigning a winner
} 
}