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

How to return the Entered Value from Mapping Corresponds to address[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;
    }

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

11 to 51 的另外 50 个条目

为了return这个我用的是函数

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

但这不是 return 给我预期的结果。

无论我在 get().

中传递了什么地址,userFstTcktNumber 总是 return 为 0

这段代码有什么问题?

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

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

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

进行搜索

UserInfo userinfo 之后你的结构也是不必要的,因为你想使用地图,你需要的不仅仅是一个实例,我上面提到的 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;
      }
}