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!
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
eth.getBlock("latest").gasLimit;
Running environment is set as Web3 Provider.
then wie oben erwähnt, mit welchem Knoten verbinden Sie sich?eth.getBlock("latest").gasLimit;
Sie auf der Konsole Ihres Netzwerks ausgeführt werden?--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.geth --datadir ... --targetgaslimit '42000000'
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
gaslimit
wird, bleibt der gleich. Sie können 0x42000000
ohne Probleme daran denkenMir 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.
Henk
Benutzer44919
Benutzer44919