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