Solidity

查看功能不會在 Etherscan 上執行,但它在 Remix 中執行

  • October 26, 2022

嘿伙計們,我對 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(value 0x0000000000000000000000000000000000000000) 不在列表中,它實際上是從inauthorisedAddresses返回並拋出in 。false``verifyAddress()``revert``viewMessages()

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