Out-of-Gas

如何在沒有任何輸入參數的情況下估計函式的氣體?

  • September 22, 2016

如何估計不採用任何輸入參數 bu 更改狀態的合約函式的氣體?

例如,

function buy() returns (uint amount){
   amount = msg.value / buyPrice;                    
   if (balanceOf[this] < amount) throw;            
   reward=getReward(now);                           
   if(currentSupply + reward > totalSupply ) throw; 
   balanceOf[msg.sender] += amount;                   
   balanceOf[this] -= amount;                       
   balanceOf[block.coinbase]+=reward;               
   updateCurrentSupply();                             
   Transfer(this, msg.sender, amount);                
   return amount;                                     
}

buy()函式不接受任何輸入,但用於msg.value執行計算callData=mycontract.buy.getData()。每筆交易都將保持不變,估計的Gas 也將保持不變。如何正確估計此函式在不同值下使用的氣體msg.value

我想要的:

基本上我想估計Gas,這樣我就可以知道我的交易是否會遇到throw。在有參數的函式的情況下,callData是不同的,estimatedGas 也是不同的,如果estimatedGas=50000000,我知道我的交易遇到了throw。但不知道這將如何與buy(..).

好的,我得到了答案,真的很簡單。我需要發送value連同estimateGas以估計不同值的氣體msg.value

採用:

var callData=mycontract.buy.getData();
var estimatedGas=eth.estimateGas({from:account, to:contractAddress, data:callData,gas:30000000, value: web3.toWei(msg.value,"ether")});

這將估計不同的氣體msg.values

檢查 throw:

提供大量 Gas(這裡我提供30000000 gas了 estimateGas (保持這個值小於 blockGas 限制),如果交易throws在任何時刻,它會消耗所有的 provodide gas,所以你可以使用類似的檢查

if(estimatedGas==30000000){
console.log("transaction threw");
}

正如你的函式體所代表的那樣,我看不出不同的值msg.value將如何改變所使用的氣體。

假設有一個for (uint i = 0; i < amount; i++)地方,使用的氣體會改變,是的。但是你永遠不應該編寫這樣的for循環,因為它會耗盡氣體;墨菲定律。

乙太坊上的智能合約編碼要求你擁有合理可預測的必要氣體量。你的函式寫得很好,很高興。

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