Límite de gas de una llamada de método de contrato

Cuando llamamos a un método de contrato, ¿cuál será el límite de gas?

¿Hay algún otro límite de gas además del límite de gas del bloque? Si hay otros, ¿podemos establecer manualmente el límite de gas cuando llamamos a un método?

Respuestas (1)

Cuando una cuenta de propiedad externa (EOA) firma una transacción, su cliente generalmente estimará el requerimiento de gas y proporcionará lo suficiente para que funcione. Esto no siempre funciona como se esperaba.

Los clientes pueden especificar la cantidad de gas a enviar, y esta cantidad se quemará al máximo. En una Web3 sendTransactionañadirían {gas: 50000}, por ejemplo.

Cualquier gas que llegue es lo máximo que tendrá disponible una función de contrato, y se quema a medida que se ejecuta la función, paso a paso. Cuando el contrato llama a otro contrato, las cosas se ponen más interesantes.

El valor predeterminado es enviar la mayor parte del gas disponible (63/64) para que la función de contrato invocada pueda consumir lo que necesita y luego la persona que llama continuará con lo que quede.

Esto funciona razonablemente bien en la mayoría de los casos, pero es posible que el desarrollador desee limitar la cantidad de gas que debe enviar. Esto se puede hacer con una sintaxis de Solidity que es un poco más cruda, como se describe aquí: ¿Cómo especificar gas/valor al hacer una llamada usando contratos abstractos?

Además, después de varios contratos "hostiles" hasta travesuras con ataques de reingreso, se decidió que el método de rutina transfer(y sendsintaxis más antigua) debería proporcionar solo un estipendio de 2300 gas en lugar de la mayor parte del gas disponible. Esto, para garantizar que las funciones de respaldo de recepción solo tengan suficiente gas para realizar un poco de contabilidad y posiblemente emitir un evento, pero no más.

Espero eso ayude.

" This doesn't always work out as expected", puede realizar una llamada () al contrato y recuperar, Consumed Gasque puede usarse como límite de gas en una transacción real con un 99% de probabilidad de éxito. De esta forma puedes decidir de antemano si la cantidad de gasolina gastada es demasiado alta y rechazar la emisión de la transacción sin gastar nada.
Lo anterior no es totalmente correcto. Cuando se llama a una función de contrato. El gas enviado es el 63/64 del gas restante. No todo el gas restante.
Buena atrapada. Corregí la respuesta para que no sea engañosa sobre EIP150. "La mayor parte" del gas.
@Nulik, ¿en qué entorno haría la llamada () al contrato? ¿Javascript? ¿Usando ether.js? ¿Algún tipo de HTTP RPC de Infura? ¿O estás hablando de hacerlo dentro de la solidez? ¿Cómo podemos estimar la cantidad de gas que se gastará en una transacción sin enviarla primero? Dijiste que puedes hacer esto "por adelantado"... ¿cómo?