Escribí un contrato A que crea un nuevo contrato B y devuelve la dirección del nuevo contrato B que se ha creado. Cuando probé esto en el navegador solidity, parece funcionar bien, pero cuando intenté ejecutar el método de creación usando web3, sigo recibiendo este error:
throw errors.InvalidResponse(result);
^
Error: VM Exception while processing transaction: out of gas
Aquí está mi código de contrato:
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;
}
}
Aquí está mi código Javascript que intenta ejecutar el método createB de A:
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
}
})
He leído muchas otras publicaciones relacionadas y solo pude encontrar respuestas que sugieren usar más gasolina, pero no importa cuánta gasolina envíe con la transacción, arrojaría el mismo error. Puede ver que estoy usando un valor realmente grande para el gas en el código. ¿Alguien puede ayudarme a identificar lo que estoy haciendo mal? Estoy usando la versión de solc: 0.4.9+commit.364da425.Darwin.appleclang, EthereumJS TestRPC v3.0.3 y node v6.4.0.
Después de replicar esto, descubrí el problema.
Deberá especificar el gas nuevamente cuando envíe la .createB()
transacción. Es decir, si usa .createB(5000)
, solo usa el límite de gas predeterminado de 90000 y falla. Establecer el límite de gas en un valor más alto .createB(5000, {gas: 200000})
fue un éxito para mí. browser-solidity da un valor más preciso 113598
del costo de la transacción.
web3.eth.contract(abi).at(baddress).getB()
donde arrojó ese error . Aunque el error anterior se resolvió, aquí es donde tuve problemas antes en truffle y ahora en web3.
Mateo Schmidt
.create(5000)
vs..createB(5000)
thalsky
A.deployed().then(function(instance){return instance.createB(50)}).then(console.log)
, devolvió una dirección de contrato nula. ¿Cómo obtengo la dirección de contrato de B recién creada?Mateo Schmidt
.createB().then()
no funcionará Dicho esto, puede usar una biblioteca como bluebird para prometer web3 de todos modos.thalsky
createB()
sin una promesa?Mateo Schmidt
thalsky