Iterar sobre un bucle provoca un error de falta de gas

Tengo una matriz de objetos json, que contienen una identificación y 5 campos. Tengo una función para registrar estos campos contra un identificador único dentro de un contrato.

contract Test {  
    struct Product {  
        uint p_id,  
        uint qty
    }

    mapping(bytes32 => Product) ProdMap;

    function registerProduct (bytes32 id, uint p, uint q) returns (bool) {
        ProdMap[id].p_id = p;
        ProdMap[id].qty = q;
    }
}  

Puedo interactuar con un contrato y obtener un hash de transacción de la transacción ejecutada en un contrato:

contractInstance.registerProduct.sendTransaction(
    web3.fromAscii("0abc123"),
    items[0].Product_ID,
    items[0].Quantity,
    {
        from:web3.eth.accounts[0],
        gas:470000
    }, 
    function(err,txid) {
        if(err) { console.log(err); }
        var hash = txid;
        console.log('Transaction registered '+'and transaction hash is: ' + hash);
        callback(null,hash);
    });  

Aquí los elementos son una matriz si los objetos json. Pero cuando recorro toda la matriz, obtengo un error de falta de gas.

contractInstance.registerProduct.sendTransaction(
    web3.fromAscii(item.Line_Item_ID),
    item.Product_ID,
    item.Quantity,
    {
        from:web3.eth.accounts[0],
        gas:1000000
    }, 
    function(err,txid) {
        if(err) {console.log(err);}
        var hash = txid;
        console.log('Transaction registered '+'and transaction hash is: ' + hash);
        callback(null,hash);
    });  

Aquí he enumerado solo 2 atributos, pero tengo 5 en total al registrar el producto. He estado usando testrpc y cuando configuro el límite en una cantidad realmente alta de 4500000000000, puedo ejecutar las transacciones. Pero cuando veo los registros de testrpc, el gas utilizado es 27608. ¿Es posible determinar el gas necesario para ejecutar una transacción? ¿Alguna sugerencia?

Respuestas (1)

Debería haber un método de estimaciónGas(), puede invocarlo así:

contractInstance.registerProduct.sendTransaction.estimateGas(
    web3.fromAscii(item.Line_Item_ID),
    item.Product_ID,
    item.Quantity,
    {
        from:web3.eth.accounts[0]
   }, 
   function(err,txid) {
        if(err) {console.log(err);}
        var hash = txid;
        console.log('Transaction registered '+'and transaction hash is: ' + hash);
        callback(null,hash);
   });  
Tienes un extra sendTransactionen tu ejemplo que no debería ser necesario.