Ethereum-Transaktionen an einer bestimmten Adresse abhören

Ist es möglich, Transaktionen auf einer bestimmten Ethereum-Adresse abzuhören? Sendet beispielsweise jemand eine bestimmte Menge ETH an diese Adresse, wird die Callback-Funktion ausgelöst.

Ich habe dies gelesen: Wie erkunde ich alle Transaktionen für ein bestimmtes Konto? aber es scheint um vergangene Transaktionen zu gehen und nicht um Live-Zuhören.

Antworten (4)

Dazu können Sie Web3.js 1.0 und WebSockets verwenden.

var subscription = web3.eth.subscribe('logs', {
address: '0x123456..',
}, function(error, result){
if (!error)
console.log(result);
})
.on("data", function(log){
console.log(log);
})
.on("changed", function(log){
});

Wenn Sie den obigen Code verwenden, aktualisieren Sie einfach die addressEigenschaft.

Arbeitsbeispiel hier: https://jsfiddle.net/h7nskoyu/11/

Dies sieht sich den CryptoKitties-Vertrag an, und wenn Sie sich die Konsole ansehen, sehen Sie Folgendes:Geben Sie hier die Bildbeschreibung ein

Die erweiterte Transaktion entspricht dem: https://etherscan.io/tx/0x3ccce0b8072649ca087a91f00bdbb475b36d03a9a8dd2cc54b9a03ac5826c255

web3.eth.subscribe Erfahren Sie hier mehr darüber .

Danke Shawn! Das hatte ich früher erwartet, konnte es aber nicht zum Laufen bringen. Ich hatte hier ein GitHub-Problem darüber gemacht: github.com/ethereum/web3.js/issues/1752 . Nicht sicher, ob das Problem in web3 oder meinem Code liegt.
Stellen Sie in Ihrem Code zum Herstellen einer Verbindung zu einem Ethereum-Anbieter sicher, dass die Verbindung zu einem WebSocket besteht? Beispielsweise können Sie Metamask in dieser Situation nicht verwenden, da Metamask derzeit keine Websockets unterstützt
Ich versuche das, bekomme aber jetzt diesen Fehler. Wird --ws verwendet, wenn der Miner ausgeführt und die Websocket-Adresse in web3 fest codiert wird.connection not open on send() Error when watching incoming transactions: connection not open connection not open on send() Error when watching incoming transactions: connection not open connection not open on send() Error when watching incoming transactions: connection not open connection not open on send() Error when watching incoming transactions: connection not open
Ich würde sagen, versuchen Sie var web3 = new Web3('wss://mainnet.infura.io/ws');einfach zu testen, ob Ihr Code funktioniert. Und wenn dies der Fall ist, öffnen Sie einen weiteren Thread, um Probleme beim Zugriff auf Ihren Geth-WebSocket zu debuggen.
@ShawnTabrizi Dies funktioniert nur, wenn addresses sich um einen Vertrag handelt und Ereignisse generiert. Dies funktioniert nicht für EOA oder wenn der Vertrag keine Ereignisse generiert.
Dies hört nicht auf Transaktionen, sondern auf Ereignisse, auch bekannt als Protokolle.
Können wir eine bestimmte Kontoadresse abhören? Das geht nur mit Vertrag.

Es heißt Kontinuierliches Überwachungskonzept. Sie können dies auch mit RPC Call tun. Verwenden der Etherscan-API (Es gibt viele Plattformen, die die ETH-API bereitstellen)

Schritt 1: Holen Sie sich die neueste Blockhöhe mit https://api.etherscan.io/api?module=proxy&action=eth_blockNumber&apikey=YourApiKeyToken

Schritt 2: Erhalten Sie alle Details dieses Blocks mit https://api.etherscan.io/api?module=proxy&action=eth_getBlockByNumber&tag=0x5A0F60&boolean=true&apikey=YourApiKeyToken (Sie erhalten alle Transaktionen unter diesem Block)

Schritt 3: Speichern Sie nun alle Daten dieser Transaktion von json in Ihrer Liste und führen Sie eine for-Schleife für Ihre Adresse aus, die Sie kontinuierlich überwachen möchten.

Wenn sich Ihre Adresse nun in der Transaktionsliste dieses Blocks befindet, können Sie Details gemäß Ihren Anforderungen verwenden. Andernfalls können Sie den nächsten generierten Block nach 10 bis 15 Sekunden (gemäß Ihren Anforderungen) überprüfen.

Danke für deine Antwort! Dies funktioniert im Moment nicht, da ich Tests in einem privaten Netzwerk durchführen möchte. Aber ich werde es mir für die Zukunft merken.

Die akzeptierte Antwort funktioniert nur für txn an einen Vertrag.

Um Ether-Transfers ( txn zu EOAs ) zu erkennen, müssen Sie einen Listener einrichten, um die neuesten Blöcke abzurufen und das Transaktions-Array des Blocks abzufragen, um eine Übereinstimmung für eine bestimmte Anforderung zu finden.

Dadurch wird die Blockchain auf eingehende Transaktionen für eine Adresse überwacht

const monitorTransaction = async (addressss)=>{
    
        const block = await web3.eth.getBlock('latest');
    
        console.log(`Checking new block ${block.number}`)
    
        for(let txHash of block.transactions){
            // console.log(txHash);
            const tx = await web3.eth.getTransaction(txHash)
            // console.log(JSON.stringify(tx));
            const tranx = typeof tx === 'string' ? tx.to.toLowerCase() : '';
    
                if(addressss === tranx){
                    console.log(`New transaction found - Block ${block.number}`);
                    console.log(`Transaction From: ${tx.from}`);
                    console.log(`Transaction To: ${tx.to}`);
                    console.log(JSON.stringify(tx));
                }
        }
    }
Der Code tut nicht das, was in der Antwort impliziert wird. Es fragt nur den letzten Block ab, es überwacht nicht auf Änderungen. Es hat andere Probleme wie die Verwendung der Variablen, strohne sie zu definieren, berücksichtigt keine internen Transaktionen.
Danke dafür, dass str auf tx aktualisiert wurde. Sie können SetInterval in Javascript verwenden, um den Block ständig alle xxx Sekunden (12 bis 15 Sekunden als Standardblockzeit) abzufragen. Manchmal müssen Sie Ihre technischen Fähigkeiten einsetzen, um Probleme zu lösen. Sie müssen sich nicht auf die vollständige Lösung von Menschen verlassen.
Zumindest die wichtigste Logik ist geschrieben. Sie können einen Code schreiben, um die Funktion monitorTransaction auszuführen, um eingehende Transaktionen zu überwachen