Remix wirft immer den Fehler: überschreitet die Sperrgasgrenze

Liebe Ethereum-Entwickler.

Ich habe diese Woche angefangen, Solidity zu lernen und versuche, einen Vertrag über Remix bereitzustellen, aber das funktioniert nicht wirklich.

Die Ausführungsumgebung ist als Web3-Anbieter festgelegt.

(Weil das Buch, das ich gerade lese, um Solidity zu studieren, mich dazu auffordert, damit ich auch etwas über web3.js lernen kann.)

Hier ist mein Code:

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);
    }
}

Dies ist der gesamte Code meines Vertrags, und wenn ich diesen auf Remix einsetze, gibt er immer wieder einen Fehler zurück, der besagt, dass er das Blockgaslimit überschreitet.

Ich habe den Wert des Gaslimits hunderte Male angepasst und es erneut versucht, aber es funktioniert immer noch nicht.

Ich habe auch auf dieser Seite und auf den anderen Seiten nach ähnlichen Fragen gesucht, aber nichts hat wirklich geholfen.

Einer meiner Freunde fand heraus, dass dieser Vertrag auf Metamask mit dem Gaslimit 404941 mit dem Wert 1 gwei eingesetzt werden kann, also habe ich dasselbe auf Remix versucht, aber es funktioniert nicht.

Irgendeine Hilfe, die ich gebrauchen kann?

Vielen Dank im Voraus!

Mit welcher Art von Netzwerk ist Ihre MetaMask verbunden? Betreiben Sie einen Geth-Knoten? Ganache? Trüffel? Infura vielleicht?
Ich wette. Ich habe nie andere als Geth benutzt.
geth --datadir "private-data" --networkid 15 --rpc --rpcapi "db,eth,net,web3,perosnal,miner" --rpccorsdomain "*" console Dies ist genau das, was ich auf cmd eingegeben habe, bevor ich es eingestellt habe die Laufumgebung als Web3 Provider.

Antworten (3)

Dies liegt daran, dass das verwendete Gas die Blockgasgrenze Ihrer Kette überschreitet. Um dies zu vermeiden, können Sie das aktuelle Blockgaslimit anzeigen und es höher als das Gas erhöhen, das zur Bereitstellung des Smart Contract verwendet wird

Danke für die Antwort, aber können Sie mir bitte sagen, wie ich das Gaslimit überprüfen und anpassen kann? Ich denke, es ist das, was ich unter der Registerkarte "Ausführen" von Remix sehen kann, aber wie ich in meiner Frage geschrieben habe, hat es nicht wirklich funktioniert.
Sie können dieses cmd auf der Konsole ausführeneth.getBlock("latest").gasLimit;
Und da run select connect to node by use Running environment is set as Web3 Provider.then wie oben erwähnt, mit welchem ​​Knoten verbinden Sie sich?
geth --datadir "private-data" --networkid 15 --rpc --rpcapi "db,eth,net,web3,personal,miner" --rpccorsdomain "*" console Vielleicht meinst du das? Netzwerk-ID 15. Genau das habe ich in cmd eingegeben
Was ist also die Ausgabe, wenn eth.getBlock("latest").gasLimit;Sie auf der Konsole Ihres Netzwerks ausgeführt werden?
Und Sie können --targetgaslimit '42000000'Ihrem cmd einen weiteren Parameter hinzufügen, um das Gaslimit zu erhöhen. Starten Sie Ihren Node und schieben Sie das Gaslimit weiter in Richtung 42000000, während der Abbau fortgesetzt wird. Im Laufe der Zeit wäre das Gaslimit so groß geworden, dass Sie das Problem Fehler: Überschreitung des Blockgaslimits nicht mehr haben.
Ich bekomme 5000 von eth.getBlock("latest").gasLimit; Und wo soll ich diesen Parameter ablegen? Wenn ich die Zeile "geth --datadir ..." eingebe?
ja, cmd etw wie ausführengeth --datadir ... --targetgaslimit '42000000'
Ich habe das gerade versucht und cmd gibt einen ungültigen Befehl zurück: "targetgaslimit", fehlt mir etwas? Vielen Dank für deine Hilfe!
Bitte fügen Sie Ihr vollständiges cmd hier ein, um es zu sehen :)
Entschuldigung, ich habe einen dummen Fehler gemacht. Ich habe vergessen, -- vor targetgaslimit einzugeben. Ich versuche es nochmal :D
Ich habe --targetgaslimit 42000000 am Ende der Zeile direkt vor 'console' eingegeben, aber es gibt immer noch 5000 zurück, wenn ich eth.getBlock("latest").gasLimit; und gibt immer noch den gleichen Fehler zurück ... Ich glaube, ich vermisse irgendwo etwas, aber ich kann es nicht herausfinden
Wie ich oben erwähnt habe gaslimit, wird das Gaslimit weiter in Richtung 42000000 verschoben, während der Abbau fortgesetzt wird, es gilt nicht sofort. Versuchen Sie zu laufen eth.getBlock("latest").gasLimit;, um den Strom zu bekommengaslimit
Um das zu überprüfen, sollte ich also "miner.start()" ausführen und warten?
ja, oder setzen Sie das gasLimit im Genesis-Block auf einen großen Wert und starten Sie eine neue Kette
Ich habe jetzt 8 Minuten gewartet und es gibt immer noch 5000 zurück. Ich denke, ich sollte einen neuen Genesis-Block erstellen. Ich habe festgestellt, dass das aktuelle Gaslimit 0x8000000 ist, und ist es in Ordnung, es auf 0x42000000 einzustellen?
Ja, ich denke, wenn kein Block geprägt gaslimitwird, bleibt der gleich. Sie können 0x42000000ohne Probleme daran denken

