Un sistema seguro de cartera que sustituya al actual de OCP (basado en Electrum) aumentando la fiabilidad y la seguridad del sistema. Debe de ser suficientemente seguro como alojar valores de millones de euros.
A medio plazo el sistema debe ser capaz de ser extendido a otras webs/servicios/aplicaciones, incluyendo gestión de pagos para mercantes, de forma que sea más sencillo desarrollar módulos para Drupal, Odoo, Woocommerce, Prestahop, ...
Debe de tener una API para comunicarse con otras webs.
### Carteras
Cada web/servicio/app usaría una cartera propia e independiente.
Usará un sistema de 4 carteras multifirma con dos firmas necesarias para enviar por cada cartera.
- Dos carteras las guardarán dos personas u organizaciones de confianza como backups.
- Otra cartera se guardará en wallet.fair.coop y otra en ocp.
Todas las carteras tiene las mismas direccciones, por lo que se pueden chequear los balances desde cualquiera de ellas. Las personas de backups pueden chequear los balances, pero no saben a quién pertenecen (los que no sean direcciones públicas) si no tienen acceso a la base de datos de OCP.
Los admins de wallet.fair.coop y ocp deberían de ser distintas personas y no guardar las carteras de backup. De esta forma ni siquiera los admins de las máquinas podrían mover los fondos (un admin en ocp podría modificar el código para falsear un mail de confirmación... Este paso creo que es el más débil y habría que crear un método de identificación entre servidores para evitar spoofing. Podría ser un mensaje firmado por una dirección de faircoin...).
### Lenguages/Frameworks/Bibliotecas/Herramientas
#### Cadena de bloques
* Electrum: Python, puede ser usado como librería como se hace en OCP y en FairMarket y soporta transacciones multifirma. Software muy maduro, actualizado y auditado.
https://github.com/faircoin/electrumfair
* Pycoin/Pycoinnet: Bibliotecas para crear aplicaciones bitcoin en python puro. Soporta FairCoin y multisig.
* FairBreadWallet: Biblioteca en C. ¿Soporta multisig?
https://github.com/faircoin/fairbread-core
* FairCoinJ: Biblioteca en Java. Soporta multisig.
https://github.com/faircoin/faircoinj
* FairCore-lib: Biblioteca en JavaScript. Soporta multisig. Al ejecutarse en el entorno del cliente se puede crear alguna validación extra, de forma que el cliente necesite firma la transacción. Incluso se le podría suministrar otra clave privada con la que firmar la transacción, el incoveniente de esto es que disminuye la usabilidad y el conocimiento mínimo para usar la herramienta. Puede ser opcional en el futuro.
https://github.com/faircoin/faircore-lib
* FairCoin Node: En principio es lo más seguro, pero no soporta multisig y en el futuro necesitará mucho disco duro.
#### Controlador API
Necesitamos una herramienta que proporcione una manera rápida y segura de crear un controlador web.
* Odoo, es en lo que tengo más experiencia, pero claramente es matar moscas a cañonazos. Además necesitaría de una base de datos, la cual no debería ser necesaria.
* Django, parece más adecuado y los más cercano a OCP.
* Servidor a medida (sistema OCP actual): Desde el punto de vista de la seguridad y tiempo necesario de desarrollo no es factible.
### Funcionamiento
#### Chequear balances e historia
Todas las carteras tienen las mismas direcciones por lo que pueden observar todas las direcciones de la cartera.
#### Enviar una transacción:
1. El usuario solicita una transacción desde un formulario web.
2. OCP crea una transacción y la firma.
3. OCP manda a wallet.fair.coop la transacción para firmar.
4. OCP manda un mail al usuario un mail de confirmación con un link a wallet.fair.coop
5. Cuando el usuario confirma el envío, wallet.fair.coop firma la transacción y la retransmite a la red.
wallet.fair.coop sólo ejecuta la cartera y sólo se comunica con los servidores autorizados, el resto de tráfico se filtrará en el firewall. Un VPS pequeño de 1 núcleo, 1GB de RRAM y 10GB de disco duro realizará el trabajo sin problemas.
Podemos seguir usando el sistema usado hasta ahora en OCP de forma que cada dirección mantenga el balance del usuario, aunque no es eficiente. El balance de cada usuario y el historial de transacciones deberían ser campos en la base de datos de OCP, el sistema actual es un cuello de botella que no va a dar problemas si se escala la aplicación a cientos de usuarios. De esta forma podríamos tener dos carteras en OCP:
1- Cartera temporal, con las direcciones actuales, para detectar ingresos. Cuando se realiza un ingreso, la cartera lo detecta, notifica a OCP del ingreso y se actualiza el balance del usuario en la base de datos. También este trabajo se puede realizar mediante un cron en vez de con notificaciones.
2- Cartera segura multifirma, cuando OCP ha actualizado el balance, transfiere los fondos a una cartera segura, que será la cartera multifirma que se ejecute en wallet.fair.coop. De esta forma sólo desde OCP se tendrá acceso a los balances de los usuarios.