Na semana passada, desenvolvi meu primeiro programa público - um robô Telegram que funciona como uma carteira Bitcoin e permite que você "jogue moedas" para outros membros de bate-papos em grupo e também faça pagamentos externos de Bitcoin para você ou para os chamados "Aplicativos Lightning". Quero dizer que, em geral, o leitor está familiarizado com Bitcoin e Telegram, como Vou tentar escrever brevemente, sem entrar em detalhes.
Uma seleção de recursos sobre o Bitcoin está disponível neste link , mas o Telegram é uma ferramenta de mensagens instantâneas para dispositivos móveis e PCs que permite criar seus próprios aplicativos pequenos (bots de bate-papo) em sua plataforma.
Quais são os principais recursos deste aplicativo?
- Permite agradecer ou recompensar o interlocutor com um valor verdadeiramente material, e não apenas um "virtual like" , isso leva a comunicação eletrônica a um nível totalmente novo
- Um exemplo do mundo real de um 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 é possível modificá-los e aplicá-los às suas tarefas. O aplicativo não utiliza soluções fechadas e / ou comerciais, apesar de se enquadrar no escopo do comércio eletrônico, hoje difícil de chamar de aberto.
E como aplicá-lo nos negócios?
algo assim ...
mais ou menos ...
O que esses números significam? Estas são
unidades de Bitcoin - Satoshi . A preços de câmbio de meados de 2019, 1000 Satoshi é de aproximadamente US $ 0,06. Satoshi pode ser gasto on-line ou facilmente trocado por moeda nacional. É por esse motivo (liquidez) que essa não é apenas mais uma
“entrada no banco de dados” ou
“pontos que você pode gastar nas lojas de nossos parceiros”, mas
dinheiro de verdade na Internet .
* Quero observar imediatamente que, deliberadamente, não estou tentando escrever algumas palavras ou frases em russo. Em alguns casos, não conheço a tradução contextual em si, ou essa tradução, na minha opinião, parece mais confusa do que correta.A questão pode surgir: como usar esse aplicativo se não houver bitcoins. Eles podem ser comprados facilmente em pequenas quantidades em uma das muitas trocas ou trocadores, ou você pode obtê-lo de um amigo de bitcoin ou até mesmo obter moedas de usuários de bot atuais. Muitas carteiras no telefone oferecem comprar bitcoins diretamente "sem sair do caixa".



Quando pegamos bitcoins (mas Satoshi (?)) - execute
@atomic_tipbot e faça / deposite.
O bot em resposta perguntará quanto satoshi adicionar ao saldo e enviará uma conta para pagamento, que pode ser paga com uma carteira móvel, digitalizando o código QR ou clicando no botão (
"abrir na carteira" ) na página da fatura.



