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:
El nuevo usuario con correo electrónico bob@g.com
puede obtener una nueva cuenta (en Bitcoind) con una nueva dirección llamandogetnewaddress bob@g.com
Luego podemos comenzar a sondear listsinceblock xxx
para obtener todas las transacciones nuevas. Si recibimos una nueva transacción entrante, la almacenamos txid
en la base de datos y luego recurrimos iterativamente gettransaction txid
a 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 safe
al , solo para facilitar el siguiente paso.
Cuando safe
la cuenta exceda los 50 BTC, envíelos a la billetera fuera de línea.
Cuando el usuario quiera retirar, rellene safe
si es necesario, envíe las monedas desde safe
y 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:
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.
Permitimos blocknotify
obtener un nuevo hash de bloque blkhash
.
Llame getblock blkhash
para obtener todos los hash de transacciones en el nuevo bloque.
Llame getrawtransaction txid
para ver si recibimos una transacción entrante en nuestras direcciones. Si es así, mantenga el txid
y siga sondeando gettransaction txid
para actualizar el número de confirmación.
Llame para mover fondos a la billetera fuera de línea signrawtransaction
.sendrawtransaction
Mis preguntas son,
¿Cuáles son los matices en las operaciones anteriores? Por ejemplo,
getrawtransaction
, en el vout
arreglo, cada objeto representa un destino, pero cada uno de ellos tiene un addresses
arreglo. Hay casos en los que contiene varias direcciones. ¿Significa que es una transacción "multisig"? ¿O está relacionado con el reqSigs
campo? ¿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!
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.
Lodewijk