Solidity
Metamask 在 web3 中註入一個賬戶,但使用另一個賬戶呼叫合約
建構一個 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。公共
view
或pure
功能不應依賴於msg.sender
正確性。如果需要,最好將地址作為參數顯式傳遞。在相同的框架中,當您創建合約實例時,它會設置一些預設參數,例如氣體限制和發送者。也許在切換帳戶時,此對像不會重置,它將繼續指向第一個帳戶。
您可以在呼叫函式時使用 {from: ‘address’} 提供地址