Msg.sender 在 "view" 函数中不起作用,为什么?有解决方法吗?
Msg.sender does not work inside a "view" function, why? Is there a workaround?
我想创建一个可查看的函数(需要 return 一个字符串给用户)搜索 msg.sender 的映射,如果发件人值为 x,我希望合同继续因此。这一切在 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" 函数的情况下 return 向用户提供一个值?
简答
msg.sender
确实在 view
函数中起作用,尽管它作为授权方案是无用的。您使用的查找工具应该有设置发件人的机制。
通话与交易
首先,了解 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
合同变通办法
is it possible to specify such settings for the 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
来隐藏数据是没有用的。 任何人都可以在调用中设置假发件人(或直接检查区块链状态)。所以,绕过这个 "protection."
是微不足道的
我想创建一个可查看的函数(需要 return 一个字符串给用户)搜索 msg.sender 的映射,如果发件人值为 x,我希望合同继续因此。这一切在 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" 函数的情况下 return 向用户提供一个值?
简答
msg.sender
确实在 view
函数中起作用,尽管它作为授权方案是无用的。您使用的查找工具应该有设置发件人的机制。
通话与交易
首先,了解 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
合同变通办法
is it possible to specify such settings for the 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
来隐藏数据是没有用的。 任何人都可以在调用中设置假发件人(或直接检查区块链状态)。所以,绕过这个 "protection."