Как запросить структуру по нескольким атрибутам в Solidity? - PullRequest
0 голосов
/ 28 мая 2018

Предположим, у меня есть следующий контракт:

contract UserContract {
    struct User {
        address walletAddress;
        string organisation;
        string fName;
        string lName;
        string email;
        uint index;
    }
    mapping(address => User) private users;
    address[] private userIndex;
}

Я знаю, как написать функцию, которая возвращает информацию о пользователе, соответствующую данному address, но я также хотел бы написать функцию, которая можетполучить информацию о пользователе по адресу электронной почты User.

Как это работает?Является ли мой единственный вариант создания отдельного отображения для этого варианта использования, который отображает структуру User в строку?Если так, значит ли это, что структура хранится два раза?Или он хранит только ссылки на эту структуру?

Спасибо!

1 Ответ

0 голосов
/ 28 мая 2018

Если вы хотите выполнить поиск по адресу или электронной почте (т. Е. НЕ составному ключу), то да, самый простой вариант - использовать два разных mappings.Однако значения struct хранятся в виде копий (см. this для получения информации о том, как хранятся отображения).

Чтобы избежать дополнительного хранилища для сложных structs, сохраните его в массиве ииспользуйте индекс для значений mapping.

contract UserContract {
    struct User {
        address walletAddress;
        string organisation;
        string fName;
        string lName;
        string email;
        uint index;
    }
    User[] users;
    mapping(address => uint256) private addressMap;
    mapping(string => uint256) private emailMap; // Note this must be private if you’re going to use `string` as the key. Otherwise, use bytes32
    address[] private userIndex;
}
...