【问题标题】:How to return the Entered Value from Mapping Corresponds to address[msg.sender]如何将输入的值从映射对应返回到地址 [msg.sender]
【发布时间】:2021-10-06 12:55:36
【问题描述】:

我正在努力创建一个可靠的彩票智能合约。我尝试了几种方法,首先我将所有玩家地址存储在一个数组中,但不幸的是,该逻辑失败,只是因为数组执行速度慢(当条目超过 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;
    }

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

为了返回这个,我使用了函数

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

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

无论我在get() 中传递了什么地址,它总是返回userFstTcktNumber 为0。

这段代码有什么问题?

【问题讨论】:

    标签: solidity smartcontracts


    【解决方案1】:

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

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

    你也不需要get函数,因为条目已经公开,你可以直接使用entry[<address>]搜索

    UserInfo userinfo之后你的struct也不需要了,因为你要使用map,你需要的不仅仅是一个实例,我上面提到的letsdo函数已经在做

    【讨论】:

      【解决方案2】:

      谢谢大家帮助我,其实昨晚我自己整理好了。这是问题的完整逻辑。

      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;
            }
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 2021-01-09
        • 2023-03-03
        相关资源
        最近更新 更多