Wie bekomme ich Transaktionen nach Konto mit web3 js?

Ich bin mir sicher, dass diese Frage schon einmal gestellt wurde, aber ich habe kein Ergebnis gefunden, das meinem Problem geholfen hat.

Wie kann ich die Transaktionen (ein- und ausgehend) für ein bestimmtes Konto abrufen? Ich benutze nodejs und web3?

Mit dieser Zeile erhalte ich die Anzahl der gesendeten Transaktionen:

web3.eth.getTransactionCount(accounts[i])

Also sollte zumindest web3 etwas über die Kontoaktivität wissen.

Gibt es eine einfache Möglichkeit, die Transaktionen meiner Konten abzurufen? Oder habe ich da was übersehen? Muss ich die gesamte Blockchain blockweise durchsuchen, um meine Transaktionen zu erhalten?

Es gibt tatsächlich einen wichtigen Unterschied zwischen der Kenntnis der Anzahl der Transaktionen und dem tatsächlichen Abrufen dieser TXs. Der "Transaktionszähler" ist auch die Nonce für das Konto, die benötigt wird, um neue Transaktionen zu erstellen, und ist ebenso wie der Saldo Teil des Kontostands. Vergangene Transaktionen sind nicht Teil des aktuellen Zustands, daher müssen Sie tatsächlich alle vergangenen Blöcke filtern, um sie zu finden
Ich habe das gleiche Problem. Hat jemand Snippet-Code von Java mit web3j? Danke
Die beste Antwort könnte die folgende sein: ethereum.stackexchange.com/a/86426/55270

Antworten (8)

Einfache Transaktionen werden nicht indiziert. Sie müssen also entweder über alle Blöcke iterieren, eine Art Off-Chain-Index verwenden (z. B. etherscan.io ) oder selbst einen erstellen und verwenden.

Sie können beispielsweise diesen heuristischen Ansatz verwenden, ohne die gesamte Kette verarbeiten zu müssen

var myAddr = '0xbb9bc244d798123fde783fcc1c72d3bb8c189413';
var currentBlock = eth.blockNumber;
var n = eth.getTransactionCount(myAddr, currentBlock);
var bal = eth.getBalance(myAddr, currentBlock);
for (var i=currentBlock; i >= 0 && (n > 0 || bal > 0); --i) {
    try {
        var block = eth.getBlock(i, true);
        if (block && block.transactions) {
            block.transactions.forEach(function(e) {
                if (myAddr == e.from) {
                    if (e.from != e.to)
                        bal = bal.plus(e.value);
                    console.log(i, e.from, e.to, e.value.toString(10));
                    --n;
                }
                if (myAddr == e.to) {
                    if (e.from != e.to)
                        bal = bal.minus(e.value);
                    console.log(i, e.from, e.to, e.value.toString(10));
                }
            });
        }
    } catch (e) { console.error("Error in block " + i, e); }
}

Wie funktioniert es?

Unter Verwendung der verfügbaren Informationen über den aktuellen Status (Anzahl der "Von"-Transaktionen und des aktuellen Saldos) geht es in der Zeit zurück, bis mindestens so viele "Von"-Transaktionen gefunden wurden, und geht dann weiter zurück, bis der Saldo erreicht ist 0.

Die inhärente Einschränkung besteht darin, dass Transaktionen mit dem Wert 0 vor der Einzahlung auf das Konto nicht gefunden werden.


Vertragsereignisse hingegen werden indiziert . Wenn Sie also einen Smart Contract entwickeln, können Sie davon Gebrauch machen.
Verwenden der web3 1.0.0-API:

web3.eth.getPastLogs({fromBlock:'0x0',address:'0x9e3319636e2126e3c0bc9e3134AEC5e1508A46c7'})
.then(res => {
  res.forEach(rec => {
    console.log(rec.blockNumber, rec.transactionHash, rec.topics);
  });
}).catch(err => console.log("getPastLogs failed", err));

Oder über JSON RPC eth_getLogs .

Dieses Skript hat eine getTransactionsByAccount. Sie müssen es ändern, indem Sie web3 voranstellen, zum Beispiel use web3.eth.blockNumberstatt just eth.blockNumber(was in der Geth-Konsole funktioniert, da die Geth-Konsole das web3-Objekt enthält).

Oben werden die einfachen Transaktionen angegeben, und es ist mehr Arbeit erforderlich , um interne Transaktionen zu erhalten .

Gibt neben dem Kommentar von @Tjaden web3.eth.getTransactionCount(account)nur die Anzahl der Transaktionen an, die von stammen account.

Danke schön. Bevor ich fragte, fand ich das Skript und fügte es in meinen Editor ein. Es hat nicht funktioniert und ich hoffte, dass es einen einfachen Weg gibt, den Grund dafür zu finden. Keine Zeit, es jetzt zu versuchen, aber ist es fertig, wenn ich web3 hinzufüge, oder muss ich Variablen usw. definieren?
web3sollte das einzige Objekt sein, das Sie brauchen; die anderen Variablen werden an die getTransactionsByAccountFunktion übergeben.
Wenn Sie das Skript in node ausführen, müssen Sie auf jeden web3-Aufruf warten
Gibt dies auch ausstehende Transaktionen zurück?
Beste Antwort meiner Meinung nach aufgrund seiner Praktikabilität. Schade, dass dies für bscscan nicht praktikabel ist, da sie manchmal ernsthaft zu verzögern scheinen.

Die passende Antwort zum Datum:

