¿Cómo saber cuándo se ha recibido un pago por bitcoind?

Quiero crear un sitio web que involucre la creación de una nueva dirección de un solo uso a la que un usuario enviaría bitcoins. Me gustaría saber mediante programación cuándo el usuario ha enviado bitcoins a la dirección para que el sitio web pueda publicar una nota de "gracias" (o hacer cualquier otra cosa). ¿Cuál es la mejor manera de hacer esto?

El flujo sería:

  1. El sitio web crea y muestra al usuario una nueva dirección de un solo uso y dice: "envíe bitcoins aquí"
  2. El usuario envía bitcoins a la dirección
  3. Tan pronto como la dirección recibe bitcoins, el sitio web dice "¡gracias por enviar 0.3 BTC!"

Supongo que podría sondear la dirección en cuestión cada pocos minutos, pero esto es problemático porque el usuario puede abandonar el sitio web después del paso 1 (es decir, nunca enviar bitcoins), por lo que el sitio web podría terminar sondeando para siempre.

Estoy usando el cliente oficial de bitcoind ahora, pero estoy abierto a usar algo más.

Entiendo que Blockchain.info proporciona una API para recibir notificaciones automáticas sobre la actividad de una dirección determinada, pero prefiero no depender de un servicio de terceros.

Estaría realmente interesado si hay un método de inserción, pero no creo que haya ningún soporte para esto en este momento integrado en el cliente.
@JayWest en este momento no hay método de inserción. En el momento actual, la única opción es crear la ilusión para el usuario final de que se está produciendo una notificación automática mediante el uso de un proceso en segundo plano para extraer continuamente datos de bitcoind (ya sea recibirlos por dirección o enumerar transacciones según el uso).

Respuestas (3)

Comenzando con v0.6.0 del cliente Bitcoin.org fue -BlockNotify. Comenzando con v0.8.2 del cliente Bitcoin.org fue -WalletNotify que proporciona notificación a nivel de transacción.

0.8.2 admite -walletnotify. ¡Gracias, Esteban!

listsinceblock es más conveniente: se puede usar de forma incremental.

¿Está esto en el cliente principal?
O listungast 6 144 para obtener transacciones no gastadas (6-) confirmadas de las últimas 24 horas (por ejemplo, si mueve la transacción entrante a una billetera fuera de línea después de "registrarla").
Oye, esto es exactamente lo que estoy tratando de hacer, almacenar transacciones de depósito para cada dirección de usuario única de la salida recibida de listsinceblock. Me gustaría preguntar, al calcular la suma de los depósitos para cada dirección de usuario única, ¿se consideran las transacciones solo de categoría receivey generatese ignoran todas las demás categorías de transacciones como orphan, immaturey send?

Es posible que desee realizar un sondeo amortizado: utilícelo listtransactionspara sondear las últimas transacciones de todas las cuentas. Entonces, en lugar de emitir una encuesta para cada cuenta, lo hace para todas al mismo tiempo. Esto, combinado con un tiempo de espera para ralentizar el sondeo si no se recibe ningún pago, debería funcionar bien.

Gracias, cdecker. Voy a esperar y ver si alguien responde con un método push para hacer esto (en lugar de sondear).