Geben Sie hier die Bildbeschreibung einIch kann denselben Vertrag für den Remix bereitstellen. Überprüfen Sie Ihr Gaslimit, während Sie den Vertrag bereitstellen, wenn es größer oder gleich 3000000 ist, dann sollten Sie in der Lage sein, den Vertrag bereitzustellen.

Mir ist klar, dass Sie neu dabei sind. Einige Ihrer Formulierungen deuten auf eine mögliche Verwirrung hin, die zu diesem Fehler führen könnte.

versuchen, einen Vertrag über Remix bereitzustellen

Wofür einsetzen?

bereitgestellt auf Metamask

wohin?

Ich werde das ein wenig herunterbrechen.

Wir müssen uns mit Code, Compilern, Chains und Tools auseinandersetzen. Wie Sie wissen, ist Remix eine IDE, hat die JavaScript-VM, die sich hervorragend für oberflächliche Tests eignet, und Sie können sie verwenden, um kompilierten Code in die "echte" Ethereum-Blockchain zu übertragen. Wir könnten sagen " mit Remix eingesetzt" und es bleibt immer noch die Frage , wofür eingesetzt? - Rinkeby, Ropsten, Kovan usw. Testnetze oder Hauptnetz?

In ähnlicher Weise ist MetaMask im Grunde ein Signiergerät und Sie können es verwenden, um auf ein Testnet oder das Mainnet zu pushen.

Die EVM, wo dies hinführt, hat Iterationen des Protokolls durchlaufen, die als Forks bekannt sind. Diese Gabeln erzeugen nicht triviale Unterschiede, die im Compiler berücksichtigt werden müssen, oder der Bytecode wird nicht erfolgreich bereitgestellt . Die EVM befindet sich derzeit auf der Istanbul-Version. Dies ist ein relativ aktuelles Upgrade, daher benötigen Sie einen relativ aktuellen Compiler.

Diese Linie:

pragma solidity ^0.4.24;

ist einfach zweideutig. Wir können nicht sicher sein, welchen Compiler Sie verwenden, aber IIRC, ältere Compiler im unteren Bereich, erzeugen Bytecode, der nicht auf Istanbul bereitgestellt wird . Sie können den Compiler auf 0.5.x ändern (ich bin mir nicht sicher, wo der Boden für Istanbul ist, also zielen Sie auf die hohe Seite) und Sie werden auf dem richtigen Weg sein. Es gibt Breaking Changes, also müssen Sie den Konstruktor leicht ändern - ein weiterer Grund, warum ^das irreführend ist.

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);
    }
}

Wenn Sie das tun, müssen Sie in Remix den richtigen Compiler auswählen, sonst wird er sich beschweren. Nach dem Kompilieren sollten Sie problemlos in Mainnet oder einem Testnet bereitstellen können.

Ich hoffe es hilft.