Solidity

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

  • October 13, 2021

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

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

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

重現使用者名錯誤的步驟:

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

編輯

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

回答問題

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

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