Como iniciar micro pagamentos em seu aplicativo

Na semana passada, passei meu tempo desenvolvendo meu primeiro programa público — um bot do Telegram que funciona como uma carteira de Bitcoin e permite "dar moedas" a outros participantes de chats em grupo, além de realizar pagamentos externos em Bitcoin para mim ou para outros aplicativos conhecidos como “Lightning Apps”. Presumo que, de maneira geral, o leitor conheça Bitcoin e Telegram, pois tentarei ser breve, sem entrar em detalhes. Uma seleção de recursos sobre Bitcoin está disponível neste link, e o Telegram é um meio de troca de mensagens instantâneas em dispositivos móveis e PCs, permitindo a criação de pequenos aplicativos (bots) em sua plataforma.

Quais são as principais funcionalidades deste aplicativo?

  • Permite agradecer ou recompensar uma pessoa com um valor realmente material, e não apenas "um "like" virtual", isso eleva a comunicação eletrônica a um nível completamente novo
  • Um exemplo real de aplicativo que pode interagir financeiramente com outros aplicativos usando um protocolo de pagamento aberto
  • Todos os componentes do aplicativo são projetos de código aberto e podem ser modificados e aplicados para suas próprias necessidades. O aplicativo não utiliza soluções fechadas ou comerciais, apesar de se encaixar na esfera do comércio eletrônico, que atualmente é difícil de considerar realmente aberta.

E como isso pode ser aplicado na prática?

algo assim…

Como iniciar micro pagamentos em seu aplicativo
ou assim…

Como iniciar micro pagamentos em seu aplicativo
O que esses números significam? Isso é unidades de bitcoin — satoshis. Pelos preços de mercado na metade de 2019, 1000 satoshis equivalem a aproximadamente $0,06. Os satoshis podem ser gastos online ou facilmente trocados por moeda nacional. É por isso que (liquidez) isso não é apenas mais uma "entrada em um banco de dados" ou "pontos que você pode gastar nas lojas de nossos parceiros", e dinheiro verdadeiro da internet.
*quero mencionar de imediato que algumas palavras ou expressões não estou tentando traduzir para o russo — ou não conheço a tradução contextual em alguns casos, ou essa tradução, em minha opinião, parece mais enganosa do que correta.

Pode surgir a pergunta de como usar um aplicativo assim se não se tem bitcoins. É fácil adquirir uma pequena quantidade em uma das muitas exchanges ou casas de câmbio, ou até mesmo de um amigo que possui bitcoins, ou ainda receber moedas de usuários atuais do bot. Muitas carteiras de telefone oferecem a opção de comprar bitcoins diretamente, sem complicações.

Como iniciar micro pagamentos em seu aplicativoComo iniciar micro pagamentos em seu aplicativoComo iniciar micro pagamentos em seu aplicativo

Quando você conseguiu bitcoins (ou mais precisamente, satoshis-s(?)) — inicie @atomic_tipbot e faça um /deposit.

O bot, em resposta, perguntará quantos satoshis você deseja depositar e enviará uma fatura que pode ser paga com uma carteira móvel, escaneando o código QR ou clicando no botão («abrir na carteira») na página da fatura.

Como iniciar micro pagamentos em seu aplicativoComo iniciar micro pagamentos em seu aplicativoComo iniciar micro pagamentos em seu aplicativo

Confirmando o pagamento na sua carteira, o bot enviará a confirmação de pagamento quase imediatamente, e isso será visualmente exibido no quadro da fatura.

Até agora, cobrimos duas componentes do aplicativo — o back-end do bot do Telegram e o sistema de processamento de pagamentos em criptomoeda (mais precisamente, seu front-end).

Para criar o bot do Telegram, utilizei Python Telegram Bot. E claro, o próprio bot de código aberto.

Como sistema de processamento de pagamentos e solução para desafios de UX, a escolha recaiu (na verdade, quase não há escolha) sobre BTCPayServer, cuja documentação pode ser encontrada neste link.

Se você está procurando soluções para o processamento de eventos de pagamento diretamente, deve prestar atenção ao páginas manuais do Electrum CLI para pagamentos on-chain, e para pagamentos instantâneos de microtransações (Lightning), soluções como Lightning-charge ou Sparko.

Então, é auto-hospedado ou não!?

