ungültiges Argument 0: Hex-String ohne 0x-Präfix

Um eine Liste der Transaktionen nach Kontoadresse zu erhalten, habe ich das folgende Code-Snippet verwendet -

function getTransactionsByAccount(myaccount, startBlockNumber, endBlockNumber) {
   if (endBlockNumber == null) {
     endBlockNumber = eth.blockNumber;
     console.log("Using endBlockNumber: " + endBlockNumber);
   }
   if (startBlockNumber == null) {
     startBlockNumber = endBlockNumber - 1000;
     console.log("Using startBlockNumber: " + startBlockNumber);
   }
   console.log("Searching for transactions to/from account \"" + myaccount + "\" within blocks "  + startBlockNumber + " and " + endBlockNumber);

   for (var i = startBlockNumber; i <= endBlockNumber; i++) {
     if (i % 1000 == 0) {
       console.log("Searching block " + i);
     }
     var block = eth.getBlock(i, true);
     if (block != null && block.transactions != null) {
       block.transactions.forEach( function(e) {
         if (myaccount == "*" || myaccount == e.from || myaccount == e.to) {
           console.log("  tx hash          : " + e.hash + "\n"
             + "   nonce           : " + e.nonce + "\n"
             + "   blockHash       : " + e.blockHash + "\n"
             + "   blockNumber     : " + e.blockNumber + "\n"
             + "   transactionIndex: " + e.transactionIndex + "\n"
             + "   from            : " + e.from + "\n" 
             + "   to              : " + e.to + "\n"
             + "   value           : " + e.value + "\n"
             + "   time            : " + block.timestamp + " " + new Date(block.timestamp * 1000).toGMTString() + "\n"
             + "   gasPrice        : " + e.gasPrice + "\n"
             + "   gas             : " + e.gas + "\n"
             + "   input           : " + e.input);
         }
       })
     }
   }
 }

Beim Ausführen des Skripts erhalte ich jedoch die folgende Fehlermeldung.

Error: invalid argument 0: hex string without 0x prefix
    at web3.js:3143:20
    at web3.js:6347:15
    at web3.js:5081:36
    at getTransactionsByAccount (/root/files/js/getTransactionsByAccount.js:16:18)
    at <anonymous>:1:43

Antworten (1)

Bei weiterer Fehlerbehebung wurde festgestellt, dass Blöcke weniger als 1000 waren

eth.blockNumber
> 41

Als Ergebnis startBlockNumberist negativ (seit 41-1000). Als Ergebnis eth.getBlock(i, true);wird nach einem kraftschlüssigen Block gesucht.

Es wäre besser gewesen, wenn der Fehler hinweisend gewesen wäre.

Lösung -

...
if (startBlockNumber == null) {
     startBlockNumber = endBlockNumber - 1000;
     if(startBlockNumber<0)
     startBlockNumber=0;
     console.log("Using startBlockNumber: " + startBlockNumber);
   }
...