Săptămâna trecută am dezvoltat prima mea aplicație publică — un bot Telegram care funcționează ca un portofel Bitcoin și permite utilizatorilor să „trimite” monede altor participanți din grupuri de chat, precum și să efectueze plăți externe în Bitcoin pentru sine sau pentru alte așa-numite „Aplicații Lightning”. Presupun că, în general, cititorul este familiarizat cu Bitcoin și Telegram, deoarece voi încerca să scriu concis, fără a intra în detalii. , iar Telegram este un instrument de mesagerie instantanee pe dispozitive mobile și PC, care permite crearea de mici aplicații (chat-boti) pe platforma sa.
Care sunt principalele funcții ale acestei aplicații?
- Permite recompensarea sau încurajarea interlocutorului cu o valoare materială reală, nu doar „like-uri virtuale”, ceea ce elevă comunicarea electronică la un nivel complet nou
- Un exemplu real de aplicație care poate interacționa financiar cu alte aplicații folosind un protocol de plată deschis
- Toate componentele aplicației sunt proiecte cu sursă deschisă și pot fi modificate și utilizate pentru propriile scopuri. Aplicația nu utilizează soluții închise sau comerciale, deși se potrivește domeniului comerțului electronic, care astăzi este greu de numit cu adevărat deschis.
Și cum poate fi aplicată în practică?
cam așa…

sau așa…

Ce înseamnă aceste numere? Sunt unități de bitcoin — satoshi. La prețurile bursiere de mijlocul anului 2019, 1000 de satoshi este aproximativ 0,06 $. Satoshi poate fi cheltuit online sau ușor schimbat în moneda națională. Din această cauză (liquiditate), nu este vorba doar de „o înregistrare în baza de date” sau „puncte pe care le puteți cheltui în magazinele partenerilor noștri”, iar banii adevărați pe internet.
*vreau să subliniez că unele cuvinte sau expresii nu încerc să le scriu în rusă — fie că nu cunosc traducerea contextuală în unele cazuri, fie că o astfel de traducere, în opinia mea, sună mai înșelătoare decât corect.
Poate apărea întrebarea cum să folosești o astfel de aplicație dacă nu ai Bitcoin. Acestea pot fi ușor achiziționate în cantități mici de pe una dintre numeroasele burse sau exchange-uri, sau poți obține de la un prieten care are Bitcoin, sau chiar să primești monede de la utilizatorii actuali ai botului. Multe portofele pentru telefon oferă opțiunea de a cumpăra Bitcoin direct „fără a te îndepărta de casă”.



Când ai obținut Bitcoin (sau mai degrabă satoshi-uri(?)) — pornești și faci /depune.
Botul te va întreba cât de mulți satoshi vrei să adaugi pe balanță și îți va trimite o factură pe care o poți plăti cu portofelul mobil scanând codul QR sau apăsând butonul („deschide în portofel”) pe pagina facturii.



