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