¿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.value
para 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 callData
es 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(..)
.
Tal como está el cuerpo de su función, no veo cómo un valor diferente de msg.value
cambiará 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 for
bucle 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.
Ok, obtuve la respuesta, fue muy simple. Necesitaba enviar el value
junto con estimateGas
el 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 gas
junto con el gas estimado (mantenga este valor por debajo del límite de blockGas) y si se realizan transacciones throws
en cualquier instante, consumirá todo el gas provodide, por lo que puede usar un cheque como
if(estimatedGas==30000000){
console.log("transaction threw");
}
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? .
Prashant Prabhakar Singh
estimatedGas=50000000
cuandobalanceOf[this] < amount
y alguna const. valor en cualquier otro caso. Porque en todas las demás funciones (como la transferencia) cuandothrow
se encuentra un, estimadGas se convierte50000000
y de esta manera puedo verificar si mi transacción encontrará unthrow
.buy(..)
Pero incluso en el caso de queamount is less than balance of contract
el gas estimado sea muy bajo y, por lo tanto, no puedo detectarlothrow
. Entonces, ¿cómo puedo verificar que mi transacción encontró unthrow
?