pragma solidity ^0.4.17;
// I want to write a code for loyalty points when user pays
contract GiveRefreceId {
struct referenceids {
uint256 rid ;
address addressrid;
}
mapping(uint256 => referenceids) referenceid;
referenceids[] lenrefrenceid;
function giveRefrenceId() public returns (uint256) {
for (uint256 i=0 ;i<=lenrefrenceid.length; i++){
require( lenrefrenceid[i] != msg.sender);
}
uint256 lenvarble = lenrefrenceid.length;
referenceids storage temprid = referenceid[lenvarble];
temprid.rid = lenvarble;
temprid.addressrid = msg.sender;
lenrefrenceid.push(temprid);
return lenvarble;
}
function getrefrnceId() view returns(uint256) {
return ((lenrefrenceid.length)-1);
}
}
1) Я написал функцию для предоставления идентификатора ссылки пользователю
2) Я хочу запретить пользователю вызывать giverefrenceid
функцию только один раз, поэтому я научил писать цикл for и проверять, присутствует ли адрес в массиве или нет.
3) но я получаю ошибку
Operator != not compatible with types struct GiveRefreceId.referenceids storage ref and address
require( lenrefrenceid[i] != msg.sender);
4) Я знаю, что он жалуется на то, что struct и require не могут быть использованы, но я не нашел другого варианта для проверки.
5) Газ будет стоить дороже, если число увеличится. Любой способ избежать цикла for и проверить, что пользователь вызывает функцию в первый раз.
6) Я не хочу писать две функции, я хочу получить идентификатор, используя одну функцию, есть ли способ?
Код ниже должен сделать.
Функция giveReferenceId
присваивает идентификатор пользователю на основе адреса. Массив clients
сохраняет список пользователей (на тот случай, если вам понадобится этот список в какой-то момент).
Чтобы убедиться, что один и тот же адрес получает только один идентификатор, используется строка: require(referenceid[msg.sender]==0);
, поскольку 0 является недопустимым идентификатором, что означает, что пользователь не зарегистрирован.
Функция getrefrnceId() возвращает идентификатор пользователя, выполнившего функцию.
pragma solidity ^0.4.25;
contract GiveRefreceId {
mapping(address => uint256) public referenceid;
address[] public clients;
uint256 idcounter;
event createdId(address user, uint256 id);
function giveRefrenceId() public returns (uint256) {
require(referenceid[msg.sender]==0);
idcounter += 1;
clients.push(msg.sender);
referenceid[msg.sender] = idcounter;
emit createdId(masg.sender,idcounter);
return idcounter;
}
function getrefrnceId() public view returns(uint256) {
return referenceid[msg.sender];
}
}
Надеюсь это поможет
getrefrnceId()
, которая возвращает идентификатор пользователя, который ее вызывает. это то, что вы имели ввиду?
Хайме
МД Венкатеш
Хайме
МД Венкатеш