我想创建一个可查看的函数(需要向用户返回一个字符串),搜索msg.sender的映射,如果发件人的值为x,我希望 Contract 继续进行 . 这一切都在混音内部工作,但如果我上传到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,因为没有实际的事务?有没有办法在不使用“视图”功能的情况下将值返回给用户?
1 回答
简答
msg.sender
确实在view
函数中工作,尽管它作为授权方案是无用的 . 您使用的查找工具应该具有设置发件人的机制 .呼叫与交易
首先,了解difference between a call and a transaction非常重要 .
看起来你正在运行一个
call
,它运行得很快并且不会改变区块链的状态 .msg.sender
在交易和通话中均已设置 . 在事务中,它不能伪造:您必须具有与给定帐户关联的私钥 . 但是在call
中,您可以自由地将发件人设置为您喜欢的任何值 .设置发件人
如何设置发件人取决于您使用的工具来调用 . 该工具可能是web3.js,web3.py,Mist,MyEtherWallet,MyCrypto等 . 它们都有(或可能没有!)机制来设置呼叫中的发送方 .
MyEtherWallet
在评论中,你特别提到了MyEtherWallet . 在快速搜索中,我没有找到任何关于如何设置发件人的信息 . 有关ethereum.stackexchange的这个未解决的问题似乎值得关注,因为它问的问题大致相同:How to check msg.sender balance with MyEtherWallet contract
Contract 变通办法
没有办法帮助某人在 Contract 中设置发件人 . 但是您可以提供一种将地址作为参数的不同方法 . 然后像MyEtherWallet这样的工具将允许您设置感兴趣的地址 . 例如:
隐藏数据
It's worth noting that hiding data by checking msg.sender is useless. 任何人都可以在通话中设置假发件人(或直接检查区块链状态) . 所以,绕过这个是微不足道的"protection."