Cómo iniciar micropagos en su aplicación

La semana pasada pasé desarrollando mi primer programa público: un bot de Telegram que funciona como una billetera de Bitcoin y le permite "arrojar monedas" a otros miembros de chats grupales y también realizar pagos externos de Bitcoin a usted mismo u otro llamado "Aplicaciones Lightning". Quiero decir que, en general, el lector está familiarizado con Bitcoin y Telegram, ya que Trataré de escribir brevemente, sin entrar en detalles. Una selección de recursos sobre Bitcoin está disponible en este enlace , pero Telegram es una herramienta de mensajería instantánea para dispositivos móviles y PC que le permite crear sus propias aplicaciones pequeñas (bots de chat) en su plataforma.

¿Cuáles son las características clave de esta aplicación?


  • Le permite agradecer o recompensar al interlocutor con un valor verdaderamente material, y no solo un "me gusta virtual" , esto lleva la comunicación electrónica a un nivel completamente nuevo
  • Un ejemplo del mundo real de una aplicación que puede interactuar financieramente con otras aplicaciones utilizando un protocolo de pago abierto
  • Todos los componentes de la aplicación son proyectos de código abierto y es posible modificarlos y aplicarlos a sus tareas. La aplicación no utiliza soluciones cerradas y / o comerciales, a pesar de que se ajusta al ámbito del comercio electrónico, que hoy es bastante difícil de abrir.

¿Y cómo aplicarlo en los negocios?


algo así ...

imagen

más o menos ...

imagen

¿Qué significan estos números? Estas son unidades de Bitcoin - Satoshi . A mediados de los precios de cambio de 2019, 1000 Satoshi es aproximadamente $ 0.06. Satoshi puede gastarse en línea o intercambiarse fácilmente por moneda nacional. Es por esta razón (liquidez) que no se trata simplemente de otra "entrada en la base de datos" o "puntos que puede gastar en las tiendas de nuestros socios", sino de dinero real de Internet .
* Quiero señalar de inmediato que deliberadamente no estoy tratando de escribir algunas palabras o frases en ruso, o no conozco la traducción contextual en algunos casos, o tal traducción, en mi opinión, suena más confusa que correcta

Puede surgir la pregunta, cómo usar una aplicación de este tipo si no hay bitcoins. Se pueden comprar fácilmente en pequeñas cantidades en uno de los muchos intercambios o intercambiadores, o puede obtenerlo de un amigo de bitcoin o incluso obtener monedas de los usuarios actuales de bot. Muchas billeteras en el teléfono ofrecen comprar bitcoins directamente "sin salir de la caja".

imagenimagenimagen

Cuando tengamos bitcoins (pero más bien Satoshi (?)), Ejecute @atomic_tipbot y make / deposit.

En respuesta, el bot le preguntará cuánto satoshi agregar al saldo y enviará una cuenta para el pago, que se puede pagar con una billetera móvil escaneando el código QR o haciendo clic en el botón ( "abrir en la billetera" ) en la página de la factura.

imagenimagenimagen

Después de confirmar el pago en su billetera, casi de inmediato se enviará una confirmación de pago al bot y esto se mostrará visualmente en el marco de la cuenta.

Hasta este momento, tocamos dos componentes de la aplicación: el bot de telegramas back-end y el sistema de procesamiento de pago de criptomonedas (más bien, su front-end).

Para crear un bot de Telegram, usé el bot de Python Telegram . Y, por supuesto, el bot de código abierto en sí.

Como sistema de procesamiento de pagos y resolución de problemas UX, la elección cayó (de hecho, casi no hay elección) en BTCPayServer , para el cual la documentación está disponible en este enlace .

Si busca soluciones para procesar eventos de pago directamente, debe prestar atención a las páginas del manual de Electrum CLI para el llamado pagos en cadena y para soluciones de micropagos instantáneos (Lightning) como Lightning-charge o Sparko .

Entonces, ¿es autohospedado o no?


Si lo es En mi aplicación, uso el alojamiento gratuito BTCPayServer - BTCPayJungle , pero es absolutamente posible y no requiere mucho tiempo para iniciar mi propio centro de procesamiento. Sin embargo, vale la pena recordar que necesitará ~ 500 GB disponibles en el ferrocarril para almacenar las cadenas de bloques de Bitcoin (y Litecoin). También requerirá recursos informáticos y de red para la duración de la sincronización y, según sus necesidades, los "envoltorios" necesarios para las cadenas de bloques, por lo que sería conveniente interactuar con ellos. BTCPayServer no contiene claves privadas de diseño ni ninguna otra información que le permita controlar su billetera.

