Fehler: VM-Ausnahme beim Ausführen der Transaktion: kein Gas mehr

Ich bin neu bei Smart Contracts, also sei bitte sanft;)

Ich habe Probleme, einen Vertrag für die testrpcVerwendung von Trüffel bereitzustellen.

$ truffle deploy

Fehler beim Bereitstellen von LFC:

Fehler: VM-Ausnahme beim Ausführen der Transaktion: kein Gas mehr

Hier mein Vertrag:

import "Mortal.sol";
import "Exchanger.sol";
import "ExternalStorage.sol";
import "DepositDB.sol";
import "ForexDB.sol";
import "OrderDB.sol";
import "ContractManagerDB.sol";

contract LFC is Mortal {

    // ForEx exchanger
    // Steve Huckle

    bytes3 private constant defaultBaseCurrency = "Eth";

    bytes32 private constant orderName = "Order DB";
    bytes32 private constant forexName = "Forex DB";
    bytes32 private constant depositName = "Deposit DB";    

    Exchanger private exchanger;
    ExternalStorage private storageContract;
    OrderDB private orderDB;
    DepositDB private depositDB;
    ForexDB private forexDB;
    ContractManagerDB private contractManagerDB;

    //event ExchangerCreated(address ex, uint now);

    function createExchanger() public {
        exchanger = new Exchanger();
    }

    function createStorage() public onlyOwner {
        storageContract = new ExternalStorage();
        storageContract.changeOwner(exchanger);
    }

    function createContractManager() public onlyOwner {
        contractManagerDB = new ContractManagerDB();
        contractManagerDB.setStorage(storageContract);
        contractManagerDB.changeOwner(address(exchanger));       
        exchanger.setContractManager(contractManagerDB);
    }

    function createOrderContract() public onlyOwner {
        orderDB = new OrderDB();
        orderDB.setStorage(storageContract);
        orderDB.changeOwner(address(exchanger));
        //storageContract.setAddressValue(sha3(managerName,orderName),orderDB);
    }

    function createForexContract() public onlyOwner {
        forexDB = new ForexDB();
        forexDB.setStorage(storageContract); 
        forexDB.changeOwner(address(exchanger));
        //storageContract.setAddressValue(sha3(managerName,forexName),forexDB);
    }   

    function createDepositContract() public onlyOwner {
        depositDB = new DepositDB();
        depositDB.setStorage(storageContract);
        depositDB.changeOwner(address(exchanger));
        //storageContract.setAddressValue(sha3(managerName,depositDBName),depositDB);
    }

    function addAdmin() public onlyOwner {
        storageContract.addAdmin(exchanger);
        storageContract.addAdmin(depositDB);
        storageContract.addAdmin(forexDB);      
        storageContract.addAdmin(orderDB);           
        storageContract.addAdmin(contractManagerDB);
    }

    function addContracts() public {
        contractManagerDB.addContract(orderName,orderDB);
        contractManagerDB.addContract(forexName,forexDB);
        contractManagerDB.addContract(depositName,depositDB);
        exchanger.setNames(orderName,forexName,depositName);
    }

    function setForexBase() public {
        forexDB.setBase(defaultBaseCurrency);
    }

    function getExchanger() public constant returns (address) {
        return exchanger;
    }
}

Jede Hilfe und/oder Erklärung, wie ich das Problem lösen kann und was ich falsch mache, wäre sehr dankbar. Das Problem scheint darin zu liegen, zu viele "Neue" zu machen. Ist diese Vorgehensweise ungewöhnlich? Anstatt es so zu machen, sollte ich stattdessen die abhängigen Verträge bereitstellen und dann ihre Adressen an den obigen Vertrag übergeben?

Es sieht so aus, als ob Ihr Vertrag sehr groß ist und viel Benzin benötigt. In truffle console, kannst du es versuchen LFC.new({from: account, gas: 3000000}). Wenn dies fehlschlägt, versuchen Sie es mit höheren Werten. Wenn dies fehlschlägt, müssen Sie in verschiedene Komponenten aufteilen. Sie sollten auch zur Verwendung von Truffle v2 übergehen.
Auf Truffle v2 aktualisiert, was cool ist - aber es verwendet jetzt eine ganz neue Bereitstellungsmethode, die später wahrscheinlich cool ist, aber nicht so cool, wenn ich nur schnell "Truffle Deployment" auf die alte Art und Weise ausführen möchte;)

Antworten (1)

Sie können nur bis zu ~4,5 Millionen Gas pro Block verbrauchen. Wenn Ihr Vertrag sehr groß ist, kann es sein, dass mehr als das erforderlich ist. Die Lösung besteht darin, jeden einzelnen Vertrag separat bereitzustellen und dann seine Adressen an den Ersteller des Hauptvertrags weiterzugeben, sodass die Gaskosten auf mehrere Transaktionen verteilt werden.

Ja - als ich die Dokumentation etwas weiter las, kam ich schnell zu dem Schluss, dass der Weg zum Ziel darin besteht, alle abhängigen Verträge bereitzustellen und dann ihre Adressen an den Konstrukteur von LFC weiterzugeben. Aber wem gehören die abhängigen Verträge, die dies auf diese Weise tun? Wird es das Konto der Person sein, die die Adressen an LFC weitergibt?
Niemand "besitzt" Verträge .... Sie tun, was im Code steht, es spielt keine Rolle, wer sie erstellt hat. Wenn Sie im Konstruktor ausdrücklich einen Eigentümer festlegen, sollten Sie dem Eigentümer nur erlauben, das Eigentum an einer anderen Adresse zu übertragen. Wenn Sie die - Mortalund onlyOwner-Verträge verwenden, sollten Sie deren Quellcode wirklich lesen und verstehen, was sie tun. Es ist nicht sehr kompliziert
Ah ja - Eigentümer = msg.sender. Verzeihen Sie mir, dass ich eine dumme Frage stelle und unter einem Moment der Dummheit leide :(