Depois de confirmar o pagamento na sua carteira, quase imediatamente uma confirmação de pagamento será enviada ao bot e isso será exibido visualmente no quadro da conta.
Até esse momento, abordamos dois componentes do aplicativo - o bot de telegrama de back-end e o sistema de processamento de pagamentos por criptomoeda (em vez disso, seu front-end).
Para criar um bot de Telegram, usei o
Python Telegram Bot . E, claro, o próprio bot de
código aberto .
Como um sistema para processar pagamentos e resolver problemas de UX, a escolha caiu (na verdade, quase não existe escolha) no
BTCPayServer , para o qual a
documentação está disponível neste link .
Se você procurar soluções para o processamento direto de eventos de pagamento, preste atenção às
páginas de manual da
Electrum CLI para os chamados pagamentos em cadeia e para soluções instantâneas de micropagamentos (Lightning), como
Lightning-charge ou
Sparko .
Então, é auto-hospedado ou não!?
É sim. No meu aplicativo, uso o BTCPayServer - BTCPayJungle de hospedagem gratuita, mas é absolutamente possível e não requer muito tempo para iniciar meu próprio centro de processamento. No entanto, vale lembrar que você precisará de aproximadamente 500 GB disponíveis na ferrovia para armazenar as blockchains Bitcoin (e Litecoin). Também exigirá recursos de computação e de rede para a duração da sincronização e, dependendo de suas necessidades, os "wrappers" necessários para as cadeias de blocos, para que seja conveniente interagir com eles. O BTCPayServer não contém chaves privadas
projetadas ou qualquer outra informação que permita controlar sua carteira.
Para pagamentos em cadeia (regulares), é necessário adicionar o chamado chave xpub-wallet no BTCPayServer para gerar endereços de recebimento (chaves públicas). Isso torna possível e seguro usar o BTCPayServer mesmo em um formulário "compartilhado". Todas essas chaves e endereços xpub podem ser facilmente obtidos em boas carteiras como a
Electrum , para posterior processamento do processamento.
Todo mundo que se deparou com o Bitcoin ouviu que o Bitcoin é lento e as transações são caras, especialmente quando é exagero; portanto, para micropagamentos instantâneos, você deve usar transações (fora da cadeia) da Lightning Network.
O que é essa rede Lightning?
Este é um plugin para bitcoin que cria uma camada adicional de abstração e permite que você faça transações instantâneas e quase gratuitas na rede Bitcoin. Tudo isso é possível graças à magia criptográfica com várias assinaturas, geralmente chamada de
contrato inteligente . Existem várias implementações do protocolo Lightning Network, eu uso a implementação
c-lightning em C.
A principal diferença entre pagamentos on-chain e off-chain (Lightning) é como eles são armazenados. Todas as transações
on-chain são retransmitidas para todos os nós da rede até que um dos nós do Bitcoin anuncie um
novo bloco minado com as transações incluídas nele. (Há até
BitFury no hub ; eles apenas produzem ferro para mineração). É por esse motivo que chamamos essas transações
em cadeia . Tais transações serão registradas em uma blockchain comum e armazenadas nela até o final de sua existência. Essas transações também são de domínio público e podem ser monitoradas, rastreadas e analisadas.
No caso de transações
fora da cadeia (Lightning), tudo acontece de maneira diferente. Cada nó da rede Lightning possui um
(ou mais) endereços na cadeia - esses são os endereços Bitcoin habituais dos quais tudo começa. Quando os bitcoins aparecem nesse endereço, é possível abrir o chamado.
canal de raio para outro nó, o que significa que, com a ajuda de técnicas criptográficas, esses dois nós concordaram com a disponibilidade de fundos entre si. Posteriormente, todas as transações (próprias e de nós estrangeiros) que passam por esse canal são armazenadas apenas nos nós dos participantes da transação (e nós intermediários). As únicas transações registradas na blockchain são transações sobre abertura ou fechamento de um canal. Em uma escala mais completa, obtemos uma rede de nós interconectados que cria entre os participantes milhares de maneiras diferentes de "transferir" fundos de um nó para outro, de acordo com certas regras estritas. Quase todas essas transações são armazenadas apenas no arquivo de banco de dados dos próprios nós. É por esse motivo que os chamamos de
fora da cadeia .
O diagrama mostra a visualização de todos os componentes do aplicativo

Em resumo:
1) O usuário envia um comando para o bot no
Telegram2) O telegrama envia uma mensagem de evento
python para o
aplicativo bot
3) um
aplicativo python envia uma solicitação ao
BTCPayServer4) O BTCPayServer gera endereços BTC e LTC recebidos, além de enviar uma solicitação de fatura para
a cobrança de uma taxa , que por sua vez se comunica com o daemon
c-lightning . Na saída, obtemos uma bela forma HTML de processamento de pagamentos
5) O usuário paga a fatura e vê uma confirmação
6)
BTCPayServer envia
uma notificação de pagamento de fatura (IPN) para o callback_url especificado, no nosso caso
callbacks.py (outro aplicativo python para receber notificações)
7) De acordo com os dados recebidos, o saldo do usuário muda
... e se o usuário quisesse retirar fundos (moedas que ele recebeu de outros) ...8) O
aplicativo Python do bot aguarda o texto ou a imagem do código QR e, quando dados válidos são recebidos, o pagamento pelo utilitário
paylightning.py * é
realizado , o que inicializa a transação usando o RPC c-lightning.
* Para ser honesto, vale a pena notar que meu wrapper paylightning.py não está completamente concluído e pode retornar um falso negativo em cenários específicos. Eu recomendo usar um invólucro bem depurado em casos próximos à produçãoO que nós temos? Os usuários do nosso bot podem entrar em um bate-papo em grupo ou diretamente podem transferir o
valor do material sem restrições. E isso não é tudo - graças ao protocolo Lightning Network, que de certa forma é uma rede de pagamento unificada e simplificada, é possível enviar o mesmo dinheiro recebido no bate-papo para aplicativos de terceiros completamente. Por exemplo, o Telegram já tinha o primeiro bot para pagamentos em bitcoin - @lntxbot. "Um saldo" permite que você use qualquer um dos bots, dependendo das preferências de um bate-papo em grupo específico (sim, o problema é completamente artificial e a solução é muito inútil, mas o ponto é essencial). Transferir saldo de um bot para outro não custa nada e leva segundos! É importante observar que os criadores desses bots nunca se conectaram.


