Cómo hicimos un sistema de pago de criptomonedas: cinco problemas principales

Hola Habr! En contacto está B2Broker, un proveedor de soluciones de liquidez y tecnología para la industria de corretaje e intercambio. Uno de nuestros productos es la plataforma de comercio B2BX.exchange. Cuando lanzamos la plataforma en el verano de 2017, pensamos en cómo aceptar las criptomonedas y qué procesamiento usar. Por desgracia, nadie en ese momento estaba listo para dar al menos ninguna garantía sobre la vulnerabilidad del contrato, y la historia del ataque en la plataforma DAO todavía estaba en la audiencia. No queríamos seguir los pasos del DAO. Además, teníamos algo de experiencia en aceptar pagos a través de blockchain. Por lo tanto, decidimos resolver de forma independiente todo el ciclo de pagos de blockchain. En esta publicación hablaremos sobre lo que hicimos y, lo que es más interesante, sobre qué problemas tuvimos que resolver en el proceso.


Fuente: ripplecoinnews.com

En el proceso de trabajar en el sistema de pago, nos dimos cuenta de que podemos hacer un servicio no solo para nuestra plataforma B2BX.exchange, sino también un producto completamente independiente. Lo llamamos B2BinPay.

En qué consiste B2BinPay


El sistema de pago se divide en varias partes básicas. Todos ellos están escritos en PHP.

La primera parte del sistema es responsable de interactuar con blockchains, es decir, de recibir, enviar y rastrear pagos.

La segunda parte es la API. Participa en la interacción con los consumidores de servicios e intercambios: notifica la recepción de fondos, realiza el intercambio de criptomonedas. La API se escribe utilizando el marco de Laravel.

La tercera parte es la oficina de adquisición para los consumidores. Refleja el estado del sistema en su conjunto, billeteras conectadas y sus saldos, transacciones activas y cuentas. Quizás pronto conectemos la adquisición clásica de fiat. Para crear una oficina, utilizamos Yii2.

Un bloque separado es un sistema para trabajar con proyectos ICO. Le permite distribuir tokens en todas las etapas de la venta. Además, existe la posibilidad de desarrollar un contrato (ERC-20) y una cuenta personal. Con estas herramientas, proporcionamos un servicio ICO llave en mano.



Por razones de seguridad, todos los datos sobre billeteras se almacenan en la base de datos en forma cifrada, por lo que incluso si un atacante obtiene acceso a ellos, no podrá retirar fondos de las billeteras. La autenticación de usuario de dos factores está conectada. Finalmente, el comerciante puede crear una lista blanca de direcciones IP que pueden funcionar con la API.

Ofrecemos tolerancia a fallas del sistema con una gran cantidad de servidores, incluidos los de respaldo. Cada nodo blockchain se encuentra en un servidor separado con acceso limitado desde el exterior.

¿Qué problemas hemos encontrado?


Las cadenas de bloques son diferentes. Algunos están mal documentados y no tienen una comunidad activa. Esta fue principalmente la razón de nuestros principales problemas.

1. La API de Ethereum no tiene la capacidad de devolver listas de transacciones de cuenta entrantes

Al crear una cuenta, nuestro sistema de pago genera una dirección única a la que el usuario debe transferir una cierta cantidad en la moneda seleccionada. Con una frecuencia dada, obtenemos una lista de transacciones entrantes y verificamos sus direcciones de billetera. Luego verificamos las direcciones de las billeteras con las direcciones de las facturas impagas. Al final resultó que, la transmisión no permite recibir información sobre las transacciones entrantes.

Que hacer Decidimos recibir transacciones utilizando un servicio de terceros: etherscan.io . Pero reveló algunos problemas, por lo que cambiamos a Explorer, un servicio escrito por nuestros programadores.

2. Algunas cadenas de bloques tienen documentación extremadamente escasa

Este es un caso típico: de alguna manera implementamos un nodo en una de las criptomonedas poco conocidas, y después de unos días dejó de aceptar transacciones sin informar ningún error. Lo reiniciamos, pero unos días después la situación se repitió.

Que hacer Cuando comenzaron a resolverlo, descubrieron que el problema está en uno de los parámetros del archivo de configuración. No había una palabra en la documentación sobre este parámetro, así que tuve que configurar todo por prueba y error.



3. La blockchain privada para probar la funcionalidad es difícil o simplemente imposible de implementar

Una vez que necesitábamos implementar una cadena de bloques para la criptomoneda NEO. Encontramos una imagen acoplada lista, hicimos todo de acuerdo con las instrucciones y obtuvimos un error. Un análisis rápido de los scripts no condujo a nada, Google tampoco solicitó nada.

Que hacer Creamos un problema en github, pasamos aproximadamente un mes discutiéndolo y finalmente decidimos implementar testnet. Pero no todas las criptomonedas tienen testnet. Y si lo hace, lo más frecuente es que deba enviar una solicitud de monedas de prueba y esperar un tiempo. El desarrollo de una blockchain privada en los sitios oficiales en la mayoría de los casos ni siquiera se considera, por lo que debe usar soluciones de terceros.

