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.
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 113598
für die Transaktionskosten an.
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.
Matthäus Schmidt
.create(5000)
vs..createB(5000)
Thalsky
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?Matthäus Schmidt
.createB().then()
wird nicht funktionieren. Trotzdem können Sie eine Bibliothek wie Bluebird verwenden, um web3 zu versprechen.Thalsky
createB()
ohne ein Versprechen verwenden?Matthäus Schmidt
Thalsky