La semana pasada pasé desarrollando mi primera aplicación pública: un bot de Telegram que funciona como una billetera de Bitcoin y permite "dar monedas" a otros participantes en chats grupales, así como realizar pagos en Bitcoin a mí mismo o a otros en las llamadas "Lightning Apps". Asumo que el lector está familiarizado con Bitcoin y Telegram, ya que intentaré ser breve sin entrar en detalles. , y Telegram es una herramienta de mensajería instantánea en dispositivos móviles y PC que permite crear pequeñas aplicaciones (bots de chat) en su plataforma.
¿Cuáles son las funciones clave de esta aplicación?
- Permite agradecer o recompensar a alguien con un valor material real, y no simplemente un "me gusta virtual", lo que lleva la comunicación electrónica a un nivel completamente nuevo.
- Un ejemplo 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 que se pueden modificar y utilizar para necesidades personales. La aplicación no utiliza soluciones cerradas o comerciales, a pesar de que se adapta al ámbito del comercio electrónico, el cual hoy en día es complicado de denominar como abierto.
¿Y cómo se aplica esto en la práctica?
así de esta manera...

o de esta otra...

¿Qué significan estos números? Son unidades de bitcoin — satoshis. Según los precios en las bolsas a mediados de 2019, 1000 satoshis equivalen aproximadamente a $0.06. Los satoshis se pueden gastar en línea o fácilmente cambiarse por moneda nacional. Por esta razón (liquidez), no son simplemente un "registro en la base de datos" o puntos que puedes gastar en las tiendas de nuestros socios, y dinero real de Internet..
*Quiero señalar de inmediato que algunas palabras o expresiones no intentaré escribir en ruso — o no conozco la traducción contextual en algunos casos, o tal traducción me parece engañosa en lugar de correcta.
Puede surgir la pregunta de cómo utilizar una aplicación así si no tienes bitcoins. Se pueden adquirir fácilmente en pequeñas cantidades en uno de los muchos intercambios o casas de cambio, o puedes conseguir algunos de un amigo bitcoinero o incluso recibir monedas de usuarios actuales del bot. Muchos monederos en el móvil ofrecen la opción de comprar bitcoins directamente 'sin alejarse de la caja'.



Cuando ya tengas bitcoins (o más bien satoshis-s)(?)) — iniciamos y hacemos /deposit.
El bot preguntará cuánto satoshi quieres depositar y enviará una factura para el pago, la cual se puede pagar con un monedero móvil escaneando el código QR o presionando el botón (‘abrir en el monedero’) en la página de la factura.



