Bonjour, Habr! En contact est B2Broker, un fournisseur de solutions de liquidité et de technologie pour l'industrie du courtage et de l'échange. L'un de nos produits est la plateforme de trading B2BX.exchange. Lorsque nous avons lancé la plateforme à l'été 2017, nous avons réfléchi à la manière d'accepter les crypto-monnaies et au traitement à utiliser. Hélas, personne à l'époque n'était prêt à donner au moins des garanties sur la vulnérabilité du contrat, et l'histoire de l'attaque de la plate-forme DAO était toujours à l'audience. Nous ne voulions pas suivre les traces du DAO. De plus, nous avions une certaine expérience dans l'acceptation de paiements via la blockchain. Nous avons donc décidé de travailler de manière indépendante sur l'ensemble du cycle des paiements blockchain. Dans cet article, nous parlerons de ce que nous avons fait et, plus intéressant encore, des problèmes que nous avons dû résoudre au cours du processus.
Source: ripplecoinnews.comEn travaillant sur le système de paiement, nous avons réalisé que nous pouvons rendre un service non seulement pour notre plate-forme B2BX.exchange, mais aussi un produit complètement indépendant. Nous l'avons appelé B2BinPay.
En quoi consiste B2BinPay
Le système de paiement est divisé en plusieurs parties de base. Tous sont écrits en PHP.
La première partie du système est chargée d'interagir avec les chaînes de blocs, c'est-à-dire de recevoir, d'envoyer et de suivre les paiements.
La deuxième partie est l'API. Il est engagé dans l'interaction avec les consommateurs de services et d'échanges: notifie la réception des fonds, procède à l'échange des crypto-monnaies. L'API est écrite en utilisant le framework Laravel.
La troisième partie est le bureau d'acquisition pour les consommateurs. Il reflète l'état du système dans son ensemble, les portefeuilles connectés et leurs soldes, les transactions actives et les comptes. Peut-être que bientôt nous connecterons l'acquisition de fiat classique. Pour créer un bureau, nous avons utilisé Yii2.
Un bloc séparé est un système pour travailler avec des projets ICO. Il vous permet de distribuer des jetons à toutes les étapes de la vente. A cela s'ajoute la possibilité de développer un contrat (ERC-20) et un compte personnel. À l'aide de ces outils, nous fournissons un service ICO clé en main.

