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



假设我有以下合约:

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结构映射到字符串?如果是这样,这是否意味着结构被存储两次?还是它只存储对该结构的引用?

谢谢!

如果您想按地址或电子邮件(即不是组合键(进行搜索,那么是的,最简单的选择是使用两种不同的mappings。但是,struct值存储为副本(有关如何存储映射的信息,请参阅此处(。

为了避免为复杂的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;
}

最新更新