Al confirmar el pago en tu monedero, el bot enviará prácticamente de inmediato la confirmación de pago, que se visualizará en el marco de la factura.
Hasta este momento hemos tocado dos componentes de la aplicación: el back-end del bot de Telegram y el sistema de procesamiento de pagos en criptomonedas (más bien su front-end).
Para crear el bot de Telegram utilicé . Y, por supuesto, el propio bot .
Como sistema de procesamiento de pagos y solución para las tareas de UX, la elección recayó (en realidad, casi no hay opciones) en , cuya .
Si buscas soluciones para el manejo de eventos de pago directamente, deberías prestar atención a para los pagos 'on-chain', y para micropagos instantáneos (Lightning) soluciones como o .
¿Así que es self-hosted o no!?
Sí, lo es. En mi aplicación uso el hosting gratuito de BTCPayServer — , pero es absolutamente posible y no toma mucho tiempo poner en marcha tu propio centro de procesamiento. Sin embargo, hay que tener en cuenta que necesitarás alrededor de 500 GB disponibles en disco para almacenar las blockchains de Bitcoin (y Litecoin). También se requerirán recursos computacionales y de red durante la sincronización y, dependiendo de tus necesidades, las 'envolturas' necesarias para interactuar cómodamente con las blockchains. BTCPayServer no contiene by-design claves privadas ni ninguna otra información que te permita controlar tu monedero.
Para los pagos on-chain (convencionales), es necesario añadir la llamada clave xpub de la billetera en BTCPayServer para generar direcciones para recibir (claves públicas). Esto hace posible y seguro usar BTCPayServer incluso en su forma "compartida". Todas estas claves xpub y direcciones se pueden obtener fácilmente en buenas billeteras como , para una configuración adicional del procesamiento.
Todo el que ha estado en contacto con Bitcoin ha escuchado que es lento y que las transacciones son caras, especialmente en épocas de auge, por lo que para pagos instantáneos de microtransacciones se deben utilizar transacciones (off-chain) de Lightning Network.
¿Qué es Lightning Network?
Es algo así como un complemento para Bitcoin que añade una capa adicional de abstracción y permite realizar transacciones instantáneas y prácticamente gratuitas en la red Bitcoin. Todo esto es posible gracias a la magia criptográfica con multisig, que a menudo se llama smart contract. Hay varias implementaciones del protocolo Lightning Network, yo uso una implementación en C.
La principal diferencia entre los pagos on-chain y off-chain (Lightning) está en cómo se almacenan. Todas on-chain las transacciones se retransmiten a través de todos los nodos de la red, hasta que uno de los nodos de Bitcoin anuncia que incluye las transacciones en él. (En Habr incluso hay , que precisamente fabrican hardware para minería). Es por esta razón que llamamos a estas transacciones on-chain. Tales transacciones serán registradas en el blockchain público y se conservarán en él hasta el final de su existencia. Además, estas transacciones están disponibles públicamente y se pueden monitorear, rastrear y analizar.
En el caso de transacciones off-chain (Lightning), todo funciona de manera diferente. Cada nodo de la red Lightning tiene una (o más) direcciones on-chain; estas son las mismas direcciones convencionales de Bitcoin, de las que todo comienza. Cuando hay bitcoins en tal dirección, se puede abrir lo que se llama un canal lightning a otro nodo, lo que significa que mediante técnicas criptográficas estos dos nodos acordaron la disponibilidad de fondos entre sí. Más tarde, todas las transacciones (tanto las propias como las de nodos ajenos) que pasan a través de dicho canal se almacenan solo en los nodos de los participantes de la transacción (y en nodos intermediarios). Las únicas transacciones que se registran en la blockchain son las transacciones de apertura o de apertura de canal. A mayor escala, se obtiene una red de nodos interconectados que crea entre los participantes miles de diferentes caminos para "transferir" fondos de un nodo a otro bajo ciertas reglas estrictas. Prácticamente todas estas transacciones se almacenan solo en el archivo de base de datos de los propios nodos. Por esta razón, los llamamos transacciones off-chain.
En el diagrama se puede ver la visualización de todos los componentes de la aplicación

En resumen:
1) El usuario envía un comando al bot en Telegram
2) Telegram envía un mensaje sobre el evento aplicación de python del bot
3) aplicación de python envía una solicitud a BTCPayServer
4) BTCPayServer genera direcciones entrantes de BTC y LTC, así como envía una solicitud de factura a lightning-charge, que a su vez se comunica con el demonio c-lightning. Como resultado, obtenemos un bonito formulario HTML para el procesamiento de pagos
5) El usuario paga la factura y ve la confirmación
6) BTCPayServer un flujo infinito de datos generados aleatoriamente notificación de pago de la 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 se actualiza
… y si el usuario desea retirar fondos (monedas que recibió de otros) …
8) La aplicación de python del bot espera texto o la imagen del código QR, y cuando se reciben datos válidos se realiza el pago mediante la utilidadpaylightning.py*, que inicializa la transacción a través de c-lightning RPC.

*Para ser justos, vale la pena mencionar que mi envoltura paylightning.py no está completamente terminada y puede devolver un resultado falso negativo en escenarios específicos. Recomiendo en casos cercanos a producción
¿Qué tenemos? Los usuarios de nuestro bot pueden dentro de un chat grupal o directamente transferir valor material sin restricciones. Y eso no es todo: gracias al protocolo Lightning Network, que en cierto sentido es una red de pago unificada y simplificada, surge la posibilidad de enviar el mismo dinero que se recibe en el chat a aplicaciones completamente externas. Por ejemplo, en Telegram ya existe el primer bot para pagos en Bitcoin: @lntxbot. El "saldo único" permite utilizar cualquiera de los bots de acuerdo a las preferencias de un chat grupal específico (sí, el problema es completamente inventado y la solución bastante inútil, pero esa es la esencia). Transferir saldo de un bot a otro no cuesta nada y toma segundos. Es importante notar que los creadores de estos bots nunca se han puesto en contacto entre ellos.

