La semaine dernière, j'ai travaillé sur le développement de mon premier programme public : un bot Telegram qui fonctionne comme un portefeuille Bitcoin et permet d'envoyer des « pièces » à d'autres participants dans des groupes de discussion, ainsi que d'effectuer des paiements Bitcoin externes à soi-même ou à d'autres via ce qu'on appelle des « Lightning Apps ». Je suppose que le lecteur est familier avec Bitcoin et Telegram, car je vais m'efforcer d'être bref, sans entrer dans les détails. , et Telegram est un outil de messagerie instantanée sur appareils mobiles et PC, permettant de créer de petites applications (bots de discussion) sur leur plateforme.
Quelles sont les fonctionnalités clés de cette application ?
- Elle permet de remercier ou récompenser un interlocuteur avec une valeur véritable, et non juste un « like » virtuel, ce qui élève la communication électronique à un tout autre niveau.
- Un exemple concret d'application qui peut interagir financièrement avec d'autres applications en utilisant un protocole de paiement ouvert.
- Tous les composants de l'application sont des projets open source et peuvent être modifiés et appliqués à vos besoins. L'application n'utilise pas de solutions propriétaires ou commerciales, bien qu'elle s'inscrive dans le domaine du commerce électronique, ce qui est difficile à qualifier d'ouvert actuellement.
Et comment l'appliquer concrètement ?
comme ça…

ou comme ça…

Que signifient ces chiffres ? Ce sont des unités de bitcoin — satoshis. D'après les prix du marché au milieu de l'année 2019, 1000 satoshis représentent environ 0,06 $. Les satoshis peuvent être dépensés en ligne ou facilement échangés contre une monnaie nationale. C'est pourquoi (liquidité), ce n'est pas simplement une « entrée en base de données » ou « points que vous pouvez dépenser dans les magasins de nos partenaires », et de véritables monnaies Internet.
*je tiens à préciser que certains mots ou expressions ne tenterai pas de les écrire en russe — soit je ne connais pas la traduction contextuelle dans certains cas, soit une telle traduction me semble plutôt trompeuse que correcte.
On peut se demander comment utiliser une telle application si l'on n'a pas de bitcoins. Il est facile d'en acquérir une petite quantité sur l'une des nombreuses bourses ou plateformes d'échange, ou même de demander à un ami qui possède des bitcoins, voire de recevoir des pièces d'utilisateurs actuels du bot. De nombreux portefeuilles mobiles proposent d'acheter des bitcoins directement sans se rendre ailleurs.



Une fois que l'on a des bitcoins (ou plutôt des satoshis-es(?)) — lançons et faisons /deposit.
Le bot demandera combien de satoshis déposer sur le solde et enverra une facture à payer, qui peut être réglée avec un portemonnaie mobile en scannant un code QR ou en appuyant sur le bouton (« ouvrir dans le portefeuille ») sur la page de la facture.



