Estoy escribiendo un contrato inteligente que tiene la funcionalidad de distribuir éteres (por dinero para gasolina) y tokens. La función se ve así
function distribute(address to, uint256 token, uint256 gasMoney) payable onlyAuthorized returns (bool sucess) {
createToken(to, token);
to.transfer(gasMoney);
currentContractBalance -= gasMoney;
return true;
}
Sin embargo, cada vez que llamo a la función a través de web3 py como
mycontract.transact().distribute(myAddress, numberOfTokens, gasMoney)
devuelve un error diciendo
ValueError: Contract does not appear to be deployable within the current network gas limits. Estimated: 4704624. Current gas limit: 4700036
No he sido capaz de averiguar el error de mi lado. Hice que la cuenta predeterminada fuera la dirección que se usó para implementar el contrato.
ValueError: el contrato no parece ser implementable dentro de los límites actuales de gas de la red. Estimado: 4704624. Límite de gas actual: 4700036
Este error significa que createToken
es una función muy pesada. Algunos comentarios anteriores sugirieron aumentar el límite de gas, pero eso no lo ayudará aquí. El límite de gas del bloque es demasiado bajo para ejecutar su transacción. Eso significa que incluso si establece su límite de gas en 10 millones y no se incluyeron otras transacciones en un bloque, su transacción aún no encajaría. (Cuando digo "encajar" aquí, me refiero a computacionalmente, no a la cantidad de bytes)
Las únicas opciones que realmente tiene son 1) dividir createToken en partes separadas o 2) hacerlo más eficiente. ¡Probablemente quieras hacerlo más eficiente porque el gas 4.7M es caro ! No hace mucho tiempo, el precio de la gasolina barata era de 4 Gwei. A ese precio, emitir la transacción (si fuera posible) costaría 0,0188 éteres, que son 6,20 dólares al precio actual de ETH/USD.
En este momento, la gasolina es muy barata, por lo que solo le costaría alrededor de $ 0.155 por cada transacción, pero eso podría no durar mucho.
Iteración 122442
Iteración 122442