scieee AI-readable full text Open interactive document viewer

Análisis y estudio del grafo de transacciones de Bitcoin

Claros Barrero, Fernando

Abstract

Durante los últimos años, el mundo del Bitcoin y las criptomonedas ha revolucionado por completo el concepto de pago y mercado digital. Este área tan innovadora ha despertado mucho interés entre las grandes empresas y las comunidades de investigadores, que se han aventurado en la búsqueda de herramientas que nos brinden la capacidad de entender e interpretar los fenómenos que suceden dentro de este área. Es por este motivo, que he decido implementar un sistema de procesamiento y análisis de transacciones Bitcoin. El objetivo del proyecto es la obtención de los datos de la cadena de bloques de Bitcoin, para su posterior conversión en un grafo y el estudio de las propiedades matemáticas de éste. Para llevar acabo este proyecto, se han aplicado metodologías ágiles y se ha implantado un sistema de planificación de proyectos basadas en las pautas del PMBOK (Project Management Body Of Knowledge [1]), garantizando en todo momento un desarrollo eficiente y una planificación óptima.

Full text

TRABAJO FIN DE GRADO An´alisis y estudio del grafo de transacciones de Bitcoin Realizado por Fernando Claros Barrero Para la obtenci´on del t´ıtulo de Grado en Ingenier´ıa Inform´atica - Ingenier´ıa del Software Dirigido por Roc´ıo Gonz´alez D´ıaz Nieves Atienza Mart´ınez Realizado en el departamento de Matem´atica Aplicada I Convocatoria de Junio, curso 2021/22 Agradecimientos Quiero agradecer a George Laurentiu Bogdan por su ayuda de cara a afrontar el desarrollo de este proyecto y ayudarme a entender sus tecnolog´ıas Tambi´en quiero agradecer a mis tutoras, Roc´ıo y Nieves por la paciencia que han tenido con mi desatenci´on en ciertos momentos del proyecto y no dejar de confiar en m´ı en ning´un momento. i Resumen Durante los ´ultimos a˜nos, el mundo del Bitcoin y las criptomonedas ha revolucionado por completo el concepto de pago y mercado digital. Este ´area tan innovadora ha despertado mucho inter´es entre las grandes empresas y las comunidades de investigadores, que se han aventurado en la b´usqueda de herramientas que nos brinden la capacidad de entender e interpretar los fen´omenos que suceden dentro de este ´area. Es por este motivo, que he decido implementar un sistema de procesamiento y an´alisis de transacciones Bitcoin. El objetivo del proyecto es la obtenci´on de los datos de la cadena de bloques de Bitcoin, para su posterior conversi´on en un grafo y el estudio de las propiedades matem´aticas de ´este. Para llevar acabo este proyecto, se han aplicado metodolog´ıas ´agiles y se ha implantado un sistema de planificaci´on de proyectos basadas en las pautas del PMBOK (Project Management Body Of Knowledge [1]), garantizando en todo momento un desarrollo eficiente y una planificaci´on ´optima. Link to the repository: https://github.com/ferclabar/trabajo-fin-grado Palabras clave: Bitcoin, Blockchain, transacci´on, criptodivisa, herramientas fintech, acaparamiento de capital, grafo ii Abstract During the last few years, the Bitcoin and crypto world has revolutionized the paying concept and the digital market. This new knowledge area has woken up a lot of interest between big enterprises and investigation comunities, which have started designing and looking for tools that bring us the capacity to understand and analyze the phenomenons that happen in this area. This was the reason beacause I have decided to design and implement a system that process and analyze de Bitcoin transaction data, and after that converts the transactions map into a graph in order to study the mathematic properties of it. To succed on this proyect, I have worked with agile methodologies and also have followed a project mangement system based on the rules and sugestions of the PMBOK (Project Management Body Of Knowledge [1]), guarateeing an efficient developement and an optimal planification on every single step of the project. Link to the repository: https://github.com/ferclabar/trabajo-fin-grado Keywords: Bitcoin, Blockchain, transaction, cryptocurrency, fintech tools, capital hoarding, graph iii ´ Indice general 1. Introducci´on 1 1.1. Bitcoin.................................... 1 1.1.1. ¿Qu´eesBitcoin? .......................... 1 1.1.2. Apoyo a Bitcoin: El sistema Blockchain . . . . . . . . . . . . . . 3 1.2. Motivaciones para llevar acabo el proyecto . . . . . . . . . . . . . . . . 3 2. Estudio Previo 5 2.1. Introducci´on................................. 5 2.2. Objetivos .................................. 5 2.3. Metodolog´ıa................................. 5 2.4. Planificaci´on................................. 6 2.5. Presupuesto................................. 7 3. An´alisis del problema 8 3.1. Introducci´on................................. 8 3.2. Requisitos de informaci´on . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.3. Requisitos funcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.4. Requisitos no funcionales . . . . . . . . . . . . . . . . . . . . . . . . . . 10 4. Modelo del sistema 11 4.1. Introducci´on................................. 11 4.2. Dise˜no.................................... 11 4.2.1. Arquitectura del modelo . . . . . . . . . . . . . . . . . . . . . . 11 4.2.2. Elaboraci´on del modelo de flujo de datos . . . . . . . . . . . . . 12 5. Implementaci´on 13 5.1. Introducci´on................................. 13 5.2. Herramientas ................................ 13 5.2.1. Scala................................. 13 5.2.2. Librer´ıas de Python de Apache Spark: Pyspark . . . . . . . . . 13 5.2.3. Librer´ıas de Python de GraphX: GraphFrames y NetworkX . . . 16 5.3. Desarrollo .................................. 17 5.3.1. Conversor de archivos .DAT: Scala Converter . . . . . . . . . . 17 5.3.2. Procesamiento de los datos mediante Spark . . . . . . . . . . . 19 5.3.3. Creaci´on del grafo y estudio de propiedades de ´este . . . . . . . 20 6. Exposici´on y an´alisis de resultados 26 6.1. Introducci´on................................. 26 6.2. An´alisis de las propiedades del grafo . . . . . . . . . . . . . . . . . . . 26 6.2.1. Grado de los nodos . . . . . . . . . . . . . . . . . . . . . . . . . 26 6.2.2. B´usqueda de patrones por medio de filtros . . . . . . . . . . . . 28 6.2.3. Triangle counting . . . . . . . . . . . . . . . . . . . . . . . . . . 28 6.2.4. Ranking de paginaci´on . . . . . . . . . . . . . . . . . . . . . . . 30 iv 6.2.5. Representaci´on parcial y total del grafo . . . . . . . . . . . . . . 30 6.3. Posibles utilidades reales de los resultados . . . . . . . . . . . . . . . . 33 6.4. Vectores de mejora del proyecto para futuras investigaciones . . . . . . 34 7. Conclusiones 36 7.1. Beneficios del Big Data y su an´alisis para Bitcoin y el resto de criptodivisas 36 7.2. Potencial de las herramientas de teor´ıa de grafos para el an´alisis de datos 36 7.3. Conclusi´on personal sobre el campo de investigaci´on . . . . . . . . . . . 37 7.3.1. La complejidad del estudio . . . . . . . . . . . . . . . . . . . . . 37 7.3.2. Desv´ıos del plan de desarrollo inicial . . . . . . . . . . . . . . . 37 7.4. Cierre .................................... 38 8. Bibliograf´ıa 40 v ´ Indice de figuras 1.1. Busto de Satoshi Nakamoto en Budapest . . . . . . . . . . . . . . . . . 1 1.2. Estructura de funcionamiento de bitcoin . . . . . . . . . . . . . . . . . 2 1.3. Comparaci´on de bases de datos seg´un distribuci´on . . . . . . . . . . . . 3 4.1. Representaci´on gr´afica del flujo de los datos a trav´es del programa empleado .................................... 12 5.1. Documentaci´on de Apache Spark . . . . . . . . . . . . . . . . . . . . . 14 5.2. Esquema de m´odulos y compatibilidades de Spark . . . . . . . . . . . . 15 5.3. Esquema de computaci´on del sistema Spark . . . . . . . . . . . . . . . 16 5.4. Distribuci´on de paquetes del conversor Scala . . . . . . . . . . . . . . . 17 5.5. Directorio local de bloques tras la descarga de Bitcoin Core . . . . . . . 18 5.6. Interfaz de Bitcoin Core . . . . . . . . . . . . . . . . . . . . . . . . . . 18 6.1. Conjunto de datos con el conteo de aristas salientes y entrantes . . . . 26 6.2. Estad´ısticas recogidas del conteo de aristas salientes y entrantes . . . . 27 6.3. Diagrama de dispersi´on de aristas salientes y entrantes . . . . . . . . . 27 6.4. Coeficiente de correlaci´on entre transacciones entrantes y salientes . . . 28 6.5. B´usqueda de patrones en las transacciones del grafo por medio de filtrado 29 6.6. Listado de nodos con mayor relevancia . . . . . . . . . . . . . . . . . . 30 6.7. Representaci´on de transacciones salientes del nodo 12 . . . . . . . . . . 31 6.8. Representaci´on de transacciones salientes del nodo 48 . . . . . . . . . . 31 6.9. Representaci´on de transacciones salientes del nodo 556 . . . . . . . . . 31 6.10. Representaci´on total del grafo en forma el´ıptica . . . . . . . . . . . . . 32 6.11. Representaci´on rectangular del grafo . . . . . . . . . . . . . . . . . . . 33 6.12. ´ Indice de miedo y avaricia de Bitcoin del dia 20 de junio de 2022 . . . . 34 6.13. Titular de acaparamiento de Bitcoin por Instituciones. 31 de Diciembre de2020 ................................... 34 6.14. Informaci´on detallada de una transacci´on del Blockchain . . . . . . . . 35 vi ´ Indice de extractos de c´odigo 5.1. Ejecuci´on del conversor . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.2. Comando Load de Spark . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.3. Comando Load de Spark para los nodos . . . . . . . . . . . . . . . . . 20 5.4. Comando Load de Spark para las aristas . . . . . . . . . . . . . . . . . 20 5.5. Construcci´on del grafo . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 5.6. C´alculo del grado de los nodos . . . . . . . . . . . . . . . . . . . . . . . 21 5.7. Craci´on de DataSet con estad´ısticas sobre los nodos . . . . . . . . . . . 21 5.8. Creaci´on de diagrama de dispersi´on de aristas entrantes y salientes . . . 21 5.9. C´alculo de la correlaci´on entre aristas entrantes y salientes . . . . . . . 22 5.10. C´alculo del grado de los nodos . . . . . . . . . . . . . . . . . . . . . . . 22 5.11. C´alculo del grado de triangulaci´on del grafo . . . . . . . . . . . . . . . 23 5.12. C´alculo de los nodos m´as relevantes . . . . . . . . . . . . . . . . . . . . 23 5.13. Representaci´on parcial del grafo mediante filtro por transacciones salientes 24 5.14. Creaci´on mediante NetworkX . . . . . . . . . . . . . . . . . . . . . . . 25 5.15. Representaci´on del grafo mediante NetworkX y Matplotlib . . . . . . . 25 5.16. Representaci´on total del grafo . . . . . . . . . . . . . . . . . . . . . . . 25 vii 1. Introducci´on 1.1. Bitcoin 1.1.1. ¿Qu´e es Bitcoin? Bitcoin es una moneda digital y un sistema de pago sin banco central o administrador ´unico. Este sistema fue creado por un grupo de matem´aticos an´onimos que trabajaron bajo el pseud´onimo de Satoshi Nakamoto, a mediados de 2009. En principio, los usuarios de Bitcoin pueden transferir dinero entre s´ı a trav´es de una red entre iguales usando software libre y de c´odigo abierto [20]. Figura 1.1: Busto de Satoshi Nakamoto en Budapest Este sistema esta teniendo una gran popularidad en la comunidad debido a que implementa un sistema de pago p´ublico y a su vez an´onimo donde todo el historial de transacciones est´a disponible para consultar en la red pero, a la misma vez, todos los monederos son protegidos con anonimato. Adem´as, est´a construido sobre un sistema de datos distribuido, el sistema Blockchain (explicado en la secci´on 1.1.2), lo que hace que el sistema no dependa de ning´un organismo central y sea la propia comunidad de usuarios la que rige la veracidad y oficialidad de cada movimiento monetario [20]. Se caracteriza por estar construido con base en un protocolo criptogr´afico. Esto significa que cada transacci´on que quiere realizarse deber´a ser validada por la comunidad por medio de la resoluci´on de un problema de criptograf´ıa de complejidad muy alta. La resoluci´on de este problema para la confirmaci´on de la transacci´on la denominamos minado. Con ello, se ofrece un alto nivel de seguridad pues se ha observado resistente a fraude, falsificaci´on, devoluciones y otros ataques. 1 3. An´alisis del problema 3.1. Introducci´on La clave de realizar un desarrollo exitoso reside en saber todas las necesidades y establecer objetivos claros y medibles, pero tambi´en que sean alcanzables es imprescindible. Hay que huir de la ausencia de realismo en los objetivos propuestos. Tambi´en es necesario hacer seguimiento peri´odico para solventar las dificultades en la gesti´on y la mejora del avance del proyecto[12] En este cap´ıtulo haremos recopilaci´on de requisitos t´ecnicos necesarios para la realizaci´on del proyecto. Repasaremos desde los datos que necesitamos para su posterior an´alisis, hasta los requisitos de calidad que he decidido considerar para que el desarrollo sea limpio, visual, intuitivo y eficiente. 3.2. Requisitos de informaci´on En este apartado se detallar´a la lista de requisitos de informaci´on necesarios para la realizaci´on del desarrollo: Cuadro 3.1: RI-01. Informaci´on sobre las transacciones. ID Descripci´on del requisito RI-01 El sistema deber´a tener la informaci´on de las transacciones Bitcoin en un conjunto de datos de las carteras de los usuarios implicados en las transacciones, y otro conjunto de datos sobre las transacciones realizadas entre carteras. Cuadro 3.2: RI-02. Grafo de las transacciones. ID Descripci´on del requisito RI-02 El sistema deber´a contener el grafo de transacciones, siendo los nodos las carteras de usuario, y las aristas las transacciones entre estas. 3.3. Requisitos funcionales En este apartado se detallar´a la lista de requisitos funcionales necesarios para la realizaci´on del desarrollo, que nos facilitar´a las herramientas necesarias para efectuar un an´alisis sobre el grafo de transacciones: 8 Cuadro 3.3: RF-01. Representaci´on parcial y total del grafo ID Descripci´on del requisito RF-01 El sistema deber´a poder representar gr´aficamente tanto una parte del grafo como el conjunto total de nodos y aristas del grafo. Cuadro 3.4: RF-02. Rastreo de patrones en las transacciones. ID Descripci´on del requisito RF-02 El sistema deber´a poder filtrar las transacciones con par´ametros escogidos por el usuario. Cuadro 3.5: RF-03. Ranking de paginaci´on. ID Descripci´on del requisito RF-03 El sistema deber´a poder realizar un ranking de la relevancia de los nodos en base al algoritmo del ranking de paginaci´on. Cuadro 3.6: RF-04. Grado de los nodos del grafo ID Descripci´on del requisito RF-04 El sistema deber´a poder realizar un calculo del grado de cada nodo. Cuadro 3.7: RF-05. Estad´ısticas del grafo a partir del grado de sus nodos ID Descripci´on del requisito RF-05 El sistema deber´a poder realizar un calculo de estad´ısticas del grafo a partir del grado de los nodos. Cuadro 3.8: RF-06. Correlaci´on entre transacciones entrantes y salientes. ID Descripci´on del requisito RF-06 El sistema deber´a poder realizar un calculo de la correlaci´on entre transacciones entrantes y salientes de cada nodo. Cuadro 3.9: RF-07. Conteo de tri´angulos del grafo ID Descripci´on del requisito RF-07 El sistema deber´a poder obtener un conjunto de datos con los tri´angulos entre nodos que conforman el grafo. 9 3.4. Requisitos no funcionales En este apartado se detallar´an las funcionalidades que se van a implementar para el procesamiento y representaci´on gr´afica de la red de transacciones. Cuadro 3.10: RNF-01. Calidad del c´odigo. ID Descripci´on del requisito RNF-01 El desarrollo de c´odigo debe ser eficiente y tener buen rendimiento en coste computacional. Cuadro 3.11: RNF-02. Legibilidad del c´odigo. ID Descripci´on del requisito RNF-02 El desarrollo de c´odigo debe ser legible, visual e intuitivo. 10 4. Modelo del sistema 4.1. Introducci´on El modelado de sistemas software es una fase de los proyectos software que se realiza para analizar y tratar con la complejidad inherente a estos sistemas. El dise˜no de un modelo ayuda al ingeniero de software y a los desarrolladores a tener una concepci´on visual del sistema a implementar. Adem´as, los modelos de un nivel de abstracci´on mayor pueden utilizarse para la comunicaci´on con el cliente o persona que har´a uso de este proyecto (en mi caso, la comunidad de investigaci´on) [3]. En este cap´ıtulo, hablaremos de como se ha realizado esta fase de modelado del sistema. Comentaremos las decisiones arquitect´onicas que se han llevado a cabo con el fin de garantizar una soluci´on ´optima, as´ı como el modelo del flujo de los datos a trav´es del sistema para llegar desde un archivo Blockchain hasta su conversi´on en un grafo de transacciones. 4.2. Dise˜no 4.2.1. Arquitectura del modelo De cara a realizar un modelo arquitect´onico del sistema, se lleg´o a la conclusi´on de que la soluci´on m´as ´optima era separar el sistema en dos grandes bloques. En primer lugar tendremos el m´odulo donde se encontrar´a el conversor de archivos .DAT a ficheros .parquet procesables por el motor de procesamiento del bloque de an´alisis. Este m´odulo est´a escrito en Scala, y lo analizaremos en profundidad en el cap´ıtulo 5, en el que se detallar´a la implementaci´on del sistema y las herramientas utilizadas. Por otro lado, se implementar´a un m´odulo de an´alisis escrito en Python. En este m´odulo se trabajar´a con los archivos procesados por el modulo de conversi´on anteriormente mencionado. En primer lugar se utilizar´a Spark para el procesamiento de los ficheros y la creaci´on de conjuntos de datos, y luego se desarrollar´an todas las funcionalidades de an´alisis en bloques de instrucciones aislados de manera que se distingan todas las funcionalidades a implementar. De cara a no sobrecargar el disco del equipo donde se lanzar´a el proyecto, no se trabajar´a en un sistema de persistencia de los datos. Es decir, los datos no se almacenar´an en ninguna base de datos, sino que se crear´an y procesar´an cada vez que lancemos el archivo del m´odulo de an´alisis del proyecto. Los ´unicos datos que se almacenar´an ser´an los archivos .parquet procesados por el m´odulo de conversi´on. Se ha tomado esta decisi´on debido a la extrema complejidad de los versionados de Scala y con intenci´on de facilitar la correcci´on de este proyecto. 11 4.2.2. Elaboraci´on del modelo de flujo de datos De cara a hablar del flujo de datos dentro del sistema, es importante diferenciar los dos estados en los que se encontraran los datos a lo largo del flujo. Por un lado tendremos los datos almacenados en archivos, este ser´a el formato en el que entrar´an en el sistema y sufrir´an la primera transformaci´on en un archivo en formato parquet. Una vez tengamos los datos en ese estado, podremos proceder a su procesamiento, convirti´endolos as´ı en un conjunto de datos que se crea y almacena en memoria cada vez que se ejecuta el notebook con los bloques de ejecuci´on escritos en Python. Una vez que dispongamos de estos datos, ´estos dejaran de estar almacenados en archivos, y formaran parte de la ejecuci´on de las instrucciones. Por ´ultimo, una vez obtenidos estos datos y almacenarlos en conjuntos de datos separados en carteras y transacciones, gracias a las librer´ıas escogidas, podremos convertirlos en un sistema de datos orientado a un grafo, al cual, se le realizar´an m´ultiples c´alculos matem´aticos para estudiar propiedades de inter´es de este sistema de transacciones Bitcoin. En este gr´afico, se muestra el flujo y las transformaciones que sufren los datos a lo largo del proceso con la intenci´on final de crear y analizar el grafo: Figura 4.1: Representaci´on gr´afica del flujo de los datos a trav´es del programa empleado 12 5. Implementaci´on 5.1. Introducci´on La implementaci´on de un sistema inform´atico es el proceso principal dentro de un proyecto de desarrollo software. Consiste en la producci´on del c´odigo necesario para cumplimentar las necesidades extra´ıdas del an´alisis del problema. En este cap´ıtulo explicaremos c´omo, a partir de un modelo y un dise˜no previo, se realiza una implementaci´on de c´odigo para realizar las funcionalidades detalladas en el apartado de an´alisis del proyecto. as´ı como las herramientas utilizadas y las ventajas que ´estas nos ofrecen. 5.2. Herramientas 5.2.1. Scala Scala es un lenguaje de programaci´on multi-paradigma implementado para expresar patrones comunes de programaci´on de forma clara, sint´actica, visual y concisa. Este lenguaje de programaci´on es ejecutado en la maquina virtual de Java por lo que se producir´a una uni´on muy beneficiosa para los lenguajes de programaci´on Java y Scala. Esta relaci´on simbi´otica entre lenguajes permitir´a la uni´on de ambos en el desarrollo de una aplicaci´on, pudiendo, entre otras muchas cosas, heredar clases e implementar interfaces [6,11]. 5.2.2. Librer´ıas de Python de Apache Spark: Pyspark Apache Spark es un framework de programaci´on utilizado para el procesamien- to de datos de manera distribuida. Est´a dise˜nado para trabajar de manera r´apida y eficiente y ser de prop´osito general. Adem´as este framework esta dise˜nado dentro del marco de proyecto Apache, lo que garantiza licencia OpenSource en todas sus funcionalidades [5]. Spark cuenta con librer´ıas en una gran variedad de idiomas. Lo que hace que podamos disfrutar de sus funcionalidades en amplio espectro de proyectos de distinto ´ambito y calibre. En este apartado hablaremos de las ventajas que tiene utilizar este framework y qu´e papel ha cobrado a lo largo del desarrollo de este proyecto. 13 Popularidad en la comunidad Una amplia variedad de proveedores y multinacionales tecnol´ogicas se sumaron r´apidamente a respaldar el proyecto Spark, reconociendo la oportunidad de ampliar el mercado de sus productos de Big Data existentes a ´areas con un gran potencial como el aprendizaje autom´atico, donde Spark ofrece un valor real [19]. Adem´as de esto, Spark se considera, a d´ıa de hoy, uno de los proyectos m´as activos gestionados por la Fundaci´on Apache Software, y la comunidad que ha crecido en torno al proyecto incluye tanto contribuidores particulares como patrocinadores corporativos con un gran respaldo econ´omico como Databricks, IBM y Huawei [19]. Calidad de la documentaci´on y compatibilidad con m´ultiples lenguajes Cuando hablamos de Spark, hablamos de una de las ramas m´as populares y famosas del proyecto Apache. Desde el inicio del proyecto, se invirtieron grandes cantidades de capital por parte de la organizaci´on y m´ultiples inversores, para crear un software accesible, comprensible y mantenible. Y una de las mayores ventajas de este framework es la calidad de su documentaci´on. La documentaci´on del framework cuenta con manuales a disposici´on de usuario durante todas las fases de uso del framework. Dispone de un manual de instalaci´on muy detallado para todos los sistemas operativos. As´ı como un repositorio donde se pueden encontrar todas las versiones estables del framework para encontrar la que se adecue m´as a las necesidades del proyecto a realizar. En mi caso, he estado utilizando la ´ultima versi´on estable a disposici´on, la versi´on 3.2.1. Adem´as, tambi´en se encuentra a disposici´on del usuario una documentaci´on para el uso de Spark por medio de distintas APIs escritas en los lenguajes en los que el framework se encuentra disponible. Actualmente Spark cuenta con APIs para Java, Scala, Python, R (para el estudio estad´ıstico de grandes vol´umenes de datos) y SQL. En mi caso he utilizado la versi´on adaptada a Python. Figura 5.1: Documentaci´on de Apache Spark 14 Y por ´ultimo, la parte m´as relevante de esta documentaci´on es que cuenta con manuales de programaci´on de todo el espectro de funcionalidades anexas a Spark. En este proyecto en concreto, esta parte de la documentaci´on result´o ser de vital importancia debido a que adem´as de procesar los datos mediante Spark, el grafo de transacciones se construye mediante una rama de este framework llamada GraphX, para la cual se dedicar´a un apartado en este proyecto. Figura 5.2: Esquema de m´odulos y compatibilidades de Spark Rendimiento: simplicidad, velocidad y soporte Hay muchas razones para elegir Spark, pero tres son clave: simplicidad, velocidad y soporte. Cuando hablamos de Spark, hablamos de un sistema montado sobre un cl´uster de computaci´on que permite trabajar con Big Data mediante la paralelizaci´on de procesadores en distintas m´aquinas. Est´a dise˜nado para ser r´apido, f´acilmente accesible y cuenta con una amplia gama APIs nativas de Java, Scala, R y Python y bibliotecas de desarrolladores Spark[17]. Apache Spark puede funcionar junto a Hadoop, con Apache Mesos o por s´ı mismo sobre los sistemas operativos Linux, Windows y OS X. Desde comienzos del desarrollo del framework, Spark fue dise˜nado para ejecutarse de manera optimizada en memoria. Esta optimizaci´on, nos hace m´as f´acil la tarea de procesar datos r´apidamente, ganando en eficiencia a su alternativa al esquema de procesamiento de datos mediante MapReduce de Hadoop. Esta herramienta nos ofrece la capacidad de procesar datos hasta 100 veces m´as r´apido cuando se utiliza in-memory (corriendo en la memoria), y 10 veces m´as r´apido cuando procesan datos sobre disco [19]. 15 Figura 5.3: Esquema de computaci´on del sistema Spark 5.2.3. Librer´ıas de Python de GraphX: GraphFrames y NetworkX GraphFrames es un paquete de m´etodos escrito en Scala programado sobre las librer´ıas de Apache Spark que ofrece herramientas de creaci´on de grafos basados en conjuntos de datos. He considerado esta herramienta como id´onea para la realizaci´on del proyecto debido a que es compatible con Spark y nos brinda pr´acticamente todas las funcionalidades de GraphX. Adem´as, GraphFrames cuenta con APIs de alto nivel desarrolladas para los principales lenguajes de programaci´on (Python y Scala), lo que ha resultado de utilidad debido a que ha sido posible integrar el m´odulo y hacer uso de sus funcionalidades en este proyecto escrito en Python. La calidad de la documentaci´on de las APIs es muy buena y contiene una gran cantidad de referencias y ejemplos que han sido de gran ayuda para comprender las funcionalidades que nos ofrece el m´odulo. De cara a desarrollar este proyecto, la versi´on escogida de GraphFrames ser´a la versi´on 0.6.0. Por otro lado, para el dibujo de los grafos se ha hecho uso de la librer´ıa de Python NetworkX. Esta librer´ıa ofrece una amplia gama de m´etodos de an´alisis y dibujo de redes y grafos. Adem´as, se complementa a la perfecci´on con GraphFrames, lo que ha hecho que la combinaci´on de ambas librer´ıas haya sido un ´exito y se hayan podido procesar y dibujar los grafos. La versi´on utilizada de esta librer´ıa ser´a la ´ultima versi´on estable, la 2.8.4. 16 5.3. Desarrollo 5.3.1. Conversor de archivos .DAT: Scala Converter De cara a poder procesar mediante Spark el bloque de datos ofrecido por la herramienta Bitcoin Core, era necesario realizar una transformaci´on del formato del archivo, debido a que Spark trabaja de manera m´as eficiente con archivos columnares. Por tan- to, se integr´o un m´odulo de conversi´on de archivos .DAT en el proyecto, programado en Scala, que garantizaba que el formato de entrada que tuviera Spark fuera analizable. Este m´odulo fue desarrollado por el Analista de Datos J¨orn Franke, y el m´odulo se encuentra en el repositorio ”Using Apache Hive to analyze Bitcoin Blockchain data”. Tambi´en, se ha aprovechado la documentaci´on y ciertos m´odulos del repositorio ”Bitcoin Insights” elaborado por el analista de datos Jirka Kremser, que integraba este conversor en un proyecto escrito sobre lenguaje Python [13,10]. El m´odulo esta estructurado en distintos paquetes que nos ofrecen las funcionalidades que necesitamos para realizar la conversi´on[9]. Figura 5.4: Distribuci´on de paquetes del conversor Scala Despu´es de ejecutar el comando de construcci´on del proyecto sbt clean assembly se crear´a un archivo .jar con el ejecutable necesario para realizar las conversiones. Para convertir ser´a necesario ejecutar el siguiente comando en la consola de administraci´on del sistema. De cara a simplificar el proyecto, se han a˜nadido directamente los archivos .parquet convertidos gracias al conversor. La compatibilidad de los versionados es tremendamente compleja y el tama˜no de los archivos .DAT es demasiado grande (unos 200 MB). Por eso, he decido que lo m´as ´optimo ser´ıa realizar la conversi´on aparte y trabajar directamente con los archivos procesables por Spark. Aunque, si quisi´eramos obtener directamente los datos del blockchain, podr´ıamos hacerlo a trav´es de la herramienta para desarrolladores de Bitcoin: Bitcoin Core. En este programa se podr´an consultar todos los registros Blockchain completamente actualizados. En el caso de este proyecto 17 from pyspark . sql . functions import col import random vertexOutDegrees = g. outDegrees senders = vertexOutDegrees.join(nodes, vertexOutDegrees.id == nodes .id) \ . drop (" id ") \ .orderBy("outDegree", ascending= False ) # Podriamos escoger cualquier direccion del conjunto de datos para representar address = senders . take (1000) [999]. Address sub_graph = g. find ("( src ) -[e] ->( dst )") \ .filter(col (’src. Address ’) == address ) def node_to_dict (r): return { ’id ’: r[0] , ’label ’: r [1] , ’x’: random . uniform (0 ,1) , ’y’: random . uniform (0 ,1) , ’size ’: random . uniform (0.2 ,1) } sub_nodes = sub_graph . select (" dst .id ", " dst . Address "). distinct() sub_edges = sub_graph . select ("e. src ", "e. dst") target_nodes_dict = map( node_to_dict , sub_nodes . collect () ) def edge_to_dict (i, r): return { ’id ’: i , ’source ’: r[0] , ’target ’: r[1] } sub_edges_dict = [ edge_to_dict (i , r) for i, r in enumerate( sub_edges . collect () )] target_nodes_dict . append ({ ’id ’: sub_edges . first () [’src ’], ’label ’: address , 24 ’color ’: ’#999 ’, ’x’: -1, ’y’: 0.5 , ’size ’: 2 }) Extracto de c´odigo 5.13: Representaci´on parcial del grafo mediante filtro por transacciones salientes import networkx as nx G = nx . Graph () G. add_edges_from ( sub_edges . collect ()) Extracto de c´odigo 5.14: Creaci´on mediante NetworkX import matplotlib . pyplot as plt options = { ’node_color ’: ’g’, ’node_size’: 70, ’width ’: 0.2 , ’node_shape ’: ’d’, ’with_labels ’: True , ’font_size’: 5, } nx . draw (G, ** options ) Extracto de c´odigo 5.15: Representaci´on del grafo mediante NetworkX y Matplotlib Por otro lado, vamos a representar gr´aficamente el conjunto completo de todos los nodos y aristas del grafo. Este proceso se realizar´a mediante las librer´ıas GraphFrames para el procesado y la librer´ıa NetworkX para su representaci´on gr´afica, respectivamente. sample_data = edges . sample ( False , 0.0004) . collect () G2 = nx. Graph () G2. add_edges_from ( sample_data ) options = { ’node_color ’: ’g’, ’node_size’: 1, ’width ’: 0.05 , ’node_shape ’: ’o’, ’vmin ’: 100.1 , ’vmax ’: 10.1 , ’with_labels ’: False , } nx. draw_random (G2 , ** options ) Extracto de c´odigo 5.16: Representaci´on total del grafo 25 6. Exposici´on y an´alisis de resultados 6.1. Introducci´on En este cap´ıtulo explicaremos la interpretaci´on de los resultados obtenidos a partir del procesamiento de datos del Blockchain, as´ı como las conclusiones a las que se han llegado a ra´ız de los resultados y las posibles mejoras del sistema que podr´ıan realizarse. 6.2. An´alisis de las propiedades del grafo 6.2.1. Grado de los nodos En esta secci´on se detallar´an las estad´ısticas recogidas a partir del estudio del grado de cada nodo del grafo. En primer lugar, generamos un conjunto de datos para estudiar el n´umero de transacciones salientes y entrantes. En primer lugar, se genera un conjunto de datos con las aristas salientes y entrantes de cada nodo del grafo. Figura 6.1: Conjunto de datos con el conteo de aristas salientes y entrantes Y luego, gracias a la funci´on describe() podemos calcular estad´ısticas b´asicas de este conjunto de datos. En esta tabla se detallan datos sobre el conteo total, la media, la desviaci´on t´ıpica, el m´ınimo, y el m´aximo de aristas salientes y entrantes del grafo. Estas propiedades resultan de gran utilidad para realizar estudios estad´ısticos sobre grafos de gran volumen y establecer conclusiones a partir de estos an´alisis. En esta tabla podemos observar que las transacciones salientes totales coinciden con las entrantes totales, lo cual concuerda debido a que cada arista tiene una cartera 26 Figura 6.2: Estad´ısticas recogidas del conteo de aristas salientes y entrantes entrante y una saliente. Tenemos una media de 6.18 transacciones salientes y 4.69 transacciones entrantes, y por ´ultimo es bastante interesante el dato del registro m´aximo de 121885 transacciones entrantes (posiblemente asociada a un banco Bitcoin), y 1994 transacciones salientes. Por ´ultimo, con la intenci´on de determinar si existe una relaci´on linealidad entre transacciones salientes y entrantes de cada cartera se ha realizado un diagrama de dispersi´on con una semilla aleatoria de nodos que nos muestra el siguiente gr´afico: Figura 6.3: Diagrama de dispersi´on de aristas salientes y entrantes Y a partir de estos datos tambi´en se calcul´o la correlaci´on entre aristas entrantes y salientes. 27 Figura 6.4: Coeficiente de correlaci´on entre transacciones entrantes y salientes A partir de este calculo, podemos determinar que estos dos atributos de los nodos mantienen una relaci´on extremadamente d´ebil. Esto se debe a que el coeficiente de correlaci´on, que en este caso es 0.182 es muy pr´oximo a 0. Como conclusi´on, a˜nadir´ıa que no ser las transacciones salientes y entrantes dos variables proporcionales, existe una gran comunidad de nodos que no se dedican a mover su capital. Una raz´on posible ser´ıa que el mercado Bitcoin en ese momento se encontraba en un momento de fase alcista o periodo de acumulaci´on. En este momento los usuarios se dedican a conservar su inversi´on en lugar de distribuir y vender debido a que se espera una subida extremadamente grande, como la que se produjo en 2017, lo cual concuerda con los datos debido a que este historial de transacciones est´a registrado hasta 2016, donde la gente empez´o a creer en el fen´omeno Bitcoin y decidi´o invertir para esperar esta subida. 6.2.2. B´usqueda de patrones por medio de filtros Gracias al sistema de filtrado que nos ofrece GraphX, podemos encontrar ciertos patrones dentro del conjunto de transacciones, y obtener subconjuntos m´as peque˜nos que re´unan condiciones interesantes para realizar un an´alisis. En este caso se ha realizado una consulta basada en que el nodo de entrada debe tener m´as de 1000 transacciones entrantes, y el nodo de salida debe tener m´as de 1000 transacciones salientes. Gracias a estas herramientas de filtrado, se podr´ıan implementar herramientas como sistemas de detecci´on de transacciones legalmente irregulares, dado que podremos encontrar patrones en grandes vol´umenes de transaciones dentro de la red. 6.2.3. Triangle counting Como ya detallamos en la secci´on 5.3.3, que explicaba el conteo de triangulos, la exploraci´on de este m´etodo en profundidad ha sido imposible debido al inmenso coste computacional de pasar el algoritmo por un grafo de gran tama˜no. Al final, el resultado que ha sido posible obtener ha sido el n´umero total de triangulos del grafo, que nos da una cifra final de 546651 resgistros, esto nos indica que todos los nodos del grafo son perteneciantes como m´ınimo a un tri´angulo, dado que el n´umero de registros coincide con el numero de nodos del grafo. Este dato se ha calculado en un tiempo de ejecuci´on de 17 minutos. En conclusi´on, teniendo en cuenta que el coste de ejecuci´on medio de un bloque de instrucciones de este proyecto es de 1 minuto, podr´ıamos anotar que esta 28 Figura 6.5: B´usqueda de patrones en las transacciones del grafo por medio de filtrado 29 funci´on sobrepasa de manera excesiva el coste de procesamiento y por tanto no ser´ıa rentable en este contexto del proyecto. Adem´as, esta medida resulta de gran utilidad para estudiar agrupaciones de nodos dentro de la red y calcular coeficientes de clustering, pero por razones de insuficiencia de recursos de computaci´on no han podido ejecutarse sobre este grafo. 6.2.4. Ranking de paginaci´on En este apartado se mostrar´a el listado de los 5 nodos m´as relevantes dentro del grafo de transacciones, as´ı como su ranking de paginaci´on asociado: Figura 6.6: Listado de nodos con mayor relevancia Gracias a esta funci´on, podemos apreciar qu´e nodos tienen m´as peso dentro del grafo total, y podr´ıa ser utilizada para identificar empresas y entidades bancarias dentro de la red Bitcoin, dado que estos nodos con mayor importancia ser´an los que m´as y mejor relacionados se encontrar´an dentro del grafo. 6.2.5. Representaci´on parcial y total del grafo En este apartado nos centraremos en el dibujado del grafo de transacciones. Con el fin de explorar a fondo las funcionalidades de GraphX, se ha dividido esta secci´on en dos bloques: la representaci´on de las transacciones asociadas a un nodo y la representaci´on total en distintas formas. Transacciones asociadas a un nodo En primer lugar, se representar´an gr´aficamente los subgrafos asociados a las transacciones salientes de un ´unico nodo. En las siguientes figuras se presentan 3 ejemplos ordenados por volumen de transacciones de menor a mayor tama˜no. La figuras 6.2.4 y 6.2.5 tendr´an pocas transacciones, mientras que la figura 6.2.5 presentar´a muchos m´as nodos debido a que tiene muchas m´as transacciones salientes. 30 Figura 6.7: Representaci´on de transacciones salientes del nodo 12 Figura 6.8: Representaci´on de transacciones salientes del nodo 48 Figura 6.9: Representaci´on de transacciones salientes del nodo 556 31 Representaci´on total en distintas formas Tras representar los subgrafos asociados a las transacciones de un ´unico nodo, se han implementado dos maneras de dibujar el grafo completo. Gracias a la librer´ıa NetworkX, es posible realizar representaciones visuales de grafos de extrema complejidad. Dado que dibujar la totalidad de los nodos es pr´acticamente imposible debido a las limitaciones t´ecnicas, se ha hecho uso de la funci´on de Spark sample() que coge un conjunto aleatorio de aristas de menor tama˜no que el conjunto total y se realiza la representaci´on gr´afica a partir de este conjunto menor. En el caso concreto de este grafo, se han representado el 0.003 % de los aristas del conjunto total. Cuando fuera posible, a nivel computacional, representar la totalidad del grafo contando con m´as recursos, lo ´unico que tendr´ıamos que hacer es no utilizar la funci´on sample() y coger la totalidad del conjunto para realizar la representaci´on. Para la representaci´on total se han utilizado dos gr´aficos. En primer lugar tenemos una representaci´on en forma el´ıptica, donde los nodos conforman el per´ımetro de la elipse, mientas que las relaciones entre ellos se representan dentro de la figura. En segundo lugar, tenemos una representaci´on rectangular. Aqu´ı, los nodos se distribuyen de manera aleatoria dentro de la figura. Figura 6.10: Representaci´on total del grafo en forma el´ıptica Mediante estos gr´aficos, podemos observar de manera visual c´omo se presenta el grafo de transacciones. En las representaciones totales del grafo, pueden observarse con facilidad ciertos nodos que cuentan con un volumen muy alto de transacciones (muchas aristas salientes y entrantes). Estos denominados coloquialmente ”Supernodos”, corresponden en el contexto de la red Bitcoin, a grandes entidades bancarias con un frente de inversi´on en Bitcoin, o bien, a empresas que acumulan una parte importante de su capital en Bitcoin. Por tanto, gracias a esta representaci´on visual, podemos entender con m´as claridad como se presenta la red de transacciones de esta criptodivisa. 32 Figura 6.11: Representaci´on rectangular del grafo 6.3. Posibles utilidades reales de los resultados A la vista de los resultados obtenidos a lo largo de esta investigaci´on, se han recopilado una serie de aplicaciones pr´acticas reales que podr´ıan tener las funcionalidades desarrolladas en este proyecto. En primer lugar, el hecho de que sea posible la representaci´on gr´afica de las transacciones por medio de su concepci´on como grafo, nos permite realizar an´alisis visuales de la distribuci´on del gran volumen de transacciones que se encuentra en la red. Gracias a esta visualizaci´on, se pueden percibir de manera intuitiva, como ya se indic´o en la secci´on 6.2.5, aquellos nodos que acumulan una gran cantidad de volumen de transacciones. Esta herramienta, unida al desarrollo de una funcionalidad de fechado de transacciones, podr´ıa resultar de gran utilidad para detectar situaciones de acaparamiento de capital. Este fen´omeno se produce cuando un ´unico contribuyente de la red realiza grandes adquisiciones de capital y acumula un porcentaje relevante de una criptodivisa. Estos acaparamientos son llevados a cabo por bancos y grandes entidades internacionales, que actualmente poseen en 78 % del total de Bitcoin, dejando solo un 22 % para los traders. Las consecuencias que ´este produce son la inestabilidad del valor de la moneda y el aumento del miedo entre los inversores, tal y como se indica en la figura 6.12. Por tanto, de cara a analizar este tipo de fen´omenos, las funciones de representaci´on gr´afica pueden resultar de gran utilidad. 33 8. Bibliograf´ıa [1] Gu´ıa de los fundamentos para la direcci´on de proyectos, 2022. URL https: //es.wikipedia.org/wiki/Gu%C3%ADa de los fundamentos para la direcci% C3%B3n de proyectos. [2] Graphx programming guide, 2022. URL https://spark.apache.org/docs/ latest/graphx-programming-guide.html. [3] Modelado de software. wikipedia: La enciclopedia libre, 2022. URL https://es. wikipedia.org/wiki/Modelado del software#:∼:text=El%20modelado%20de% 20sistemas%20software,la%20comunicaci%C3%B3n%20con%20el%20cliente. [4] Bit2Me Academy. ¿c´omo funciona el blockchaincade- na de bloques?, 2022. URL https://academy.bit2me.com/ como-funciona-blockchain-cadena-de-bloques/#:∼:text=En%20esencia% 20una%20red%20blockchain,con%20una%20matem%C3%A1tica%20muy% 20avanzada. [5] ESIC Business and Marketing School. Apache spark: Introducci´on, qu´e es y c´omo funciona, 2018. URL https://www.esic.edu/rethink/tecnologia/ apache-spark-introduccion-que-es-y-como-funciona. [6] Comunidad. Scala - wikipedia, 2021. URL https://es.wikipedia.org/wiki/ Scala. [7] CEUPE: Centro Europeo de Postgrado. ¿c´omo se benefician las criptomonedas del big data?, 2021. URL https://masterbigdataceupe.com/ como-se-benefician-las-criptomonedas-del-big-data/#Las criptomonedas pueden sacar provecho del Big Data. [8] The Apache Foundation. Apache spark documentation, 2022 (Latest update). URL https://spark.apache.org/docs/latest/. [9] Jorn Franke. Using hive to analyze bitcoin blockchain data, 2017. URL https://github.com/ZuInnoTe/hadoopcryptoledger/wiki/ Using-Hive-to-analyze-Bitcoin-Blockchain-data. [10] J¨orn Franke. Using hive to analyze bitcoin blockchain data, 2017. URL https://github.com/ZuInnoTe/hadoopcryptoledger/wiki/ Using-Hive-to-analyze-Bitcoin-Blockchain-data. [11] Redacci´on KeepCoding. 10 motivos por los que debes aprender scala, 2022. URL https://keepcoding.io/blog/ 10-motivos-por-los-que-debes-aprender-scala/. [12] Grupo Korporate. Fracaso de los proyectos inform´aticos, 2021. URL https: //grupokorporate.com/por-que-fracasa-un-proyecto-ti/. 40 [13] Jirka Kremser. Bitcoin insights, 2018. URL https://github.com/jkremser/ bitcoin-insights. [14] LinkedIn. Sueldo promedio de un analista de datos en espa˜na, 2022. URL https://www.linkedin.com/salary/explorer?countryCode=es&geoId= 105646813&titleId=340. [15] Ra´ul Jaime Maestre. Qu´e es fintech y por qu´e es el futuro de las finanzas, 2022. URL https://www.iebschool.com/blog/que-es-fintech-finanzas/. [16] Patricia Mabel Pesado. Sistemas de software distribuidos y bases de datos distribuidas, junio 2006. URL http://sedici.unlp.edu.ar/handle/10915/20809. [17] Hari Santanam. Apache spark para el procesamiento paralelo de big data, 2018. URL https://medium.com/datos-y-ciencia/ apache-spark-para-el-procesamiento-paralelo-de-big-data-rapido-facil-c132243cee0. [18] UNIR. ¿qu´e es la planificaci´on de un proyecto?, 2018. URL https://www.unir. net/empresa/revista/planificacion-proyecto/. [19] Mar´ıa Elena Verjaga Felgueras. An´alisis de datos y extracci´on de conocimiento utilizando bigdata, 2018. URL https://hdl.handle.net/10953.1/8380. [20] Wikipedia. Bitcoin, 2022. URL https://es.wikipedia.org/wiki/Bitcoin. 41