Comment démarrer des micro-paiements dans votre application

La semaine dernière, j'ai passé à développer mon premier programme public - le bot Telegram qui fonctionne comme un portefeuille Bitcoin et vous permet de «jeter des pièces» à d'autres participants dans des chats de groupe et d'effectuer également des paiements Bitcoin externes pour vous-même ou pour d'autres soi-disant «Lightning Apps». Je veux dire qu'en général le lecteur est familier avec Bitcoin et Telegram, comme J'essaierai d'écrire brièvement, sans entrer dans les détails. Une sélection de ressources sur Bitcoin est disponible sur ce lien , mais Telegram est un outil de messagerie instantanée pour les appareils mobiles et les PC qui vous permet de créer vos propres petites applications (chat bots) sur leur plateforme.

Quelles sont les principales fonctionnalités de cette application?


  • Vous permet de remercier ou de récompenser l'interlocuteur avec une valeur vraiment matérielle, et pas seulement un «virtuel» , ce qui porte la communication électronique à un tout autre niveau
  • Un exemple concret d'une application qui peut interagir financièrement avec d'autres applications en utilisant un protocole de paiement ouvert
  • Tous les composants d'application sont des projets open source et il est possible de les modifier et de les appliquer à vos tâches. L'application n'utilise pas de solutions fermées et / ou commerciales, en dépit du fait qu'elle s'adapte au domaine du commerce électronique, qui est aujourd'hui assez difficile à appeler ouvert.

Et comment l'appliquer en entreprise?


quelque chose comme ça ...

image

ou alors ...

image

Que signifient ces chiffres? Ce sont des unités de Bitcoin - Satoshi . Au prix de change de la mi-2019, 1000 Satoshi est d'environ 0,06 $. Satoshi peut être dépensé en ligne ou facilement échangé contre de la monnaie nationale. C'est pour cette raison (liquidité) qu'il ne s'agit pas simplement d'une autre «entrée dans la base de données» ou de «points que vous pouvez dépenser dans les magasins de nos partenaires», mais de l'argent réel sur Internet .
* Je tiens à noter tout de suite que je n'essaie délibérément pas d'écrire des mots ou des phrases en russe - soit je ne connais pas la traduction contextuelle elle-même dans certains cas, soit une telle traduction, à mon avis, semble plus déroutante que correcte.

La question peut se poser, comment utiliser une telle application s'il n'y a pas de bitcoins. Ils peuvent être facilement achetés en petites quantités sur l'un des nombreux échanges ou échangeurs, ou vous pouvez les obtenir auprès d'un ami Bitcoin ou même obtenir des pièces des utilisateurs de robots actuels. De nombreux portefeuilles sur le téléphone proposent d'acheter des bitcoins directement "sans quitter la caisse".

imageimageimage

Lorsque nous avons mis la main sur des bitcoins (mais plutôt Satoshi (?)) - exécutez @atomic_tipbot et faites / déposez.

Le bot en réponse demandera combien de satoshi doit être crédité sur le compte et enverra une facture pour le paiement, qui peut être payée avec un portefeuille mobile en scannant le code QR ou en cliquant sur le bouton ( «ouvrir dans le portefeuille» ) sur la page de facturation.

imageimageimage

Après avoir confirmé le paiement sur votre portefeuille, presque immédiatement une confirmation de paiement sera envoyée au bot et celle-ci sera visuellement affichée dans le cadre du compte.

Jusqu'à ce moment, nous avons abordé deux composants de l'application - le bot de télégramme principal et le système de traitement des paiements par crypto-monnaie (plutôt, son frontal).

Pour créer un bot Telegram, j'ai utilisé le Bot Python Telegram . Et bien sûr, le bot open source lui-même.