Sim, é verdade. No meu aplicativo, utilizo o serviço de hospedagem gratuito BTCPayServer — BTCPayJungle, mas é absolutamente possível e não leva muito tempo para configurar seu próprio centro de processamento. No entanto, é importante lembrar que você precisará de cerca de 500GB disponíveis em disco rígido para armazenar as blockchain do Bitcoin (e Litecoin). Você também precisará de recursos computacionais e de rede durante a sincronização e, dependendo de suas necessidades, as necessárias "wrappers" para blockchains, para interagir com elas de maneira confortável. O BTCPayServer não contém por design chaves privadas ou qualquer outra informação que permita controlar sua carteira.

Para pagamentos on-chain (normais), é necessário adicionar a chamada chave xpub da carteira no BTCPayServer para gerar endereços para recebimento (chaves públicas). Isso torna possível e seguro usar o BTCPayServer mesmo em um formato 'compartilhado'. Todas essas chaves xpub e endereços podem ser facilmente obtidos em boas carteiras como Electrum, para configuração adicional do processamento.

Todos que se depararam com Bitcoin ouviram que o bitcoin é lento e as transações são caras, especialmente durante picos de demanda. Portanto, para micropagamentos instantâneos, é preferível usar transações (off-chain) na Lightning Network.

O que é a Lightning Network?

É algo como um plug-in para o bitcoin, que adiciona uma camada extra de abstração e permite realizar transações instantâneas e praticamente gratuitas na rede Bitcoin. Tudo isso é possível graças à mágica criptográfica com múltiplas assinaturas, frequentemente chamada de smart contract. Existem várias implementações do protocolo Lightning Network, eu utilizo c-lightning , uma implementação em C.

A principal diferença entre pagamentos on-chain e off-chain (Lightning) é a forma como eles são armazenados. Todas as on-chain transações são retransmitidas por todos os nós da rede até que um dos nós bitcoin anuncie um novo bloco minerado com as transações incluídas. (No Habr, há até BitFury, que fabrica hardware para mineração). É exatamente por isso que chamamos essas transações on-chain. Essas transações serão gravadas na blockchain pública e permanecerão lá até o fim de sua existência. Além disso, essas transações estão acessíveis publicamente e podem ser monitoradas, rastreadas e analisadas.

No caso de transações off-chain (Lightning), tudo acontece de forma diferente. Cada nó da rede Lightning possui um (ou mais) endereço(s) on-chain - esses são os endereços bitcoin comuns, de onde tudo começa. Quando bitcoins aparecem em um desses endereços, é possível abrir o chamado canal lightning para outro nó, o que significa que, por meio de técnicas criptográficas, esses dois nós concordaram sobre a disponibilidade de fundos entre si. Posteriormente, todas as transações (tanto as suas quanto as transações de nós externos) que passam por esse canal são armazenadas apenas nos nós participantes da transação (e nos nós intermediários). As únicas transações que são registradas na blockchain são as transações de abertura ou fechamento de canal. Em uma escala mais ampla, obtém-se uma rede de nós interconectados que estabelece entre os participantes milhares de caminhos diferentes para "transferir" fundos de um nó para outro sob regras rígidas específicas. Praticamente todas essas transações são armazenadas apenas no arquivo de banco de dados dos próprios nós. É por essa razão que as chamamos de transações off-chain.

O diagrama mostra a visualização de todos os componentes da aplicação

Como iniciar micro pagamentos em seu aplicativo

Resumindo:

1) O usuário envia um comando para o bot em Telegram

2) O Telegram envia uma mensagem sobre o evento aplicação python bot

3) aplicação python envia uma solicitação para BTCPayServer

4) O BTCPayServer gera endereços de recebimento BTC e LTC e também envia uma solicitação de fatura para lightning-charge, que por sua vez se comunica com o daemon c-lightning. O resultado é um formulário HTML bonito para processamento de pagamento

5) O usuário paga a fatura e vê a confirmação

6) BTCPayServer envia notificação de pagamento da fatura (IPN) para o callback_url especificado, neste caso callbacks.py (outra aplicação python para receber notificações)

7) De acordo com os dados recebidos, o saldo do usuário é alterado

… e se o usuário quiser retirar fundos (moedas que recebeu de outros) …

8) Aplicação python do bot aguarda texto ou imagem de QR code, e quando os dados válidos são recebidos, o pagamento é realizado pela ferramentapaylightning.py*, que inicializa a transação por meio do c-lightning RPC.

Como iniciar micro pagamentos em seu aplicativo