Para ser justos, vale la pena decir que en la mayoría de los casos, puede obtener respuestas a preguntas relacionadas con la infraestructura de una criptomoneda en particular. El recurso más útil en este sentido es Github, luego debe ir a los foros oficiales y Reddit.

4. Reutilización inapropiada del código

Bitcoin finalmente tiene muchas copias con blockchains y bloques individuales, no los confunda con tenedores. En la mayoría de los casos, tales criptomonedas tienen una API de Bitcoin absolutamente idéntica. Para no multiplicar el mismo código, para trabajar con tales copias usamos la misma clase que para trabajar con la moneda de Satoshi Nakamoto.

Pero puede que no sea tan simple. Cuando necesitábamos integrar Dogecoin, seguimos el escenario descrito, configuramos e implementamos testnet. Como resultado, algunas pruebas cayeron y hubo problemas con la creación de transacciones.

Que hacer Primero, ejecutamos la prueba a través del depurador. Resultó que Dogecoin en la solicitud para crear una transacción no permite transferir la cantidad en forma de cadena, como lo hace Bitcoin. Debido a esto, tuvimos que redefinir el método en la clase secundaria. Por cierto, esta es la única diferencia identificada en las API de Dogecoin y Bitcoin. Cuál es su significado es incomprensible.

5. No todas las criptomonedas permiten generar un número ilimitado de direcciones únicas

Aquí todo es simple: sin esta generación, no podemos usar la identificación de pago en la dirección.

Que hacer En tales situaciones, utilizamos un mensaje único que se adjunta a la transacción al enviar el pago. Desafortunadamente, algunos clientes olvidan indicar estos mensajes y luego se preguntan por qué el pago no se acreditó automáticamente.

¿Cómo integrarse en CMS?


Creamos complementos B2BinPay para WordPress, Woocommerce, Magento, PrestaShop. Aquí el apetito vino con la comida: inicialmente no planeábamos promover el sistema a través de complementos para CMS. Para cada complemento hicimos una revisión en el sistema. Lo más serio sucedió con el complemento Magento, le diremos más sobre esta revisión.

La revisión se divide en dos partes: técnica y de marketing. La inspección técnica consta de cuatro etapas:

  • Sniffer de código
  • Instalación y prueba de barniz
  • Copiar pegar pegar detector
  • Control de calidad manual

Las primeras tres etapas están completamente automatizadas, por lo que es mejor tener en cuenta algunas cosas en la etapa de desarrollo. Para simplificar su vida durante la prueba, en primer lugar, debe recordar las reglas de Code Sniffer.

Las reglas de Magento para Code Sniffer cumplen con los estándares PSR-1 y PSR-2, este es uno de los pocos CMS cuyos desarrolladores se adhieren a los enfoques modernos de desarrollo en PHP. Además, los chicos de Magento publicaron un conjunto separado de reglas que ayuda a encontrar errores en las configuraciones xml de la estructura de extensión y complementa las comprobaciones generalmente aceptadas. También se publica un script para verificar el contenido del paquete terminado en su cuenta de github, que también debe usarse antes de enviar su desarrollo para la verificación automática.

La instalación básica de Magento contiene una clase bootstrap para phpunit: puede usarla para escribir pruebas para su complemento. Honestamente, todavía no hemos descubierto si la disponibilidad de las pruebas contribuye a la rápida finalización de la Revisión Técnica.



Las primeras tres etapas de la inspección técnica son automáticas. Para la cuarta etapa y para Marketing Review, tendrá que ser paciente: ambos procesos son realizados por personas y, por eso, se forman colas.

Esperamos los resultados del control de calidad manual durante aproximadamente 5 días, que es básicamente normal. Pero cada una de nuestras solicitudes para Marketing Review ha sido procesada por más de una semana. Aquí, fue importante para los evaluadores que en los primeros párrafos escribamos la integración con la que prestamos el servicio y cuál es su modelo de precios, y solo entonces indicamos las ventajas de nuestro complemento.

Planes futuros


Creemos que B2BinPay resultó ser bastante simple en términos de interacción con los usuarios y, por lo tanto, será conveniente tanto para las nuevas empresas en el mercado de cifrado como para los negocios avanzados, por ejemplo, en el campo de las ventas en línea, donde se necesita un producto estable y seguro.

Al comienzo de la circulación inicial de monedas, aceptamos Bitcoin, Bitcoin CASH, Litecoin, DASH, Ethereum, Monero y otros. Ahora ofrecemos servicios para comerciantes y billeteras para clientes empresariales bajo nuestra compañía estonia, para lo cual recibimos dos licencias: para intercambiar criptomonedas y billeteras.

Cuando incorporamos clientes, hacemos un KYC completo para cada comerciante, después de lo cual el comerciante puede comenzar a aceptar criptomonedas, que se convierten automáticamente en dólares, euros o libras y se pagan a la cuenta bancaria del comerciante.

Estaremos encantados de responder sus preguntas sobre la creación de B2BinPay y sobre el producto en principio. Además, ahora estamos buscando activamente personas con ideas afines que tengan habilidades de programación en Python y estén listas para unirse a nuestro equipo. Ahora en San Petersburgo hemos abierto vacantes para líderes de equipo y desarrolladores senior . ¡Esperamos su currículum!

Source: https://habr.com/ru/post/441338/


All Articles