Remix siempre arroja el error: excede el límite de gas del bloque

Estimados desarrolladores de Ethereum.

Empecé a aprender Solidity esta semana y estoy tratando de implementar un contrato a través de Remix, pero esto realmente no funciona.

El entorno de ejecución se establece como proveedor Web3.

(Porque el libro que estoy leyendo actualmente para estudiar Solidity me pide que lo haga, así que también puedo aprender sobre web3.js)

Aquí está mi código:

pragma solidity ^0.4.24;
contract MyToken {
    string public name;
    string public symbol;
    uint8 public decimals;

    mapping (address => uint256) public balanceOf;
    event Transfer(address _from, address _to, uint _value);

    constructor(string tokenName, string tokenSymbol, uint8 decimalUnits, uint256 initialSupply) public {
        name = tokenName;
        symbol = tokenSymbol;
        decimals = decimalUnits;
        balanceOf[msg.sender] = initialSupply;
        }

    function transfer(address _to, uint256 _value) public {
        require(_value <= balanceOf[msg.sender]);
        require(balanceOf[_to] + _value >= balanceOf[_to]);
        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;
        emit Transfer(msg.sender, _to, _value);
    }
}

Este es el código completo de mi contrato, y cuando lo implemento en Remix, sigue devolviendo un error que dice "excede el límite de gas del bloque".

He ajustado el valor del límite de gas cientos de veces y lo he vuelto a intentar, pero sigue sin funcionar.

También busqué preguntas similares en este sitio y en otros sitios, pero nada realmente ayudó.

Uno de mis amigos descubrió que este contrato se puede implementar en Metamask con límite de gas 404941 con un valor de 1 gwei, así que probé lo mismo en Remix pero no funciona.

¿Alguna ayuda que pueda usar?

¡Gracias de antemano!

¿A qué tipo de red está conectada su MetaMask? ¿Está ejecutando un nodo Geth? ¿Ganache? ¿Trufa? ¿Infura tal vez?
Geth apuesto. Nunca he usado otros que no sean geth.
geth --datadir "private-data" --networkid 15 --rpc --rpcapi "db,eth,net,web3,perosnal,miner" --rpccorsdomain "*" consola Esto es exactamente lo que escribí en cmd antes de configurar el entorno de ejecución como proveedor Web3.

Respuestas (3)

Esto se debe a que el gas utilizado supera el límite de gas de bloque de su cadena; para evitarlo, puede ver cuál es el límite de gas de bloque actual y aumentarlo por encima del gas utilizado para implementar el contrato inteligente

Gracias por responder, pero ¿puede decirme cómo puedo verificar el límite de gas y ajustarlo? Creo que es lo que puedo ver en la pestaña "Ejecutar" de Remix, pero como escribí en mi pregunta, realmente no funcionó.
puedes ejecutar este cmd en la consolaeth.getBlock("latest").gasLimit;
Y debido a que ejecute, elija conectarse al nodo usando Running environment is set as Web3 Provider.entonces como Henk mencionó anteriormente, ¿cuál es su nodo al que se está conectando?
geth --datadir "datos privados" --networkid 15 --rpc --rpcapi "db,eth,net,web3,personal,miner" --rpccorsdomain "*" console ¿Quizás te refieres a esto? ID de red 15. Eso es exactamente lo que escribí en cmd
Entonces, ¿cuál es el resultado al ejecutarse eth.getBlock("latest").gasLimit;en la consola de su red?
Y puede agregar un parámetro más --targetgaslimit '42000000'a su cmd para aumentar el límite de gas. Inicie su nodo y siga empujando el límite de gas hacia 42000000 mientras continúa la extracción. Con el tiempo, el límite de gas habrá crecido tanto que ya no tendrá el problema Error: excede el límite de gas del bloque.
Obtengo 5000 de eth.getBlock("latest").gasLimit; ¿Y dónde debo poner ese parámetro? Cuando escribo en la línea "geth --datadir ..."?
sí, ejecutando cmd smth comogeth --datadir ... --targetgaslimit '42000000'
Acabo de intentarlo y cmd devuelve un comando no válido: "targetgaslimit", ¿me estoy perdiendo algo? ¡Muchas gracias por tu ayuda!
por favor pegue su cmd completo aquí para ver :)
Lo siento, cometí un error estúpido. Olvidé escribir -- antes de targetgaslimit. Déjame intentarlo de nuevo :D
Escribí --targetgaslimit 42000000 al final de la línea justo antes de 'console' pero aún devuelve 5000 cuando pongo eth.getBlock("latest").gasLimit; y todavía devuelve el mismo error también... Creo que me estoy perdiendo algo en alguna parte, pero no puedo entender
Como mencioné anteriormente, gaslimitseguirá empujando el límite de gas hacia 42000000 a medida que continúe la extracción, no se aplicará de inmediato. intenta correr eth.getBlock("latest").gasLimit;para conseguir la corrientegaslimit
Entonces, para verificar eso, ¿debería ejecutar "miner.start ()" y esperar?
sí, o ponga gasLimit en un gran valor en el bloque de génesis y comience una nueva cadena
He esperado durante 8 minutos y todavía devuelve 5000. Creo que debería ir a crear un nuevo bloque de génesis. Encontré que el límite de gas actual es 0x8000000, ¿estará bien establecerlo como 0x42000000?
sí, creo que si no se acuña ningún bloque, seguirá gaslimitsiendo el mismo. Puedes configurarlo 0x42000000sin ningún problema.