Basta con reenviar un mensaje de solicitud de depósito de @lntxbot a @atomic_tipbot y ¡voilà!
Esto ya no es simplemente "transferir números en una base de datos", sino un pago entre dos bases de datos diferentes y no relacionadas. Así, se han integrado ya varias "LApps" en el bot, entre ellas: y .
¿Qué significa integración LApp?
Cada Lightning Network nodo es, en esencia, una billetera de Bitcoin. Tiene dos saldos: on-chain y off-chain. El saldo on-chain es necesario para abrir nuevos canales y almacenar fondos de canales cerrados. Pero el saldo off-chain es precisamente lo que circula entre los nodos. Los principales requisitos para un nodo son recibir y enviar pagos, por lo que cada nodo, como software, tiene funciones de pago y factura. Voy a demostrar cómo ocurre esto:
user@ln-node:/$ lightning-cli invoice 1000000000 internal_description external_description
{
"payment_hash" : "64c0c8f5f8f708b08487ad1376f3d256f92ccb9606987ba395c2b4193efde5a0",
"expires_at" : 1558709834,
"bolt11" : "lnbc10m1pwdaj72pp5vnqv3a0c7uytppy845fhdu7j2mujejukq6v8hgu4c26pj0hauksqdpqv4u8getjdeskchmyv4ekxunfwp6xjmmwxqyjw5qcqp2rzjqw3qcrp2u3ggke56wrjlstcg76drmfw680cvjum88sl7ja7mpas7xzxz8sqqfecqqyqqqqlgqqqqqqgqjqn8e3ml733dkms2txxldnuwsllwhhkldss73268hdka3e7f083vjhjqurwqrndqd2rcd85pw7vkywnr4dq7yfd59r0g2mw4wzztwr6dcprxzej6"
}
Recibimos la "factura" especificada en este caso, que es el formato de pagos en la red Bitcoin (y de Litecoin, por cierto, también). Esta es una cadena que contiene información sobre el receptor, la cantidad de la transacción, el tiempo de expiración de la solicitud, etc. Se puede obtener información detallada ejecutando decodepay en relación con esta cadena:
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"
}
Para pagar una «factura» así, necesitamos la función pay 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"
}
Todos los estados de las transacciones son procesados por toda la red y su propio nodo en particular. No es necesario (aunque existe la posibilidad) interactuar con los autores de la aplicación que recibe el pago o con alguna 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 intermediario. No hace falta esperar la aprobación de su transacción por parte del banco o de una entidad gubernamental. En definitiva, aquí no hay contracargos ni otros factores externos que puedan afectar el saldo de su cuenta. Esta es una solución para mover valor a través de Internet, sin necesidad de un árbitro externo que decida si la transacción cumple con las reglas (a veces incluso con las reglas internas, de las que no todos los participantes están informados de antemano) o no. En Bitcoin no hay "reglas internas". Las únicas reglas a las que hay que atenerse son las de la red: abiertas y conocidas por todos.
Esto lo hace real directos, prácticamente gratuitos y instantáneos transacciones monetarias entre personas o programas de manera completamente autónoma.
Si tienes la capacidad de obtener datos de pago de una aplicación de terceros, entonces surge la posibilidad de interactuar financieramente con esa aplicación. Como ejemplo, podemos considerar el servicio lnsms.world, que permite enviar un mensaje SMS a cualquier número, pagándolo con bitcoins. Para integrar esta aplicación, solo necesitamos transferir los datos del formulario web directamente al script de envío de SMS: 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é, pero lnsms responde con el código de estado HTTP 201 y devuelve una factura en formato BOLT11. Bueno, eso es suficiente para que los usuarios del bot puedan pagar el envío de SMS desde su saldo obtenido en los chats. El usuario ni siquiera sabe lo que está sucediendo, simplemente ha pagado un par de centavos por enviar un SMS. Y yo, como desarrollador, no entro en detalles sobre el funcionamiento de los servicios de SMS. Simplemente transferí el pago y recibí el servicio. Puedo añadir un recargo, o no hacerlo, es mi libre elección. No hay cuentas, acuerdos ni otra API para tareas triviales como enviar SMS.
Y ahora imaginemos por un 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 se trata de decenas o incluso cientos de pagos insignificantes cada segundo entre dispositivos, servicios, tiendas o ciertos proveedores de servicios. Esa es la poder de los micropagos, así debería ser el Internet de las cosas. Ya existen proyectos como que hacen realidad estas ideas y en un futuro cercano veremos grandes, en mi opinión, cambios en el ámbito que ahora denominamos comercio electrónico.
Si te gustó la publicación y quieres probar bitcoins en acción — .
Solo los usuarios registrados pueden participar en la encuesta. , por favor.
¿Te interesan artículos puramente técnicos sobre Bitcoin y software relacionado?
Sí
No
Me interesan más los aspectos de mercado de las criptomonedas.
Votaron 8 usuarios. 4 usuarios se abstuvieron.
Fuente: habr.com
