Das Iterieren über eine Schleife verursacht einen Gasfehler

Ich habe ein Array von JSON-Objekten, die eine ID und 5 Felder enthalten. Ich habe eine Funktion, um diese Felder mit einer eindeutigen Kennung innerhalb eines Vertrags zu registrieren.

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;
    }
}  

Ich kann mit einem Vertrag interagieren und einen Transaktions-Hash aus der ausgeführten Transaktion in einem Vertrag erhalten:

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);
    });  

Hier ist items ein Array von JSON-Objekten. Aber wenn ich das gesamte Array durchschleife, erhalte ich einen Gasfehler.

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);
    });  

Hier habe ich nur 2 Attribute aufgelistet, aber ich habe insgesamt 5, während ich das Produkt registriere. Ich habe testrpc verwendet und wenn ich das Limit auf einen wirklich hohen Betrag von 4500000000000 setze, kann ich die Transaktionen ausführen. Aber wenn ich die Protokolle für testrpc sehe, ist das verwendete Gas 27608. Ist es möglich, das zum Ausführen einer Transaktion benötigte Gas zu bestimmen? Irgendwelche Vorschläge?

Antworten (1)

Es sollte eine schätztGas () -Methode geben, die Sie wie folgt aufrufen können:

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);
   });  
Sie haben in Ihrem Beispiel ein Extra sendTransaction, das nicht benötigt werden sollte.