Après confirmation du paiement dans votre portefeuille, le bot enverra presque immédiatement une confirmation de paiement qui sera visuellement affichée dans le cadre de la facture.
Jusqu'à présent, nous avons abordé deux composants de l'application — le back-end du bot Telegram et le système de traitement des paiements en cryptomonnaie (plutôt son front-end).
Pour créer le bot Telegram, j'ai utilisé . Et bien sûr, le bot lui-même. .
Pour le système de traitement des paiements et pour résoudre les problèmes d'UX, j'ai choisi (en réalité, il n'y a pas beaucoup de choix) le , dont la .
Si vous cherchez des solutions pour traiter les événements de paiement directement, il vaut la peine de consulter pour les paiements on-chain, et pour les paiements instantanés de petite taille (Lightning), des solutions telles que ou .
Est-ce auto-hébergé ou pas !?
Oui, c'est le cas. Dans mon application, j'utilise l'hébergement gratuit de BTCPayServer — , mais il est tout à fait possible et rapide de mettre en place votre propre centre de traitement. Cependant, il est important de se rappeler que vous aurez besoin d'environ 500 Go d'espace disponible sur le disque dur pour stocker les blockchains Bitcoin (et Litecoin). Des ressources de calcul et réseau seront également nécessaires pendant la synchronisation, et selon vos besoins, des « wrappers » pour les blockchains seront nécessaires pour faciliter l'interaction. BTCPayServer ne contient pas par conception de clés privées ou d'autres informations permettant de contrôler votre portefeuille.
Pour les paiements on-chain (classiques), il est nécessaire d'ajouter le soi-disant xpub de votre portefeuille dans BTCPayServer pour générer des adresses de réception (clés publiques). Cela rend possible et sécurisé l'utilisation de BTCPayServer même en mode « partagé ». Tous ces xpub et adresses peuvent être facilement obtenus dans de bons portefeuilles comme , pour une configuration ultérieure du traitement.
Tous ceux qui ont été confrontés au Bitcoin ont entendu dire que le Bitcoin est lent et que les transactions sont chères, surtout en période de forte activité, c'est pourquoi pour les paiements micro-instantanés, il est conseillé d'utiliser des transactions (off-chain) via le Lightning Network.
Qu'est-ce que le Lightning Network ?
C'est quelque chose comme un plugin pour Bitcoin, qui superpose une couche d'abstraction supplémentaire et permet d'effectuer des transactions instantanées et pratiquement gratuites sur le réseau Bitcoin. Tout cela est rendu possible grâce à la magie cryptographique avec des signatures multiples, souvent appelée contrat intelligent. Il existe plusieurs implémentations du protocole Lightning Network, j'utilise une implémentation en C.
La principale différence entre les paiements on-chain et off-chain (Lightning) réside dans la manière dont ils sont stockés. Toutes on-chain les transactions sont retransmises à travers tous les nœuds du réseau jusqu'à ce qu'un des nœuds Bitcoin annonce comprenant les transactions. (Sur Habr, il y a même , ils fabriquent du matériel pour le minage). C'est la raison pour laquelle nous appelons ces transactions on-chain. Ces transactions seront enregistrées dans la blockchain publique et y resteront jusqu'à la fin de son existence. De plus, ces transactions sont accessibles publiquement et peuvent être surveillées, suivies et analysées.
Dans le cas des transactions off-chain (Lightning), tout se passe différemment. Chaque nœud du réseau Lightning a une ou plusieurs adresses on-chain — ce sont les adresses Bitcoin classiques, avec lesquelles tout commence. Lorsqu'il y a des Bitcoins sur une telle adresse, il est possible d'ouvrir ce que l'on appelle un canal lightning canal éclair à un autre nœud, ce qui signifie que, par le biais de techniques cryptographiques, ces deux nœuds ont convenu de la disponibilité des fonds entre eux. Plus tard, toutes les transactions (tant les siennes que celles d'autres nœuds) qui passent par un tel canal ne sont conservées que sur les nœuds des participants à la transaction (et sur les nœuds intermédiaires). Les seules transactions qui sont enregistrées dans la blockchain sont celles d'ouverture ou de fermeture du canal. À une échelle plus large, nous avons un réseau de nœuds interconnectés qui établit entre les participants des milliers de chemins différents pour le « transfert » de fonds d'un nœud à un autre selon des règles strictes. Pratiquement 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 off-chain.
Le diagramme montre la visualisation de tous les composants de l'application

En résumé :
1) L'utilisateur envoie une commande au bot dans Telegram
2) Telegram envoie un message concernant l'événement l'application python du bot
3) application python envoie une requête à BTCPayServer
4) BTCPayServer génère des adresses BTC et LTC entrantes, et envoie également une requête de facture à lightning-charge, qui à son tour communique avec le démon c-lightning. En sortie, nous obtenons un joli formulaire HTML de traitement de paiement
5) L'utilisateur paye la facture et voit une confirmation
6) BTCPayServer envoie une notification de paiement de la facture (IPN) à l'url de rappel spécifiée, 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 est modifié
… et si l'utilisateur a voulu retirer des fonds (les pièces reçues d'autres) …
8) L'application python du bot attend un texte ou une image de code QR, et lorsque des données valides sont reçues, le paiement est effectué via l'utilitairepaylightning.py*, qui initie la transaction par le biais de c-lightning RPC.

*Pour être juste, il convient de noter que mon wrapper paylightning.py n'est pas tout à fait terminé et peut retourner un faux négatif dans des scénarios spécifiques. Je recommande dans des cas proches de la production
Qu'avons-nous ? Les utilisateurs de notre bot peuvent, au sein d'un chat de groupe ou directement, transmettre une 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 désormais possible d'envoyer les mêmes fonds reçus dans le chat à des applications complètement externes. Par exemple, il y avait déjà un bot pour les paiements en Bitcoin sur Telegram — @lntxbot. Le « solde unique » permet d'utiliser n'importe lequel des bots selon les préférences de chaque groupe de discussion (oui, le problème est totalement fictif et la solution assez inutile, mais c'est dans l'idée). Transférer des fonds d'un bot à un autre ne coûte rien et prend quelques secondes ! Il est important de noter que les créateurs de ces bots n'ont jamais vraiment été en contact les uns avec les autres.

