¿Cómo estimar el gas para una función sin ningún parámetro de entrada?

¿Cómo estimar el gas para una función de contrato que no toma ningún parámetro de entrada pero cambia de estado?
Por ejemplo,

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;                                     
}

Esta buy()función no toma ninguna entrada, sino que se usa msg.valuepara realizar cálculos. El valor callData=mycontract.buy.getData()seguirá siendo el mismo para cada transacción y también lo será el Gas estimado. ¿Cómo puedo estimar adecuadamente el Gas utilizado por esta función bajo diferentes valores de msg.value?

Lo que quiero:
Básicamente, quiero estimar Gas, para poder saber si mi transacción encontrará throw. En los casos de funciones con parámetros, el callDataes diferente, también lo es el gas estimado, y si estimatedGas=50000000, sé que mi transacción encontró throw. Pero no tengo idea de cómo funcionará esto con funciones como buy(..).

Respuestas (2)

Tal como está el cuerpo de su función, no veo cómo un valor diferente de msg.valuecambiará el gas utilizado.

Supongamos que hubiera un for (uint i = 0; i < amount; i++)lugar, el gas usado cambiaría, sí. Pero nunca debe codificar un forbucle de este tipo, ya que se quedaría sin gasolina; Ley de murphy.

La codificación de contrato inteligente en Ethereum le pide que tenga cantidades razonablemente predecibles de gas necesario. Tu función está bien escrita, sé feliz.

Esperaba un estimatedGas=50000000cuando balanceOf[this] < amounty alguna const. valor en cualquier otro caso. Porque en todas las demás funciones (como la transferencia) cuando throwse encuentra un, estimadGas se convierte 50000000y de esta manera puedo verificar si mi transacción encontrará un throw. buy(..)Pero incluso en el caso de que amount is less than balance of contractel gas estimado sea muy bajo y, por lo tanto, no puedo detectarlo throw. Entonces, ¿cómo puedo verificar que mi transacción encontró un throw?

Ok, obtuve la respuesta, fue muy simple. Necesitaba enviar el valuejunto con estimateGasel fin de estimar Gas para diferentes valores msg.value.

usar:

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

Esto estimará el gas para diferentes msg.values.
Para verificar el lanzamiento:
suministre una gran cantidad de gas (aquí proporcioné 30000000 gasjunto con el gas estimado (mantenga este valor por debajo del límite de blockGas) y si se realizan transacciones throwsen cualquier instante, consumirá todo el gas provodide, por lo que puede usar un cheque como

if(estimatedGas==30000000){
console.log("transaction threw");
}
La transacción de Thown le costará la cantidad de gas suministrada. Puede establecer un margen por encima de lo que estimateGas(...)devuelve la función y verificar los errores generados utilizando el bit de código en ¿Cómo se puede detectar el estado de la transacción de un error generado cuando el gas puede ser exactamente el mismo que el gas utilizado para una transacción exitosa? .