Solidity
查看功能不會在 Etherscan 上執行,但它在 Remix 中執行
嘿伙計們,我對 goerli Etherscan 上的讀取功能有一個奇怪的問題。我在 Görli Etherscan https://goerli.etherscan.io/address/0xf01eE0f988e6613165A82C23aC5A5b0b6458E672上有一份經過驗證的契約 ,當我嘗試訪問 Etherscan 上的“viewMessages”功能時,它被拒絕了。當然,它也不能通過 Web3 Python 庫工作。當我嘗試通過 Remix 進行時,它通常可以工作。我只能訪問授權地址,但您可以在圖片上清楚地看到 viewMessages 的訪問權限。我正在從授權地址訪問它。
你能幫幫我嗎?
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; contract Messenger{ address [] public authorisedAddresses; struct User { address sender; string message; } constructor(){ authorisedAddresses.push(msg.sender); } User[] internal user; function authoriseAddress(address _input) external { bool address_bool = verifyAddress(); if (address_bool == true){ authorisedAddresses.push(_input); } else {revert("User not authorised!");} } function writeMessage(string calldata _input) external { bool address_bool = verifyAddress(); if (address_bool == true){ user.push(User(msg.sender, _input)); } else {revert("User not authorised!");} } function userLength() public view returns (uint) { return user.length; } function addressLength() internal view returns (uint) { return authorisedAddresses.length; } function verifyAddress() internal view returns (bool) { uint i = 0; while (i <= addressLength()){ if (authorisedAddresses[i] == msg.sender) { return true; } ++i; } return false; } function viewMessages(uint _input) public view returns(address, string memory){ bool address_bool = verifyAddress(); if (address_bool == true){ User storage text = user[_input]; return (text.sender, text.message); } else {revert("User not authorised!");} }
}
正如0xSanson在評論中正確猜測的那樣,MetaMask 地址實際上在只讀呼叫期間**並未中繼到合約。**相反,呼叫將地址 0 作為
msg.sender
.我能夠使用自定義契約來驗證這種情況。
因此,呼叫反轉的原因是因為
msg.sender
(value0x0000000000000000000000000000000000000000
) 不在列表中,它實際上是從inauthorisedAddresses
返回並拋出in 。false``verifyAddress()``revert``viewMessages()