Il suffit de transférer le message de demande de dépôt de @lntxbot à @atomic_tipbot et voilà !
Ce n'est plus simplement un « transfert de chiffres dans une base de données », mais un paiement entre deux bases de données différentes, non reliées. Ainsi, plusieurs « LApps » ont déjà été intégrées dans le bot, parmi lesquelles : et .
Que signifie intégration LApp?
Chaque Lightning Network nœud est en soi un portefeuille Bitcoin. Il a deux soldes : on-chain et off-chain. Le solde on-chain est nécessaire pour ouvrir de nouveaux canaux et stocker des fonds provenant de canaux fermés. En revanche, le solde off-chain est ce qui circule entre les nœuds. Les principales exigences pour un nœud sont de recevoir et d'envoyer des paiements, donc chaque nœud, en tant que logiciel, dispose des fonctions pay et invoice. Je vais montrer comment cela se passe :
user@ln-node:⁄ % lightning-cli invoice 1000000000 internal_description external_description
{
"payment_hash" : "64c0c8f5f8f708b08487ad1376f3d256f92ccb9606987ba395c2b4193efde5a0",
"expires_at" : 1558709834,
"bolt11" : "lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6"
}
Nous recevons la « facture » de spécification dans ce cas, qui est le format des paiements dans le réseau Bitcoin (et Litecoin, d’ailleurs, aussi). C'est une chaîne contenant des informations sur le destinataire, le montant de la transaction, la date d'expiration de la demande, etc. Des informations détaillées peuvent être obtenues en exécutant decodepay sur cette chaîne :
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"
}
Pour payer une telle « facture », nous avons besoin de la fonction pay 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"
}
Tous les états des transactions sont traités par tout le réseau, y compris votre propre nœud. Il n'est pas nécessaire (mais c'est possible) d'interagir avec les auteurs de l'application recevant le paiement ou avec leur API pour obtenir des informations sur l'état du paiement. Pas besoin de vérifier l'état du paiement dans le système de traitement intermédiaire. Il n'est pas nécessaire d'attendre l'approbation de votre transaction par la banque ou une institution gouvernementale. En fin de compte, il n'y a pas de rétrofacturations ni d'autres facteurs externes qui peuvent affecter le solde de votre compte. C'est une solution pour transférer de la valeur via Internet, sans avoir besoin d'un arbitre tiers qui décide si la transaction respecte les règles (parfois même des règles internes dont tous les participants ne sont pas informés à l'avance) ou non. Dans Bitcoin, il n'y a pas de « règles internes ». Les seules règles à suivre sont celles du réseau - ouvertes et connues de tous.
Ceci rend les transactions réelles directes, quasi gratuites et instantanées entre des personnes ou des programmes, de manière entièrement autonome.
Si vous avez la possibilité d'obtenir des données de paiement d'une application tierce, cela permet une interaction financière avec cette application. Prenons l'exemple du service lnsms.world, qui permet d'envoyer un SMS à un numéro aléatoire, en le payant en bitcoins. Pour intégrer cette application, il suffit de transmettre les données du formulaire web directement au script d'envoi de SMS — en émule les actions de l'utilisateur 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 pourquoi, mais lnsms répond avec un code d'état HTTP 201 et retourne une facture au format BOLT11. Eh bien, c'est suffisant pour que les utilisateurs du bot puissent régler l'envoi de SMS avec leur solde, obtenu dans des discussions. L'utilisateur ne sait même pas ce qui se passe, il a simplement payé quelques centimes pour l'envoi d'un SMS. Et moi, en tant que développeur, je ne m'immisce pas dans les détails du fonctionnement des services de SMS. J'ai juste transféré le paiement et obtenu le service. Je peux ajouter une majoration, ou pas — c'est mon choix. Pas de comptes, pas de contrats, pas de nouvelle API pour des tâches triviales comme l'envoi de SMS.
Et maintenant, imaginons un instant que notre application soit quelque chose de plus utile qu'un chatbot et effectue un paiement, non pas à un autre bot, mais à une autre application ou appareil connecté à Internet. Ou bien ce sont des dizaines, voire des centaines de paiements dérisoires chaque seconde entre des appareils, des services, des magasins ou des fournisseurs de services. C'est la puissance des micro-paiements, tel que devrait être l'Internet des objets. Il existe déjà des projets comme qui concrétisent ces idées et bientôt, à mon avis, nous verrons de grands changements dans le domaine que nous appelons actuellement le commerce électronique.
Si vous avez aimé cet article et que vous voulez voir les bitcoins en action — .
Seuls les utilisateurs enregistrés peuvent participer au sondage. , s'il vous plaît.
Êtes-vous intéressé par des articles purement techniques sur le bitcoin et les logiciels associés ?
Oui
Non
Je suis plus intéressé par les aspects de marché des cryptomonnaies
8 utilisateurs ont voté. 4 utilisateurs se sont abstenus.
Source : habr.com
