个人身份识别合同



>我正在为身份识别人员创建一个合同,我需要验证是否有一些具有相同地址、电子邮件或电话号码的合同。

例:

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;
}

有这个解决方案,但我相信它不是更好的,因为映射它会非常大,合同也很昂贵。

有人知道另一种解决方案吗?

你不应该像你在这里尝试的那样使用合约来表示一个对象。它不仅非常昂贵,因为合约部署通常比交易贵得多,而且您也不能保证唯一性。

您应该使用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.不能在合约之间发送字符串。

最新更新