Olá Habr! Entre em contato está a B2Broker, fornecedora de soluções de liquidez e tecnologia para o setor de corretagem e câmbio. Um de nossos produtos é a plataforma de negociação B2BX.exchange. Quando lançamos a plataforma no verão de 2017, pensamos em como aceitar criptomoedas e qual processamento usar. Infelizmente, naquele momento, ninguém estava pronto para dar pelo menos garantias sobre a vulnerabilidade do contrato, e a história do ataque à plataforma DAO ainda estava na audiência. Não queríamos seguir os passos do DAO. Além disso, tivemos alguma experiência em aceitar pagamentos por meio da blockchain. Por isso, decidimos elaborar independentemente todo o ciclo de pagamentos em blockchain. Neste post, falaremos sobre o que fizemos e, mais interessante, sobre quais problemas tivemos que resolver no processo.
Fonte: ripplecoinnews.comNo processo de trabalho no sistema de pagamento, percebemos que podemos prestar um serviço não apenas para nossa plataforma B2BX.exchange, mas também para um produto completamente independente. Nós o chamamos de B2BinPay.
Em que consiste o B2BinPay
O sistema de pagamento é dividido em várias partes básicas. Todos eles são escritos em PHP.
A primeira parte do sistema é responsável por interagir com blockchains, ou seja, por receber, enviar e rastrear pagamentos.
A segunda parte é a API. Ele está envolvido na interação com os consumidores de serviços e trocas: notifica o recebimento de fundos, realiza a troca de criptomoedas. A API é escrita usando a estrutura do Laravel.
A terceira parte é o escritório de compras para os consumidores. Ele reflete o estado do sistema como um todo, carteiras conectadas e seus saldos, transações e contas ativas. Talvez em breve conectaremos a aquisição fiduciária clássica. Para criar um escritório, usamos o Yii2.
Um bloco separado é um sistema para trabalhar com projetos da OIC. Permite distribuir tokens em todas as etapas da venda. Além disso, há a possibilidade de desenvolver um contrato (ERC-20) e uma conta pessoal. Usando essas ferramentas, fornecemos um serviço ICO chave na mão.

