La settimana scorsa ho trascorso del tempo a sviluppare il mio primo programma pubblico: un bot di Telegram che funziona come un portafoglio Bitcoin e consente di "lanciare monete" ad altri partecipanti di chat di gruppo, oltre a effettuare pagamenti Bitcoin esterni a me stesso o ad altri noti come "Lightning Apps". Suppongo che in generale il lettore sia familiare con Bitcoin e Telegram, perché cercherò di scrivere in modo conciso, evitando i dettagli. , mentre Telegram è uno strumento di messaggistica istantanea su dispositivi mobili e pc, che consente di creare app piccole (chat-bot) sulla loro piattaforma.
Quali sono le funzioni chiave di questa applicazione?
- Permette di ringraziare o incoraggiare un interlocutore con un valore materiale reale, e non semplicemente "un like virtuale", questo porta la comunicazione elettronica a un livello completamente nuovo
- Un esempio reale di applicazione che può interagire finanziariamente con altre applicazioni utilizzando un protocollo di pagamento aperto
- Tutti i componenti dell'applicazione sono progetti open source e possono essere modificati e utilizzati per i propri scopi. L'applicazione non utilizza soluzioni chiuse o commerciali, nonostante si inserisca nel campo del commercio elettronico, che al giorno d'oggi è difficile da definire come aperto.
E come applicare questo nella pratica?
in un modo o nell'altro…

oppure in questo modo…

Cosa significano questi numeri? Sono unità di Bitcoin — satoshi. Ai prezzi di mercato a metà 2019, 1000 satoshi corrispondono a circa $0,06. I satoshi possono essere spesi online o facilmente scambiati con la valuta nazionale. Proprio per questo motivo (liquidità), non sono solo un'altra "registrazione nel database" o "punti che puoi spendere nei negozi dei nostri partner", ma denaro reale di Internet.
*vorrei notare subito che alcune parole o frasi non cerco consapevolmente di scrivere in russo — o non conosco la traduzione contestuale in alcuni casi, o tale traduzione a mio avviso suona più fuorviante che corretta
Potrebbe sorgere la domanda su come utilizzare un'applicazione del genere se non si possiedono bitcoinos. È possibile acquistarli facilmente in piccole quantità su uno dei molti exchange o nello scambio, oppure da un amico bitcoiner o addirittura ricevere delle monete dagli attuali utenti del bot. Molti portafogli su telefono offrono di acquistare bitcoin direttamente "senza allontanarsi dalla cassa".



Una volta ottenuti i bitcoin (o meglio i satoshi-i(?)) — avviamo e facciamo /deposit.
Il bot risponderà chiedendo quanti satoshi versare sul bilancio e invierà una fattura da pagare, che può essere saldata tramite il portafoglio mobile scansionando il codice QR o premendo il pulsante ("apri nel portafoglio") nella pagina della fattura.