Odată ce confirmi plata în portofelul tău, botul va trimite aproape imediat o confirmare a plății și acest lucru va fi vizualizat în cadrul facturii.
Până acum, am acoperit două componente ale aplicației — backend-ul botului Telegram și sistemul de procesare a plăților în criptomonede (mai degrabă frontend-ul acestuia).
Pentru a crea botul Telegram, am folosit . Și, desigur, botul este .
Ca sistem de procesare a plăților și soluție pentru provocările UX, alegerea a căzut (de fapt, nu prea există opțiuni) pe , pentru care .
Dacă cauți soluții pentru procesarea directă a evenimentelor de plată, ar fi bine să acorzi atenție pentru plățile on-chain, iar pentru plățile instantanee micro (Lightning), soluții ca sau .
Așadar, este self-hosted sau nu!?
Da, așa este. În aplicația mea folosesc găzduire gratuită BTCPayServer — , dar este absolut posibil și nu necesită mult timp pentru a lansa propriul centru de procesare. Cu toate acestea, trebuie să reții că vei avea nevoie de ~500GB disponibili pe HDD pentru a stoca blockchain-urile Bitcoin (și Litecoin). De asemenea, vor fi necesare resurse de calcul și rețea în timpul sincronizării și, în funcție de nevoile tale, „wrappers” necesare pentru blockhain-uri, pentru a interacționa cu acestea ușor. BTCPayServer nu conține by-design chei private sau orice altă informație care să permită controlul portofelului tău.
Pentru plățile on-chain (obișnuite), este necesar să adăugați așa-numitul xpub-cheie a portofelului în BTCPayServer pentru a genera adrese pentru primire (chei publice). Acest lucru face posibil și sigur utilizarea BTCPayServer chiar și în formă «partajată». Toate aceste xpub-chei și adrese pot fi obținute cu ușurință în portofele bune, precum , pentru o configurare ulterioară a procesării.
Toți cei care s-au confruntat cu Bitcoin au auzit că Bitcoin este lent și că tranzacțiile sunt scumpe, mai ales când există hype, așa că pentru plăți microscopice instantanee, ar trebui să utilizați tranzacții (off-chain) prin Lightning Network.
Ce este Lightning Network?
Este un fel de plugin pentru Bitcoin, care adaugă un strat suplimentar de abstractizare și permite efectuarea de tranzacții instantanee și practic gratuite în rețeaua Bitcoin. Totul este posibil datorită magiei criptografice cu semnături multiple, adesea numite smart contract. Există mai multe implementări ale protocolului Lightning Network, eu folosesc o implementare pe C.
Principala diferență între plățile on-chain și cele off-chain (Lightning) constă în modul în care sunt stocate. Toate on-chain tranzacțiile sunt retransmise prin toate nodurile rețelei, până când unul dintre nodurile Bitcoin anunță care include tranzacțiile în el. (Pe Habr există chiar și , care producă echipamente pentru minerit). Din acest motiv numim aceste tranzacții on-chain. Aceste tranzacții vor fi înregistrate în blockchain-ul comun și vor rămâne în el pe durata existenței sale. De asemenea, aceste tranzacții sunt accesibile publicului și pot fi monitorizate, urmărite și analizate.
În cazul tranzacțiilor off-chain (Lightning), lucrurile se desfășoară diferit. Fiecare nod al rețelei Lightning are o (sau mai multe) adrese on-chain — acestea sunt aceleași adrese obișnuite de Bitcoin, cu care totul începe. Când Bitcoin apare pe o astfel de adresă, este posibil să deschideți așa-numitul canal lightning la o altă nodă, ceea ce înseamnă că, prin tehnici criptografice, aceste două noduri s-au convenit asupra disponibilității fondurilor între ele. Ulterior, toate tranzacțiile (atât cele proprii, cât și tranzacțiile nodurilor externe) care trec printr-un astfel de canal sunt păstrate doar pe nodurile participanților la tranzacție (și pe nodurile intermediare). Singurele tranzacții care sunt înregistrate în blockchain sunt tranzacțiile de deschidere sau închidere a canalului. La o scară mai largă, obținem o rețea de noduri interconectate care construiește între participanți mii de căi diferite pentru „transferul” de fonduri de la un nod la altul conform unor reguli stricte. Practic toate aceste tranzacții sunt stocate doar în fișierul de bază de date al nodurilor însele. Aceasta este motivul pentru care le numim tranzacțiilor off-chain.
Diagrama arată vizualizarea tuturor componentelor aplicației

Pe scurt:
1) Utilizatorul trimite comanda către bot în Telegram
2) Telegram trimite un mesaj despre eveniment aplicația python botului
3) aplicația python trimite o cerere la BTCPayServer
4) BTCPayServer generează adrese BTC și LTC, precum și trimite o cerere de factură la lightning-charge, care la rândul său comunică cu demonul c-lightning. La ieșire, obținem un formular HTML frumos pentru procesarea plății
5) Utilizatorul plătește factura și vede confirmarea
6) BTCPayServer trimite o notificare de plată a facturii (IPN) la callback_url-ul specificat, în cazul nostru callbacks.py (încă o aplicație python pentru a primi notificări)
7) Conform datelor primite, soldul utilizatorului se modifică
… și dacă utilizatorul dorește să retragă fonduri (monedele primite de la alții) …
8) Aplicația python a botului așteaptă textul sau imaginea codului QR, iar când datele valide sunt primite, se efectuează plata cu utilitarulpaylightning.py*, care inițiază tranzacția prin intermediul c-lightning RPC.

*Pentru justiție, trebuie menționat că wrapper-ul meu paylightning.py nu este complet finalizat și poate returna un rezultat fals negativ în scenarii specifice. Recomand în cazurile apropiate de producție
Ce avem? Utilizatorii botului nostru pot transmite valoare materială în cadrul unui chat de grup sau direct valoare materială fără limită. Și asta nu e tot — datorită protocolului Lightning Network, care este, într-un anumit sens, o rețea de plăți unificată și simplificată, apare posibilitatea de a trimite aceleași fonduri primite în chat către aplicații complet externe. De exemplu, în Telegram a existat deja un bot pentru plăți în bitcoin — @lntxbot. „Soldul unic” permite utilizarea oricărui bot în funcție de preferințele unui anumit grup de chat (da, problema este complet imaginară și soluția destul de inutilă, dar este vorba despre esență). Transferarea soldului de la un bot la altul nu costă nimic și durează câteva secunde! Este important de menționat că dezvoltatorii acestor botoți nu au comunicat niciodată între ei.

