首页 文章

Msg.sender在“视图”功能中不起作用,为什么?有解决方法吗?

提问于
浏览
1

我想创建一个可查看的函数(需要向用户返回一个字符串),搜索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 回答

  • 3

    简答

    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 指定此类设置?

    没有办法帮助某人在 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...";
        }
    }
    

    隐藏数据

    It's worth noting that hiding data by checking msg.sender is useless. 任何人都可以在通话中设置假发件人(或直接检查区块链状态) . 所以,绕过这个是微不足道的"protection."

相关问题