Para los pagos en cadena (regulares), debe agregar el llamado Clave xpub-wallet en BTCPayServer para generar direcciones de recepción (claves públicas). Esto hace posible y seguro usar BTCPayServer incluso en forma "compartida". Todas estas claves y direcciones xpub se pueden obtener fácilmente en buenas billeteras como Electrum , para un procesamiento de procesamiento adicional.

Todos los que se han encontrado con Bitcoin han escuchado que Bitcoin es lento y las transacciones son caras, especialmente cuando es exagerado, por lo que para micropagos instantáneos debe usar transacciones Lightning Network (fuera de la cadena).

¿Qué es esta red Lightning?


Este es un complemento de bitcoin que crea una capa adicional de abstracción y le permite realizar transacciones instantáneas y casi gratuitas en la red de Bitcoin. Todo esto es posible gracias a la magia criptográfica con múltiples firmas, a menudo llamado contrato inteligente . Hay varias implementaciones del protocolo Lightning Network, utilizo la implementación de c-lightning en C.

La principal diferencia entre los pagos dentro y fuera de la cadena (Lightning) es cómo se almacenan. Todas las transacciones en cadena se transmiten a todos los nodos de la red hasta que uno de los nodos de Bitcoin anuncie un nuevo bloque minado con transacciones incluidas en él. (Incluso hay BitFury en el centro ; solo producen hierro para la minería). Es por esta razón que llamamos a tales transacciones en cadena . Dichas transacciones se registrarán en una cadena de bloques común y se almacenarán en ella hasta el final de su existencia. Dichas transacciones también son de dominio público y pueden ser monitoreadas, rastreadas y analizadas.

En el caso de transacciones fuera de la cadena (Lightning), todo sucede de manera diferente. Cada nodo de la red Lightning tiene una (o más) direcciones en cadena: estas son las direcciones habituales de Bitcoin desde las que todo comienza. Cuando los bitcoins aparecen en dicha dirección, es posible abrir los llamados. canal de rayos a otro nodo, lo que significa que con la ayuda de técnicas criptográficas, estos dos nodos acordaron la disponibilidad de fondos entre ellos. Más tarde, todas las transacciones (tanto propias como de transacciones de nodos externos) que pasan a través de dicho canal se almacenan solo en los nodos de los participantes de la transacción (y nodos intermedios). Las únicas transacciones que se registran en blockchain son transacciones sobre abrir o cerrar un canal. En una escala más completa, obtenemos una red de nodos interconectados que construye entre los participantes miles de formas diferentes de "transferir" fondos de un nodo a otro de acuerdo con ciertas reglas estrictas. Casi todas estas transacciones se almacenan solo en el archivo de base de datos de los propios nodos. Es por esta razón que los llamamos fuera de cadena .

El diagrama muestra la visualización de todos los componentes de la aplicación.


imagen

En resumen:

1) El usuario envía un comando al bot en Telegram

2) Telegram envía un mensaje de evento de Python a la aplicación bot

3) una aplicación de Python envía una solicitud a BTCPayServer

4) BTCPayServer genera direcciones BTC y LTC entrantes, así como envía una solicitud de factura a lightning-charge , que a su vez se comunica con el demonio c-lightning . En la salida, obtenemos una hermosa forma HTML de procesamiento de pagos

5) El usuario paga la factura y ve una confirmación

6) BTCPayServer envía una notificación de pago de factura (IPN) al callback_url especificado, en nuestro caso callbacks.py (otra aplicación de Python para recibir notificaciones)

7) Según los datos recibidos, el saldo del usuario cambia

... y si el usuario quería retirar fondos (monedas que recibió de otros) ...

8) La aplicación Python del bot está esperando el texto o la imagen del código QR, y cuando se reciben datos válidos, se realiza el pago mediante la utilidad paylightning.py * , que inicializa la transacción usando c-lightning RPC.

imagen

* Para ser justos, vale la pena señalar que mi envoltorio paylightning.py no está completamente terminado y puede devolver un falso negativo en escenarios específicos. Recomiendo usar un contenedor bien depurado en casos cercanos a la producción

Que tenemos Los usuarios de nuestro bot pueden dentro de un chat grupal o directamente pueden transferir el valor del material sin restricciones. Y esto no es todo: gracias al protocolo Lightning Network, que en cierto sentido es una red de pago unificada y simplificada, es posible enviar el mismo dinero que se recibe en el chat a aplicaciones completamente de terceros. Por ejemplo, Telegram ya tenía el primer bot para pagos con bitcoins: @lntxbot. "One balance" le permite usar cualquiera de los bots dependiendo de las preferencias de un chat grupal en particular (sí, el problema está completamente ideado y la solución es muy inútil, pero el punto es en esencia). ¡Transferir saldo de un bot a otro no cuesta nada y toma segundos! Es importante tener en cuenta que los creadores de estos bots nunca se conectaron entre sí.

imagenimagen

¡Es suficiente simplemente reenviar el mensaje de solicitud de depósito de @lntxbot a @atomic_tipbot y voul'a!

Esto no es solo "transferir números a la base de datos", sino un pago entre dos bases de datos diferentes no relacionadas. Por lo tanto, varios "LApps" ya están integrados en el bot, entre ellos: sat2.io y lnsms.world .

¿Qué significa la integración de LApp ?

Cada nodo de Lightning Network es esencialmente una billetera de Bitcoin. Ella tiene dos saldos: dentro y fuera de la cadena. El equilibrio en la cadena es necesario para abrir nuevos canales y almacenar fondos de canales cerrados. Pero el equilibrio fuera de la cadena es justo lo que pasa entre los nodos. Los requisitos principales para un nodo son recibir y enviar pagos, por lo que cada nodo como software tiene funciones de pago y factura . Demostraré cómo sucede esto:

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

En este caso, recibimos una "factura" de la especificación BOLT11 , que es el formato de pago en la red de Bitcoin (y Litecoin, por cierto, también). Esta es una línea que contiene información sobre el destinatario, el monto de la transacción, el tiempo de vencimiento de la solicitud, etc., se puede obtener información detallada ejecutando decodepay con respecto a esta línea:

 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" } rayo-cli decodepay lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6 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" } 

Pero para pagar tal "factura" necesitamos la función de pago 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" } rayo-cli lnbc2u1pwdana3pp5c0nyfgq974hr8huflt9uutyalj4maaw3q5594xp89jkvw74jme3sdql2pshjgr5dus8q6r0dejjqampd3kx2aqcqzpgwjgn45gy80jwjhgm3tpsxg33j6h6pehdus0mnjerrad943cz3vs83g30lyhlhfjxtqvtl76vttkuhs5jekuxpsqmf98l8265pwmm76gp4e7z6j pago 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" } 

Todos los estados de transacción son manejados por toda la red y su propio nodo en particular. No es necesario (pero existe la posibilidad) de interactuar con los autores de la aplicación del beneficiario o cualquiera de sus API para obtener información sobre el estado del pago. No es necesario verificar el estado del pago en el sistema de procesamiento intermedio. No es necesario esperar la aprobación de su transacción por parte de un banco o agencia gubernamental. Al final, no hay devoluciones de cargo y otros factores externos que pueden afectar el saldo de su cuenta. Esta es una solución para mover el valor a través de Internet, sin la necesidad de un árbitro externo que decida si la transacción cumple con las reglas (a veces incluso las reglas internas, sobre las cuales no todos los participantes están informados antes) o no. No hay "reglas internas" en bitcoin. Las únicas reglas que debe seguir son las reglas de red: abiertas y conocidas.

Esto hace que las transacciones de dinero directas , prácticamente gratuitas e instantáneas entre personas o programas sean realistas.

Si tiene la oportunidad de recibir datos de pago de una aplicación de terceros, entonces es posible interactuar financieramente con esta aplicación. Como ejemplo, considere el servicio lnsms.world, que le permite enviar un mensaje SMS a un número arbitrario pagándolo con bitcoins. Para integrar esta aplicación, solo necesitamos transferir datos del formulario web directamente al script de envío de SMS, para emular las acciones del usuario en el sitio 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) 

No sé por qué motivo, pero lnsms responde con el código de estado 201 HTTP y devuelve una factura con el formato BOLT11. Bueno, esto es suficiente para que los usuarios de bot paguen por enviar SMS desde su saldo recibido en las salas de chat. El usuario ni siquiera sabe lo que está sucediendo allí, solo pagó un par de centavos por enviar SMS. Y yo, como desarrollador, no profundizo en los detalles del trabajo de los servicios de SMS. Acabo de reenviar el pago y recibí el servicio. Puede hacer un marcado en la parte superior, pero no puede hacerlo; esta es mi elección libre. Sin cuentas, acuerdos u otra API para tareas triviales como enviar SMS.

Y ahora imaginemos por el momento que nuestra aplicación es algo más útil que un bot de chat y realiza un pago no a otro bot, sino a otra aplicación o dispositivo conectado a Internet. O son docenas o incluso cientos de pagos insignificantes por segundo entre dispositivos, servicios, tiendas o algún tipo de proveedor de servicios. Este es el poder de los micropagos, por lo que debería verse Internet de las cosas. Ya hay proyectos como Althea que dan vida a estas ideas y en un futuro cercano veremos grandes cambios, en mi opinión, en el área que ahora llamamos comercio electrónico.

Si te gustó la publicación y quieres probar bitcoins en acción, envíame una cerveza y bollos franceses suaves .

Source: https://habr.com/ru/post/452696/


All Articles