class TransactionChecker {
    constructor(address) {
        this.address = address.toLowerCase();
        this.web3 = new Web3("https://mainnet.infura.io/v3/60968ff3b2f84a0ebdff7a993f4d080b");
}

async checkBlock() {
    let block = await this.web3.eth.getBlock('latest');
    let number = block.number;
    let transactions = block.transactions;
    //console.log('Search Block: ' + transactions);

    if (block != null && block.transactions != null) {
        for (let txHash of block.transactions) {
            let tx = await this.web3.eth.getTransaction(txHash);
            if (this.address == tx.to.toLowerCase()) {
                console.log("from: " + tx.from.toLowerCase() + " to: " + tx.to.toLowerCase() + " value: " + tx.value);
            }
        }
    }
  }
}

 var transactionChecker = new  TransactionChecker('0x69fb2a80542721682bfe8daa8fee847cddd1a267');
 transactionChecker.checkBlock();

Ausgabe:

 from: 0x240946ca5418ba362e9011d6454ff858adc0e0ae to: 0x2c334d73c68bbc45dd55b13c5dea3a8f84ea053c value: 2000000000000000000
 from: 0x410282b6e53c0d48007ace4874b6afa6754425f7 to: 0xe6c46e42256703de29e37b01a246e11a5b102c6b value: 450000000000000000
 from: 0xffc5e446d5f32f7c8479b5eae4271751dacd45b8 to: 0x7a250d5630b4cf539739df2c5dacb4c659f2488d value: 1000000000000000000
 from: 0xd8376d071c27582fb15c6a9a46eaf23e6adaf76e to: 0x7a250d5630b4cf539739df2c5dacb4c659f2488d value: 2000000000000000000
 from: 0x7f5896c91a1bf9e94d4d81b142daa61d50c8eecb to: 0xba2eac592746fc7427247b591507dac51c51a500 value: 0
 from: 0x02314d41f62e62c02b8cbd036334573db1334f11 to: 0x4d62c46898bdcd6b14118646ed1401336c9a47b3 value: 0
 from: 0x9cc53c6f67332f7c4aa5a56f83121e51d30c5923 to: 0x0a331b3de09c986eaaf967d8b493b816cb7902e8 value: 296699999999999940
 from: 0xc09e7e05da6b021d881b0e3ec580307c40102e2d to: 0xaf4afb03963f3f5f87a3e20a0f9191270c7b3436 value: 638368162441200000
 from: 0x32be343b94f860124dc4fee278fdcbd38c102d88 to: 0xa910f92acdaf488fa6ef02174fb86208ad7722ba value: 1487418725338565767
 from: 0x343b18bf65d9d2a64bb763246e207d2d303328bf to: 0xdac17f958d2ee523a2206206994597c13d831ec7 value: 0
 from: 0x343b18bf65d9d2a64bb763246e207d2d303328bf to: 0xdac17f958d2ee523a2206206994597c13d831ec7 value: 0
 from: 0xcb0249c85ba9b6e32d79adaae2f9660ae0dfbefc to: 0x239220734954c95c852f0fc059ec783a3f0e283c value: 1000000000000000
Funktioniert das auch mit ausstehenden Transaktionen?

Ich weiß, es ist zu spät, um diese Frage zu beantworten. Aber ich hoffe es konnte anderen helfen.

Sie können Transaktionen nicht direkt mit web3 und JSON-RPC auflisten. Um eine Liste von Transaktionen mit einer Adresse zu erhalten, müssen Sie ganze (oder einen Teil davon) Blöcke der Ethereum-Blockchain scannen, um sie zu finden.

Sie könnten es erraten! Es ist ziemlich zeitintensiv!

Um dieses Problem zu lösen, benötigen Sie einen Block-Indexer oder einen Block-Explorer. Sie indizieren alle Blockchain-Daten in unterschiedlicher Form und Reihenfolge. Sie verwenden einen Block-Explorer wie „Etherscan“ oder setzen einen Open-Source-Indexer wie „Blockscout“ ein.

Sie bieten Ihnen eine hilfreichere API (im Vergleich zu ETH RPC). Sie müssen mit der Methode „txlist“ im Modul „Konto“ interagieren.

Das ist nicht richtig. Sie haben nicht die Möglichkeit, Transaktionen einer Adresse direkt abzurufen, aber Sie können die Transaktion mit web3 und JSON-RPC auflisten. Sie benötigen nur ein wenig Logik, um sie zu filtern.

Ich habe diese Methode 'web3.eth.getTransactionsByAccount' in meiner Konsole nicht gefunden. Wie ich sehe, gibt es keine direkte Möglichkeit, Transaktionen nach Kontoadresse abzurufen. Vielleicht sollten Sie die gesamte Blockchain auf Ihre Weise crawlen, oder Sie können die API eines Drittanbieters verwenden.

Diese Methode existiert nicht in web3. Worauf sich @eth bezog, war ein Skript namens getTransactionsByAccount.
 web3.eth.getTransactionCount("0x8fFcABE2D92A76286b58f6C286980877C3C2C5C6")
 .then((b=console.log)=>{
    console.log(b)
    for(var i=0;i<b;i++){
            web3.eth.getBlock(b-i).then((Block)=>
            {

            a =[
                            Block.hash
                 ]
                     console.log(a);
                 var  iterator =a.values()
                 for (let elements of iterator) { 
             web3.eth.getTransactionFromBlock(elements).then(console.log)


                } 
             });
         }
         });
Funktioniert das auch mit ausstehenden Transaktionen?