Der Vertragscode konnte nicht gespeichert werden, bitte überprüfen Sie Ihre Gasmenge

Ich weiß, dass dieses Problem schon mehrmals diskutiert wurde, aber ich kann die Lösung für mein Problem aus keiner der Antworten entnehmen,

Mein Vertrag wurde gut bereitgestellt, bevor die folgende Funktion hinzugefügt wurde:

function setApproval(address addr, bool approved)payable returns(string, uint, uint) {

       //some logical operations and assignments

    }

Sobald ich die Funktion hinzufüge und versuche, den Vertrag bereitzustellen, erhalte ich diesen Fehler

Fehler aufgetreten, Bailing. Netzwerkstatus unbekannt. Überprüfen Sie erfolgreiche Transaktionen manuell. Fehler: Der Vertragscode konnte nicht gespeichert werden, bitte überprüfen Sie Ihre Gasmenge.

Test-RPC-Server zeigt folgende Protokolle

Transaction: 0xd5791ac0c6059cbd43e00a7fabe566ada3f0572966f12ff25da6e04215840f39 Contract created: 0x9062592c5dd06340401c1e750ddb025defabf5be Gas usage: 4712388 Block Number: 16 Block Time: Sat Jul 22 2017 03:30:30 GMT+0530 (India Standard Time) Runtime Error: out of gas

erneut nach dem Entfernen dieses Funktionsvertrags fehlerfrei bereitgestellt

was ist falsch an dieser funktion?

Mein Vertragscode umfasst etwa 250 Zeilen. Gibt es eine Begrenzung für die Größe des Vertragscodes?

Danke im Voraus

Wie setzen Sie den Vertrag um? Versuchen Sie, die gasLimitEinstellung zu erhöhen, falls vorhanden.
Wie setzen Sie Ihren Vertrag um? Wenn Sie Ihren Code eingeben, können wir Ihnen mit einer modifizierten Version helfen. Um den Gasbetrag für eine einzelne Transaktion zu ändern, gehen Sie folgendermaßen vor eth.sendTransaction(params...., { gas: 10000000 }).
@jeff Ich stelle den Code mithilfe der Truffle-Konsole bereit. Ist es möglich, das Gaslimit in der Azure Ethereum Consortium Blockchain zu erhöhen
@Ismael Ich erhalte den Fehler beim Bereitstellen des Vertrags. Es geht nicht um eine einzelne Transaktion, der Vertrag ohne setApproval()Funktion wird ohne Fehler bereitgestellt, und ich kann die Funktionen mit der von Ihnen vorgeschlagenen Methode aufrufen, aber sobald ich diese bestimmte Funktion hinzufüge und versuchen, den Vertrag erneut bereitzustellen, erhalte ich die Fehlermeldung, die ich in der Frage angegeben habe
@ jeff Der Befehl, den ich für die Bereitstellung verwendetruffle migrate --reset
@SwapnilKumbhar Ich weiß nichts über Trüffel. Vielleicht können Sie eine andere Bereitstellungsmethode ausprobieren ( MEW stellt eine bereit), um das Problem besser zu identifizieren. Auch eine kostenpflichtige Constant-Methode erscheint mir seltsam, da Constant-Funktionen "kostenlos" sein sollen. Bin mir aber nicht sicher ob es legal ist.
Es ist keine konstante Funktion, vielleicht sind Sie verwirrtretrurns
@SwapnilKumbhar Wenn der Fehler erst nach dem Hinzufügen einer neuen Funktion auftritt, ist die Ursache sehr wahrscheinlich, dass Ihnen beim Bereitstellen das Benzin ausgeht. Sie sollten also die Gasmenge erhöhen. Ich denke, bei Trüffeln müssen Sie Ihre Bereitstellungsfunktion so ändern, dass Sie deployer.deploy(MyContract, params.., {gas: 5000000});bei Bedarf die Gasmenge erhöhen.
Was ist der Code in setApproval? Wenn es ohne diese Funktion funktioniert, muss das Problem mit dem Code zu tun haben, den Sie in der Frage ausgelassen haben.
@pabloruiz55 Code innerhalb von setApproval () wirkt sich nicht auf das Ergebnis aus. Ich habe versucht, den Code zu kommentieren, schließlich kam ich nach dem Lesen einiger Artikel zu der Annahme, dass die Größe des Codes in der Azure Ethereum Consortium Blockchain begrenzt ist, da die max. Gaslimit für einen Block ist 4712388.

Antworten (5)

Ändern Sie in Ihrer 2_deploy_contracts.jsDatei das GasPreisstandardmäßig auf eine höhere Zahl, dh:

// 2_deploy_contracts.js

const MyContract = artifacts.require('./MyContract.sol')

module.exports = function (deployer) {
  deployer.deploy(MyContract, { gas: 5000000 })
}

Ich hatte das gleiche Problem und das hat bei mir funktioniert.