En tant que système de traitement des paiements et de résolution des problèmes UX, le choix est tombé (en fait, il n'y a presque pas de choix) sur BTCPayServer , pour lequel la documentation est disponible sur ce lien .

Si vous recherchez des solutions pour traiter directement les événements de paiement, vous devez faire attention aux pages de manuel Electrum CLI pour les soi-disant les paiements en chaîne et pour les solutions de micro-paiements instantanés (Lightning) comme Lightning-charge ou Sparko .

Est-il donc auto-hébergé ou non!?


Oui. Dans mon application, j'utilise l'hébergement gratuit BTCPayServer - BTCPayJungle , mais c'est absolument possible et ne nécessite pas beaucoup de temps pour lancer mon propre centre de traitement. Cependant, il convient de rappeler que vous aurez besoin d'environ 500 Go disponibles sur le chemin de fer pour stocker les chaînes de blocs Bitcoin (et Litecoin). Cela nécessitera également des ressources informatiques et réseau pour la durée de la synchronisation et, selon vos besoins, les «wrappers» nécessaires pour les blockchains, de sorte qu'il serait pratique d'interagir avec eux. BTCPayServer ne contient pas de clés privées de conception ou toute autre information qui vous permet de contrôler votre portefeuille.

Pour les paiements en chaîne (réguliers), vous devez ajouter ce que l'on appelle Clé xpub-wallet dans BTCPayServer pour générer des adresses de réception (clés publiques). Cela rend possible et sûr l'utilisation de BTCPayServer même sous une forme "partagée". Toutes ces clés et adresses xpub peuvent être facilement obtenues dans de bons portefeuilles comme Electrum , pour un traitement ultérieur.

Tous ceux qui ont rencontré Bitcoin ont entendu dire que Bitcoin est lent et que les transactions sont chères, en particulier lorsqu'il est hype, donc pour les micro-paiements instantanés, vous devez utiliser les transactions Lightning Network (hors chaîne).

Qu'est-ce que ce réseau Lightning?


C'est un peu un plugin Bitcoin qui construit une couche supplémentaire d'abstraction et vous permet de faire des transactions instantanées et presque gratuites sur le réseau Bitcoin. Tout cela est possible grâce à la magie cryptographique à multi-signatures, souvent appelée contrat intelligent . Il existe plusieurs implémentations du protocole Lightning Network, j'utilise l'implémentation c-lightning en C.

La principale différence entre les paiements en chaîne et hors chaîne (Lightning) est la façon dont ils sont stockés. Toutes les transactions en chaîne sont relayées à tous les nœuds du réseau jusqu'à ce que l'un des nœuds Bitcoin annonce un nouveau bloc miné avec des transactions incluses. (Il y a même BitFury sur le moyeu ; ils ne produisent que du fer pour l'exploitation minière). C'est pour cette raison que nous appelons ces transactions en chaîne . Ces transactions seront enregistrées dans une blockchain commune et y seront stockées jusqu'à la fin de son existence. Ces transactions sont également du domaine public et peuvent être surveillées, suivies et analysées.

Dans le cas des transactions hors chaîne (Lightning), tout se passe différemment. Chaque nœud du réseau Lightning a une (ou plusieurs) adresses en chaîne - ce sont les adresses Bitcoin habituelles à partir desquelles tout commence. Lorsque des bitcoins apparaissent à une telle adresse, il est possible d'ouvrir ce que l'on appelle. canal de foudre vers un autre nœud, ce qui signifie qu'avec l'aide de techniques cryptographiques, ces deux nœuds se sont mis d'accord sur la disponibilité des fonds entre eux. Plus tard, toutes les transactions (tant les leurs que les transactions de nœuds étrangers) qui transitent par un tel canal sont stockées uniquement sur les nœuds des participants à la transaction (et les nœuds intermédiaires). Les seules transactions enregistrées sur la blockchain sont des transactions sur l'ouverture ou la fermeture d'un canal. À plus grande échelle, nous obtenons un tel réseau de nœuds interconnectés qui construit entre les participants des milliers de façons différentes de «transférer» des fonds d'un nœud à un autre selon certaines règles strictes. Presque toutes ces transactions sont stockées uniquement dans le fichier de base de données des nœuds eux-mêmes. C'est pour cette raison que nous les appelons hors chaîne .

Le diagramme montre la visualisation de tous les composants de l'application


image

En bref:

1) L'utilisateur envoie une commande au bot dans Telegram

2) Le télégramme envoie un message d'événement python à l' application bot

3) une application python envoie une demande à BTCPayServer

4) BTCPayServer génère les adresses BTC et LTC entrantes et envoie une demande de facture à lightning-charge , qui à son tour communique avec le démon c-lightning . À la sortie, nous obtenons une belle forme HTML de traitement des paiements

5) L'utilisateur paie la facture et voit une confirmation

6) BTCPayServer envoie une notification de paiement de facture (IPN) au callback_url spécifié, dans notre cas callbacks.py (une autre application python pour recevoir des notifications)

7) Selon les données reçues, le solde de l'utilisateur change

... et si l'utilisateur souhaite retirer des fonds (pièces qu'il a reçues d'autres) ...

8) L' application Python du bot attend le texte ou l'image du code QR, et lorsque des données valides sont reçues, le paiement par l'utilitaire paylightning.py * est effectué , ce qui initialise la transaction à l'aide de c-lightning RPC.

image

* En toute honnêteté, il convient de noter que mon wrapper paylightning.py n'est pas complètement terminé et peut retourner un faux négatif dans des scénarios spécifiques. Je recommande d'utiliser un wrapper bien débogué dans les cas proches de la production

