Out-of-Gas
如何在沒有任何輸入參數的情況下估計函式的氣體?
如何估計不採用任何輸入參數 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
循環,因為它會耗盡氣體;墨菲定律。乙太坊上的智能合約編碼要求你擁有合理可預測的必要氣體量。你的函式寫得很好,很高興。