*Para ser justo, vale a pena notar que meu wrapper paylightning.py não está completamente finalizado e pode retornar um resultado falso negativo em cenários específicos. Recomendo o uso de um wrapper bem testado em situações que se aproximam da produção

O que temos? Os usuários do nosso bot podem dentro do chat em grupo ou diretamente transmitir valor material sem restrições. E isso não é tudo — graças ao protocolo Lightning Network, que de certa forma é uma rede de pagamentos unificada e simplificada, agora é possível enviar o mesmo dinheiro que foi recebido no chat para aplicativos completamente diferentes. Por exemplo, no Telegram já existe um bot para pagamentos em Bitcoin — @lntxbot. O ‘Saldo Unificado’ permite usar qualquer um dos bots, dependendo das preferências de um grupo de chat específico (sim, o problema é absolutamente fictício e a solução é bastante inútil, mas essa é a essência). Transferir saldo de um bot para outro não custa nada e leva segundos! É importante notar que os criadores desses bots nunca se comunicaram entre si.

Como iniciar micro pagamentos em seu aplicativo Como iniciar micro pagamentos em seu aplicativo

É bastante simples encaminhar uma mensagem com um pedido de depósito do @lntxbot para o @atomic_tipbot e voilà!

Isso não é apenas um 'lançamento de números em um BD', mas um pagamento entre dois BDs diferentes e não relacionados. Assim, já existem vários 'LApps' integrados ao bot, entre eles: sat2.io e lnsms.world.

O que significa integração LApp?

Cada Lightning Network nodo é essencialmente uma carteira de Bitcoin. Ela possui dois saldos: on-chain e off-chain. O saldo on-chain é necessário para abrir novos canais e armazenar fundos de canais fechados. Já o saldo off-chain é exatamente o que circula entre os nós. Os principais requisitos para um nó são receber e enviar pagamentos, por isso cada nó, como software, possui funções pay e invoice. Eu vou mostrar como isso acontece:

user@ln-node: / % lightning-cli invoice 1000000000 internal_description external_description
{
   "payment_hash" : "64c0c8f5f8f708b08487ad1376f3d256f92ccb9606987ba395c2b4193efde5a0",
   "expires_at" : 1558709834,
   "bolt11" : "lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6"
}

Recebemos a 'fatura' da especificação BOLT11 neste caso, que é o formato dos pagamentos na rede Bitcoin (e Litecoin, por sinal, também). Esta é uma string que contém informações sobre o destinatário, o valor da transação, o tempo de expiração do pedido, etc., informações detalhadas podem ser obtidas executando decodepay em relação a esta string:

user@ln-node: / % lightning-cli decodepay lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6
{
   "currency": "bc",
   "created_at": 1558105034,
   "expiry": 604800,
   "payee": "025a14b8ed40583d67aec92da19453e0b2d1fbbf75f96f85d3dd0ff61a51ee0490",
   "msatoshi": 1000000000,
   "amount_msat": "1000000000msat",
   "description": "external_description",
   "min_final_cltv_expiry": 10,
   "routes": [
      [
         {
            "pubkey": "03a20c0c2ae4508b669a70e5f82f08f69a3da5da3bf0c973673c3fe977db0f61e3",
            "short_channel_id": "574012x1255x1",
            "fee_base_msat": 1000,
            "fee_proportional_millionths": 1,
            "cltv_expiry_delta": 144
         }
      ]
   ],
   "payment_hash": "64c0c8f5f8f708b08487ad1376f3d256f92ccb9606987ba395c2b4193efde5a0",
   "signature": "304502210099f31dffd18b6db8296637db3e3a1ffbaf7b7db087a2ad1eedb7639f25e78b25022079038370073681aa1e1a7a05de6588e98ead078896d0a37a15b755c212dc3d37"
}

Para o pagamento deste "invoice", precisamos da função pay do c-lightning:

