Vertrag, der einen anderen Vertrag mit Web3 erstellt, der aus dem Gasfehler herauskommt, obwohl der Gaswert hoch ist (z. B. 50.000.000)

Ich habe einen Vertrag A geschrieben, der einen neuen Vertrag B erstellt und die Adresse des neu erstellten Vertrags B zurückgibt. Als ich dies im Solidity-Browser getestet habe, scheint es gut zu funktionieren, aber als ich versuchte, die create-Methode mit web3 auszuführen, erhalte ich immer wieder diesen Fehler:

        throw errors.InvalidResponse(result);
    ^
Error: VM Exception while processing transaction: out of gas

Hier ist mein Vertragscode:

pragma solidity ^0.4.2; 
contract B { 
   int public id;
   function B(int _id) { 
     id = _id;
   }
} 

contract A { 
   address Baddress;
   function createB(int _id) returns (address) { 
     Baddress = new B(_id); 
     return Baddress;
   } 
}

Hier ist mein Javascript-Code, der versucht, die createB-Methode von A auszuführen:

web3.eth.defaultAccount = web3.eth.coinbase;
var Acontract = web3.eth.contract([{"constant":false,"inputs":[],"name":"getdum","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"num","type":"int256"}],"name":"create","outputs":[],"payable":false,"type":"function"}]);

var A = Acontract.new({from: web3.eth.accounts[0], 
data: '{{compiled byte code}}', 
gas: '47000000'}, function (e, contract){
   console.log(e, contract);
   if (typeof contract.address !== 'undefined') {
     console.log('Contract mined! address: ' + contract.address);
     contract.createB(5000).then(console.log); // This line throws the error
   }
})

Ich habe viele andere verwandte Beiträge gelesen und konnte nur Antworten finden, die vorschlagen, mehr Gas zu verwenden, aber egal wie viel Gas ich mit der Transaktion gesendet habe, es würde den gleichen Fehler auslösen. Sie können sehen, dass ich im Code einen wirklich großen Wert für Gas verwende. Kann mir jemand helfen zu erkennen, was ich falsch mache? Ich verwende solc Version: 0.4.9+commit.364da425.Darwin.appleclang, EthereumJS TestRPC v3.0.3 und Node v6.4.0.

Benutzt du Trüffel? Außerdem denke ich, dass Sie möglicherweise einen Tippfehler in Ihrem Code .create(5000)vs..createB(5000)
Vielen Dank, dass Sie den Tippfehler bemerkt haben. Ich habe dort versehentlich das B gelöscht ... Ich habe versucht, Trüffel zu verwenden, aber als ich diesen Befehl verwendet habe: A.deployed().then(function(instance){return instance.createB(50)}).then(console.log), hat er eine Null-Vertragsadresse zurückgegeben. Wie erhalte ich die neu erstellte B-Vertragsadresse?
Ich verwende eigentlich keinen Trüffel, aber die versprochenen Methoden sind (noch!) nicht in web3 nativ. .createB().then()wird nicht funktionieren. Trotzdem können Sie eine Bibliothek wie Bluebird verwenden, um web3 zu versprechen.
Ach ich verstehe. Obwohl, denkst du, ich kann createB()ohne ein Versprechen verwenden?
Sie können, es wird nur ein Transaktions-Hash und kein Thenable zurückgegeben. Die Standardmethode besteht darin, dies zu tun und dann nach einem Ereignis zu filtern, das die Transaktion erstellt.
Richtig, obwohl es in meinem Fall nur einen Fehler zurückgibt, egal wie viel Gas ich verwende. Es ist seltsam, weil es so viele Tutorials zu Verträgen gibt, die andere Verträge erstellen, und keiner von ihnen schien Probleme mit Benzinmangel zu haben.

Antworten (1)

Nachdem ich dies repliziert hatte, entdeckte ich das Problem.

Sie müssen das Gas erneut angeben, wenn Sie die .createB()Transaktion senden. Das heißt, wenn Sie verwenden .createB(5000), verwendet es nur die Standardgasgrenze von 90000 und schlägt fehl. Die Einstellung des Gaslimits auf höher, mit .createB(5000, {gas: 200000})war für mich erfolgreich. browser-solidity gibt einen genaueren Wert 113598für die Transaktionskosten an.

Danke dir! Das war in der Tat die Gasversorgung, die ich vermisste. web3.eth.contract(abi).at(baddress).getB()Ich bin jedoch immer noch nicht in der Lage, den korrekten ID-Wert von B zu erhalten, da der Fehler „ungültige Adresse“ aufgetreten ist, nachdem ich B von seiner in A zurückgegebenen Vertragsadresse aus aufgerufen habe . Obwohl der vorherige Fehler behoben wurde, hatte ich hier zuvor Probleme mit Truffle und jetzt web3.
NVM! Ich habe es behoben, nachdem ich in Ihrem letzten Kommentar nach eth.filter gesucht hatte. Nochmals vielen Dank für Ihre Hilfe!!
Prost dafür! verbringen unsere Debugging.