Solidity
公共地址變數導致 BadFunctionCall 異常
請參閱底部的契約。您會注意到契約是相同的,只是第一個契約的權限欄位標記為公開,而第二個不是。
第二份契約工作正常。我可以呼叫 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 後,合約執行良好。