如何返回地址[msg.sender]对应的映射输入值



我正在努力创建一个可靠的彩票智能合约。我尝试了几种方法,首先我将所有玩家地址存储在一个数组中,但不幸的是,逻辑失败了,只是因为数组执行缓慢(当条目超过1000+时)。

现在我正在尝试映射mapping(address => Struct) entries;。现在我所做的。我创建了一个结构,其中包含用户第一个票号和用户最后一个票号,即uint userFstTcktNumber;uint userLstTcktNumber;

这是我的结构

struct UserInfo {
uint userFstTcktNumber;
uint userLstTcktNumber;
} UserInfo userinfo;

然后创建一个映射

mapping(address => UserInfo )  public entry;

然后我创建了一个函数来输入映射和结构中的值。

function letsdo(uint first, uint last) public{
entry[msg.sender];
userinfo.userLstTcktNumber = first;
userinfo.userLstTcktNumber = last;
}

现在我想做什么?我只想从对应于地址的映射和结构中获得值,假设我有来自"0x617F2E2fD72FD9D5503197092aC168c91465E7f2"地址的1 to 10的10个条目。还有另外50个条目来自11 to 51,来自另一个地址"0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C"

返回这个,我使用函数

function get(address) public view returns(uint, uint){
return (userinfo.userFstTcktNumber, userinfo.userLstTcktNumber); 
}

但是它没有返回给我预期的结果。

它总是返回userFstTcktNumber是0,不管我在get()里面传递了什么地址。

这段代码有什么问题?

您没有真正使用您的地图,您需要设置值以便能够在其中进行搜索。

function letsdo(uint first, uint last) public {
entry[msg.sender] = UserInfo(first, last);
}

您也不需要get函数,因为条目已经是公共的,您可以直接使用entry[<address>]

进行搜索。struct之后的UserInfo userinfo也是不必要的,因为您想使用map,您将需要的不仅仅是一个实例,我上面提到的letsdo函数已经在做了

嘿,谢谢大家帮我解决这个问题,其实昨晚我自己解决了。下面是这个问题的完整逻辑。

pragma solidity ^0.4.18; 
contract lottery{
uint public lastTicketNumber = 0;
uint youEntredWithAmount;
address [] public players;
uint public entryFee =  0.01 ether;

struct UserInfo {
uint userFstTcktNumber;
uint userLstTcktNumber;
}

mapping(address => UserInfo ) public entry;

function letsdo(uint first, uint last) public{
players.push(msg.sender);
entry[msg.sender].userFstTcktNumber = first;
entry[msg.sender].userLstTcktNumber = last;
}

function currentLevel(address userAddress) public constant returns (uint, uint) {
return (entry[userAddress].userFstTcktNumber, entry[userAddress].userLstTcktNumber);
}



function numberOfParticipents() public view returns(address [] memory){
return players;
}
}