# Creando Lightning App con Python
###### tags: `talleres_mln`
Este es un workshop para crear una lightning app que permite recibir propinas en la web
**Tabla de contenido**
[TOC]
## Autor
Twitter para correcciones, comentarios o sugerencias: [@bitao36](https://twitter.com/bitao36)
El presente tutorial fue elaborado para el [Seminario socrático de Mastering Lightning](https://libreriadesatoshi.com/) a través de [@libreriadesatoshi](https://twitter.com/libdesatoshi).
## Requerimientos :information_source:
:::info
* Tener instalado Linux
* Tener instalado Polar
* Haber creado una red en Polar con dos nodos uno de ellos LND
* Tener instalado Python 3.10 o superior
:::
## Conexion al nodo LND
Efectuaremos la conexión al nodo LND mediante gRPC que es la forma más usada.
### Acceso gRPC al nodo LND
En el workshop de lightning app se mostró como generar los stub gRPC compilando este archivo: [lightning.proto](https://raw.githubusercontent.com/lightningnetwork/lnd/master/lnrpc/lightning.proto) para generar los archivos:
```lightning_pb2.py, lightning_pb2_grpc.py and lightning_pb2.pyi ```
que permitían generar los bolt11 invoices.
En este proyecto después de generar el invoice necesitamos consultar el estado del invoice para que cuando sea pagado el backend pueda notificar al front end y mostrar una imagen de éxito.
Para lograr eso necesitamos compilar este archivo:
invoices.proto [invoices.proto](https://raw.githubusercontent.com/lightningnetwork/lnd/master/lnrpc/invoicesrpc/invoices.proto) con los siguientes comandos:
```
curl -o invoices.proto -s https://raw.githubusercontent.com/lightningnetwork/lnd/master/lnrpc/invoicesrpc/invoices.proto
python3 -m grpc_tools.protoc --proto_path=googleapis:. --mypy_out=. --python_out=. --grpc_python_out=. invoices.proto
```
Después de seguir estos pasos estos tres archivos son generados:
``` invoices_pb2_grpc.py, invoices_pb2.py, invoices_pb2.pyi ```
Un detalle importante a tener en cuenta es que invoices_pb2.py internamente llama a lightning_pb2.py. Esto quiere decir que si todos estos archivos que generaste compilando los archivos proto los tienes almacenados en una carpeta, debes indicarle a Python de alguna forma para que los pueda encontrar.
### Arquitectura de la app

El componente Servidor es un endpoint en python flask que recibirá peticiones del cliente y creará invoices conectandose mediante gRPC al nodo LND
El Cliente es una página html5 con css y javascript generada usando chatgpt.
El prompt para generarla fué:
“Tengo el siguiente proyecto en python flask que corresponde a un endpoint para recibir propinas de la lightning network.
Creame por favor la plantilla html que va a usar el endpoint, que tenga un estilo elegante, usa javascript puro usando la funcion async y separa los archivos css y js: <endpoint>”
<endpoint> es el codigo Python flask que recibirá las peticiones del cliente.
Puedes mejorar el html o hacer mejoras modificando el prompt.
## Ejecutar proyecto en Python
Usaremos un proyecto que ya tiene una carpeta lnd_protos en donde están los componentes necesarios para conectarse a un nodo LND mediante gRPC. Sigue los siguientes pasos:
1. Clonar proyecto de github: ``` git clone https://github.com/bitao36/lntips.git ```
1. Crear entorno virtual: ```$ python3 -m venv venv ```
1. Activar entorno virtual: ```$ source venv/bin/activate ```
1. Instalar dependencias: ```$ pip3 install -r requirements.txt```
2. En el proyecto ve a la carpeta site-packages que está dentro de la carpeta virtual venv. Si tienes instalado python 3.10, la carpeta sería ```venv/lib/python3.10/sitepackages``` y aquí crea un .pth archivo con la ruta completa a lnd_protos ``` $nano path_to_lnd_protos.pth```
y agrega la ruta completa: ```/path/to/your/project/lnd_protos```
3. Ejecutar Polar
4. Crear red con mínimo dos nodos uno de ellos LND
5. Obtener archivo cert y macaroons del nodo LND y copiarlos en la carpeta credentials del proyecto clonado
6. Ejecutar proyecto ```$ flask run```
## Testear proyecto
Ve a un navegador y digita http://localhost:5000
Ingresa el monto en sats. Si todo ha ido bien se imprime en pantalla un invoice bolt11.
Ahora puedes ir a Polar y pagar el invoice con un nodo que no sea el que generó el invoice.
En el momento en que pagas el invoice debe aparecer una imagen de éxito indicando que el pago fué exitoso!
## Demo
<iframe src="https://drive.google.com/file/d/1oMWOQa2dlkFJIMPthoqh7m7iPg3fAejB/preview" width="640" height="480" allow="autoplay"></iframe>
## Mejoras
Este proyecto puede tener las siguientes mejoras:
* Añadir descripción al invoice
* Generar un QR para el invoice
Si añades estas u otras mejoras al proyecto se tendrá en cuenta para la nota final.