Una volta confermato il pagamento nel proprio portafoglio, il bot invierà praticamente subito una conferma del pagamento e questo verrà visualizzato nel riquadro della fattura.
Fino a questo momento abbiamo trattato due componenti dell'applicazione — il backend del bot Telegram e il sistema di elaborazione dei pagamenti in criptovaluta (più precisamente il suo frontend).
Per creare il bot Telegram ho utilizzato . E naturalmente, il bot stesso .
Come sistema di elaborazione dei pagamenti e per le esigenze UX, la scelta è ricaduta (in realtà, c'è poca scelta) su , per il quale .
Se cerchi soluzioni per la gestione degli eventi di pagamento direttamente, vale la pena dare un'occhiata a per i pagamenti on-chain, mentre per i pagamenti micro istantanei (Lightning) soluzioni come o .
Quindi è self-hosted o no!?
Sì, lo è. Nella mia applicazione utilizzo un hosting gratuito di BTCPayServer — , ma è assolutamente possibile e non richiede molto tempo avviare un proprio centro di elaborazione. Tuttavia, bisogna tenere presente che sarà necessario avere circa 500 GB disponibili su disco per memorizzare le blockchain di Bitcoin (e Litecoin). Ci saranno anche risorse di calcolo e di rete necessarie durante la sincronizzazione e a seconda delle tue necessità, le "wrapper" per le blockchain per facilitare l'interazione. BTCPayServer non contiene per design chiavi private o qualsiasi altra informazione che consenta di controllare il tuo portafoglio.
Per i pagamenti on-chain (normali) è necessario aggiungere la cosiddetta chiave xpub del wallet in BTCPayServer per generare indirizzi per ricevere (chiavi pubbliche). Questo rende possibile e sicuro l'uso di BTCPayServer anche in una versione "condivisa". Tutte queste chiavi xpub e indirizzi possono essere facilmente ottenuti in buoni wallet come , per ulteriori configurazioni del processo di pagamento.
Chiunque si sia imbattuto nel Bitcoin ha sentito dire che il bitcoin è lento e le transazioni costose, soprattutto quando c'è hype, quindi per pagamenti istantanei e micro-pagamenti è consigliabile utilizzare transazioni (off-chain) Lightning Network.
Cos'è la Lightning Network?
È una sorta di plugin per il bitcoin, che sovrastra un ulteriore strato di astrazione e permette di effettuare transazioni istantanee e praticamente gratuite sulla rete Bitcoin. Tutto ciò è possibile grazie alla magia crittografica delle multi-firme, più comunemente chiamata smart contract. Ci sono diverse implementazioni del protocollo Lightning Network, io utilizzo , un'implementazione in C.
La principale differenza tra i pagamenti on-chain e off-chain (Lightning) è nel modo in cui vengono memorizzati. Tutte on-chain le transazioni vengono ritrasmesse a tutti i nodi della rete, fino a quando uno dei nodi Bitcoin non annuncia con le transazioni incluse. (Su Habr c'è anche , che producono hardware per il mining). Proprio per questo motivo chiamiamo tali transazioni on-chain. Tali transazioni saranno registrate nel blockchain generale e rimarranno nel suo registro fino alla fine della sua esistenza. Inoltre, tali transazioni sono pubbliche e possono essere monitorate, tracciate e analizzate.
Nel caso delle transazioni off-chain (Lightning), tutto avviene diversamente. Ogni nodo della rete Lightning ha uno (o più) indirizzi on-chain — questi sono i normali indirizzi bitcoin da cui tutto inizia. Quando arrivano bitcoin su un particolare indirizzo, è possibile aprire il cosiddetto canale lightning a un'altra nodo, il che significa che tramite tecniche crittografiche queste due nodi hanno concordato l'accessibilità dei fondi tra di loro. Successivamente, tutte le transazioni (sia proprie che transazioni di nodi esterni) che attraversano tale canale vengono memorizzate solo sui nodi dei partecipanti alla transazione (e sui nodi intermediari). Le uniche transazioni che vengono registrate nella blockchain sono quelle relative all'apertura o all'apertura del canale. In un contesto più ampio, si ottiene una rete di nodi interconnessi che costruisce tra i partecipanti migliaia di percorsi diversi per il "trasferimento" di fondi da un nodo all'altro secondo determinate regole rigide. Praticamente tutte queste transazioni vengono conservate solo nel file del DB dei nodi stessi. È proprio per questo motivo che le chiamiamo off-chain.
Nel diagramma è visibile la visualizzazione di tutti i componenti dell'applicazione

In breve:
1) L'utente invia un comando al bot in Telegram
2) Telegram invia un messaggio di evento applicazione python del bot
3) applicazione python invia una richiesta a BTCPayServer
4) BTCPayServer genera indirizzi BTC e LTC in entrata, e invia anche una richiesta di fattura a lightning-charge, che a sua volta comunica con il demone c-lightning. In output otteniamo un bel modulo HTML per l'elaborazione del pagamento
5) L'utente paga la fattura e vede la conferma
6) BTCPayServer un flusso della notifica di pagamento della fattura (IPN) all'URL di callback specificato, nel nostro caso callbacks.py (un'altra applicazione python per ricevere notifiche)
7) In base ai dati ricevuti, il saldo dell'utente viene aggiornato
… e se l'utente desidera prelevare fondi (monete ricevute da altri) …
8) L'applicazione python del bot attende un testo o un'immagine del codice QR, e quando i dati validi vengono ricevuti, viene effettuato il pagamento utilizzando l'utilitàpaylightning.py*, che inizializza la transazione tramite RPC c-lightning.

*Per correttezza, va notato che il mio wrapper paylightning.py non è del tutto completo e potrebbe restituire risultati falsi negativi in scenari specifici. Raccomando in situazioni prossime alla produzione
Cosa abbiamo? Gli utenti del nostro bot possono, all'interno di una chat di gruppo o direttamente, trasferire valore materiale senza limitazioni. E non è tutto: grazie al protocollo Lightning Network, che in un certo senso è una rete di pagamento unificata e semplificata, diventa possibile inviare gli stessi soldi ricevuti in chat a applicazioni completamente esterne. Ad esempio, su Telegram è già stato creato il primo bot per i pagamenti in Bitcoin: @lntxbot. Il "Saldo Unico" permette di utilizzare uno qualsiasi dei bot in base alle preferenze di un particolare gruppo chat (sì, il problema è del tutto inventato e la soluzione è piuttosto inutile, ma il punto è nell’essenza). Trasferire il saldo da un bot a un altro non costa nulla e richiede secondi! È importante notare che i creatori di questi bot non si sono mai messi in contatto tra loro.

