簡體   English   中英

只有合約的所有者才能更新智能合約 - Solidity

[英]Only the owner of the contract can update the smart contract - Solidity

我正在開發一個保存用戶信息的智能合約。 問題是當我嘗試從沒有部署合約的地址更新用戶信息時,請求成功但用戶信息沒有變化。 但是當我從部署合約的地址更改用戶信息時,它會更改所有用戶的用戶信息。 無論帳戶是否不同,更改都會反映在所有帳戶上。

function setUserName(string memory _userName) public {
    users[msg.sender].userName = _userName;
}

這是我更新用戶信息的功能。 我相信“msg.sender”是調用合約的人,而不是部署合約的人。 我正在使用 metamask 和 ganache 作為帳戶。 第一個帳戶在 chrome 瀏覽器中添加到 metamask,第二個帳戶在 mozilla firefox 中添加到 metamask。

重現用戶名錯誤的步驟:

  1. 打開兩個不同的瀏覽器
  2. 啟動ganache服務器
  3. 在瀏覽器中,將第一個地址的私鑰添加到元掩碼以添加 ETH
  4. 在瀏覽器中,將第二個地址的私鑰添加到元掩碼中以添加 ETH
  5. 使用“ truffle migrate --reset ”部署合約
  6. 它將遷移與ganache中第一個地址的合約
  7. 從瀏覽器兩個嘗試更新用戶名。 您將看到更新成功但用戶名未更新(即使在刷新后)。
  8. 現在從瀏覽器一通過轉到設置頁面更新用戶名。 您將看到用戶名已更新,並且此更改也反映在瀏覽器 2 上,無論從瀏覽器更改的地址如何。
  9. 當我們嘗試通過交換代幣來獲得積分時,也會發生同樣的情況。 從瀏覽器一請求成功,但從瀏覽器二它拋出一個錯誤,指示“ERC20:轉賬金額超過余額”。 即使用戶在他們的帳戶中也有令牌。

編輯

我想出了一個辦法來處理這個問題。 問題是數據被正確保存,但在獲取記錄時,solidity 將 msg.sender 分配給合同的創建者,而不是發送交易的人。 因此,為了解決這個問題,我在調用函數中從前端發送用戶地址,並在相應函數中接收該地址作為參數。 因此,我沒有使用 msg.sender,而是使用我從前端收到的地址。

回答問題

我想出了一個辦法來處理這個問題。 問題是數據被正確保存,但在獲取記錄時,solidity 將 msg.sender 分配給合同的創建者,而不是發送交易的人。 因此,為了解決這個問題,我在調用函數中從前端發送用戶地址,並在相應函數中接收該地址作為參數。 因此,我沒有使用 msg.sender,而是使用我從前端收到的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM