【问题标题】:Only the owner of the contract can update the smart contract - Solidity只有合约的所有者才能更新智能合约 - Solidity
【发布时间】:2021-11-28 14:13:48
【问题描述】:

我正在开发一个保存用户信息的智能合约。问题是当我尝试从没有部署合约的地址更新用户信息时,请求成功但用户信息没有变化。但是,当我从部署合同的地址更改用户信息时,它会更改所有用户的用户信息。就像更改会反映在所有帐户上一样,无论帐户是否不同。

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,而是使用从前端收到的地址。

【问题讨论】:

  • 您是否尝试过在 etherscan 等浏览器上查看交易?
  • 谢谢@JacopoMosconi。我想出了一个办法来处理这个问题。问题是数据被正确保存,但是在获取记录时,solidity 将 msg.sender 分配给合约的创建者,而不是发送交易的人。因此,为了解决这个问题,我在调用函数中从前端发送用户地址,并在各个函数中接收地址作为参数。因此,我没有使用 msg.sender,而是使用从前端收到的地址。

标签: blockchain ethereum solidity web3 metamask


【解决方案1】:

回答问题

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

【讨论】:

    猜你喜欢
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2023-01-30
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多