Comment effectuer des micro-paiements possibles dans votre application

Cette semaine, j'ai passé à coder ma toute première application publique pour animaux de compagnie basée sur le bot de chat Telegram qui agit comme un portefeuille Bitcoin et permet d'envoyer et de recevoir des conseils entre les utilisateurs de Telegram et d'autres soi-disant «applications Lightning». Je suppose que vous êtes familier avec Bitcoin & Telegram en général, je vais essayer de poster court et sans sauter dans les détails. Plus de ressources sur Bitcoin peuvent être trouvées ici et Telegram est simplement un messager instantané qui vous permet de créer vos applications personnalisées (chat-bots) en utilisant leur plate-forme.


Quels sont les points clés d'une telle application?


  • Permet d'évaluer les idées et les réponses des autres utilisateurs avec une valeur réelle au lieu de
    «j'aime virtuel». Cela amène la conversation en ligne à un tout nouveau niveau
  • Exemple réel d'application de micro-paiement qui peut fonctionner avec d'autres entités
    sur Internet en utilisant un protocole ouvert
  • Tous les modules sont des projets open source et peuvent être facilement réutilisés et ajustés
    pour votre propre projet. L'application ne relaie pas les services commerciaux tiers.
    Même si elle relève du domaine du commerce électronique, qui est actuellement presque fermé, l'application
    est basé sur des solutions ouvertes.

Quels sont les cas d'utilisation?


quelque chose comme ça ...

image

ou comme ça ..
image

Que signifient les chiffres? Ce sont des unités bitcoin - satoshis . À la mi-2019, 1000 satoshis ont une valeur de 0,06 $. Vous pouvez le dépenser en ligne ou échanger dans votre devise locale en utilisant de nombreux services disponibles. Ce n'est donc pas juste un autre "numéro dans une base de données" ou un "coupons que vous pouvez dépenser dans notre boutique partenaire" , mais un véritable argent sur Internet .


Vous pouvez demander quoi faire si vous n'avez pas de bitcoin à utiliser dans l'application. Vous pouvez simplement recevoir un pourboire de l'utilisateur de l'application existante ou acheter une petite quantité de bitcoin sur divers échanges ou portefeuilles bitcoin pour téléphone mobile ou PC.


imageimageimage


Lorsque vous avez obtenu un bitcoin, vous pouvez démarrer @atomic_tipbot et effectuer un / dépôt.


Vous verrez une facture, vous pouvez sélectionner le mode de paiement préféré et envoyer de l'argent simplement en scannant le code QR ou en appuyant sur le bouton ( "ouvrir dans le portefeuille" ) sur la facture.


imageimageimage


Confirmez le paiement dans votre portefeuille mobile et vous verrez un écran de confirmation presque instantanément dans Telegram.


Jusqu'à présent, nous avons touché deux parties distinctes de l'application: le back-end du télégramme et le système de traitement des paiements (en fait, plus comme son front-end).


Pour créer ce bot Telegram, j'ai utilisé Python Telegram Bot . Et bien sûr, le bot est open-source .


En tant que système de traitement des paiements pour générer des factures, vérifier l'état, envoyer une notification et prendre soin de l'UX, BTCPayServer est utilisé, dont la documentation peut être trouvée ici .


Si vous cherchez à traiter directement les événements de paiement, vous pouvez consulter les pages de manuel Electrum CLI pour les paiements en chaîne et découvrir des solutions pour les paiements hors chaîne (Lightning) comme Lightning-charge ou Sparko .


Vous avez dit «pas de tiers» et «pas de services cloud»!?


Oui, c'est vrai. Dans mon application, j'utilise l'hébergement partagé gratuit de l'instance BTCPayServer - BTCPayJungle , mais il est possible de tourner même sur votre propre serveur dédié. N'oubliez pas que vous avez alors besoin d'environ ~ 500 Go d'espace pour stocker la blockchain Bitcoin et Litecoin. BTCPayServer ne détient aucune clé privée ni information sensible pouvant permettre aux pirates de contrôler les fonds sur votre portefeuille. Pour les paiements en chaîne (standard), vous devez fournir la clé xpub de votre portefeuille à BTCPayServer afin qu'il puisse générer des adresses publiques. De cette façon, l'architecture BTCPay permet de traiter les paiements en toute confiance même sur un environnement partagé. Il est très simple à configurer si vous utilisez des portefeuilles éprouvés comme Electrum .


