Ich bin neu bei Smart Contracts, also sei bitte sanft;)
Ich habe Probleme, einen Vertrag für die testrpc
Verwendung 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?
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.
Mortal
und onlyOwner
-Verträge verwenden, sollten Sie deren Quellcode wirklich lesen und verstehen, was sie tun. Es ist nicht sehr kompliziert
Xavier Leprêtre B9lab
truffle console
, kannst du es versuchenLFC.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.Glühwächter