Solidity

如何將所有使用者的數據分別儲存到智能合約中

  • April 13, 2022

在智能合約上儲存使用者數據的最佳方式是什麼?假設我們有n個使用者,我們想要儲存每個使用者的使用者名和他/她的其他詳細資訊。例如,如果我輸入我的錢包地址,應該只顯示我的數據。如何做到這一點?請幫忙謝謝:)

我想實現這一點:

"address": {
   "data": {},
   "posts": [{
      ...
    }]
}

如果我理解這個問題,解決方案可能是這樣的:

//SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

contract Users {
   mapping(address => User) _user;

   struct User {
       string _username;
       uint _age;
       // define other information
   }

   function addUser(address _userAddress, string memory _username, uint _age) public {
       _user[_userAddress] = User(_username, _age);
   }

   function getUser(address _address) view public returns(User memory) {
       return _user[_address];
   }
}

使用function addUser()您將使用者添加到結構中。而當您呼叫 時function getUser(),您可以檢索定義到結構中的所有資訊,該結構引用特定地址。

編輯 1

您可以通過結構映射存檔。


// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.12;
contract Test{
       struct user{
         string firstName;
         string lastName;
         uint256 id;   
        }
       mapping(address=>user) public userData;
       function add(address _user,string memory _fname,string memory _lname,uint256 _id) public {
              userData[_user].firstName = _fname;
              userData[_user].lastName = _lname;
              userData[_user].id = _id;
       }
}

編輯 2

如果使用者未添加到使用者結構中並且他嘗試呼叫 getUser 函式,它將恢復。


// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.12;
contract Test{
       struct user{
               address _address;
               string firstName;
               string lastName;
               uint256 id;   
        }
       mapping(address=>user) userData;
       function add(address _user,string memory _fname,string memory _lname,uint256 _id) public {
              userData[_user]._address = _user;
              userData[_user].firstName = _fname;
              userData[_user].lastName = _lname;
              userData[_user].id = _id;
       }

       function getUser() public view returns(address){
               require(userData[msg.sender]._address == msg.sender , "You are not allowed.");
               return userData[msg.sender]._address;
       }
}

引用自:https://ethereum.stackexchange.com/questions/123439