Basta encaminhar a mensagem de solicitação de depósito de @lntxbot para @atomic_tipbot e voul'a!
Isso não é apenas "transferir números para o banco de dados", mas um pagamento entre dois bancos de dados diferentes e não relacionados. Assim, vários "LApps" já estão integrados ao bot, entre eles:
sat2.io e
lnsms.world .
O que significa a integração do LApp ?Cada nó da
Lightning Network é essencialmente uma carteira Bitcoin. Ela tem dois saldos: on-chain e off-chain. O saldo na cadeia é necessário para abrir novos canais e armazenar fundos de canais fechados. Mas o saldo fora da cadeia é exatamente o que ocorre entre os nós. Os principais requisitos para um nó são receber e enviar pagamentos; portanto, cada nó como software possui funções de
pagamento e
fatura . Vou demonstrar como isso acontece:
user@ln-node:/ % lightning-cli invoice 1000000000 internal_description external_description { "payment_hash" : "64c0c8f5f8f708b08487ad1376f3d256f92ccb9606987ba395c2b4193efde5a0", "expires_at" : 1558709834, "bolt11" : "lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6" }
Nesse caso, recebemos uma "fatura" da especificação
BOLT11 , que é um formato de pagamento na rede Bitcoin (e Litecoin, a propósito, também). Esta é uma linha que contém informações sobre o destinatário, valor da transação, tempo de expiração da solicitação, etc., informações detalhadas podem ser obtidas executando o decodepay com relação a esta linha:
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" }
relâmpago-cli decodepay lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6 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" }
Mas para pagar por essa "fatura", precisamos da função de pagamento 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" }
relâmpago-cli lnbc2u1pwdana3pp5c0nyfgq974hr8huflt9uutyalj4maaw3q5594xp89jkvw74jme3sdql2pshjgr5dus8q6r0dejjqampd3kx2aqcqzpgwjgn45gy80jwjhgm3tpsxg33j6h6pehdus0mnjerrad943cz3vs83g30lyhlhfjxtqvtl76vttkuhs5jekuxpsqmf98l8265pwmm76gp4e7z6j pagamento 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 de transação são tratados por toda a rede e seu próprio nó em particular. Não há necessidade (mas existe essa oportunidade) de interagir com os autores do aplicativo do beneficiário ou qualquer uma de suas APIs para obter informações sobre o status do pagamento. Não há necessidade de verificar o status do pagamento no sistema de processamento intermediário. Não é necessário esperar a aprovação de sua transação de um banco ou agência governamental. No final, não há estornos e outros fatores externos que podem afetar o saldo da sua conta. Esta é uma solução para mover valor via Internet, sem a necessidade de um árbitro externo que decida se a transação está em conformidade com as regras (às vezes até regras internas, das quais nem todos os participantes são informados com antecedência) ou não. Não há "regras internas" no bitcoin. As únicas regras que você precisa seguir são as regras de rede - abertas e conhecidas.
Isso torna transações de dinheiro
diretas ,
praticamente gratuitas e
instantâneas entre pessoas ou programas, realisticamente reais.
Se você tiver a oportunidade de receber dados de pagamento de um aplicativo de terceiros, será possível interagir financeiramente com esse aplicativo. Como exemplo, considere o serviço lnsms.world, que permite enviar uma mensagem SMS para um número arbitrário, pagando-a com bitcoins. Para integrar esse aplicativo, precisamos apenas transferir dados do formulário da web diretamente para o script de envio do SMS - para emular 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 que motivo, mas o lnsms responde com o código de status HTTP 201 e retorna uma fatura no formato BOLT11. Bem, isso é suficiente para os usuários bot pagarem pelo envio de SMS do saldo recebido nas salas de bate-papo. O usuário nem sabe o que está acontecendo lá, apenas pagou alguns centavos pelo envio de SMS. E eu, como desenvolvedor, não entro nos detalhes do trabalho dos serviços de SMS. Apenas encaminhei o pagamento e recebi o serviço. Você pode fazer uma marcação no topo, mas não pode fazê-lo - essa é a minha escolha livre. Nenhuma conta, contrato ou outra API para tarefas triviais, como o envio de SMS.
E agora vamos imaginar por um momento que nosso aplicativo é algo mais útil que um bot de bate-papo e efetua um pagamento não a outro bot, mas a outro aplicativo ou dispositivo conectado à Internet. Ou são dezenas ou mesmo centenas de pagamentos insignificantes a cada segundo entre dispositivos, serviços, lojas ou algum tipo de prestador de serviços. Esse é o poder dos micropagamentos, então a Internet das coisas deve parecer. Já existem projetos como o
Althea que
dão vida a essas idéias e, em um futuro próximo, veremos grandes mudanças, na minha opinião, na área que hoje chamamos de comércio eletrônico.
Se você gostou do post e quer experimentar bitcoins em ação,
envie-me uma cerveja e pães franceses macios .