只有合约的所有者才能更新智能合约 - 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. 现在从浏览器到设置更新用户名 页。您会看到用户名已更新并且此更改是 也反映在浏览器上 二,不管地址被 从浏览器的改变。
  9. 当我们试图通过交换代币来获得积分时,也会发生同样的情况。从浏览器一请求成功,但从浏览器二它抛出一个错误,指示“ERC20:转账金额超过余额”。即使用户在他们的帐户中也有令牌。

编辑

我想出了一个办法来处理这个问题。问题是数据被正确保存,但在获取记录时,solidity 将 msg.sender 分配给合约的创建者,而不是发送交易的人。因此,为了处理这个问题,我在调用函数中从前端发送用户地址,并在各个函数中接收该地址作为参数。因此,我没有使用 msg.sender,而是使用从前端收到的地址。

问题的答案

我想出了一个办法来处理这个问题。问题是数据被正确保存,但在获取记录时,solidity 将 msg.sender 分配给了合约的创建者,而不是发送交易的人。因此,为了处理这个问题,我在调用函数中从前端发送用户地址,并在各个函数中接收该地址作为参数。因此,我没有使用 msg.sender,而是使用从前端收到的地址。