¿Qué es un smart contracts?

Un contrato inteligente o smart contracts es un tipo de código que te permite verificar y ejecutar un contrato de forma automática y fácil. Si bien, se han discutido las condiciones para la contratación de agentes externos para ejecutar el contrat, está claro que supone un cambio de paradigma clave para el mundo de los negocios.  Estos contratos funcionan en blockchain y no requieren la intervención humana por adelantado para verificar y hacer cumplir las condiciones.

Algunos casos de uso relevantes los encontramos en los contratos de préstamos, donde el smart contracts permite al deudor cerrar automáticamente el acceso al dinero si el deudor no paga los intereses acordados o los pagos a plazos. El smart contracts permite el proceso de verificación de datos o la implementación de las cláusulas del contrato de seguro, y evita posibles disputas.

Pero un un buen smart contracts es difícil de hacer bien. Sus tres atributos principales, la capacidad de expresar valor, la transparencia y la inmutabilidad son fundamentales para su funcionamiento. Sin embargo, estos atributos también los convierten en un peligro para la seguridad y un objetivo de gran interés para los ciberdelincuentes. Incluso si no hay un ataque deliberado, hay muchos ejemplos de colapso de capital y pérdidas de empresas debido a ciertas vulnerabilidades.

Como resultado, pueden tener ciertas tendencias a sufrir vulnerabilidades. En este artículo, describiremos los cinco problemas más comunes que suelen suceder.

 

1-Error aritmético de números enteros

Un error muy común es el error aritmético de números enteros. Debido a la falta de soporte de punto flotante, los smart contracts generalmente representan valores como números enteros.

El uso de números enteros para representar valores (que es común en los programas financieros) requiere reducir el valor a una unidad más pequeña para permitir una precisión suficiente. El ejemplo más simple es expresar el valor en centavos en lugar de dólares, porque de lo contrario no sería posible expresar 0.5 dólares. De hecho, la precisión de los contratos inteligentes tiende a mejorarse aún más, y muchos tokens admiten 18 lugares decimales.

Un problema que los desarrolladores conocen hoy en día es la posibilidad de desbordamiento de enteros.

Al igual que el kilometraje de un coche, los números enteros representados en el ordenador también tienen un valor máximo, una vez alcanzado este valor, simplemente vuelven al punto de partida y parten del valor mínimo. De manera similar, restar 4 de 3 en un entero sin signo se desbordará, lo que resultará en un número muy grande. Los desarrolladores suelen ser conscientes de este problema potencial, que es posible evitarlo mediante el uso de una biblioteca matemática segura.

Sin embargo, lo que muchos desarrolladores no parecen apreciar es la falta de precisión cuando la aritmética de enteros se ejecuta incorrectamente. En particular, el orden de las operaciones es muy importante, y el caso típico es el cálculo de porcentajes. Por ejemplo, para encontrar el 25%, generalmente lo dividimos por 100 y lo multiplicamos por 25.

Supongamos que solo queremos usar números enteros para calcular el 25% de 80. Debido a errores de redondeo, expresarlo como 80/100 * 25 resultará en 0. Un pequeño error aquí es que la división se realizó antes de la multiplicación.

Es un ejemplo que sucede con frecuencia apesar de ser un error muy simple.

2-Vulnerabilidades del límite de block gas

Ethereum se asegura de que el bloque no crezca demasiado, gracias al límite de block gas. Esto solo significa que la cantidad de gas que pueden consumir las transacciones contenidas en estos bloques es limitada. En resumen, si una transacción consume demasiado gas, nunca se meterá en problemas y, por lo tanto, nunca se ejecutará.

Esto puede conducir a una vulnerabilidad común: si los datos se almacenan en arreglos de tamaño variable y luego se accede a ellos haciendo un bucle a través de estos arreglos, la transacción puede agotarse rápidamente y revertirse. Esto sucede cuando aumenta la cantidad de elementos en el ensamblaje, lo que generalmente ocurre en la producción, no durante las pruebas.

La razón es que el conjunto de datos de prueba suele ser más pequeño que el conjunto de datos de producción, lo que hace que esta vulnerabilidad sea muy peligrosa porque los contratos relacionados con este problema generalmente pasan las pruebas unitarias y funcionan bien con una pequeña cantidad de usuarios. Sin embargo, a medida que se desarrolle el proyecto y aumente la cantidad de datos, fallarán. En este caso, puee afectar a los fondos, haciendo imposible su recuperación, al utilizar pagos recurrentes.

3-Frontrunning

Esto se puede definir como la ocupación de transacciones no confirmadas y es el resultado de la transparencia de la cadena de bloques.

Todas las transacciones no confirmadas son visibles en el grupo de la memoria antes de que los mineros las incluyan en el bloque, y los comerciantes interesados ​​pueden simplemente monitorear el contenido de la transacción y “adelantar” la transacción pagando tarifas más altas. Esto se puede automatizar fácilmente y se ha vuelto muy común en aplicaciones financieras descentralizadas.

Este tipo de problemas suelen requieren algún tipo de refactorización o rediseño importante para resolverlos.

 

Frontrunning

 

4-Falta de parámetros o controles de precondición

Otro básico de programación, pero usual,  es la falta de verificación de los parámetros de la función u olvidar hacer las comprobaciones necesarias para que una determinada operación sea válida. Por lo general, esto incluye parámetros de dirección que no se verifican con la dirección cero, o si un usuario no autenticado tiene suficiente saldo de tokens para realizar una operación específica, por ejemplo. Otro buen ejemplo es el control de acceso, donde solo ciertos tipos de usuarios deberían estar autorizados para llamar a una determinada función, pero esta verificación nunca se realiza.

Estos errores suelen ser el resultado de un descuido en el proceso de diseño. Es una buena idea tener instrucciones escritas para todas las funciones, indicando los parámetros, condiciones previas y operaciones a realizar. Apegarse a patrones de diseño, como Verificar-Efecto-Interacción, también puede ayudar a prevenir este tipo de vulnerabilidad.

5-Bugs de lógica

Los 4 puntos anteriores, son más específicos de los smart contracts, pero hay otros que son inherentes a la programación. Sin embargo, el problema más habitual suele ser un error básico en la lógica del contrato inteligente. Estos errores pueden ser causados ​​por simples errores tipográficos o malentendidos de especificaciones, que tienen como consecuencia un impacto serio en la seguridad.