¿Cómo procesar los reembolsos y asegurarse de que después de un bloqueo no se los reenvíes a nadie?

Quiero tener un servidor en funcionamiento que procesará pagos y reembolsos. Sin embargo, también quiero asegurarme de que si mi servidor falla, después de reiniciar continuaré enviando los reembolsos correspondientes sin enviar un reembolso a alguien a quien ya he enviado uno también. Planeo usar un WAL para lograr esto, pero necesito saber qué almacenar en el WAL. ¿Es posible conocer su ID de transacción antes de enviar la transacción?

De esa manera, podría simplemente registrar la identificación antes de enviarla, y si falla, puedo verificar la cadena de bloques para ver si esa transacción ya existe o no.

Esto parece ser un problema común para los procesadores de pago, pero al observar la documentación de JSON-RPC , parece que solo obtiene la identificación de la transacción después de enviar la dirección de envío/envío.

Sospecho que esto se puede lograr creando un tx sin procesar y luego almacenándolo en el WAL antes de intentar enviar el tx. Luego, después de un bloqueo, puedo verificar qué transacciones están en la cadena de bloques y cuáles no, pero no sé si esta es la mejor manera o no.

Respuestas (2)

Puede consultar blockchain para conocer las últimas transacciones de la dirección que está utilizando para los reembolsos.

Obtenga las últimas transacciones de la dirección de la cadena de bloques y compárelas con los reembolsos en su sistema para ver cuáles pudo enviar y cuáles no antes del bloqueo.

Pero necesito una manera de identificar de forma única un reembolso. Dirección+cantidad no es necesariamente única, por lo que no tengo forma de saber qué transacciones de la cadena de bloques coinciden con qué transacciones en mi cola de salida. ¿Me estoy perdiendo de algo?
No, tienes razón. Tenga en cuenta que este es un caso realmente extremo. Debe haber enviado las monedas y antes de poder guardar la transacción en su base de datos, la máquina debe fallar. La verificación de la dirección funciona, pero debe usar una dirección única para cada reembolso.
Usar una dirección única es una idea interesante, sin embargo, ¿cuánto tiempo espera después de un bloqueo para determinar si una transacción termina en la cadena de bloques o no? Muy fácilmente podría terminar retransmitiendo debido a un problema en el procesamiento de transacciones (o en mi conexión de red). Como dije anteriormente, sospecho que la única forma segura de hacer esto es almacenar el tx sin procesar firmado en el WAL antes de enviarlo y luego reproducirlo después de un bloqueo. De esa manera, la red de bitcoin evita el doble gasto para mí. Sin embargo, no estoy convencido de que no haya una forma más fácil/limpia de hacerlo.
@senecaso La identificación de la transacción siempre es única, podría usar eso.

Puede hacer esto encadenando el reembolso y la transacción que recibió. De esta manera, podría emitir el reembolso tan a menudo como su sistema falla sin correr el riesgo de devolver más de lo que necesita. Esto es un poco complicado y necesita usar la API bitcoind, pero SatoshiDice la ha estado usando con éxito para devolver las ganancias. Lo que hace es tomar la salida que se le envió y gastarla en una transacción que reembolsa al remitente. Dado que una salida se puede reclamar como máximo una vez, el reembolso se enviará solo una vez.