Solidity

公共地址變數導致 BadFunctionCall 異常

  • April 19, 2018

請參閱底部的契約。您會注意到契約是相同的,只是第一個契約的權限欄位標記為公開,而第二個不是。

第二份契約工作正常。我可以呼叫 hash()、test() 等等,一切都按預期工作。

但是,第一份契約沒有任何作用。我不能在任何函式上使用 call() 和 transact() (儘管 estimateGas() 工作正常)。相反,我收到以下錯誤:

eth_abi.exceptions.InsufficientDataBytes:嘗試讀取 32 個字節。只得到 0 個字節

web3.exceptions.BadFunctionCallOutput:無法與/呼叫合約函式進行交易,合約部署是否正確且鏈同步?

不知道是什麼問題,有大神能指教一下嗎?以下是契約:

contract Award {
   
   address public authority;
   string public hash;
   
   bool itWorked = false;
   
   mapping(address => bool) users;
   
   function Award(string _hash) public {
       authority = msg.sender;
       hash = _hash;
   }
   
   function addUser(address _address) public {
       users[_address] = true;
   }
   
   function deleteUser(address _address) public {
       users[_address] = false;
   }
   
   function hasUser(address _address) public view returns (bool) {
       return users[_address];
   }

   function test() public pure returns (bool) {
       return true;
   }
   
}

contract Award {
   
   address authority;
   string public hash;
   
   bool itWorked = false;
   
   mapping(address => bool) users;
   
   function Award(string _hash) public {
       authority = msg.sender;
       hash = _hash;
   }
   
   function addUser(address _address) public {
       users[_address] = true;
   }
   
   function deleteUser(address _address) public {
       users[_address] = false;
   }
   
   function hasUser(address _address) public view returns (bool) {
       return users[_address];
   }

   function test() public pure returns (bool) {
       return true;
   }
   
}

根據要求,這是進行呼叫的 Python 程式碼:

contract = w3.eth.contract(abi=contract.abi, bytecode=contract.bytecode)
hash = contract.constructor('test_hash').transact(transaction={'from': self.account, 'gas': 410000})

while True:
       receipt = e.get_transaction_receipt(hash)

       if receipt:
           break

       sleep(2)

address = w3.w3.eth.getTransactionReceipt(hash)['contractAddress']

instance = w3.eth.contract(abi=contract.abi, address=address)

instance.functions.test().call()

問題是我沒有為合約建構子提供足夠的 gas 來執行。

正如評論中所建議的,我檢查了交易狀態,它是 0。然後我意識到 gasUsed 等於提供的 gas。

在為部署交易增加 gas 後,合約執行良好。

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