Memoria para optar al título de ingeniero Civil en Computación
es_ES
Abstract
dc.description.abstract
La blockchain de Ethereum promete una infraestructura ideal para desarrollar sistemas parcial o totalmente descentralizados, pero existe una diferencia fundamental entre su máquina virtual, y la de lenguajes como Java: es necesario pagar para ejecutar código en ella. Como es Turing-completa, no se puede determinar a priori si es que un programa será terminante o no, lo que crea un problema único en este ecosistema: estimar el costo de ejecutar un programa. Herramientas actualmente disponibles para estimar estos costos sólo generan una cota superior del posible costo, la que puede llegar a ser infinita y no entregarle información útil al desarrollador del sistema.
Esta memoria tiene como objetivo general desarrollar una herramienta que genere distribuciones de costos de gas para las funciones de un contrato de Solidity (similar a una clase de Java), como un acercamiento al problema de estimación de gas. Además, como objetivos específicos se busca analizar patrones en el código fuente y cómo se relacionan a ciertas distribuciones de costos y generar recomendaciones a próximos autores de código Solidity para escribir código más seguro.
Comienza con una etapa investigativa de Ethereum, en particular sobre la máquina virtual en la cual se ejecutan transacciones (similares a ejecutar un método en Java), seguida por un estudio de un lenguaje que corre en esta máquina virtual: Solidity y cómo se diferencia de otros lenguajes populares como Java. Continúa analizando el sistema de gas implementado para controlar el uso de recursos computacionales de cada minero, y herramientas actuales que intentan resolver el problema de estimación de gas.
Luego se define la estructura de la herramienta desarrollada, basándose en conceptos de fuzz testing. Para esto se desarrollan técnicas únicas para este ecosistema, como la generación de direcciones en la blockchain y de transacciones válidas. El análisis simbólico se introduce para fortalecer un punto débil de la herramienta: su aleatoreidad. Un experimento para evaluar esta herramienta es diseñado para ser ejecutado en una base de datos de 94,878 contratos.
A partir de los resultados obtenidos en el experimento se genera un gráfico que resume el consumo de gas para un servicio dado y se definen clasificaciones para cada uno basadas en los costos obtenidos y en cómo se relacionan a la estimación estática generada por el compilador de Solidity. Cada clasificación se correlaciona con ciertas estructuras en el código que las generó y luego son usadas para realizar un análisis global del comportamiento de la herramienta.
Se concluye la memoria presentando posibles falencias en la lógica de la herramienta, explicando el efecto de agregar análisis simbólico a esta, resumiendo puntos donde concentrar el trabajo futuro y dando recomendaciones a autores de código Solidity para generar código más seguro en el futuro.
Una versión resumida de este trabajo fue presentada en ICSME-NIER 2020