Este suficient să retransmiți mesajul cu cererea de depozit de la @lntxbot la @atomic_tipbot și voilà!
Aceasta nu mai este doar o „mutare de numere în Baza de Date”, ci o plată între două Baze de Date diferite, nelegate între ele. Astfel, în bot sunt deja integrate mai multe „LApps”, printre care: și .
Ce înseamnă integrările LApp?
Fiecare Lightning Network nod este, prin natura sa, un portofel bitcoin. Are două solduri: on-chain și off-chain. Soldul on-chain este necesar pentru deschiderea de noi canale și stocarea fondurilor din canale închise. Iar soldul off-chain este ceea ce circulă între noduri. Cerințele de bază pentru un nod sunt primirea și trimiterea plăților, așa că fiecare nod, ca software, are funcții pay și invoice. Voi demonstra cum se întâmplă acest lucru:
user@ln-node:~ % lightning-cli invoice 1000000000 internal_description external_description
{
"payment_hash" : "64c0c8f5f8f708b08487ad1376f3d256f92ccb9606987ba395c2b4193efde5a0",
"expires_at" : 1558709834,
"bolt11" : "lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6"
}
Primiți un „factură” de specificații în acest caz, care este formatul plăților în rețeaua Bitcoin (și Litecoin, de altfel, de asemenea). Aceasta este o linie care conține informații despre beneficiar, suma tranzacției, data limită a cererii etc., informații detaliate pot fi obținute prin rularea decodepay pe această linie:
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"
}
Pentru a efectua plata acestui 'invoice', avem nevoie de funcția pay de la 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"
}
Toate stările de tranzacție sunt gestionate de întreaga rețea și, în special, de nodul tău propriu. Nu este necesar (dar există această posibilitate) să interacționezi cu autorii aplicației recepționer sau cu orice API al lor pentru a obține informații despre starea plății. Nu este nevoie să verifici starea plății în sistemul de procesare intermediar. Nu trebuie să aștepți aprobarea tranzacției tale din partea băncii sau a instituțiilor guvernamentale. În fond, nu există chargebacks și alți factori externi care să poată influența soldul contului tău. Aceasta este o soluție pentru transferul valorii prin intermediul internetului, fără a necesita un arbitru terț care să decidă dacă tranzacția respectă regulile (uneori chiar reguli interne de care nu toți participanții sunt informați din timp) sau nu. În Bitcoin nu există 'reguli interne'. Singurele reguli care trebuie respectate sunt regulile rețelei - deschise și cunoscute tuturor.
Acest lucru devine real directe, aproape gratuite și instantanee transacții de bani între persoane sau programe în mod complet autonom.
Dacă aveți posibilitatea de a obține datele de plată de la o aplicație terță, atunci aveți ocazia să interacționați din punct de vedere financiar cu această aplicație. De exemplu, putem lua în considerare serviciul lnsms.world, care permite trimiterea de SMS-uri pe un număr ales, plătind cu bitcoin. Pentru a integra această aplicație, trebuie doar să transmită datele dintr-un formular web direct scriptului de trimitere SMS — să emuleze acțiunile utilizatorului pe site-ul 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)
Nu știu din ce motiv, dar lnsms răspunde cu un cod de status HTTP 201 și returnează o factură în format BOLT11. Ei bine, este suficient ca utilizatorii botului să poată efectua plata pentru trimiterea SMS-ului din soldul lor obținut în chat-uri. Utilizatorul nici nu știe ce se întâmplă, el doar a plătit câțiva cenți pentru trimiterea unui SMS. Și eu, ca dezvoltator, nu mă adâncesc în detaliile funcționării serviciilor SMS. Pur și simplu am transferat plata și am obținut serviciul. Pot să fac o marjă de preț, dar pot să nu o fac — aceasta este alegerea mea liber aleasă. Fără conturi, acorduri și API-uri pentru sarcini nesemnificative precum trimiterea de SMS-uri.
Și acum să ne imaginăm că aplicația noastră este ceva mai util decât un chatbot și efectuează o plată nu către alt bot, ci către o altă aplicație sau dispozitiv conectat la Internet. Sau poate că sunt zeci sau chiar sute de plăți insignifiante în fiecare secundă între dispozitive, servicii, magazine sau anumiți furnizori de servicii. Aceasta este puterea micropayment-urilor, așa ar trebui să arate Internetul lucrurilor. Există deja proiecte precum care transformă aceste idei în realitate și în curând vom observa, în opinia mea, mari schimbări în domeniul pe care îl numim acum comerț electronic.
Dacă ți-a plăcut postarea și dorești să încerci bitcoinul în acțiune — .
Numai utilizatorii înregistrați pot participa la sondaj. , vă rugăm.
Sunteți interesați de articole tehnice despre Bitcoin și software-ul aferent?
Da
Nu
Mă interesează mai mult aspectele de piață ale criptomonedelor
Au votat 8 utilizatori. S-au abținut 4 utilizatori.
Sursa: habr.com
