Solidity
如何將所有使用者的數據分別儲存到智能合約中
在智能合約上儲存使用者數據的最佳方式是什麼?假設我們有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; } }