身份识别合同
Contract for Person Identification
我正在为识别人创建合同,我需要验证是否有一些合同具有相同的地址、电子邮件或 phone 号码。
示例:
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;
}
}
我可以选择使用密钥电子邮件或 phone 将地址合同保存在映射中。
contract RegisterPerson {
//save the contract address person using the key of the email
mapping(bytes32=>address) public addressEmail;
}
有这个解决方案,但我认为不是更好,因为映射会很大,合同也很贵。
有人知道另一个解决方案吗?
你不应该像你在这里试图做的那样使用合同来代表一个对象。不仅成本非常高,因为合约部署通常比交易昂贵得多,而且你也不能保证唯一性。
您应该使用 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
。您不能在合同之间发送字符串。
我正在为识别人创建合同,我需要验证是否有一些合同具有相同的地址、电子邮件或 phone 号码。
示例:
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;
}
}
我可以选择使用密钥电子邮件或 phone 将地址合同保存在映射中。
contract RegisterPerson {
//save the contract address person using the key of the email
mapping(bytes32=>address) public addressEmail;
}
有这个解决方案,但我认为不是更好,因为映射会很大,合同也很贵。
有人知道另一个解决方案吗?
你不应该像你在这里试图做的那样使用合同来代表一个对象。不仅成本非常高,因为合约部署通常比交易昂贵得多,而且你也不能保证唯一性。
您应该使用 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
。您不能在合同之间发送字符串。