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