Solidity
只有合約的所有者才能更新智能合約 - Solidity
我正在開發一個保存使用者資訊的智能合約。問題是當我嘗試從沒有部署合約的地址更新使用者資訊時,請求成功但使用者資訊沒有變化。但是,當我從部署契約的地址更改使用者資訊時,它會更改所有使用者的使用者資訊。就像更改反映在所有帳戶上一樣,無論帳戶是否不同。
function setUserName(string memory _userName) public { users[msg.sender].userName = _userName; }
這是我更新使用者資訊的功能。我相信“msg.sender”是呼叫合約的那個,而不是部署合約的那個。我正在為帳戶使用 metamask 和 ganache。第一個帳戶添加到 chrome 瀏覽器中的 metamask,第二個帳戶添加到 mozilla firefox 中的 metamask。
重現使用者名錯誤的步驟:
- 打開兩個不同的瀏覽器
- 啟動甘納許伺服器
- 在瀏覽器中,將第一個地址的私鑰添加到元遮罩以添加 ETH
- 在瀏覽器二中,將第二個地址的私鑰添加到元遮罩中以添加 ETH
- 使用“ truffle migrate –reset ”部署合約
- 它將遷移具有 ganache 中第一個地址的合約
- 從瀏覽器兩個嘗試更新使用者名。您將看到更新成功但使用者名未更新(即使在刷新後)。
- 現在從瀏覽器一通過轉到設置頁面來更新使用者名。您將看到使用者名已更新,並且此更改也反映在瀏覽器二上,無論從瀏覽器更改的地址如何。
- 當我們嘗試通過交換代幣獲得積分時也會發生同樣的情況。從瀏覽器 1 請求成功,但從瀏覽器 2 拋出錯誤,指示“ERC20:轉賬金額超過餘額”。甚至使用者的帳戶中也有令牌。
編輯
我想出了一個辦法來處理這個問題。問題是數據被正確保存,但是在獲取記錄時,solidity 將 msg.sender 分配給合約的創建者,而不是發送交易的人。因此,為了解決這個問題,我在呼叫函式中從前端發送使用者地址,並在各個函式中接收地址作為參數。因此,我沒有使用 msg.sender,而是使用從前端接收的地址。
回答問題
我想出了一個辦法來處理這個問題。問題是數據被正確保存,但是在獲取記錄時,solidity 將 msg.sender 分配給合約的創建者,而不是發送交易的人。因此,為了解決這個問題,我在呼叫函式中從前端發送使用者地址,並在各個函式中接收地址作為參數。因此,我沒有使用 msg.sender,而是使用從前端接收的地址。