Cree un servicio de billetera en línea con Bitcoind, ¿puede escalar? Si no, ¿qué se puede hacer?

Me gustaría crear un servicio de billetera en línea. Creo que será fácil implementar todas las funcionalidades si uso Bitcoind. Aquí hay un posible flujo de trabajo:

  1. El nuevo usuario con correo electrónico bob@g.compuede obtener una nueva cuenta (en Bitcoind) con una nueva dirección llamandogetnewaddress bob@g.com

  2. Luego podemos comenzar a sondear listsinceblock xxxpara obtener todas las transacciones nuevas. Si recibimos una nueva transacción entrante, la almacenamos txiden la base de datos y luego recurrimos iterativamente gettransaction txida todas las transacciones no confirmadas. Cuando el número de confirmaciones supere cierto umbral, acredite la cuenta en la base de datos y luego llame move bob@g.com safeal , solo para facilitar el siguiente paso.

  3. Cuando safela cuenta exceda los 50 BTC, envíelos a la billetera fuera de línea.

  4. Cuando el usuario quiera retirar, rellene safesi es necesario, envíe las monedas desde safey actualice el saldo del usuario en la base de datos.

Sin embargo, en todas las preguntas relacionadas que he leído, la mayoría de la gente dice que Bitcoind no escalará. Incluso la wiki de Bitcoin lo dice. Ahora, si solo vamos a usar JSONRPC para interactuar con la red, puedo imaginar el siguiente flujo de trabajo:

  1. Generamos, digamos, 1 millón de direcciones en la base de datos. Cuando el usuario se registra o requiere una nueva dirección, le asignamos una dirección.

  2. Permitimos blocknotifyobtener un nuevo hash de bloque blkhash.

  3. Llame getblock blkhashpara obtener todos los hash de transacciones en el nuevo bloque.

  4. Llame getrawtransaction txidpara ver si recibimos una transacción entrante en nuestras direcciones. Si es así, mantenga el txidy siga sondeando gettransaction txidpara actualizar el número de confirmación.

  5. Llame para mover fondos a la billetera fuera de línea signrawtransaction.sendrawtransaction

Mis preguntas son,

  • ¿Crees que mis propuestas son razonables?
  • ¿Cuáles son los matices en las operaciones anteriores? Por ejemplo,

    • al mover todos los fondos a una cuenta y luego enviar dinero, ¿eso cuenta como una transacción o una transacción para cada cuenta? ¿Las tarifas de transacción son las mismas?
    • al hacer getrawtransaction, en el voutarreglo, cada objeto representa un destino, pero cada uno de ellos tiene un addressesarreglo. Hay casos en los que contiene varias direcciones. ¿Significa que es una transacción "multisig"? ¿O está relacionado con el reqSigscampo? ¿Cómo manejamos estos casos?

He leído las siguientes preguntas, pero no encontré mi respuesta:

¿El cliente Bitcoin original escala para contener millones de direcciones?

Bitcoin Client API-RPC: forma eficiente de listar transacciones de una lista de direcciones

Por favor ayuda... ¡Muchas gracias!

Es muy difícil responder algo tan amplio como las preguntas que mencionas. En su mayoría, es más una cosa de ingeniería de software que una cosa de Bitcoin también. Así que respondí a su pregunta como veo que se aplica a Bitcoin y al software de Bitcoin. En particular, asegúrese de que su cuenta "segura" solo pueda ser transferida por un ser humano, y que esté en una máquina separada que generalmente esté fuera de línea y con un firewall estricto.

Respuestas (2)

Odio ser este tipo, pero si está luchando con esto, es probable que tenga dificultades para asegurar las claves privadas. Esas claves privadas son las claves de tu imperio de una manera en la que ni siquiera quieres pensar.

Piense muy seriamente en subcontratar esto a una empresa con seguro para ello. O contrate un seguro usted mismo. La subcontratación también le quita la molestia del rendimiento.

Si no lo hace, no olvide hacer billeteras (realmente) frías. Simplemente coloque ese efectivo en otro lugar.

Quizás más directamente, hay varios demonios de bitcoin por ahí. También podrías hacer el tuyo propio, con algo como bitcoinJ. Conocí a los chicos detrás de btcd ("BitcoinD in Go") https://github.com/conformal/btcd en Bitcoin2014, su codificador líder me causó una buena impresión.

Me temo que todavía no hay una respuesta archivada para esta pregunta. Quizás el mejor consejo es "Hazlo, una vez que te encuentres con un problema, ya tendrás éxito. Tiempo suficiente para resolverlo más tarde".

Hubo algunas sugerencias más sobre una respuesta a esta pregunta relacionada: ¿ Cómo escalar miles de cuentas de bitcoin correctamente con bitcoind deamon?

Alguien ya ha creado un contenedor para el daemon de bitcoin en Java: https://github.com/btc4j/btc4j-daemon ; podría ser más fácil usar eso en lugar del daemon directamente y usar una base de datos para hacer lo que sería ineficiente en la cadena de bloques, como el manejo de cuentas de usuario.

En última instancia, todo depende de lo que estés tratando de lograr. Suena bastante claro por lo que ya has leído y por lo que he leído que el demonio estándar de bitcoin no escala. Por lo tanto, su mejor apuesta sería usar este u otro envoltorio de daemon de bitcoin para crear su proyecto de billetera.

Si desea interactuar directamente con el demonio de bitcoin (o lo más directamente posible con un contenedor), intente usar el contenedor de Java y use una base de datos para las tareas que el demonio no maneja de manera eficiente. Sin embargo, si desea diseñar su servicio de billetera en línea teniendo en cuenta la seguridad, lo animo a usar el demonio Armory: https://bitcointalk.org/index.php?topic=92496.0 . Por lo que he leído, parece que este demonio no tiene tantas funciones como el demonio normal de bitcoin, pero no lo he probado yo mismo, por lo que es muy posible que sea suficiente para sus necesidades. Aún así, tiene una gran ventaja en el ámbito de la seguridad de que puede crear una billetera de solo observación en su servidor web para la billetera de los clientes.