dies funktioniert mit testrpc, ich habe versucht, dies mit dem Blockchain-Netzwerk des Azure-Ethereum-Konsortiums zu verwenden, es funktioniert nicht, schließlich kam ich nach dem Lesen einiger Artikel zu der Annahme, dass die Größe des Codes in der Blockchain des Azure-Ethereum-Konsortiums begrenzt ist, da die max. Das Gaslimit für einen Block beträgt 4712388. Ich glaube, dies ist die Einschränkung der Azure-Ethereum-Konsortium-Blockchain.
@SwapnilKumbhar, ich verwende auch das Blockchain-Netzwerk des Azure Ethereum Consortium und stoße auf diesen Fehler, wenn ich versuche, einen Vertrag über meine dApp bereitzustellen. Aber es funktioniert gut für denselben Vertrag, wenn ich es über Remix einsetze. Ich weiß nicht, was mein Problem ist, aber es scheint etwas mit dem Bereitstellungsprozess zu tun zu haben und nicht mit der Vertragsgröße oder dem erforderlichen Gas
@dchang Können Sie Ihren Vertragscode hier teilen? Das wird hilfreich sein, um Ihr Problem zu debuggen. Im Moment werde ich vorschlagen, dass Sie versuchen, die Codezeilen zu reduzieren und zu versuchen, sie bereitzustellen. Versuchen Sie besser, einige schwere Funktionen zu entfernen. Wenn es funktioniert, teilen Sie Ihren Vertrag logisch in mehrere Verträge auf und stellen Sie sie einzeln bereit. Ich habe diese Lösung angewendet, als ich das Problem mit einigen großen Verträgen hatte.
@SwapnilKumbhar Wie bereits erwähnt, ist das Problem nicht der Vertrag selbst, da ich ihn mit Remix bereitstellen kann. Und um es zu verwerfen, versuche ich es mit einem sehr einfachen Vertrag: "pragma solidity ^0.5.3; contract TestContrato{ }". Einfacher geht es nicht. Zusätzlicher Hinweis: Ich verwende keinen Truffle, stattdessen versuche ich, nur web3 (Version 1.0.0-beta.36) zu verwenden, indem ich die Methode deploy () verwende oder eine Rohübertragung mit Daten sende: Bytecode

Wenn ein Vertrag von der Schnittstelle erbt und keine Funktion implementiert, wird dieser Fehler ausgegeben.

Trüffel 4.0.4 solc 0.4.18

interface IF { 
    function doSomething() external view returns(uint); 
}

contract Inherit is IF {
    Inherit() public; 
}

beim Einsatz. wird Fehler ausgeben:

Der Vertragscode konnte nicht gespeichert werden, bitte überprüfen Sie Ihre Gasmenge

Die Lösung besteht darin, die Funktion zu implementieren.

contract Inherit is IF {
    doSomething() external view returns(uint) {
        return 5;
    }
}

Das Problem, das selten auftritt, aber genau dieselbe Fehlermeldung verursacht, ist das folgende:

Derzeit ist die Größe des Vertragscodes auf 24 KB begrenzt, und manchmal kann Ihr Bytecode größer sein, was genau das gleiche Problem verursacht.

Wechseln Sie zu Ihrer Vertragserstellungs-JSON-Datei und prüfen Sie, ob die Größe des bereitgestellten Bytecodes größer als 24 KB ist.

Lösung: Dies kann durch verschiedene Vertragsoptimierungen wie das Entfernen ausreichender Getter, öffentliche Deklarationen usw. gelöst werden.

Ich habe @rhlsthrm-Lösung mit zusätzlicher Modifikation verwendet, weil seine Lösung mir gegeben hat

Fehler: Sperrgasgrenze überschritten

Meine Lösung ist für Geth.

Holen Sie sich zuerst das Gaslimit aus dem letzten Block

verwenden

eth.getBlock("latest").gasLimit

Kopieren Sie das Gaslimit und fügen Sie es dann so ein

var Identity = artifacts.require("./Identity.sol");

module.exports = function(deployer) {
  deployer.deploy(Identity, { gas: 794722 });
};

Erhöhen Sie den Gaswert in Ihrer Bereitstellungsdatei.

Wenn Sie den Bereitstellungsfehler protokollieren, können Sie die Gasdetails wie folgt sehen:

cumulativeGasUsed: 1217170,
effectiveGasPrice: 2500000011,
gasUsed: 1000000,

Bitte überprüfen Sie, ob 'gasUsed' kleiner als 'cumulativeGasUsed' ist, damit Sie den Gaswert in Ihrer Deployment-Code-Einstellung wie folgt erhöhen sollten:

const result = await new web3.eth.Contract(abi)
    .deploy({
      data: evm.bytecode.object,
    })
    .send({ from: accounts[0], gas: 1000000 });

Ändern Sie den Gaswert (1000000) in (2000000) wie folgt:

const result = await new web3.eth.Contract(abi)
    .deploy({
      data: evm.bytecode.object,
    })
    .send({ from: accounts[0], gas: 2000000 });