¿Cómo sé cuánto gas debo usar al llamar a un contrato?

Cuando estoy llamando (enviando una transacción a) un contrato, ¿cómo determino cuánto gas usar? ¿Hay alguna manera de calcular esto por adelantado y qué sucede si envío demasiado o muy poco combustible?

La última parte de su pregunta, sobre enviar demasiada/poca gasolina, se responde aquí . Sin embargo, la primera parte de la pregunta es buena para agregar. ¡Votado!

Respuestas (2)

Hay API de estimación de gas tanto en JSON-RPC como en Javascript .

Son estimaciones y para los desarrolladores que desean mayor precisión, se requieren pruebas, posiblemente en una cadena privada.

Si se proporciona demasiado gas, el exceso de gas se convierte en éter y se reembolsa. Si se especifica muy poco gas, todo el gas especificado se pierde para el minero y la transacción se revierte: al igual que el contrato nunca se ejecutó.

Los usuarios generalmente tendrán que confiar en la DApp que están usando, y las DApps que tienen una buena UI y UX, pueden indicar algunos costos estimados para el usuario, o posiblemente incluso ocultar dichos detalles enviando a la cuenta del usuario algo de éter, o dando a un nuevo usuario una cuenta que tiene algo de éter.

Esto es factible porque la mayoría de las transacciones requieren una cantidad muy pequeña de éter; 1 ether es 10^18 wei y puede ejecutar muchas transacciones. Como ejemplo, si uno simplemente estuviera usando Ethereum para transferir wei/ether, al precio actual del gas de 5 Gigawei, un usuario puede hacer alrededor de 9523 transferencias con 1 ether. Esto se debe a que una transacción de transferencia de valor cuesta 21000 de gas y, por lo tanto, el cálculo es 1e18 / (21000 * 5e9) = 9523.80.

Para aquellos que leyeron esto en junio de 2017, ahora son 40 centavos de dólar estadounidense ($0,40) por transacción. Cuando se escribió, ETH costaba $ 1,53, por lo que costaba alrededor de 0,16 centavos de dólar estadounidense ($ 0,0016) centavos por transacción. Dado que Ether ha subido tan dramáticamente, la programación eficiente de contratos será clave. Si quisiera transferir dinero ahora mismo, el mínimo de gas es 0,0024 ETH, que son 91 centavos de dólar estadounidense. Los precios de las transacciones están subiendo porque la moneda tiene un valor muy alto en este momento.
Actualicé la respuesta para reflejar que los precios de la gasolina ahora rondan los 5 Gwei en lugar de los 50 Gwei. Si ether cuesta $300, es una tarifa de transacción de 3,15 centavos (21000*5e9 / 1e18 * 300 = 0,0315) ethgasstation.info también sugiere un precio de gasolina bajo y seguro actual de 2 Gwei, lo que lleva a una tarifa de 1,26 centavos.

La pregunta también etiqueta la invocación de contrato, así que aquí está cómo hacerlo en web3js:

//whitelist control
const sender = "0xB1C8C55C812ec8A6296D98bD225baC443127a5cc"; 

const argumentsArray = [
    //argument address to whitelist
    "0xbA1d45a797F0f4474F47996551EC983B3FBa80BA"
];

const whitelistAddressContractCall = whitelistContract.methods["whitelistFunction"];

const gasEstimate = await whitelistAddressContractCall
    .apply(null, argumentsArray)
    .estimateGas({
        gas: 8000000,
        from: sender
    });

console.log("gasEstimate: " + gasEstimate)

Tenga en cuenta que el contrato (whitelistContract en este caso) también se puede crear desde la ABI.

Detalles aquí: https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-estimategas