Web3js

估算 ERC20 傳輸的氣體

  • April 16, 2020

我想估計兩個地址之間的簡單 ERC20 傳輸的氣體。公認的 web3.js 文件estimateGas令人困惑:

// using the callback
myContract.methods.myMethod(123).estimateGas({gas: 5000000}, function(error, gasAmount){
   if(gasAmount == 5000000)
       console.log('Method ran out of gas');
});

myMethod(123)是我感到困惑的地方。那是做什麼用的?以下是我目前正在考慮的,但我得到TypeError: contract.methods.send is not a function. 我應該用什麼代替myMethod(123)

contract.methods
  .send("0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe")
  .estimateGas({ gas: 60000 }, (error, gasAmount) => {
     return gasAmount;
});

const obj = myContract.methods.myMethod(123);


該變數obj是客戶端腳本中的一個對象,它代表一個函式呼叫。

在這個具體的例子中,它是myMethod(123)合約上的函式呼叫myContract

您可以將此對像用於以下任何操作:

  1. obj.encodeABI()
  2. obj.call(options)
  3. obj.send(options)
  4. obj.estimateGas(options)

Whereoptions是具有以下欄位的任意組合的對象:

  • from
  • gas
  • gasPrice
  • value

如果函式不改變合約的狀態(即它是pureor view),那麼call幾乎是你唯一想要用它做的事情,例如:

const retVal = await obj.call({from: x});

如果函式確實改變了合約的狀態(即既不是pure也不是view),那麼所有其他的(encodeABIestimateGassend都是有用的,例如:

const encodedData = obj.encodeABI();
const requiredGas = await obj.estimateGas({from: x});
const txReceipt = await obj.send({from: x, gas: requiredGas});

在您的特定情況下,您要估計其氣體消耗的函式呼叫將是:

myContract.methods.transfer(to, amount)

在哪裡:

  • to是一個字元串,它表示一個address
  • amount是一個表示uint256值的字元串

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