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!
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
eth.getBlock("latest").gasLimit;
Running environment is set as Web3 Provider.
entonces como Henk mencionó anteriormente, ¿cuál es su nodo al que se está conectando?eth.getBlock("latest").gasLimit;
en la consola de su red?--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.geth --datadir ... --targetgaslimit '42000000'
gaslimit
seguirá 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
gaslimit
siendo el mismo. Puedes configurarlo 0x42000000
sin ningún problema.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.
henk
usuario44919
usuario44919