Problemas al distribuir Tokens y Ether simultáneamente

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.

Su límite de gasolina para esta transacción es demasiado bajo. Debe aumentar el límite de gas o la transacción no se procesará
El límite de gas de una transacción representa la cantidad máxima de gas que puede usar su transacción. Si es más bajo que el gas realmente utilizado, su transacción no podrá ser procesada. Por favor, lea la documentación sobre cómo funciona el gas ANTES de realizar la transacción para evitar preguntas ya formuladas. Gas: ethereum.gitbooks.io/frontier-guide/content/costs.html transac en web3py: web3py.readthedocs.io/en/latest/…

Respuestas (1)

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 createTokenes 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.