Solidity

映射結構數據的儲存/檢索

  • July 28, 2021

我想將結構數據儲存在映射中,即如果我有如下所述的學生結構,那麼我應該能夠擁有無數學生並使用錢包地址區分他們。

我想明智地儲存學生數據帳戶,並允許通過錢包地址檢索這些數據。

我已經編寫了以下程式碼,但我只能檢索最近setData()的數據呼叫。

contract FormSubmit{

 struct Student {
 string  email;
 string  password;
 string  address1;
 string  address2;
 string  city;
 string  state;
 string  zip;
 }

 mapping(address => Student) Students;

function setData(address _address, string memory _email, string memory     _password,
string memory _address1, string memory _address2, string memory _city, string memory _state,
string memory _zip) public
{

 Students[_address].email = _email;
 Students[_address].password = _password;
 Students[_address].address1 = _address1;
 Students[_address].address2 = _address2;
 Students[_address].city = _city;
 Students[_address].state = _state;
 Students[_address].zip =_zip;
}

function getData(address _address) public view returns(string memory, string memory, string memory, string memory, string memory, string memory, string memory){
 return(Students[_address].email, 
 Students[_address].password,
 Students[_address].address1, 
 Students[_address].address2, 
 Students[_address].city, 
 Students[_address].state, 
 Students[_address].zip);
}}

請幫我

編輯

在此處輸入圖像描述

您可以在 getData 中看到我正在獲取最後儲存的學生的資訊,而不是儲存在同一地址上的前一個學生的資訊。

它在我的最終工作正常。

嚴肅地說,如果我setData()用所有填充了參數的函式參數呼叫然後呼叫,getData()那麼我可以通過將學生數據儲存在不同的錢包地址下來區分學生數據。

然而,將這樣的敏感資訊添加到像乙太坊這樣的公共區塊鏈中是一個可怕的案例。學生錢包可能不會受到其相關私鑰的公開賣淫的保護,但話雖如此,您似乎將儲存密碼和電子郵件地址,這讓我認為該智能合約可能用於某種 dApp 中需要某種額外的深度網路訪問。

我會比較把它放在乙太坊網路上,在不穿內衣的情況下跑過荊棘叢的速度非常快(TLDR:我不推薦)。

使用以下方法獲取和設置保存在一個特定地址上的多個學生

contract FormSubmit{

 struct Student {
     string  email;
 }

 event SetData (
    uint studentId
 );

 mapping(address => Student[]) Students;

function setData(address _address) public
{
 // this enables you to retreive a student detail
 // using the array index as id
 uint studentId = students.length;
 Student student = Student(_email);
 Students[_address].push(student);
 emit SetData(studentId); 
}

function getData(address _address, uint _studentId ) public view returns(string memory){
 return(Students[_address][_studentId].email);
}}

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