如何在 Solidity 中通过多个属性查询结构?
How to query a struct by multiple attributes in 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;
}
我知道如何编写一个returns用户信息对应给定address
的函数,但我还想编写一个可以通过[=12]获取用户信息的函数=]的电子邮件地址。
这是如何工作的?我唯一的选择是为这个用例创建一个单独的映射,将 User
结构映射到一个字符串吗?如果是这样,这是否意味着该结构被存储了两次?或者它只存储对该结构的引用?
谢谢!
如果您想通过地址或电子邮件(即,不是复合键)进行搜索,那么是的,最简单的选择是使用两个不同的 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;
}
假设我有以下合约:
contract UserContract {
struct User {
address walletAddress;
string organisation;
string fName;
string lName;
string email;
uint index;
}
mapping(address => User) private users;
address[] private userIndex;
}
我知道如何编写一个returns用户信息对应给定address
的函数,但我还想编写一个可以通过[=12]获取用户信息的函数=]的电子邮件地址。
这是如何工作的?我唯一的选择是为这个用例创建一个单独的映射,将 User
结构映射到一个字符串吗?如果是这样,这是否意味着该结构被存储了两次?或者它只存储对该结构的引用?
谢谢!
如果您想通过地址或电子邮件(即,不是复合键)进行搜索,那么是的,最简单的选择是使用两个不同的 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;
}