Solidity

Metamask 在 web3 中註入一個賬戶,但使用另一個賬戶呼叫合約

  • February 25, 2020

建構一個 React 應用,MetaMask 注入 web3,我得到了賬號

$$ 0 $$從 getAccounts(),然後將它與其他參數一起傳遞給我的合約函式。我希望我的修飾符根據 1) msg​​.sender 2) 在我的 web3 中註入的帳戶 MetaMask 和 3) 合約所有者之間的比較來鎖定傳入的函式呼叫。 調試未擷取的“MetaMask - RPC 錯誤:內部 JSON-RPC 錯誤”時。我注意到我的支票非常有價值:1) 和 2) 不匹配。Metamask 在 web3 中註入我選擇的帳戶(下圖中的帳戶 3),但使用帳戶 1(我在 MetaMask 中設置的第一個,見下圖,在 Ganache 中的第一個)呼叫以下 Solidity 函式(為調試而修改) ) 作為 msg.sender。如果我 console.log JS 中的 msg.sender 和 web3 地址,我會得到兩個不同的值。

ethAddress: "0x478205E668883bba86cCa3eFB8C489A7c4d27cE7"
sender: "0x81eCa3fA3727BdC7B8774c26B57152bb62C0834D"

如果不加以控制,這種行為可能會導致不可預測的事情。任何線索為什麼?它是一個錯誤嗎?

   function findMe(address _ethAddress) public view returns(address sender,address ethAddress) { //bool foundMe
           return (
               msg.sender,
               _ethAddress
           );
   //        require(msg.sender == _ethAddress);
   //        if (users[_ethAddress].found) {
   //            return true;
   //        } else {
   //            return false;
   //        }
       }

在此處輸入圖像描述

當在事務之外呼叫函式時,msg.sender它是不可靠的,因為它沒有簽名。例如,它可以為 null。

公共viewpure功能不應依賴於msg.sender正確性。如果需要,最好將地址作為參數顯式傳遞。

在相同的框架中,當您創建合約實例時,它會設置一些預設參數,例如氣體限制和發送者。也許在切換帳戶時,此對像不會重置,它將繼續指向第一個帳戶。

您可以在呼叫函式時使用 {from: ‘address’} 提供地址

引用自:https://ethereum.stackexchange.com/questions/70835