gpt4 book ai didi

blockchain - Msg.sender 在 "view"函数内不起作用,为什么?有解决方法吗?

转载 作者:行者123 更新时间:2023-12-04 22:55:06 29 4
gpt4 key购买 nike

我想创建一个可查看的函数(需要向用户返回一个字符串)来搜索 msg.sender 的映射,如果发件人值为 x,我希望契约(Contract)相应地进行。这一切都在 remix 中工作,但如果我将它上传到 ropsten,它就不再存在了。这是一个已知的问题?我也尝试过 tx.origin,结果相同。
这是我试过的有问题的代码:

function getLink() public view returns(string){
if(tokenBalances[msg.sender]>0){
return link;
}else{
return "You need to purchase a token at first...";
}
}

编辑:我认为问题是,在使用可视函数时没有 msg.sender 因为没有实际交易?有没有办法在不使用“ View ”函数的情况下向用户返回一个值?

最佳答案

简答
msg.sender确实适用于 view功能,尽管它作为授权方案没有用。您使用的查找工具应该具有设置发件人的机制。

调用 vs 事务

首先,了解 difference between a call and a transaction 很重要.

看来您正在运行 call ,它运行速度很快并且不会改变区块链的状态。 msg.sender在事务和调用中设置。在交易中,它不能被伪造:您必须拥有与给定帐户相关联的私钥。但在 call ,您可以随意将发件人设置为您喜欢的任何值。

设置发件人

您如何设置发件人取决于您使用的调用工具。该工具可能是 web3.js、web3.py、Mist、MyEtherWallet、MyCrypto 等。它们都有(或可能没有!)一种在调用中设置发件人的机制。

我的以太钱包

在评论中,您特别提到了 MyEtherWallet。在快速搜索中,我没有找到有关如何设置发件人的任何信息。 ethereum.stackexchange 上有一个悬而未决的问题似乎值得关注,因为它提出了大致相同的问题:How to check msg.sender balance with MyEtherWallet contract

契约(Contract)变通方法

is it possible to specify such settings for the contract?



没有办法帮助某人从契约(Contract)内部设置发件人。但是您可以提供一种将地址作为参数的不同方法。然后像 MyEtherWallet 这样的工具将允许您设置感兴趣的地址。例如:
function getLink(address account) public view returns(string){
if(tokenBalances[account] > 0){
return link;
}else{
return "You need to purchase a token at first...";
}
}

隐藏数据

值得注意的是,通过检查 msg.sender 隐藏数据没用。 任何人都可以在通话中设置假发件人(或直接检查区块链状态)。所以,绕过这个“保护”是微不足道的。

关于blockchain - Msg.sender 在 "view"函数内不起作用,为什么?有解决方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51847788/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com