Qu'avons-nous? Les utilisateurs de notre bot peuvent à l'intérieur d'une discussion de groupe ou directement transférer la valeur matérielle sans restrictions. Et ce n'est pas tout - grâce au protocole Lightning Network, qui est en quelque sorte un réseau de paiement unifié et simplifié, il est possible d'envoyer le même argent reçu dans le chat à des applications entièrement tierces. Par exemple, Telegram avait déjà le premier bot pour les paiements Bitcoin - @lntxbot. «Un équilibre» vous permet d'utiliser n'importe lequel des bots en fonction des préférences d'un chat de groupe particulier (oui, le problème est complètement artificiel et la solution est très inutile, mais l'essentiel est par essence). Transférer le solde d'un bot à un autre ne coûte rien et prend quelques secondes! Il est important de noter que les créateurs de ces robots ne se sont même jamais connectés les uns aux autres.

imageimage

Il suffit de simplement transmettre le message de demande de dépôt de @lntxbot à @atomic_tipbot et voul'a!

Il ne s'agit pas seulement de «transférer des numéros vers la base de données», mais un paiement entre deux bases de données différentes et indépendantes. Ainsi, plusieurs «LApps» sont déjà intégrés dans le bot, parmi eux: sat2.io et lnsms.world .

Que signifie l' intégration LApp ?

Chaque nœud Lightning Network est essentiellement un portefeuille Bitcoin. Elle a deux soldes: en chaîne et hors chaîne. Un équilibre en chaîne est nécessaire pour ouvrir de nouveaux canaux et stocker des fonds provenant de canaux fermés. Mais l'équilibre hors chaîne est exactement ce qui se passe entre les nœuds. Les exigences principales pour un nœud sont la réception et l'envoi de paiements, donc chaque nœud en tant que logiciel a des fonctions de paiement et de facturation . Je vais montrer comment cela se produit:

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

Nous obtenons une «facture» de la spécification BOLT11 dans ce cas, qui est le format de paiement sur le réseau Bitcoin (et Litecoin, d'ailleurs, aussi). Il s'agit d'une ligne contenant des informations sur le destinataire, le montant de la transaction, l'heure d'expiration de la demande, etc., des informations détaillées peuvent être obtenues en exécutant decodepay par rapport à cette ligne:

 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" } éclair 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" } 

Mais pour payer une telle «facture», nous avons besoin de la fonction de paiement de 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" } éclair cli lnbc2u1pwdana3pp5c0nyfgq974hr8huflt9uutyalj4maaw3q5594xp89jkvw74jme3sdql2pshjgr5dus8q6r0dejjqampd3kx2aqcqzpgwjgn45gy80jwjhgm3tpsxg33j6h6pehdus0mnjerrad943cz3vs83g30lyhlhfjxtqvtl76vttkuhs5jekuxpsqmf98l8265pwmm76gp4e7z6j salariale 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" } 

Tous les états de transaction sont gérés par l'ensemble du réseau et votre propre nœud en particulier. Il n'est pas nécessaire (mais il existe une telle opportunité) d'interagir avec les auteurs de l'application bénéficiaire ou l'une de leurs API pour obtenir des informations sur l'état du paiement. Il n'est pas nécessaire de vérifier l'état du paiement dans le système de traitement intermédiaire. Pas besoin d'attendre l'approbation de votre transaction par une banque ou une agence gouvernementale. En fin de compte, il n'y a pas de refacturation et d'autres facteurs externes qui peuvent affecter le solde de votre compte. Il s'agit d'une solution pour déplacer de la valeur via Internet, sans avoir besoin d'un arbitre externe qui décide si la transaction est conforme aux règles (parfois même des règles internes, dont tous les participants ne sont pas informés auparavant) ou non. Il n'y a pas de "règles internes" dans le bitcoin. Les seules règles que vous devez suivre sont les règles de réseau - ouvertes et bien connues.

Cela rend les transactions d'argent directes , pratiquement gratuites et instantanées entre des personnes ou des programmes réalistes.

Si vous avez la possibilité de recevoir des données de paiement d'une application tierce, il devient alors possible d'interagir financièrement avec cette application. Par exemple, considérons le service lnsms.world, qui vous permet d'envoyer un SMS à un numéro arbitraire en le payant avec des bitcoins. Pour intégrer cette application, nous avons seulement besoin de transférer les données du formulaire Web directement vers le script d'envoi de SMS - pour émuler les actions des utilisateurs sur le site Web:

 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) 

Je ne sais pas pour quelle raison, mais lnsms répond avec 201 code de statut HTTP et renvoie une facture au format BOLT11. Eh bien, cela suffit aux utilisateurs de bots de payer pour envoyer des SMS à partir de leur solde reçu dans les salles de chat. L'utilisateur ne sait même pas ce qui s'y passe, il vient de payer quelques centimes pour l'envoi de SMS. Et moi, en tant que développeur, je n'entre pas dans les détails du travail des services SMS. Je viens de transmettre le paiement et j'ai reçu le service. Vous pouvez faire une majoration sur le dessus, mais vous ne pouvez pas le faire - c'est mon libre choix. Aucun compte, accord ou autre API pour des tâches triviales comme l'envoi de SMS.

Et maintenant, imaginons pour le moment que notre application soit quelque chose de plus utile qu'un bot de chat et effectue un paiement non pas à un autre bot, mais à une autre application ou appareil connecté à Internet. Ou ce sont des dizaines, voire des centaines de paiements insignifiants chaque seconde entre des appareils, des services, des magasins ou une sorte de fournisseurs de services. C'est le pouvoir des micro-paiements, donc l'Internet des objets devrait ressembler. Il existe déjà des projets comme Althea qui donnent vie à ces idées et dans un avenir proche, nous verrons de grands changements, à mon avis, dans le domaine que nous appelons maintenant le commerce électronique.

Si vous avez aimé le post et que vous voulez essayer les bitcoins en action - envoyez-moi une bière et des petits pains français .

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


All Articles