Blockchain
Web3.py : Eth.estimate_gas 方法在檢查兩個地址是否相等時總是返回錯誤
以下是智能合約程式碼,即使地址使用者與 msg.sender 相同,setMessage 方法在使用 web3.py 估計 gas 時總是失敗並返回。當合約部署在 Ganache 上時
$$ windows application $$並且交易是使用 web3.py “buildTransaction” 方法建構的,在估算交易的 Gas 時總是返回 revert 語句錯誤。有人可以建議這段程式碼有什麼問題嗎? ’’’ pragma solidity ^0.8.13; 合約 EchoMyName { 地址所有者;string message = “EchoMyName 世界”;
function setMessage( string memory msg_ , address user) public { if( msg.sender == user) { message = msg_; } else { revert("Sorry"); } } function getMessage() public view returns ( string memory ) { return message; } constructor() { owner = msg.sender; }
} ’''
Python程式碼如下:
contract_func = contract.functions.setMessage("Hello There", "0x4628df168f80c9BE779c0dC1aBaC36b070F662AC") transaction = contract_func.buildTransaction(transaction = {'nonce' : nonce,'gasPrice': w3.eth.gas_price})
這是返回的異常,即使消息發送者和使用者地址相同,並且測試乙太幣也在帳戶中:
異常:執行恢復:處理事務時VM異常:恢復對不起
儘管程式碼和邏輯都很好並且可以在混音中使用,但更喜歡使用 require 語句而不是 if-else-revert() 語句。它們比需要聲明的成本更高,並且也是solidity官方文件的首選。
採用:
require(msg.sender==user, "You are not the user"); message = msg_;
交易將自動恢復,如果
msg.sender!=user;
我在 web3.py/Ganache 上複製了你的契約,它似乎運作良好。
我認為您的問題在於 buildTransaction() 函式。即使您正在修改區塊鏈的狀態,我也看不到“from”參數(或 chainId)。
另外,我相信您的 nonce 應該是 ’nonce’ = nonce +1 ,因為您已經使用 nonce 的值進行創建契約的交易。
這是一個有效的程式碼片段:
transaction = mycontract.functions.setMessage( "Hello There", my_address ).buildTransaction( { "chainId": w3.eth.chain_id, "gasPrice": w3.eth.gas_price, "from": my_address, "nonce": nonce + 1, }