Escuche las transacciones de ethereum en una dirección específica

¿Es posible escuchar transacciones en una dirección específica de ethereum? Por ejemplo, si alguien envía una cierta cantidad de ETH a esa dirección, se activaría la función de devolución de llamada.

Leí esto: ¿Cómo explorar todas las transacciones de una cuenta determinada? pero parece tratarse de transacciones pasadas y no escuchar en vivo.

Respuestas (4)

Puede usar Web3.js 1.0 y WebSockets para lograr esto.

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

Si usa el código anterior, simplemente actualice la addresspropiedad.

Muestra de trabajo aquí: https://jsfiddle.net/h7nskoyu/11/

Esto mira el contrato de CryptoKitties, y cuando miras la consola ves esto:ingrese la descripción de la imagen aquí

La transacción ampliada se asigna a esto: https://etherscan.io/tx/0x3ccce0b8072649ca087a91f00bdbb475b36d03a9a8dd2cc54b9a03ac5826c255

Obtenga más información web3.eth.subscribe aquí .

¡Gracias Shawn! Esto es lo que esperaba antes, pero no había podido hacerlo funcionar. Hice un problema de GitHub al respecto aquí: github.com/ethereum/web3.js/issues/1752 . No estoy seguro si el problema está en web3 o en mi código.
En su código para conectarse a un proveedor de Ethereum, ¿se asegura de que la conexión sea a un WebSocket? Por ejemplo, no puede usar Metamask en esta situación, ya que Metamask actualmente no es compatible con websockets.
Intentando eso, pero obteniendo este error ahora. Usé --ws cuando ejecuté el minero y codifiqué la dirección websocket en web3.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
Yo diría que intente usar var web3 = new Web3('wss://mainnet.infura.io/ws');para simplemente probar que su código está funcionando. Y si es así, abra otro hilo para depurar problemas de acceso a su Geth WebSocket.
@ShawnTabrizi Esto solo funciona si addresses un contrato y genera eventos. Esto no funcionará para EOA o si el contrato no genera eventos.
Esto no escucha transacciones sino eventos, también conocidos como registros.
¿Podemos escuchar una dirección de cuenta específica? Esto solo funciona con contrato.

Se llama concepto de monitoreo continuo. También puede hacerlo usando RPC Call. Uso de la API de Etherscan (hay muchas plataformas que proporcionan la API de ETH)

Paso 1: obtenga la altura de bloque más reciente usando https://api.etherscan.io/api?module=proxy&action=eth_blockNumber&apikey=YourApiKeyToken

Paso 2: Obtenga todos los detalles de ese bloque usando https://api.etherscan.io/api?module=proxy&action=eth_getBlockByNumber&tag=0x5A0F60&boolean=true&apikey=YourApiKeyToken (obtendrá todas las transacciones en este bloque)

Paso 3: ahora almacene todos los datos de esa transacción de json en su lista y ejecute el bucle para su dirección que desea monitorear continuamente.

Entonces, si su dirección estará en la lista de transacciones de ese bloque, puede usar los detalles según sus requisitos; de lo contrario, puede verificar el siguiente bloque generado después de 10 a 15 segundos (según sus requisitos).

¡Gracias por su respuesta! Esto no funcionará en este momento porque quiero hacer pruebas en una red privada. Pero lo tendré en cuenta para el futuro.

La respuesta aceptada solo funcionará para txn a un contrato.

Para detectar transferencias de éter (txn a EOA), deberá configurar un oyente para obtener los últimos bloques y consultar la matriz de transacciones del bloque para encontrar una coincidencia para un requisito particular.

Esto monitoreará la cadena de bloques para transacciones entrantes para una dirección

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));
                }
        }
    }
El código no hace lo que está implícito en la respuesta. Solo consulta el último bloque, no monitorea los cambios. Tiene otros problemas como usar la variable strsin definirla, no considera transacciones internas.
Gracias por eso, str se ha actualizado a tx. Puede usar SetInterval en javascript para consultar constantemente el bloque cada xxx segundos (12 a 15 segundos como el tiempo de bloqueo predeterminado). A veces necesitas usar tus habilidades técnicas para resolver problemas. No necesita depender de la solución completa de las personas.
Al menos la lógica más importante está escrita. Puede escribir un código para ejecutar la función monitorTransaction para monitorear las transacciones entrantes