Los contratos inteligentes, que son contratos escritos en código (generalmente en Solidity, el lenguaje de programación de Ethereum) y alojados en una cadena de bloques, presentan un potencial enorme para múltiples industrias.
Es el momento de profundizar en las numerosas aplicaciones de esta tecnología. Veremos qué son los contratos inteligentes o smart contracts, sus aplicaciones, beneficios y vulnerabilidades. También explicaremos cómo evitar esas vulnerabilidades.
Indice
¿Qué es un contrato inteligente?
Un contrato inteligente es un acuerdo codificado entre dos partes que ejecuta un intercambio automáticamente una vez que se entregan los bienes o se completan los servicios.
Los contratos inteligentes eliminan la necesidad de intermediarios y ejecutan automáticamente los términos del contrato una vez que se cumplen los requisitos. Las instrucciones están escritas en el contrato para representar los posibles resultados de la transacción (si se completó dentro del plazo requerido, si solo se entregó parcialmente, etc.) y se ejecutan automáticamente según lo que suceda.
Ten en cuenta que no son legalmente vinculantes como los instrumentos legales tradicionales, sino que son simplemente decisiones comerciales expresadas en una forma comprensible por software y ejecutadas por las “Reglas de la ley”. Eso significa que ambas partes acuerdan que una vez que se cumplan las condiciones, el contrato se ejecutará pase lo que pase.
El mero hecho de que estén controlados por el código se suma a su esencia innovadora, ya que también los hace rastreables, irreversibles y no manipulables.
Sin embargo, como con cualquier innovación, existe la otra cara de la moneda. Con los contratos inteligentes, esa es la cuestión de la confianza.
Aunque la tecnología blockchain proporciona por naturaleza una alternativa confiable y sin confianza a los modelos ya existentes de conducta comercial e interpersonal, un contrato controlado por código sigue siendo tan seguro como el código escrito y tan a prueba de balas como el conjunto de habilidades de la persona que lo escribió.
Por ejemplo, se redacta un contrato entre un importador y un exportador. Escrito en código y alojado en una cadena de bloques, estipula que el exportador debe entregar 30 libras de granadas al importador antes de una fecha determinada. El exportador entrega la mercancía a tiempo y recibe el pago automático. Los reguladores utilizan la cadena de bloques para estudiar la transacción y asegurarse de que se cumplan todas las regulaciones en todo momento.
Un ejemplo más común es una máquina expendedora. Una persona ingresa la cantidad de dinero requerida y marca el número del artículo que desea comprar. Una vez que ingresan el número, reciben su artículo automáticamente. La máquina expendedora está diseñada para producir un resultado automáticamente siempre que el comprador siga los pasos necesarios.
Más allá de las máquinas expendedoras, los contratos inteligentes ya están en uso. AXA, una aerolínea francesa, está utilizando una aplicación llamada Fizzy para reembolsar automáticamente a los pasajeros cuyo vuelo tiene más de dos horas de retraso. Si un pasajero está registrado, un vuelo tardío que cumple con los requisitos del contrato actúa como un evento desencadenante para liberar fondos directamente al pasajero. A medida que la tecnología mejore y las industrias se den cuenta del potencial, el uso de contratos inteligentes debería aumentar.
Aplicaciones
Muchos contratos inteligentes se crean y alojan en la cadena de bloques Ethereum. Esto es ideal para el desarrollo de contratos inteligentes en parte debido a Solidity, su lenguaje de programación. Todo el objetivo de Ethereum es permitir que los programadores creen e implementen contratos inteligentes.
Solidity está hecho a medida para la creación e implementación de contratos inteligentes. Es un lenguaje de secuencias de comandos similar a Javascript, pero verifica y aplica las restricciones integradas en el contrato en tiempo de compilación, no en tiempo de ejecución. El tiempo de compilación se refiere al proceso de compilar el código fuente, que está escrito en un script similar al inglés de un programa en código de máquina, que es binario (hecho de unos y ceros). Esto significa que cualquier error en el código (contrato) se detecta antes de la ejecución (tiempo de ejecución) donde causaría muchos más problemas.
La solidez es excelente para los contratos inteligentes porque permite que los contratos se vinculen y relacionen entre sí de muchas maneras diferentes. Por ejemplo, es posible que no puedas cambiar un contrato en la cadena de bloques, pero puedes crear otra referencia de contrato y vincular los dos. Muchas interacciones y transacciones comerciales son complejas y requieren múltiples contratos para funcionar correctamente. Solidity se creó con esto en mente y proporciona a los usuarios las herramientas para crear contratos que interactúan con un contrato base y hacen referencia a él.
Los almacenes de datos se basan en la estructura y los datos limpios, mientras que los lagos de datos permiten que los datos estén en su forma más natural. Esto se debe a que las herramientas analíticas avanzadas y el software de minería toman datos sin procesar y los transforman en información útil.
Estas son las principales aplicaciones de los contratos inteligentes.
Hipotecas
La industria hipotecaria es enorme. Tiene un ecosistema complejo de procesos e intermediarios que realizan tareas como verificación de antecedentes y verificación de ingresos. La introducción de contratos inteligentes en la combinación podría ahorrarles a los prestamistas más de $ 1.5 mil millones anuales solo en EE.UU. Los prestamistas y los prestatarios podrían interactuar directamente, reduciendo los costes asociados con la creación, el procesamiento y el servicio de las hipotecas.
Protección de la propiedad intelectual
Los contratos inteligentes ayudan a los creadores a proteger sus obras protegidas por derechos de autor. A cualquier contenido que se cree se le asignan derechos de propiedad en función de sus contribuyentes y sus partes. Cada vez que se compra el contenido, las regalías se entregan automáticamente a la parte correcta. La descripción clara de la propiedad y el pago automático elimina las ambigüedades que a menudo acompañan a la propiedad creativa.
Cadena de suministro (importación / exportación)
Uno de los beneficios de los contratos inteligentes es aumentar la transparencia de las transacciones. Esto es particularmente útil en transacciones complicadas de importación y exportación, que involucran muchas etapas y partes. El Internet de las cosas (IoT) también juega un papel en esto al facilitar la monitorización.
La información recopilada de los dispositivos conectados a IoT se transmite a la cadena de bloques y desencadena eventos codificados en un contrato inteligente. Por ejemplo, un bien se transporta de un almacén a un barco. El sistema del barco envía la confirmación de la recepción del artículo en buen estado, lo que desencadena la liberación del pago al fabricante. Estas transacciones pueden volverse extremadamente complicadas. Un contrato inteligente simplifica el proceso.
Seguro
El objetivo de los contratos inteligentes es aumentar la eficiencia y eliminar las interacciones innecesarias de terceros. En la industria de los seguros, los contratos inteligentes automatizan al menos parte del proceso de administración. Por ejemplo, supongamos que has comprado una póliza contra desastres naturales para tu hogar. Tan pronto como ocurra un desastre en tu área, se activará automáticamente la creación de una reclamación. Esto comenzaría a procesarse de inmediato, acelerando todo el proceso.
Beneficios
Muchos argumentan que los pros superan con creces los contras, pero para que la adopción masiva de contratos inteligentes se convierta en una realidad, aquellos que deben usarlos primero deben comprender tanto los beneficios como los riesgos asociados.
Precisión
Dado que este tipo de contrato se basa en relaciones «si / entonces» escritas en el código, cuando se cumplen todas las condiciones, los contratos se ejecutan. Por lo tanto, permiten una precisión infinitamente mayor en su ejecución que la que permiten los marcos judiciales tradicionales, mientras que al mismo tiempo no dejan espacio para la interpretación subjetiva por parte de los participantes humanos.
Velocidad
Como herramienta comercial sin papel, los contratos inteligentes se procesan muy rápidamente. Además, su naturaleza automatizada y digital permite una entrada y modificación de datos increíblemente rápida. Cuando el tiempo se equipara con el dinero, esto es una ventaja significativa sobre la competencia.
Rentabilidad
Teniendo en cuenta que la utilización de estos contratos elimina toda necesidad de emplear intermediarios que den fe de la naturaleza no violada de la información, utilizar acuerdos de este tipo es menos costoso para las empresas que los tradicionales. En este sentido, la confianza está integrada en el mecanismo de registro y ejecución de los términos del acuerdo: blockchain.
Confianza
Codificada en la plataforma blockchain y basada en los mismos principios, la tecnología de contratos inteligentes invoca inherentemente la regla de la confianza. Los registros fragmentados cifrados de las relaciones legales y las transacciones financieras se comparten entre todos los participantes de la cadena de bloques, lo que garantiza que su condición no dañada prevista esté libre de modificaciones maliciosas.
Seguridad
Una vez más, el hecho de que toda la información relacionada con este tipo de contrato, o cualquier cosa almacenada en blockchain en realidad, se divida en secciones cifradas distribuidas por la red es precisamente lo que la hace a salvo de manipulaciones. Para cambiar una pieza de información dentro de un contrato inteligente, toda la cadena debería modificarse y eso solo se hace a través de un consenso de validación.
Vulnerabilidades
La razón principal por la que existen contratos inteligentes vulnerables podría reducirse a una comprensión incorrecta de los casos extremos de la lógica implementada en relación con la plataforma.
A continuación, se muestran algunas de las vulnerabilidades comunes de los contratos inteligentes.
Ejecución indirecta de código desconocido
Existe una posibilidad de ejecución indirecta debido a la presencia de la función de respaldo en los contratos inteligentes. Hay varias razones por las que se puede llamar a esta función:
- Llamar a una función de otro contrato usando ABI: si hay un error tipográfico en la cadena de firma pasada para codificación, o una función con dicha firma no existe, entonces se llamará a la función de respaldo;
- El depósito a otro contrato genera una llamada a su función de reserva;
- Llamar a una función de otro contrato usando la API: si el desarrollador comete un error al declarar la interfaz del contrato llamado (por ejemplo, mezcla el tipo de un parámetro), entonces se llamará a la función de respaldo.
Reentrada
En Ethereum, las llamadas a funciones de otros contratos inteligentes se producen de forma sincrónica. Es decir, el código de llamada espera el final de la ejecución del método externo antes de continuar con su propio trabajo. Esto puede hacer que el contrato llamado utilice el estado intermedio del contrato de llamada.
Esta situación no siempre es evidente durante el desarrollo, si no se tienen en cuenta posibles acciones fraudulentas por parte del contrato llamado.
Para un ataque exitoso, es necesario colocar dicho contrato en la red y llamar a la función de pago del contrato vulnerable, pasando la dirección del contrato fraudulento como argumento.
Cálculo incorrecto de la cantidad del token de salida
La mayoría de los contratos inteligentes modernos tratan con enormes cantidades de dinero representadas en tokens o valor ETH. Por lo tanto, muchas operaciones en la lógica del contrato están conectadas con las transferencias de tokens hacia y desde el contrato. Crea un amplio campo para diferentes errores relacionados con los cálculos correctos de porcentajes, tarifas y ganancias. Los primeros de estos errores son:
- Manejo incorrecto de decimales, especialmente cuando se marca con un token como USDT;
- Orden de operación incorrecto durante los cálculos de tarifas, lo que conduce a una pérdida significativa de precisión;
Todos estos errores conducen a la pérdida de fondos de los usuarios o incluso a los tokens bloqueados para siempre. Por lo tanto, una de las tareas del auditor de los contratos es verificar la exactitud de la operación matemática. Estos controles también se implementan en las herramientas automatizadas y analizadores estáticos más modernos.
Problemas de interfaz / nomenclatura
Un ejemplo de esto es el contrato inteligente Rubixi. Rubixi era un juego de Ponzi, en el que su propietario podía transferirse a sí mismo las comisiones acumuladas en la pirámide financiera. Por lo general, el propietario se establece en el constructor del contrato, que se llama cuando se crea, la misma lógica se implementó en el contrato inteligente de Rubixi.
Cabe señalar que en las versiones de Solidity anteriores a 0.4.22, los constructores se definían como funciones con el mismo nombre que el nombre del contrato. En algún momento, el contrato cambió de nombre de Dynamic Pyramid a Rubixi, pero el desarrollador olvidó cambiar el nombre del constructor, por lo que cualquiera que llamara a la función Dynamic Pyramid podría convertirse en propietario de un contrato y robar los fondos acumulados.
Dependencia del orden de ejecución
El estado de un contrato está determinado por los valores de sus variables, que se modifican llamando a sus funciones. Llamar a una función de contrato inteligente es la misma transacción que una transacción de transferencia de token ETH o ERC-20. La red finaliza estas transacciones solo después de que se completa la creación del siguiente bloque.
Por lo tanto, cuando un usuario envía una transacción para llamar a una función de contrato, no puede estar seguro de que la transacción se ejecutará en el mismo estado del contrato en el que se encontraba en el momento del envío. Esto puede suceder porque otras transacciones en el mismo bloque han cambiado el estado del contrato.
Además, los mineros tienen cierta libertad para ordenar transacciones al formar un bloque, así como para elegir incluir una transacción en particular en un bloque. En algunos casos, la imposibilidad de determinar el estado del contrato, en el que se ejecutará la transacción, puede provocar la vulnerabilidad del propio contrato.
También se vuelve especialmente peligroso interactuar con contratos redactados de tal manera que su comportamiento pueda cambiar con el tiempo.
Componente de tiempo
A veces, la lógica de los contratos inteligentes puede depender del tiempo. El tiempo para un contrato solo está disponible en el contexto de una transacción. La marca de tiempo de una transacción, a su vez, es igual a la etiqueta del bloque en el que está incluida. Por lo tanto, se logra la coherencia con el estado de un contrato inteligente.
Sin embargo, esto también crea una oportunidad para que el minero abuse de su posición debido a cierta libertad para establecer una marca de tiempo para el bloque. Entonces, el minero tiene alguna ventaja sobre otras partes de un contrato que podría explotar en su propio beneficio.
Uso de la función blockhash
El uso de la función blockhash es similar a la dependencia de la marca de tiempo, no se recomienda usarla para componentes importantes por la misma razón que con la dependencia de la marca de tiempo, porque los mineros pueden manipular estas funciones y cambiar el retiro de fondos a su favor. Esto es especialmente notable cuando se usa el hash de bloque como fuente de aleatoriedad.
Excepciones manejadas incorrectamente
Hay muchas situaciones en las que se puede lanzar una excepción en Solidity, pero la forma en que se manejan estas excepciones no siempre es la misma. El manejo de excepciones se basa en interacciones entre contratos. Por lo tanto, los contratos son vulnerables a los ataques de usuarios malintencionados. Si estas excepciones no se manejan correctamente, las transacciones se revertirán.
Trabajo incorrecto con token ERC20
Existe una conocida implementación de OpenZeppelin del token ERC-20, que se utiliza en exceso en los protocolos modernos. En la mayoría de los casos, es completamente aplicable y su funcionalidad es suficiente para las operaciones financieras correctas. Aunque existe un lugar para implementaciones personalizadas de un estándar de token.
Por lo tanto, crea un lugar para las discrepancias entre el token recién creado y el estándar ERC20 real: pequeñas inconsistencias como el valor de retorno faltante en la función transfer. Sin embargo, un cambio tan pequeño puede llevar a que el método del contrato no sea funcional, ya que no podrá reconocer la interfaz. Es un error muy pequeño, casi no se nota durante las pruebas, pero en producción, conduce a fondos atascados y contratos bloqueados.
Cómo mitigar el riesgo de contratos inteligentes
Por parte de los desarrolladores, el mejor enfoque es realizar auditorías de contratos inteligentes exhaustivas antes de implementar protocolos. Los equipos de desarrollo no deben escatimar ningún coste para asegurarse de que sus contratos inteligentes estén libres de errores.
Para los usuarios, es recomendable llevar a cabo la debida diligencia antes de someter los fondos a protocolos inteligentes basados en contratos. Asegúrate de que el proyecto haya sido certificado por empresas de auditoría acreditadas.
En particular, los protocolos de seguros están forjando lentamente un modelo operativo y de infraestructura que puede abordar algunos de los riesgos asociados con el panorama de DeFi en evolución. La adopción de estas soluciones contribuirá en gran medida a mitigar los riesgos existentes de los contratos inteligentes.
Los contratos inteligentes parecen estar aquí para quedarse. Ahorran tiempo y dinero a los usuarios y mejoran la eficiencia. Algunas estimaciones sitúan la tasa de crecimiento anual compuesta (CAGR) del mercado de contratos inteligentes en un 80 por ciento durante los próximos seis años. Si bien la adopción de la tecnología blockchain ha experimentado altibajos, el vasto potencial de la tecnología debería ser suficiente para catalizar una adopción significativa en los próximos cinco años.