user@ln-node: / % lightning-cli pay lnbc2u1pwdana3pp5c0nyfgq974hr8huflt9uutyalj4maaw3q5594xp89jkvw74jme3sdql2pshjgr5dus8q6r0dejjqampd3kx2aqcqzpgwjgn45gy80jwjhgm3tpsxg33j6h6pehdus0mnjerrad943cz3vs83g30lyhlhfjxtqvtl76vttkuhs5jekuxpsqmf98l8265pwmm76gp4e7z6j
{
   "id": 163,
   "payment_hash": "c3e644a005f56e33df89facbce2c9dfcabbef5d105285a98272cacc77ab2de63",
   "destination": "03021c5f5f57322740e4ee6936452add19dc7ea7ccf90635f95119ab82a62ae268",
   "msatoshi": 200000,
   "amount_msat": "200000msat",
   "msatoshi_sent": 200003,
   "amount_sent_msat": "200003msat",
   "created_at": 1558106072,
   "status": "complete",
   "payment_preimage": "1a9552b9f4e9199e26839353f870b12cc85b7674a2fb134e78aa370032611019",
   "bolt11": "lnbc2u1pwdana3pp5c0nyfgq974hr8huflt9uutyalj4maaw3q5594xp89jkvw74jme3sdql2pshjgr5dus8q6r0dejjqampd3kx2aqcqzpgwjgn45gy80jwjhgm3tpsxg33j6h6pehdus0mnjerrad943cz3vs83g30lyhlhfjxtqvtl76vttkuhs5jekuxpsqmf98l8265pwmm76gp4e7z6j"
}

Todos os estados das transações são processados por toda a rede e pela sua própria node em particular. Não é necessário (mas é uma possibilidade) interagir com os criadores do aplicativo receptor do pagamento ou qualquer uma de suas APIs para obter informações sobre o estado do pagamento. Não há necessidade de verificar o estado do pagamento no sistema de processamento intermediário. Não é necessário aguardar a aprovação da sua transação por um banco ou instituição governamental. Afinal, não existem chargebacks nem outros fatores externos que possam afetar o saldo da sua conta. Esta é uma solução para mover valor através da Internet, sem a necessidade de um árbitro externo que decida se a transação atende às regras (que às vezes são até mesmo regras internas, das quais nem todos os participantes são informados previamente) ou não. No Bitcoin, não há "regras internas". As únicas regras a serem seguidas são as regras da rede — abertas e bem conhecidas.

Isso torna real transações diretas, praticamente gratuitas e imediatas transações financeiras entre pessoas ou programas de forma totalmente autônoma.

Se você tem a capacidade de obter dados de pagamento de um aplicativo de terceiros, então surge a oportunidade de interagir financeiramente com esse aplicativo. Como exemplo, podemos considerar o serviço lnsms.world, que permite enviar uma mensagem SMS para um número qualquer, pagando com bitcoins. Para integrar esse aplicativo, precisamos apenas passar os dados do formulário da web diretamente para o script de envio de SMS - emulando as ações do usuário no site:

payload = {                                                                                                                           
        'number': phone_number,
        'text': text,
        'force_unicode': 0
    }

    send_req = requests.post('https://lnsms.world/invoice', data=payload)
    if send_req.status_code == 201:
        plain_invoice = str(send_req.text)

Não sei por qual motivo, mas o lnsms responde com o código de status HTTP 201 e retorna uma fatura no formato BOLT11. Ora, isso é suficiente para que os usuários do bot possam fazer o pagamento pelo envio de SMS a partir de seu saldo obtido em chats. O usuário nem sabe o que está acontecendo, ele simplesmente pagou alguns centavos pelo envio do SMS. E eu, como desenvolvedor, não me aprofundo nas particularidades do funcionamento dos serviços de SMS. Apenas transfiro o pagamento e recebo o serviço. Posso adicionar uma margem de lucro, ou não — essa é minha livre escolha. Nenhuma conta, acordos ou mais uma API para tarefas triviais como enviar SMS.

E agora vamos imaginar por um momento que nosso aplicativo é algo mais útil que um bot de chat e realiza um pagamento não para outro bot, mas para outro aplicativo ou dispositivo conectado à Internet. Ou seja, são dezenas ou até centenas de pagamentos insignificantes a cada segundo entre dispositivos, serviços, lojas ou algum fornecedor de serviços. Essa é a força dos micro pagamentos, assim deve parecer a Internet das coisas. Já existem projetos como Althea que tornam essas ideias realidade e em breve veremos grandes, na minha opinião, mudanças na área que atualmente chamamos de comércio eletrônico.

Se você gostou do post e quer experimentar bitcoins em ação — me envie uma cerveja, e alguns pãezinhos franceses macios.

Apenas usuários registrados podem participar da pesquisa. Entre, por favor.

Você está interessado em artigos técnicos sobre Bitcoin e software relacionado?

  • Sim

  • Não

  • Eu me interesso mais pelos aspectos de mercado das criptomoedas

Votaram 8 usuários. 4 usuários se abstiveram.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster