我想创建一个可查看的函数(需要向用户返回一个字符串),该函数在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吗?有没有一种方法可以在不使用“ View ”功能的情况下将值返回给用户?

最佳答案

简短答案
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上有一个 Unresolved 问题似乎值得关注,因为它询问的是大致相同的问题:How to check msg.sender balance with MyEtherWallet 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...";
    }
}

隐藏数据

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

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

10-10 14:07
查看更多