簡體   English   中英

Msg.sender在“視圖”功能中不起作用,為什么? 有解決方法嗎?

[英]Msg.sender does not work inside a “view” function, why? Is there a workaround?

我想創建一個可查看的函數(需要返回一個字符串給用戶),搜索msg.sender的映射,如果發件人的值是x,我希望合同繼續進行。 這一切都在混音內部工作,但如果我上傳到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,因為沒有實際的事務? 有沒有辦法在不使用“視圖”功能的情況下將值返回給用戶?

簡短的回答

msg.sender確實在view函數中工作,盡管它作為授權方案是無用的。 您使用的查找工具應該具有設置發件人的機制。

呼叫與交易

首先,了解呼叫和交易之間區別非常重要。

看起來你正在運行一個快速運行並且不會改變區塊鏈狀態的call 在事務和調用中都設置了msg.sender 在事務中,它不能偽造:您必須具有與給定帳戶關聯的私鑰。 但是在call ,您可以自由地將發件人設置為您喜歡的任何值。

設置發件人

如何設置發件人取決於您使用的工具來調用。 該工具可能是web3.js,web3.py,Mist,MyEtherWallet,MyCrypto等。它們都有(或可能沒有!)機制來設置呼叫中的發送方。

MyEtherWallet

在評論中,你特別提到了MyEtherWallet。 在快速搜索中,我沒有找到任何關於如何設置發件人的信息。 有關ethereum.stackexchange的這個未解決的問題似乎值得關注,因為它提出了大致相同的問題: 如何使用MyEtherWallet合同檢查msg.sender余額

合同變通辦法

是否可以為合同指定此類設置?

沒有辦法幫助某人在合同中設置發件人。 但是您可以提供一種將地址作為參數的不同方法。 然后像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來隱藏數據是沒用的。 任何人都可以在通話中設置假發件人(或直接檢查區塊鏈狀態)。 因此,繞過這種“保護”是微不足道的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM