I spent last week developing my first public program — a Telegram bot that serves as a Bitcoin wallet and allows users to 'tip' other participants in group chats as well as make external Bitcoin payments to themselves or others through so-called 'Lightning Apps'. I assume that the reader is generally familiar with Bitcoin and Telegram, as I will try to be brief and not delve into details. , while Telegram is a messaging app for mobile devices and PCs that allows creating small applications (chatbots) on its platform.
What are the key features of this application?
- It allows you to reward or incentivize a conversation partner with real material value, not just a 'virtual like', which elevates electronic communication to a whole new level.
- A real example of an application that can financially interact with other applications using an open payment protocol.
- All components of the application are open-source projects and can be modified and applied to your own tasks. The app does not use closed or commercial solutions, even though it fits into the realm of e-commerce, which is quite difficult to label as open today.
And how can this be applied in practice?
like this...

or like this...

What do these numbers mean? They represent units of bitcoin — satoshis. According to market prices in mid-2019, 1000 satoshis is approximately $0.06. Satoshis can be spent online or easily exchanged for national currency. This is precisely why (liquidity) it's not just another a 'database entry' eller points that you can spend in the stores of our partners, og real internet money.
*I want to immediately note that I consciously do not attempt to write some words or phrases in Russian — either I don’t know the contextual translation in some cases, or such a translation, in my opinion, sounds more misleading than correct.
Måske opstår spørgsmålet, hvordan man bruger en sådan applikation, hvis man ikke har bitcoins. De kan nemt købes i små mængder på en af de mange børser eller vekselkontorer, eller man kan få dem fra en ven, der ejer bitcoins, eller endda modtage mønter fra nuværende brugere af botten. Mange mobile tegnebøger tilbyder at købe bitcoins direkte "uden at forlade kassen."



Når man har erhvervet sig bitcoins (eller rettere sagt satoshis-er(?)) — starter vi og laver /deposit.
Botten vil i svaret spørge, hvor mange satoshis man vil indsætte på balancen og sende en faktura, der kan betales med en mobil tegnebog ved at scanne QR-koden eller ved at trykke på knappen ("åbn i tegnebogen") på fakturasiden.



Når betalingen er bekræftet i din tegnebog, vil botten straks sende en bekræftelse af betalingen, som vil blive vist i fakturaens ramme.
Indtil nu har vi berørt to komponenter i applikationen — back-end telegram-botten og systemet til behandling af kryptovaluta-betalinger (sandsynligvis dens front-end).
Til at oprette Telegram-botten har jeg brugt . Og selvfølgelig selve botten .
Som betalingsbehandlingssystem og for at løse UX-opgaver faldt valget (egentlig er der næsten ikke valg) på , hvis .
Hvis du søger efter løsninger til behandling af betalingsbegivenheder direkte, bør du se på for såkaldte on-chain betalinger, og for øjeblikkelige mikrobetalinger (Lightning) løsninger som eller .
Er det så self-hosted eller ej!?
Ja, det er det. I min applikation bruger jeg gratis hosting fra BTCPayServer — , men det er helt muligt og kræver ikke meget tid at starte et eget betalingsbehandlingscenter. Men husk, at du vil have brug for ca. 500 GB plads på harddisken til at gemme blockchainene fra Bitcoin (og Litecoin). Der kræves også computer- og netværksressourcer under synkroniseringen, og afhængigt af dine behov, nødvendige "indpakninger" til blockchainene, så det er nemt at interagere med dem. BTCPayServer indeholder ikke by-design private nøgler eller nogen anden information, der gør det muligt at kontrollere din tegnebog.
For on-chain (regular) payments, it's necessary to add the so-called xpub wallet key in BTCPayServer to generate addresses for receiving (public keys). This makes it possible and secure to use BTCPayServer even in a 'shared' manner. All these xpub keys and addresses can be easily obtained in good wallets like , for further processing setup.
Everyone who has dealt with Bitcoin has heard that Bitcoin is slow and transactions are expensive, especially during hype, which is why for instant micropayments, it is worth using (off-chain) transactions through the Lightning Network.
What is the Lightning Network?
It's something like a plugin to Bitcoin that builds an additional layer of abstraction and allows for instant and virtually free transactions on the Bitcoin network. This is made possible by cryptographic magic with multi-signatures, commonly referred to as smart contracts. There are several implementations of the Lightning Network protocol; I use an implementation in C.
The main difference between on-chain and off-chain (Lightning) payments is how they are stored. All on-chain transactions are relayed across all nodes in the network until one of the Bitcoin nodes announces that includes the transactions. (There is even a mention on Habr of , who produce mining hardware). This is why we refer to such transactions as on-chain. Such transactions will be recorded in the public blockchain and will remain in it for the duration of its existence. Additionally, such transactions are publicly accessible and can be monitored, tracked, and analyzed.
In the case of off-chain (Lightning) transactions, everything happens differently. Each Lightning network node has one (or more) on-chain addresses — these are the very regular Bitcoin addresses where everything starts. When Bitcoins appear at such an address, one can open what is called a lightning channel til en anden node, hvilket betyder, at disse to noder har aftalt tilgængeligheden af midler mellem hinanden ved hjælp af kryptografiske teknikker. Senere gemmes alle transaktioner (både egne og fra tredjepartsnoder), der går gennem en sådan kanal, kun på deltagerens noder (og mellemnoderne). De eneste transaktioner, der bliver registreret i blockchain, er transaktioner ved åbning eller etablering af kanalen. I et større omfang dannes der et netværk af indbyrdes forbundne noder, der skaber tusindvis af forskellige ruter for "overførsel" af midler fra en node til en anden under bestemte strenge regler. Praktisk talt alle sådanne transaktioner gemmes kun i databasen på selve noderne. Netop af denne grund kalder vi dem off-chain.
Diagrammet viser visualiseringen af alle komponenterne i applikationen

Kort sagt:
1) Brugeren sender en kommando til botten i Telegram
2) Telegram sender meddelelse om hændelsen python-applikationen botten
3) python-applikation sender en anmodning til BTCPayServer
4) BTCPayServer genererer indgående adresser for BTC og LTC samt sender en anmodning om faktura til lightning-charge, som igen kommunikerer med dæmonen c-lightning. Det resulterer i, at vi får en flot HTML-form til behandling af betalinger
5) Brugeren betaler fakturaen og ser bekræftelsen
6) BTCPayServer sends betalingsmeddelelse for fakturaen (IPN) til den angivne callback_url, i vores tilfælde callbacks.py (endnu en python-applikation til at modtage notifikationer)
7) Ifølge de modtagne data ændres brugerens saldo
… og hvis brugeren ønsker at trække penge (mønter, han har modtaget fra andre) …
8) Python-applikationen botten venter på tekst eller billede af QR-koden, og når gyldige data modtages, udføres betalingen af værktøjetpaylightning.py*, som initierer transaktionen ved hjælp af c-lightning RPC.

*For retfærdighedens skyld bør det nævnes, at min wrapper paylightning.py ikke er helt færdig og kan returnere et falsk negativt resultat i bestemte scenarier. Jeg anbefaler i tilfælde, der ligner produktionsmiljøet
Hvad har vi? Brugerne af vores bot kan inden for gruppechatten eller direkte overføre materiel værdi uden begrænsninger. Men det er ikke alt — takket være Lightning Network-protokollen, som på en måde fungerer som et ensartet og forenklet betalingsnetværk, bliver det muligt at sende de samme penge, der er modtaget i chatten, til fuldstændig uafhængige applikationer. For eksempel er der allerede blevet lanceret den første bot til Bitcoin-betalinger i Telegram — @lntxbot. "Fælles saldo" gør det muligt at bruge en hvilken som helst af bottene afhængigt af præferencerne for den specifikke gruppechat (ja, problemet er fuldstændig opfundet, og løsningen er ret værdiløs, men det handler om essensen). Det koster ingenting at overføre saldo fra én bot til en anden, og det tager sekunder! Det er vigtigt at bemærke, at skaberne af disse bots aldrig har været i kontakt med hinanden.

Det er simpelt at videresende beskeden med anmodningen om indskud fra @lntxbot til @atomic_tipbot, og vupti!
Det er ikke bare "at flytte tal i en database", men en betaling mellem to forskellige, uafhængige databaser. På denne måde er der allerede integreret flere "LApps" i botten, herunder: og .
Hvad betyder integration af LApp?
Hver Lightning Network node er i sin essens en Bitcoin-tegnebog. Den har to saldoer: on-chain og off-chain. On-chain saldoen er nødvendig for at åbne nye kanaler og opbevare midler fra lukkede kanaler. Off-chain saldoen er netop det, der bevæger sig mellem noderne. De vigtigste krav til en node er at modtage og sende betalinger, derfor har hver node som software funktioner til pay og invoice. Jeg vil demonstrere, hvordan dette sker:
user@ln-node:~ % lightning-cli invoice 1000000000 internal_description external_description
{
"payment_hash" : "64c0c8f5f8f708b08487ad1376f3d256f92ccb9606987ba395c2b4193efde5a0",
"expires_at" : 1558709834,
"bolt11" : "lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6"
}
Vi får "invoicen" specifikationen i dette tilfælde, som er formatet for betalinger i Bitcoin-netværket (og Litecoin for den sags skyld også). Dette er en streng, der indeholder information om modtageren, transaktionsbeløbet, udløbstidspunktet osv.; detaljerede oplysninger kan opnås ved at køre decodepay på denne streng:
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"
}
For payment of such an "invoice", we need the pay function from 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"
}
Alle status for transaktioner håndteres af hele netværket og din egen node i særdeleshed. Der er ikke behov for (men det er muligt) at interagere med modtagerens applikationsforfattere eller deres API for at få oplysninger om betalingsstatus. Der er ikke behov for at tjekke betalingsstatus hos mellemmandsbehandling. Du skal ikke vente på godkendelse af din transaktion fra en bank eller en offentlig institution. Der er trods alt ingen chargebacks eller andre eksterne faktorer, der kan påvirke saldoen på din konto. Dette er en løsning til at overføre værdi via internettet uden behov for en tredjeparts mægler, der afgør om transaktionen overholder reglerne (nogle gange endda interne regler, som ikke alle deltagerne er blevet informeret om på forhånd) eller ej. I Bitcoin er der ingen "interne regler". De eneste regler, man skal følge, er netværksreglerne - åbne og kendte for alle.
Det gør det muligt direkte, næsten gratis og øjeblikkelige finansielle transaktioner mellem mennesker eller programmer i fuldstændig autonom tilstand.
Hvis du har mulighed for at modtage betalingsdata fra en tredjepartsapp, åbner der sig mulighed for at interagere økonomisk med denne app. Et eksempel kunne være tjenesten lnsms.world, som gør det muligt at sende en SMS til et vilkårligt nummer ved at betale med bitcoins. For at integrere denne app skal vi blot videregive data fra webformularen direkte til SMS-sendingsscriptet — emulere brugerens handlinger på hjemmesiden:
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)
Jeg ved ikke hvorfor, men lnsms svarer med HTTP statuskode 201 og returnerer en faktura i BOLT11-format. Nå, det er godt nok til, at bot-brugere kan betale for at sende SMS fra deres saldo optjent i chatrum. Brugeren ved ikke, hvad der sker, han har bare betalt et par øre for at sende en SMS. Og jeg, som udvikler, går ikke ind i detaljerne om SMS-tjenester. Jeg har bare videresendt betalingen og fået tjenesten. Man kan tage en overpris, eller man kan vælge ikke at gøre det — det er mit frie valg. Ingen konti, aftaler eller unødvendige API'er til trivielle opgaver som at sende SMS.
Og nu lad os forestille os et øjeblik, at vores app er noget mere nyttigt end en chatbot og foretager betalinger til en anden app eller enhed, der er tilsluttet internettet. Eller det kunne være titusinder eller endda hundreder af ubetydelige betalinger hvert sekund mellem enheder, tjenester, butikker eller leverandører. Det er magten bag mikrobetalinger; sådan bør IoT se ud. Der findes allerede projekter som , der realiserer disse ideer, og i den nærmeste fremtid vil vi se store, efter min mening, forandringer inden for det område, vi nu kalder e-handel.
Hvis du kunne lide indlægget, og du vil prøve bitcoins i praksis — .
Kun registrerede brugere kan deltage i undersøgelsen. , please.
Er du interesseret i dybtgående tekniske artikler om Bitcoin og beslægtet software?
Ja
Nej
Jeg er mere interesseret i de markedsmæssige aspekter af kryptovaluta.
8 brugere har stemt. 4 brugere har undladt at stemme.
Kilde: habr.com