Por motivos de segurança, todos os dados sobre carteiras são armazenados no banco de dados na forma criptografada; portanto, mesmo que um invasor obtenha acesso a eles, ele não poderá sacar fundos das carteiras. A autenticação de usuário de dois fatores está conectada. Por fim, o comerciante pode criar uma lista de permissões de endereços IP que podem funcionar com a API.
Fornecemos tolerância a falhas do sistema com um grande número de servidores, incluindo servidores de backup. Cada nó blockchain está localizado em um servidor separado com acesso limitado a partir do exterior.
Que problemas encontramos?
Blockchains são diferentes. Alguns estão mal documentados e não têm uma comunidade ativa. Esta foi principalmente a razão dos nossos principais problemas.
1. A API Ethereum não tem a capacidade de retornar listas de transações de contas a receberAo criar uma conta, nosso sistema de pagamento gera um endereço exclusivo para o qual o usuário deve transferir um determinado valor na moeda selecionada. Com uma determinada frequência, obtemos uma lista de transações recebidas e verificamos seus endereços de carteira. Em seguida, verificamos os endereços das carteiras com os endereços das contas não pagas. Como se viu, a transmissão não permite receber informações sobre transações recebidas.
O que fazer Decidimos receber transações usando um serviço de terceiros -
etherscan.io . Como ele revelou alguns problemas, passamos ao explorer, um serviço escrito por nossos programadores.
2. Algumas blockchains possuem documentação extremamente escassaAqui está um caso típico: de alguma forma, implantamos um nó em uma das criptomoedas pouco conhecidas e, após alguns dias, parou de aceitar transações sem relatar erros. Reiniciámo-lo, mas alguns dias depois a situação se repetiu.
O que fazer Quando eles começaram a descobrir, descobriram que o problema estava em um dos parâmetros no arquivo de configuração. Não havia uma palavra na documentação sobre esse parâmetro, portanto tive que configurar tudo por tentativa e erro.
3. Blockchain privado para testar a funcionalidade é difícil ou simplesmente impossível de implantarAntes, precisamos implantar um blockchain para a criptomoeda NEO. Encontramos uma imagem do docker pronta, fizemos tudo de acordo com as instruções e obtivemos um erro. Uma análise rápida dos scripts não levou a nada, o Google também não solicitou nada.
O que fazer Criamos um problema no github, passamos cerca de um mês discutindo e finalmente decidimos implantar o testnet. Mas nem toda criptomoeda possui testnet. E se isso acontecer, você precisará enviar um pedido de moedas de teste e esperar um pouco. O desenvolvimento de uma blockchain privada em sites oficiais na maioria dos casos nem sequer é considerado, então você precisa usar soluções de terceiros.
Para ser justo, vale dizer que, na maioria dos casos, você pode obter respostas para perguntas relacionadas à infraestrutura de uma determinada criptomoeda. O recurso mais útil nesse sentido é o Github, então você deve ir aos fóruns oficiais e ao Reddit.
4. Reutilização inadequada de códigoO Bitcoin eventualmente possui muitas cópias com cadeias e blocos individuais - não os confunda com garfos. Na maioria dos casos, essas criptomoedas têm uma API Bitcoin absolutamente idêntica. Para não multiplicar o mesmo código, para trabalhar com essas cópias, usamos a mesma classe que para trabalhar com a moeda de Satoshi Nakamoto.
Mas pode não ser tão simples. Quando precisávamos integrar o Dogecoin, seguimos o cenário descrito, configuramos e implantamos a testnet. Como resultado, alguns testes caíram e houve problemas com a criação de transações.
O que fazer Primeiro, executamos o teste através do depurador. Aconteceu que o Dogecoin na solicitação para criar uma transação não permite transferir a quantidade na forma de uma string, como o Bitcoin. Por causa disso, tivemos que redefinir o método na classe filho. A propósito, essa é a única diferença identificada nas APIs Dogecoin e Bitcoin. Qual é o seu significado é incompreensível.
5. Nem todas as criptomoedas permitem gerar um número ilimitado de endereços exclusivosTudo é simples aqui: sem essa geração, não podemos usar a identificação de pagamento no endereço.
O que fazer Em tais situações, usamos uma mensagem exclusiva anexada à transação ao enviar o pagamento. Infelizmente, alguns clientes esquecem de indicar essas mensagens e se perguntam por que o pagamento não foi creditado automaticamente.
Como integrar no CMS?
Criamos plugins B2BinPay para WordPress, Woocommerce, Magento, PrestaShop. Aqui o apetite veio com a alimentação - inicialmente não planejávamos promover o sistema por meio de plugins para o CMS. Para cada plugin, fizemos uma revisão no sistema. A coisa mais séria aconteceu no plug-in Magento; falaremos mais sobre essa revisão.
A revisão está dividida em duas partes - Técnica e Marketing. A inspeção técnica consiste em quatro etapas:
- Farejador de código
- Instalação e Teste de Verniz
- Copiar colar colar detector
- Controle de qualidade manual
Os três primeiros estágios são totalmente automatizados, por isso é melhor levar em consideração algumas coisas no estágio de desenvolvimento. Para simplificar sua vida durante o teste, primeiro você precisa se lembrar das regras do Code Sniffer.
As regras do Magento para o Code Sniffer estão em conformidade com os padrões PSR-1 e PSR-2, este é um dos poucos CMS cujos desenvolvedores aderem a abordagens modernas de desenvolvimento em PHP. Além disso, o pessoal do Magento publicou um conjunto separado de regras que ajuda a encontrar erros nas configurações xml da estrutura de extensão e complementa as verificações geralmente aceitas. Um script para verificar o conteúdo do pacote finalizado também é publicado na conta do github, que também deve ser usada antes de enviar seu desenvolvimento para verificação automatizada.
A instalação básica do Magento contém uma classe de inicialização para o phpunit: você pode usá-lo para escrever testes para o seu plugin. Honestamente, ainda não descobrimos se a disponibilidade de testes contribui para a rápida conclusão da Revisão Técnica.

As três primeiras etapas da inspeção técnica são automáticas. Para o quarto estágio e para a Revisão de marketing, você precisará ser paciente: ambos os processos são executados por pessoas e, por isso, filas são formadas.
Esperamos os resultados do controle de qualidade manual por aproximadamente 5 dias, o que é basicamente normal. Mas cada um de nossos aplicativos para Marketing Review foi processado por mais de uma semana. Aqui, era importante para os testadores que, nos primeiros parágrafos, escrevêssemos a integração com qual serviço prestamos e qual é o seu modelo de preços, e só então indique as vantagens do nosso plugin.
Planos futuros
Acreditamos que o B2BinPay se mostrou bastante simples em termos de interação com os usuários e, portanto, será conveniente para novas empresas no mercado de criptografia e negócios avançados - por exemplo, no campo de vendas on-line - onde é necessário um produto estável e seguro.
No início da circulação inicial de moedas, aceitamos Bitcoin, Bitcoin CASH, Litecoin, DASH, Ethereum, Monero e outros. Agora, oferecemos serviços para comerciantes e carteiras para clientes corporativos da empresa estoniana, pela qual recebemos duas licenças - para troca de criptomoedas e carteiras.
Ao integrar clientes, fazemos um KYC completo para cada comerciante, após o qual o comerciante pode começar a aceitar moedas criptografadas, que são automaticamente convertidas em dólares, euros ou libras e pagas na conta bancária do comerciante.
Teremos o maior prazer em responder às suas perguntas sobre a criação do
B2BinPay e, em princípio, sobre o produto. Além disso, agora estamos procurando ativamente pessoas que pensam da mesma forma que possuem habilidades de programação em Python e estão prontas para se juntar à nossa equipe. Agora, em São Petersburgo, abrimos vagas para
líder de equipe e
desenvolvedor sênior . Estamos ansiosos pelo seu currículo!