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?
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 sendTransaction
añ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 send
sintaxis 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.
Nulik
" This doesn't always work out as expected"
, puede realizar una llamada () al contrato y recuperar,Consumed Gas
que 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.Ilan Dshare
Rob Hitchens
Gregorio Magarshak