ingrese la descripción de la imagen aquíPuedo implementar el mismo contrato en el remix. Verifique su límite de gas mientras implementa el contrato si es mayor o igual a 3000000, entonces debería poder implementar el contrato.

Me doy cuenta de que eres nuevo en esto. Algunas de sus frases sugieren una posible confusión que podría conducir a este error.

tratando de implementar un contrato a través de Remix

¿Desplegar en qué?

desplegado en Metamask

¿A donde?

Lo desglosaré un poco.

Tenemos que lidiar con código, compiladores, cadenas y herramientas. Remix, como sabe, es un IDE, tiene la VM de JavaScript, que es excelente para pruebas superficiales, y puede usarla para enviar código compilado a la cadena de bloques Ethereum "real". Podríamos decir "implementado con Remix" y todavía queda la pregunta de ¿ implementado para qué? - Rinkeby, Ropsten, Kovan, etc. ¿testnets o mainnet?

De manera similar, MetaMask es básicamente un dispositivo de firma y puede usarlo para ingresar a una red de prueba o a la red principal.

El EVM, adonde va esto, ha pasado por iteraciones del protocolo conocidas como bifurcaciones. Esas bifurcaciones crean diferencias no triviales que deben tenerse en cuenta en el compilador o el código de bytes no se implementará correctamente . El EVM se encuentra actualmente en la versión de Estambul. Esta es una actualización bastante reciente, por lo que necesita un compilador bastante reciente.

Esta línea:

pragma solidity ^0.4.24;

es simplemente ambiguo. No podemos estar muy seguros de qué compilador está utilizando, pero IIRC, los compiladores más antiguos en el rango bajo producirán un código de bytes que no se implementa en Estambul . Puede cambiar el compilador a 0.5.x (no estoy seguro de dónde está el piso para Estambul, así que apunte al lado alto) y estará en el camino correcto. Hay cambios importantes, por lo que debe cambiar ligeramente el constructor, otra razón por la cual ^es engañoso.

pragma solidity 0.5.16;

contract MyToken {
    string public name;
    string public symbol;
    uint8 public decimals;

    mapping (address => uint256) public balanceOf;
    event Transfer(address _from, address _to, uint _value);

    constructor(string memory tokenName, string memory tokenSymbol, uint8 decimalUnits, uint256 initialSupply) public {
        name = tokenName;
        symbol = tokenSymbol;
        decimals = decimalUnits;
        balanceOf[msg.sender] = initialSupply;
        }

    function transfer(address _to, uint256 _value) public {
        require(_value <= balanceOf[msg.sender]);
        require(balanceOf[_to] + _value >= balanceOf[_to]);
        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;
        emit Transfer(msg.sender, _to, _value);
    }
}

Cuando haga eso, tendrá que seleccionar el compilador correcto en Remix o se quejará. Después de compilar, debería poder implementar en la red principal o en una red de prueba sin dificultad.

Espero eso ayude.