如何在 web3 中设置手动气体限制?让智能合约执行?

Posted

技术标签:

【中文标题】如何在 web3 中设置手动气体限制?让智能合约执行?【英文标题】:How would I set a manual gas limit in web3? To get the smart contract to execute? 【发布时间】:2022-01-12 14:00:43 【问题描述】:

我在执行智能合约时遇到问题。我认为由于错误代码必须是气体限制问题。虽然我不知道我会将代码放在哪里以便它正确执行。有什么建议吗?

Solidity 代码如下: pragma solidity ^0.8.0;

import 'hardhat/console.sol';

contract WavePort  

//TrackWaves
uint totalWaves; //State Variable, Permanetly Stored In Contract Storage

constructor() 
    console.log("Yo, I am I contract");
    


//Function Increments Waves On The Blockchain/ Immutable Never Decreasing 
function wave() public  
    totalWaves += 1;
    console.log("%s has waved!", msg.sender);


//Function Returns Us the The Total Waves To Be Viewed
function getTotalWaves()public view returns(uint256)  
    console.log("We have %d total waves", totalWaves);
    return totalWaves;

                

javascript 代码如下:

const  App = () => 

  const [currentAccount, setCurrentAccount] = useState("")
  const contractAddress = "contractAddress"
  const contractABI = abi.abi

const checkIfWalletConnected = async () =>  
  let web3
  try  
    const ethereum = window; 

    if(!ethereum)  
      window.alert("Make sure you have metamask !");
      return;
    else 
      web3 = new Web3(window.ethereum)
      console.log("We have the ethereum object", ethereum)

    const accounts = await ethereum.request(method: 'eth_accounts')
      if(accounts.length !== 0)  
        const account = accounts[0]
      
        console.log("Found an Authorized account:", account, );
        setCurrentAccount(account)

       else  
        window.alert("NO authorized account found")
      

      const EthBalance = await web3.eth.getBalance(accounts[0])
      console.log(EthBalance)
  catch(err) console.log(err)

 const connectWallet = async () =>  
    try  
      const ethereum = window; 
      if(!ethereum) alert("Get Metamask extenstion")
    return 
   else  
  const accounts = await ethereum.request(method: 'eth_accounts')
  console.log("Connected", accounts[0])
  window.alert("Wallet is Connected")
  setCurrentAccount(accounts[0])
  const ethBlance = await Web3.eth.getBalance(currentAccount)
  console.log(ethBlance)
  
    catch(err) 
      console.log(err)
    
  

  const wave = async () =>  
    try  
    const ethereum = window;

    if(ethereum)  
      const provider = new ethers.providers.Web3Provider(ethereum);
      const signer = provider.getSigner(); 
      const wavePortalContract = new ethers.Contract(contractAddress, contractABI, signer);

      let count = await wavePortalContract.getTotalWaves( ); 

      const waveTxn = await wavePortalContract.wave(gas:10000000 , gasPrice:80000000000);
      console.log("Mining....", waveTxn.hash)

      await waveTxn.wait( );
      console.log("Mined-- ", waveTxn.hash)

      count = await await wavePortalContract.getTotalWaves( );
      console.log("Retrieved total wave count.. ", count.toNumber())
      else  
      console.log("Eth Object doesn't exist!")
    
     catch(err) console.log(`$err hello world`) 


  useEffect(() => 
    checkIfWalletConnected();
  , [])

我收到的错误代码:

Error: cannot estimate gas; transaction may fail or may require manual gas limit (error="code":-32000,"message":"execution reverted", method="call", transaction="from":"0xD49a9a33F180D1e35A30F0ae2Dbfe5716a740Ebc","to":"0x5FbDB2315678afecb367f032d93F642f64180aa3","data":"0x9a2cdc08","accessList":null, code=UNPREDICTABLE_GAS_LIMIT, version=providers/5.5.1)

【问题讨论】:

尝试将gas和gas price放在同一个对象中 【参考方案1】:

在调用合约 Abi 方法时,您可以在第二个参数中传递一个额外的气体相关参数的对象(或者如果您的方法中没有任何参数,则首先传递一个对象)。

所以wave 函数的调用应该如下所示:

const waveTxn = await wavePortalContract.wave(gasLimit:30000);

检查以下文档中的所有其他参数。

https://docs.ethers.io/v5/api/contract/contract/#contract-functionsSend

【讨论】:

它仍然为我返回相同的错误。

以上是关于如何在 web3 中设置手动气体限制?让智能合约执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 web3.js 中将 uint32[]、uint8[] 参数传递给智能合约

如何使用 Python 和 web3.py 调用智能合约函数

在视图/只读区块链函数上调用 ethers web3js 时出现气体限制错误

Web3 开发系列教程—创建你的第一个智能合约智能合约存在的安全挑战

Web3 开发系列教程—创建你的第一个智能合约什么是 Gas,它是如何使用的?

合约代码无法存储,请检查您的gas限制:以太坊智能合约部署失败: