Jak uruchomić mikro-płatności w swojej aplikacji

W zeszłym tygodniu pracowałem nad moją pierwszą publiczną aplikacją — botem Telegram, który działa jako portfel Bitcoin i pozwala "wrzucać monety" innym uczestnikom grupowych czatów, a także dokonywać zewnętrznych płatności Bitcoin na siebie lub do innych tzw. "Aplikacji Lightning". Zakładam, że czytelnik ma ogólną wiedzę na temat Bitcoin i Telegram, ponieważ postaram się pisać krótko, omijając szczegóły. Zbiór zasobów na temat Bitcoin dostępny jest pod tym linkiem, a Telegram to narzędzie do natychmiastowej wymiany wiadomości na urządzeniach mobilnych i komputerach, które pozwala na tworzenie małych aplikacji (botów czatowych) na swojej platformie.

Jakie są kluczowe funkcje tej aplikacji?

  • Pozwala na nagradzanie lub zachęcanie rozmówcy prawdziwą wartością materialną, a nie tylko "wirtualnym polubieniem", co wznosi komunikację elektroniczną na zupełnie nowy poziom.
  • Rzeczywisty przykład aplikacji, która może finansowo współdziałać z innymi aplikacjami za pomocą otwartego protokołu płatności.
  • Wszystkie komponenty aplikacji są projektami z otwartym kodem źródłowym, które można modyfikować i stosować do własnych celów. Aplikacja nie korzysta z zamkniętych ani komercyjnych rozwiązań, mimo że pasuje do sfery handlu elektronicznego, którą obecnie trudno nazwać otwartą.

Jak można to zastosować w praktyce?

tak to wygląda…

Jak uruchomić mikro-płatności w swojej aplikacji
lub tak…

Jak uruchomić mikro-płatności w swojej aplikacji
Co oznaczają te liczby? To jednostki bitcoina — satoshi. Według cen giełdowych z połowy 2019 roku 1000 satoshi to około 0,06 USD. Satoshi można wydawać w internecie lub łatwo wymieniać na walutę krajową. Dlatego (płynność) to nie jest po prostu kolejny "zapis w bazie danych" lub "punkty, które można wydać w sklepach naszych partnerów", a prawdziwe pieniądze internetowe.
*od razu chcę zauważyć, że niektóre słowa lub wyrażenia z zasady staram się nie pisać po rosyjsku — albo nie znam kontekstowego tłumaczenia w niektórych przypadkach, albo takie tłumaczenie według mnie brzmiałoby raczej myląco niż poprawnie.

Może pojawić się pytanie, jak korzystać z takiej aplikacji, gdy nie ma się bitcoina. Łatwo można nabyć niewielką ilość na jednej z wielu giełd lub w kantorze, albo od znajomego bitcoina, a nawet zdobyć monety od aktualnych użytkowników bota. Wiele portfeli mobilnych oferuje możliwość zakupu bitcoinów bezpośrednio "bez odchodzenia od kasy".

Jak uruchomić mikro-płatności w swojej aplikacjiJak uruchomić mikro-płatności w swojej aplikacjiJak uruchomić mikro-płatności w swojej aplikacji

Gdy już zdobędziemy bitcoiny (a raczej satoshi-ami(?)) - uruchamiamy @atomic_tipbot i robimy /deposit.

Bot w odpowiedzi zapyta, ile satoshi wpłacić na balans i wyśle rachunek do zapłaty, który można opłacić za pomocą portfela mobilnego, skanując kod QR lub naciskając przycisk ("otwórz w portfelu") na stronie faktury.

Jak uruchomić mikro-płatności w swojej aplikacjiJak uruchomić mikro-płatności w swojej aplikacjiJak uruchomić mikro-płatności w swojej aplikacji

Po potwierdzeniu płatności w swoim portfelu, bot prawie natychmiast wyśle potwierdzenie o płatności, a to zostanie wizualnie wyświetlone w ramce rachunku.

Do tego momentu poruszyliśmy dwie komponenty aplikacji - back-end bota telegramowego i system przetwarzania płatności kryptowalutowych (a właściwie jego front-end).

Do stworzenia bota Telegrama użyłem Python Telegram Bot. Oczywiście, sam bot z otwartym kodem źródłowym.

Jako system przetwarzania płatności i rozwiązania UX wybór padł (w rzeczywistości, nie ma zbyt wielu opcji) na BTCPayServer, do którego dokumentacja dostępna jest pod tym linkiem.

Jeśli szukasz rozwiązań do bezpośredniej obróbki zdarzeń płatności, warto zwrócić uwagę na strony podręcznika Electrum CLI dla tzw. płatności on-chain, a dla błyskawicznych mikro-płatności (Lightning) rozwiązania takie jak Lightning-charge lub Sparko.

Czy więc jest to self-hosted, czy nie?!

Tak, to prawda. W mojej aplikacji używam darmowego hostingu BTCPayServer - BTCPayJungle, ale jest to całkowicie możliwe i nie wymaga dużo czasu, aby uruchomić własne centrum przetwarzania. Należy jednak pamiętać, że potrzebne będzie ~500GB dostępnych na dysku twardym do przechowywania blockchainów Bitcoin (i Litecoin). Potrzebne będą również zasoby obliczeniowe i sieciowe w czasie synchronizacji oraz, w zależności od potrzeb, odpowiednie "opakowania" dla blockchainów, aby można było z nimi wygodnie współdziałać. BTCPayServer nie zawiera z założenia kluczy prywatnych ani żadnych innych informacji, które umożliwiają kontrolowanie twojego portfela.

Aby zrealizować płatności on-chain (zwykłe), należy dodać tzw. klucz xpub portfela do BTCPayServer, aby generować adresy do odbioru (klucze publiczne). Umożliwia to bezpieczne używanie BTCPayServer nawet w formie „dzielonej”. Wszystkie te klucze xpub i adresy można łatwo uzyskać w dobrych portfelach, takich jak Electrum, w celu dalszej konfiguracji przetwarzania.

Wszyscy, którzy mieli do czynienia z Bitcoinem, słyszeli, że Bitcoin jest wolny, a transakcje są drogie, szczególnie w czasie dużego zainteresowania, dlatego do natychmiastowych mikro-płatności warto stosować transakcje off-chain w Lightning Network.

Czym jest Lightning Network?

To coś w rodzaju wtyczki do Bitcoin, która tworzy dodatkową warstwę abstrakcji i umożliwia dokonywanie natychmiastowych i praktycznie darmowych transakcji w sieci Bitcoin. Wszystko to jest możliwe dzięki kryptograficznej magii z wieloma podpisami, częściej nazywanej inteligentnym kontraktem. Istnieje kilka implementacji protokołu Lightning Network, ja używam c-lightning implementacji w C.

Główna różnica między płatnościami on-chain a off-chain (Lightning) polega na tym, jak są przechowywane. Wszystkie on-chain transakcje są retransmitowane przez wszystkie węzły sieci, aż jedna z węzłów Bitcoin nie ogłosi nowo wydobytego bloku z dołączonymi do niego transakcjami. (Na Habrze nawet jest BitFury, która produkuje sprzęt do wydobycia). Dlatego nazywamy takie transakcje on-chain. Takie transakcje zostaną zapisane w publicznym blockchainie i będą przechowywane w nim do końca jego istnienia. Takie transakcje są również ogólnie dostępne i można je monitorować, śledzić i analizować.

W przypadku off-chain (Lightning) transakcji wszystko przebiega inaczej. Każdy węzeł w sieci Lightning ma jeden (lub więcej) adresów on-chain - to te zwykłe adresy Bitcoin, od których wszystko się zaczyna. Gdy na takim adresie pojawiają się Bitcoiny, można otworzyć tzw. kanał lightning do innej węzła, co oznacza, że za pomocą technik kryptograficznych te dwa węzły ustaliły dostępność środków między sobą. Później wszystkie transakcje (zarówno własne, jak i transakcje zewnętrznych węzłów), które przechodzą przez taki kanał, są zapisywane tylko na węzłach uczestników transakcji (i węzłach pośrednich). Jedynymi transakcjami, które są zapisywane w blockchainie, są transakcje otwarcia lub zamknięcia kanału. W szerszym sensie powstaje sieć wzajemnie połączonych węzłów, która buduje między uczestnikami tysiące różnych ścieżek dla „przelewania” środków z jednego węzła do drugiego według określonych, sztywnych zasad. Praktycznie wszystkie takie transakcje są przechowywane tylko w pliku bazy danych samych węzłów. To dlatego nazywamy je off-chain.

Na diagramie widać wizualizację wszystkich komponentów aplikacji

Jak uruchomić mikro-płatności w swojej aplikacji

Krótko mówiąc:

1) Użytkownik wysyła komendę do bota w Telegram

2) Telegram wysyła wiadomość o zdarzeniu aplikacji python bota

3) aplikacji python wysyła zapytanie do BTCPayServer

4) BTCPayServer generuje przychodzące adresy BTC i LTC, a także wysyła żądanie faktury do lightning-charge, który z kolei komunikuje się z demonem c-lightning. Na wyjściu otrzymujemy elegancki formularz HTML do obsługi płatności

5) Użytkownik opłaca fakturę i widzi potwierdzenie

6) BTCPayServer wysyła powiadomienie o płatności faktury (IPN) na określony callback_url, w naszym przypadku callbacks.py (kolejna aplikacja python do odbierania powiadomień)

7) Na podstawie otrzymanych danych saldo użytkownika się zmienia

… a jeśli użytkownik chciał wypłacić środki (monety, które otrzymał od innych) …

8) Aplikacja python bota czeka na tekst lub obrazek kodu QR, a gdy uzyskane dane są prawidłowe, następuje płatność narzędziempaylightning.py*, które inicjuje transakcję za pomocą RPC c-lightning.

Jak uruchomić mikro-płatności w swojej aplikacji

*Sprawiedliwości trzeba przyznać, że moje opakowanie paylightning.py nie jest całkiem ukończone i może zwrócić fałszywie negatywny wynik w specyficznych scenariuszach. Zalecam używanie dobrze dopracowanego opakowania w przypadkach zbliżonych do produkcji

Co mamy? Użytkownicy naszego bota mogą wewnątrz grupowego czatu lub bezpośrednio przekazywać wartość materialną bez ograniczeń. I to jeszcze nie wszystko — dzięki protokołowi Lightning Network, który w pewnym sensie jest zjednoczoną i uproszczoną siecią płatniczą, pojawia się możliwość wysyłania tych samych pieniędzy, które otrzymano na czacie, całkowicie niezwiązanym aplikacjom. Na przykład w Telegramie już były pierwsze boty do płatności bitcoinowych — @lntxbot. „Jednolity bilans” pozwala na użycie któregokolwiek z botów w zależności od preferencji konkretnego czatu grupowego (tak, problem jest całkowicie wymyślony, a rozwiązanie dość bezsensowne, ale chodzi o istotę). Przeniesienie salda z jednego bota na innego nic nie kosztuje i zajmuje sekundy! Ważne jest, aby zauważyć, że twórcy tych botów nigdy ze sobą nie współpracowali.

Jak uruchomić mikro-płatności w swojej aplikacji Jak uruchomić mikro-płatności w swojej aplikacji

Wystarczy po prostu przekazać wiadomość z zapytaniem o depozyt od @lntxbot do @atomic_tipbot i voilà!

To już nie tylko „przerzucanie liczb w bazach danych”, ale płatność między dwiema różnymi, niezwiązanymi bazami danych. W ten sposób w bota zintegrowano już kilka „LApps”, w tym: sat2.io i lnsms.world.

Co to znaczy integracja LApp?

Każda Lightning Network noda to tak naprawdę portfel bitcoinowy. Ma dwa bilanse: on-chain oraz off-chain. Bilans on-chain jest niezbędny do otwierania nowych kanałów i przechowywania środków z zamkniętych kanałów. Natomiast bilans off-chain to właśnie to, co przemieszcza się między nodami. Główne wymagania wobec nody to odbieranie i wysyłanie płatności, dlatego każda noda jako oprogramowanie ma funkcje pay i invoice. Pokażę, jak to się odbywa:

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

Otrzymujemy „fakturę” specyfikacji BOLT11 w tym przypadku, która jest formatem płatności w sieci Bitcoin (a zresztą także Litecoin). To ciąg zawierający informacje o odbiorcy, kwocie transakcji, czasie wygaśnięcia żądania itp., szczegółowe informacje można uzyskać, uruchamiając decodepay na tym ciągu:

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

Aby dokonać płatności za ten «faktura», potrzebujemy funkcji pay od 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"
}

Wszystkie stany transakcji są obsługiwane przez całą sieć, a także przez twoją własną nodę. Nie ma potrzeby (choć jest taka możliwość) kontaktowania się z autorami aplikacji-recewtu płatności lub ich API w celu uzyskania informacji o stanie płatności. Nie ma potrzeby sprawdzania statusu płatności w systemie przetwarzania. Nie trzeba czekać na zatwierdzenie transakcji przez bank lub instytucję państwową. W końcu nie ma tutaj chargbacków ani innych czynników zewnętrznych, które mogą wpływać na saldo. To rozwiązanie pozwala na przesyłanie wartości przez Internet bez potrzeby zewnętrznego arbitra, który decyduje, czy transakcja spełnia wymagania (czasem nawet wewnętrzne zasady, o których nie wszyscy uczestnicy są wcześniej informowani) czy nie. W Bitcoinie nie ma "wewnętrznych zasad". Jedynymi zasadami, które należy przestrzegać, są zasady sieci — otwarte i powszechnie znane.

To staje się rzeczywiste bezpośrednie, praktycznie bezpłatne i natychmiastowe transakcje pieniężne między ludźmi lub programami w pełni autonomicznie.

Jeśli masz możliwość uzyskania danych płatności z aplikacji zewnętrznej, otwiera się możliwość interakcji finansowej z tą aplikacją. Przykładem może być serwis lnsms.world, który umożliwia wysyłanie SMS-ów na dowolny numer, płacąc za nie bitcoinami. Aby zintegrować tę aplikację, wystarczy przekazać dane z formularza webowego bezpośrednio do skryptu wysyłania SMS — zsymulować działania użytkownika na stronie internetowej:

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)

Nie wiem z jakiego powodu, ale lnsms odpowiada kodem statusu HTTP 201 i zwraca fakturę w formacie BOLT11. Cóż, to wystarczy, aby użytkownicy bota mogli dokonać płatności za wysyłkę SMS z ich salda uzyskanego w czatach. Użytkownik nawet nie wie, co się dzieje, po prostu zapłacił kilka centów za wysłanie SMS-a. A ja, jako programista, nie zagłębiam się w szczegóły działania usług SMS. Po prostu przekazałem płatność i otrzymałem usługę. Można nałożyć marżę, a można jej nie nakładać — to mój wolny wybór. Żadnych kont, umów ani nowego API do błahych zadań, takich jak wysyłanie SMS-ów.

A teraz wyobraźmy sobie, że nasze aplikacja jest czymś bardziej użytecznym niż chatbot i dokonuje płatności nie na rzecz innego bota, ale innej aplikacji lub urządzenia podłączonego do Internetu. Albo to dziesiątki, a może setki drobnych płatności co sekundę między urządzeniami, usługami, sklepami lub jakimiś dostawcami usług. To jest moc mikro-płatności, tak powinien wyglądać Internet rzeczy. Już istnieją projekty takie jak Althea które wcielają te idee w życie i wkrótce, moim zdaniem, zobaczymy znaczące zmiany w obszarze, który obecnie nazywamy e-commerce.

Jeśli podobał Ci się post i chcesz spróbować bitcoinów w praktyce — prześlij mi na kufel piwa i miękkie francuskie bułeczki.

Tylko zarejestrowani użytkownicy mogą brać udział w ankiecie. Zaloguj się, proszę.

Czy interesują Cię wyłącznie techniczne artykuły o bitcoinie i pokrewnym oprogramowaniu?

  • Tak

  • Nie

  • Bardziej interesują mnie aspekty rynkowe kryptowaluty.

Oddano głosy od 8 użytkowników. 4 użytkowników wstrzymało się od głosu.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster