【发布时间】: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。
重现用户名错误的步骤:
- 打开两个不同的浏览器
- 启动 ganache 服务器
- 在浏览器中,将第一个地址的私钥添加到元掩码中 为了添加 ETH
- 在浏览器二中将第二个地址的私钥添加到元掩码中 为了添加 ETH
- 使用“truffle migrate --reset”部署合约
- 它将迁移 ganache 中第一个地址的合约
- 从浏览器两个尝试更新用户名。你会看到的 更新成功但用户名没有更新(甚至 刷新后)。
- 现在从浏览器一中通过转到设置来更新用户名 页。您将看到用户名已更新,并且此更改为 也反映在浏览器二上,不管地址是什么 从浏览器的改变。
- 当我们尝试通过交换代币获得积分时也会发生同样的情况。从浏览器一请求成功,但从浏览器二它抛出一个错误,指示“ERC20:转账金额超过余额”。甚至用户的帐户中都有令牌。
编辑
我已经找到了解决这个问题的方法。问题是数据被正确保存,但是在获取记录时,solidity 将 msg.sender 分配给合约的创建者,而不是发送交易的人。因此,为了解决这个问题,我在调用函数中从前端发送用户地址,并在各个函数中接收地址作为参数。因此,我没有使用 msg.sender,而是使用从前端收到的地址。
【问题讨论】:
-
您是否尝试过在 etherscan 等浏览器上查看交易?
-
谢谢@JacopoMosconi。我想出了一个办法来处理这个问题。问题是数据被正确保存,但是在获取记录时,solidity 将 msg.sender 分配给合约的创建者,而不是发送交易的人。因此,为了解决这个问题,我在调用函数中从前端发送用户地址,并在各个函数中接收地址作为参数。因此,我没有使用 msg.sender,而是使用从前端收到的地址。
标签: blockchain ethereum solidity web3 metamask