È sufficiente inoltrare il messaggio con la richiesta di deposito da @lntxbot a @atomic_tipbot e voilà!
Non si tratta più semplicemente di "spostare cifre nel DB" ma di un pagamento tra due diversi database non collegati tra loro. In questo modo, nel bot sono già integrate diverse "LApp", tra cui: e .
Cosa significa integrazione LApp?
Ogni Lightning Network nodo è essenzialmente un portafoglio Bitcoin. Ha due saldi: on-chain e off-chain. Il saldo on-chain è necessario per aprire nuovi canali e per conservare fondi dai canali chiusi. Mentre il saldo off-chain è ciò che si sposta tra i nodi. I requisiti principali per un nodo sono l'invio e la ricezione di pagamenti, quindi ogni nodo come software ha funzioni pay e invoice. Mostrerò come funziona:
user@ln-node:/% lightning-cli invoice 1000000000 internal_description external_description
{
"payment_hash" : "64c0c8f5f8f708b08487ad1376f3d256f92ccb9606987ba395c2b4193efde5a0",
"expires_at" : 1558709834,
"bolt11" : "lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6"
}
Riceviamo un "invoice" della specifica in questo caso, che è il formato dei pagamenti nella rete Bitcoin (e anche Litecoin, tra l'altro). Questa è una stringa che contiene informazioni sul destinatario, sull'importo della transazione, sul tempo di scadenza della richiesta, ecc. Informazioni dettagliate possono essere ottenute eseguendo decodepay rispetto a questa stringa:
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"
}
Ecco, per pagare una «fattura» di questo tipo, abbiamo bisogno della funzione pay di 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"
}
Tutti gli stati delle transazioni vengono elaborati da tutta la rete e dalla tua noda in particolare. Non è necessario (ma è possibile) interagire con gli autori dell'applicazione di pagamento o con le loro API per ottenere informazioni sullo stato del pagamento. Non è necessario controllare lo stato del pagamento nel sistema di elaborazione intermedia. Non è necessario attendere l'approvazione della tua transazione da parte della banca o di un ente governativo. Alla fine, non ci sono chargeback e altri fattori esterni che possano influenzare il saldo del tuo conto. Questa è una soluzione per trasferire valore tramite Internet, senza la necessità di un arbitro esterno che stabilisca se la transazione rispetta le regole (a volte anche le regole interne, di cui non tutti i partecipanti sono stati informati in anticipo) o meno. In Bitcoin non ci sono "regole interne". L'uniche regole a cui devi attenerti sono le regole della rete — aperte e ben note.
Questo rende tutto reale diretti, praticamente gratuiti e istantanei trasferimenti di denaro tra persone o programmi in modalità completamente autonoma.
Se hai la possibilità di ricevere dati di pagamento da un'app di terze parti, allora puoi interagire in senso finanziario con questa app. Un esempio è il servizio lnsms.world, che consente di inviare un SMS a un numero a caso, pagando con bitcoin. Per integrare questa applicazione, dobbiamo semplicemente passare i dati da un modulo web direttamente allo script per l'invio degli SMS: emulando le azioni dell'utente sul sito 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)
Non so per quale motivo, ma lnsms restituisce un codice di stato HTTP 201 e restituisce una fattura nel formato BOLT11. Beh, questo è sufficiente affinché gli utenti del bot possano effettuare il pagamento per l'invio di SMS dal proprio saldo, ottenuto nelle chat. L'utente non sa neanche cosa stia succedendo, ha semplicemente pagato un paio di centesimi per inviare un SMS. E io, come sviluppatore, non mi inoltro nei dettagli del funzionamento dei servizi SMS. Ho semplicemente trasferito il pagamento e ricevuto il servizio. Posso applicare un sovrapprezzo, o meno — è una mia libera scelta. Niente account, accordi e di nuovo API per compiti banali come l'invio di SMS.
E ora, immaginiamo per un momento che la nostra applicazione sia qualcosa di più utile di un chatbot e effettui un pagamento non a un altro bot, ma a un'altra applicazione o dispositivo connesso a Internet. Oppure si tratta di decine o addirittura centinaia di pagamenti insignificanti ogni secondo tra dispositivi, servizi, negozi o qualche fornitore di servizi. Questa è la potenza dei micro-pagamenti, così deve apparire l'Internet delle cose. Esistono già progetti come che realizzano queste idee e nel prossimo futuro vedremo grandi, a mio parere, cambiamenti nel campo che ora chiamiamo commercio elettronico.
Se ti è piaciuto il post e vuoi provare i bitcoin in azione — .
Solo gli utenti registrati possono partecipare al sondaggio. , per favore.
Sei interessato agli articoli puramente tecnici su Bitcoin e software correlato?
Sì
No
Sono più interessato agli aspetti di mercato delle criptovalute
8 utenti hanno votato. 4 utenti si sono astenuti.
Fonte: habr.com
