如何在Solidity中通过多个属性查询结构?

时间:2018-05-28 15:58:41

标签: ethereum solidity truffle

假设我有以下合同:

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 :(得分:3)

如果您想通过地址或电子邮件(即非复合键)进行搜索,那么最简单的选择是使用两个不同的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;
}