Qu'est-ce que Lightning Network?


C'est quelque chose comme un add-on à Bitcoin qui ajoute une couche d'abstraction supplémentaire et permet de faire des transactions Bitcoin instantanées et presque gratuites. Tout cela est possible grâce à la magie cryptographique multi-signatures, souvent appelée smart-contract . Il existe plusieurs implémentations du protocole LN. J'utilise l'implémentation C -Lightning C.


La principale différence entre les paiements en chaîne et hors chaîne (Lightning) réside dans la façon dont les transactions sont stockées. Toutes les transactions en chaîne sont diffusées sur l'ensemble du réseau afin que chaque nœud Bitcoin en cours enregistre cette transaction dans la chaîne de blocs, si le bloc contenant cette transaction est miné . Hé, BitFury , ai-je raison? ;) C'est pourquoi nous appelons de telles transactions en chaîne . Ces transactions seront stockées dans la blockchain jusqu'à la fin de son existence. Il est possible de suivre, d'analyser et de surveiller publiquement une telle transaction sur le réseau.


En cas de transaction hors chaîne (Lightning), les choses se passent d'une autre manière. Chaque nœud Lightning a (peut être plusieurs) une adresse en chaîne, à partir de laquelle tout commence. Lorsque des fonds sont reçus sur une telle adresse, l'utilisation d'un nœud de techniques de cryptographie peut ouvrir ce qu'on appelle un canal de foudre vers un autre nœud, ce qui signifie que ces deux nœuds se sont mis d'accord sur la disponibilité des fonds entre eux. Plus tard, toutes les transactions effectuées via le canal (propres transactions, ou il peut être acheminé par un autre nœud) sont stockées uniquement sur ces deux nœuds (et nœud intermédiaire s'il y en avait). Les seules transactions qui sont stockées dans la blockchain des réseaux sont les transactions d'ouverture et de fermeture de canaux. C'est pourquoi les transactions Lightning que nous appelons hors chaîne . Généralement, ils n'existent que dans le fichier de base de données de nœuds.


Le tout est visualisé sur le diagramme


image

Petite histoire:


1) L'utilisateur envoie un message et demande un dépôt au bot sur Telegram


2) Telegram déclenche l' application python du bot


3) L' application Python envoie une demande à BTCPayServer


4) BTCPayServer génère des adresses entrantes pour BTC et LTC, ainsi que pour contacter Lightning-Charge , qui obtient les données du démon C-Lightning . En conséquence, nous obtenons un cadre HTML bien géré pour le traitement des paiements


5) L'utilisateur paie la facture et verra la confirmation


6) BTCPayServer envoie une notification de paiement de facture (IPN) à l'URL de rappel spécifiée, dans notre cas, il
ira à callbacks.py (une autre application python pour écouter les rappels)


7) Selon le détail complet du paiement, le solde de l'utilisateur est modifié et l'utilisateur reçoit une notification


... si l'utilisateur décide de retirer des fonds (pourboires qu'il a reçus) ...


8) L'application python de Bot écoute le texte ou l'image de QR, lorsqu'elle obtient des données de facturation (longue chaîne de caractères) puis envoie une demande de paiement de cette facture à une autre application python paylightning.py * , qui initialise les paiements à l'aide de c-lightning RPC


image

* Pour être honnête, je dois mentionner que mon paylight wrapper paylightning.py est incomplet et peut retourner un faux négatif dans certains cas spécifiques. Vous devez utiliser un emballage de paiement bien testé pour c-lightning en cas d'utilisation similaire à la production.


Les utilisateurs peuvent s’envoyer des conseils lors de discussions de groupe et envoyer / recevoir de la valeur sans aucune limite. Mais ce n'est pas tout. Grâce au protocole Lightning Network, qui est dans une sorte de réseau de paiement unifié et simplifié, vous pouvez envoyer les mêmes pièces de solde à des applications complètement différentes. Il existe un autre tip-bot bitcoin sur le télégramme - @lntxbot. L'utilisateur peut demander un dépôt à ce bot


