我正在为身份识别人员创建合同,我需要验证是否有一些合同具有相同的地址、电子邮件或电话号码。
示例:
contract Person {
//date of create
uint public dateCreate;
//name of person
string public name;
//variables to be validates
string public email;
string public phone;
// constructor
function Person(string _name, string _email, string _phone) public {
name = _name;
email = _email;
phone = _phone;
owner = msg.sender;
}
}我可以选择将地址契约保存在与密钥电子邮件或电话的映射中。
contract RegisterPerson {
//save the contract address person using the key of the email
mapping(bytes32=>address) public addressEmail;
}有这个解决方案,但我相信它不会更好,因为映射它将是非常大的和昂贵的合同。
有没有人知道另一个解决方案?
发布于 2018-01-26 01:19:17
你不应该使用契约来表示一个对象,就像你在这里尝试做的那样。这不仅是非常昂贵的,因为合同部署通常比事务更昂贵,而且你也不能保证唯一性。
您应该使用struct来表示个体。
contract PersonStorage {
struct Person {
uint dateCreate;
string name;
string email;
string phone;
}
mapping(bytes32 => Person) persons;
function addPerson(string _name, string _email, string _phone) public {
Person memory person;
person.name = _name;
person.email = _email;
person.phone = _phone;
persons[keccak256(person.email)] = person;
}
...
}现在,您的约定是所有Person的数据存储。您可以部署此版本,并将约定地址传递给任何需要访问它的约定。您还可以将所有数据集中起来,以防您需要允许多个业务逻辑合同使用这些数据,或者需要升级您的业务合同。
编辑-我应该注意到,如果这是在它自己的合同中,您将不得不从string更改为bytes32。你不能在合约之间发送字符串。
https://stackoverflow.com/questions/48446912
复制相似问题