Blockchain

Web3.py : Eth.estimate_gas 方法在檢查兩個地址是否相等時總是返回錯誤

  • April 5, 2022

以下是智能合約程式碼,即使地址使用者與 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,
   }

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