imageimage


Transférez simplement les données de @lntxbot à @atomic_tipbot et voul'a!


Ce n'est plus un «échange de numéro dans la base de données» mais un paiement entre deux «bases de données» distinctes et non liées. Bot a déjà quelques «LApps» intégrés: sat2.io et lnsms.world .


Vous pouvez vous demander ce que signifie exactement l' intégration LApp ?


Chaque nœud du réseau Lightning agit comme un portefeuille Bitcoin. Il a à la fois un équilibre en chaîne et hors chaîne. Le solde en chaîne est généralement utilisé pour ouvrir des canaux et stocker des fonds à partir de canaux fermés, dans des tâches de maintenance de nœuds courts. Le solde hors chaîne est exactement ce qui est utilisé pour échanger des fonds entre les nœuds. Les fonctions principales de chaque nœud sont la capacité d'envoyer ou de recevoir des fonds, de sorte que le nœud en tant que logiciel fournit des méthodes de paiement et de facturation . Je vais vous montrer brièvement comment cela se passe:


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

La facture BOLT11 est générée dans ce cas, qui est un format unifié pour les demandes de paiement dans le réseau Bitcoin (ainsi que Litecoin). Cette chaîne comprend des données sur le destinataire de la facture, le montant, l'horodatage, l'expiration, etc. Pour décoder cette chaîne, c-lightning fournit une méthode de décodage:


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

Dans le cas où nous devons payer une facture, nous devons utiliser la méthode 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 statuts des paiements sont gérés par l'ensemble du réseau et votre propre nœud. Vous n'avez pas besoin (mais avez la possibilité de le faire) de communiquer avec les développeurs d'applications côté réception ou leur API, un fournisseur de traitement de cartes ou toute banque pour obtenir une confirmation de votre paiement ou pour libérer des fonds de votre propre compte. Il n'y a pas de refacturation ni aucune autre influence externe sur le solde de vos comptes. Tout ce dont vous avez besoin est un logiciel qui agit selon des règles de réseau décentralisées. Il s'agit d'une solution pour échanger une valeur sur Internet, sans avoir besoin d'arbitre au milieu qui décide de la compatibilité de votre paiement avec certaines règles, parfois même inconnues de toutes les parties. Il n'y a pas de règles "internes" dans le bitcoin, toutes les règles que votre application doit remplir sont ouvertes et connues.


Cela permet un échange de valeur direct , presque gratuit et instantané sur Internet entre les personnes ou même le logiciel lui-même de manière vraiment autonome.


S'il existe un moyen d'obtenir des données de paiement à partir d'une autre application, vous pouvez agir avec cela sur le plan financier. Comme dans notre exemple, lnsms.world est une application Web qui vous permet d'envoyer des SMS à n'importe quel numéro et de le payer avec Bitcoin. Pour intégrer une telle option dans notre application, nous devons simplement transmettre les données requises du formulaire Web à lnsms.world:


 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 la facture BOLT11. Eh bien, cela suffit pour payer cette facture et nos utilisateurs enverront des sms peu de temps après la réception du paiement. Nous pouvons facturer des frais supplémentaires ou non, c'est notre libre choix.


Maintenant, imaginez que votre bot est en fait une application plus utile et ne paie pas un autre bot, mais une autre entité, connectée à Internet. Ou bien, il peut s'agir de paiements entre logiciels, machines, magasins, prestataires de services sur une base régulière se répétant toutes les quelques secondes? Ressentez-vous la puissance des micro-paiements? Voilà à quoi ressemblera l'Internet des objets. Déjà, il existe des projets tels que https://althea.org/ et dans un avenir proche, nous serons confrontés à de grands changements dans le domaine de ce que nous appelons le commerce électronique.


Si vous aimez cet article et que vous essayez vous-même les paiements Bitcoin, vous pouvez me laisser un conseil sur ma page de pourboire .

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


All Articles