Pour des raisons de sécurité, toutes les données sur les portefeuilles sont stockées dans la base de données sous forme cryptée, donc même si un attaquant y accède, il ne pourra pas retirer des fonds des portefeuilles. L'authentification utilisateur à deux facteurs est connectée. Enfin, le marchand peut créer une liste blanche d'adresses IP pouvant fonctionner avec l'API.
Nous proposons une tolérance aux pannes système avec un grand nombre de serveurs, y compris des serveurs de sauvegarde. Chaque nœud de la chaîne de blocs est situé sur un serveur distinct avec un accès limité de l'extérieur.
Quels problèmes avons-nous rencontrés?
Les blockchains sont différentes. Certains sont mal documentés et n'ont pas de communauté active. C'était principalement la raison de nos principaux problèmes.
1. L'API Ethereum n'a pas la possibilité de renvoyer des listes de transactions de compte entrantesLors de la création d'un compte, notre système de paiement génère une adresse unique à laquelle l'utilisateur doit transférer un certain montant dans la devise sélectionnée. Avec une fréquence donnée, nous obtenons une liste des transactions entrantes et vérifions leurs adresses de portefeuille. Ensuite, nous vérifions les adresses des portefeuilles avec les adresses des factures impayées. Il s'est avéré que la diffusion ne permet pas de recevoir des informations sur les transactions entrantes.
Que faire Nous avons décidé de recevoir des transactions en utilisant un service tiers -
etherscan.io . Mais il a révélé quelques problèmes, alors nous passons à l'explorateur, un service écrit par nos programmeurs.
2. Certaines blockchains ont une documentation extrêmement rareVoici un cas typique: nous avons en quelque sorte déployé un nœud sur l'une des crypto-monnaies peu connues, et après quelques jours, il a cessé d'accepter des transactions sans signaler aucune erreur. Nous l'avons redémarré, mais quelques jours plus tard, la situation s'est répétée.
Que faire Quand ils ont commencé à le comprendre, ils ont découvert que le problème se trouvait dans l'un des paramètres du fichier de configuration. Il n'y avait pas un mot dans la documentation sur ce paramètre, j'ai donc dû tout configurer par essais et erreurs.
3. La blockchain privée pour tester la fonctionnalité est difficile ou simplement impossible à déployerUne fois, nous devions déployer une chaîne de blocs pour la crypto-monnaie NEO. Nous avons trouvé une image docker prête, avons tout fait conformément aux instructions et nous avons eu une erreur. Une analyse rapide des scripts n'a conduit à rien, Google n'a également rien invité.
Que faire Nous avons créé un problème sur github, passé environ un mois à en discuter et finalement décidé de déployer testnet. Mais toutes les crypto-monnaies n'ont pas de testnet. Et si c'est le cas, le plus souvent, vous devez envoyer une demande de pièces test et attendre un peu. Le développement d'une blockchain privée sur les sites officiels dans la plupart des cas n'est même pas envisagé, vous devez donc utiliser des solutions tierces.
En toute honnêteté, il convient de dire que dans la plupart des cas, vous pouvez obtenir des réponses aux questions liées à l'infrastructure d'une crypto-monnaie particulière. La ressource la plus utile dans ce sens est Github, alors vous devriez aller sur les forums officiels et Reddit.
4. Réutilisation inappropriée du codeBitcoin a finalement beaucoup de copies avec des chaînes de blocs et des blocs individuels - ne les confondez pas avec des fourches. Dans la plupart des cas, ces crypto-monnaies ont une API Bitcoin absolument identique. Afin de ne pas multiplier le même code, pour travailler avec de telles copies, nous utilisons la même classe que pour travailler avec la devise de Satoshi Nakamoto.
Mais ce n'est peut-être pas si simple. Lorsque nous avons dû intégrer Dogecoin, nous avons suivi le scénario décrit, configuré et déployé testnet. En conséquence, certains tests ont échoué et la création de transactions a posé des problèmes.
Que faire Tout d'abord, nous avons exécuté le test via le débogueur. Il s'est avéré que Dogecoin dans la demande de création d'une transaction ne permet pas de transférer le montant sous la forme d'une chaîne, comme le fait Bitcoin. Pour cette raison, nous avons dû redéfinir la méthode dans la classe enfant. À propos, c'est la seule différence identifiée dans les API Dogecoin et Bitcoin. Quelle est sa signification est incompréhensible.
5. Toutes les crypto-monnaies ne permettent pas de générer un nombre illimité d'adresses uniquesIci, tout est simple: sans cette génération, nous ne pouvons pas utiliser l'identification de paiement à l'adresse.
Que faire Dans de telles situations, nous utilisons un message unique qui est joint à la transaction lors de l'envoi du paiement. Malheureusement, certains clients oublient d'indiquer ces messages et se demandent alors pourquoi le paiement n'a pas été crédité automatiquement.
Comment s'intégrer au CMS?
Nous avons créé des plugins B2BinPay pour WordPress, Woocommerce, Magento, PrestaShop. Ici, l'appétit est venu avec manger - au départ, nous n'avions pas prévu de promouvoir le système via des plugins pour CMS. Pour chaque plugin, nous avons fait une revue du système. La chose la plus sérieuse s'est produite pour le plugin Magento, nous vous en dirons plus sur cette critique.
L'examen est divisé en deux parties - technique et marketing. L'inspection technique comprend quatre étapes:
- Renifleur de code
- Installation et test de vernis
- Copier coller coller détecteur
- Contrôle qualité manuel
Les trois premières étapes sont entièrement automatisées, il est donc préférable de prendre en compte certaines choses au stade du développement. Pour vous simplifier la vie pendant le test, vous devez tout d'abord vous souvenir des règles de Code Sniffer.
Les règles Magento pour Code Sniffer sont conformes aux normes PSR-1 et PSR-2, c'est l'un des rares CMS dont les développeurs adhèrent aux approches modernes de développement en PHP. De plus, les gars de Magento ont publié un ensemble de règles distinct qui aide à trouver des erreurs dans les configurations xml de la structure d'extension et complète les vérifications généralement acceptées. Un script pour vérifier le contenu du package fini est également publié sur leur compte github, qui doit également être utilisé avant d'envoyer votre développement pour une vérification automatisée.
L'installation de base de Magento contient une classe d'amorçage pour phpunit: vous pouvez l'utiliser pour écrire des tests pour votre plugin. Honnêtement, nous n'avons toujours pas déterminé si la disponibilité des tests contribue à l'achèvement rapide de l'examen technique.

Les trois premières étapes du contrôle technique sont automatiques. Pour la quatrième étape et pour Marketing Review, vous devrez être patient: les deux processus sont effectués par des personnes et pour cette raison, des files d'attente sont formées.
Nous avons attendu les résultats de l'AQ manuelle pendant environ 5 jours, ce qui est fondamentalement normal. Mais chacune de nos demandes d'examen marketing a été traitée pendant plus d'une semaine. Ici, il était important pour les testeurs que dans les premiers paragraphes, nous notions l'intégration avec quel service nous fournissons et quel est son modèle de tarification, et que nous indiquions ensuite les avantages de notre plugin.
Plans futurs
Nous pensons que B2BinPay s'est avéré assez simple en termes d'interaction avec les utilisateurs et qu'il sera donc pratique à la fois pour les nouvelles entreprises du marché de la cryptographie et pour les entreprises avancées - par exemple, dans le domaine des ventes en ligne - où un produit stable et sécurisé est nécessaire.
Au début de la circulation initiale des pièces, nous avons accepté Bitcoin, Bitcoin CASH, Litecoin, DASH, Ethereum, Monero et autres. Nous proposons désormais des services aux commerçants et aux portefeuilles pour les entreprises clientes sous notre société estonienne, pour lesquels nous avons reçu deux licences - pour l'échange de crypto-monnaies et pour les portefeuilles.
Lors de l'intégration des clients, nous faisons un KYC à part entière pour chaque commerçant, après quoi le commerçant peut commencer à accepter les crypto-monnaies, qui sont automatiquement converties en dollars, en euros ou en livres et payées sur le compte bancaire du commerçant.
Nous serons heureux de répondre à vos questions sur la création de
B2BinPay et sur le produit lui-même en principe. De plus, nous recherchons maintenant activement des personnes partageant les mêmes idées qui ont des compétences en programmation Python et sont prêtes à rejoindre notre équipe. Maintenant, à Saint-Pétersbourg, nous avons ouvert des postes vacants pour chef d'
équipe et
développeur senior . Nous attendons votre CV avec impatience!