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?
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
.
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
jeff coleman