Creación de un sistema de cuentas

Estoy usando el sistema de cuenta bitcoind para mi aplicación web, pero no funciona de la forma en que quiero que funcione. Así que quiero crear mi propio sistema de cuentas en Laravel (probablemente de código abierto).

La razón principal del sistema de cuenta es que no puedo saber la tarifa cuando envío una transacción. Con mi propio sistema de cuenta puedo verificar si la tarifa es correcta y luego enviar la transacción.

Pero, ¿cómo puedo configurar un sistema de cuenta seguro?

Estaba pensando en una tabla con todas las cuentas de bitcoin (no estoy usando la tabla de usuarios para poder crear cuentas para un pedido, por ejemplo).

Luego una tabla de direcciones con todas las direcciones vinculadas a una cuenta.

Pero, ¿cómo manejo las transacciones entrantes? ¿Y las transacciones salientes? Si por alguna razón cambio algo fuera de mi sistema de cuenta, probablemente se romperá con bastante facilidad.

¿Tengo que importar todas las transacciones para calcular los saldos de cuenta correctos?

Y quiero hacer el sistema de manera que pueda hacer transacciones entre cuentas, sin hacer una transacción "real", tal como funciona ahora.

Creo que no es tan difícil sin las transacciones de cuenta a cuenta y sin mover las direcciones de bitcoin a otras funciones de cuentas, simplemente importe todas las transacciones en la base de datos y calcule el saldo de cada dirección. Y luego sume el saldo de la dirección para cada cuenta, pero lo necesito.

¿Este tipo de sistema ya existe. Si no, alguien me puede ayudar a pensar en esto.

¿Hay algún motivo en particular por el que las direcciones deban asociarse con cuentas específicas? Por lo que escribe, me parece que tiene el control total de los fondos en cada cuenta de todos modos, por lo que sería mucho más fácil rastrear los saldos de sus usuarios por separado de las direcciones.— Tenga en cuenta que el "sistema de cuentas" en Bitcoin Core ha quedado en desuso durante años y no estaba destinado a usarse para la contabilidad, no es sorprendente que no haga lo que usted quiere que haga. ;)
@Murch Solo quiero hacer un buen proyecto que sea muy escalable. Para que otras personas también puedan usarlo. Si lo uso para otros proyectos, se puede implementar muy fácilmente. Si hago un seguimiento del saldo del usuario por separado de las direcciones y cometo un error (sucede mucho;)), no sería bueno.
Mantener todos los fondos de los usuarios en direcciones separadas significa que no tiene ningún beneficio de escala para cuestiones como tarifas y selección de monedas. Molería los UTXO en pedazos pequeños a medida que sus usuarios administran sus fondos, no podría agregar pagos a través de canales Lightning sin actualizar en cadena (o canales de pago)... Es cualquier cosa menos escalable.— Tampoco estoy seguro que mantener los saldos separados hace que sea mucho más difícil cometer un error.
@Murch creo que he encontrado el camino. Tengo una tabla con todas las transacciones. Estos tienen una identificación de usuario. La identificación de usuario es la identificación del propietario de la dirección en el momento de la recepción. Entonces, si la dirección va a otra cuenta, las transacciones aún pertenecen al usuario que las recibió. De esta manera, puedo obtener todas las transacciones de un usuario y calcular el saldo.
Sí, parece una forma mucho mejor de hacerlo. :) Solo asegúrese de dar cuenta de las transacciones solo después de la confirmación, y tal vez incluso después de unos pocos bloques o su tabla estará muy confundida por reorganizaciones de blockchain o bloques obsoletos. ;)

Respuestas (1)

¡Tengo el sistema de cuentas funcionando! Solo que realmente no lo probé, por lo que no es estable. https://github.com/jwz104/cuentas-bitcoin

Funciona con una tabla de usuarios, direcciones y transacciones.

Se está ejecutando un cronjob que registra todas las transacciones recibidas. Si la dirección se encuentra en la tabla de direcciones, agregará la transacción con la identificación de usuario de la dirección. Si la dirección no tiene user_id, la transacción no se agregará porque es una transacción de devolución (Cambio).

Cuando se crea una transacción, el paquete enviará la cantidad de bitcoins a la dirección, y los bitcoins que quedan se envían a una dirección de devolución (Dirección sin ID de usuario) para que el usuario no pague demasiado.