Contrato creando otro contrato usando Web3 saliendo del error de gas a pesar de que el valor del gas es grande (por ejemplo, 50,000,000)

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.

¿Estás usando trufa? Además, creo que puede tener un error tipográfico en su código .create(5000)vs..createB(5000)
Gracias por notar el error tipográfico. Accidentalmente eliminé la B allí... Intenté usar truffle, pero cuando usé este comando: 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?
De hecho, no uso trufa, pero los métodos prometidos no son nativos de web3 (¡todavía!). .createB().then()no funcionará Dicho esto, puede usar una biblioteca como bluebird para prometer web3 de todos modos.
Ah, claro. Aunque, ¿crees que puedo usar createB()sin una promesa?
Puede, solo devolverá un hash de transacción en lugar de un thenable. La forma estándar es hacer eso, luego filtrar por un evento que crea la transacción.
Correcto, aunque en mi caso solo devuelve error por mucha gasolina que consuma. Es extraño porque hay tantos tutoriales sobre contratos que crean otros contratos, y ninguno de ellos parecía tener problemas con la falta de gasolina.

Respuestas (1)

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 113598del costo de la transacción.

¡Gracias! De hecho, este fue el suministro de gas que perdí. Sin embargo, todavía no puedo obtener el valor de ID correcto de B debido a un error de "dirección no válida" después de llamar a B desde su dirección de contrato devuelta en A. Seguí el ejemplo en la página de documentación de Web3 usando 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.
NVM! Lo arreglé después de buscar eth.filter en tu último comentario. ¡¡Gracias de nuevo por tu ayuda!!
¡Saludos por esto! pasar el nuestro depurando.