Clarity
Un lenguaje de contratos inteligentes diseñado para ser legible y predecible.

Clarity es un decidible lenguaje de contratos inteligentes que optimiza la previsibilidad y la seguridad, diseñado para la blockchain Stacks. Ha sido construido desde cero para facilitar a los desarrolladores la escritura de contratos inteligentes seguros y confiables. Clarity tiene varias características únicas que la convierten en una opción ideal para escribir contratos inteligentes.
Las decisiones de diseño detrás de Clarity se basaron en gran medida en aprender de las explotaciones comunes en Solidity y en crear un lenguaje pensado específicamente para la seguridad y la protección.
Qué hace a Clarity diferente
La siguiente sección es un extracto del libro Clarity, Claridad de la Mente:
El número de lenguajes de contratos inteligentes crece cada año. Elegir un primer lenguaje puede ser un desafío, especialmente para un principiante. La elección está en gran medida dictada por el ecosistema que te interese, aunque algunos lenguajes son aplicables a más de una plataforma. Cada lenguaje tiene sus ventajas y desventajas y está fuera del alcance de este libro analizarlos todos. En su lugar, nos centraremos en lo que distingue a Clarity y por qué es una opción principal si requieres la máxima seguridad y transparencia.
Uno de los preceptos fundamentales de Clarity es que es segura por diseño. El proceso de diseño se guió examinando los errores, fallos y vulnerabilidades comunes en el campo de la ingeniería de contratos inteligentes en su conjunto. Hay innumerables ejemplos del mundo real donde la falla del desarrollador llevó a la pérdida o el robo de grandes cantidades de tokens. Para nombrar dos grandes casos: un problema conocido como el error de Parity llevó a la pérdida irreparable de millones de dólares en Ethereum. En segundo lugar, el hackeo de The DAO (una "Organización Autónoma Descentralizada") causó un daño financiero tan grande que la Fundación Ethereum decidió emitir un hard fork controvertido que revirtió el robo. Estos y muchos otros errores podrían haberse prevenido en el diseño del propio lenguaje.
Clarity es interpretado, no compilado
El código Clarity se interpreta y se compromete en la cadena exactamente como está escrito. Solidity y otros lenguajes se compilan a bytecode antes de enviarse a la cadena. El peligro de los lenguajes compilados para contratos inteligentes es doble: primero, un compilador añade una capa de complejidad. Un error en el compilador puede producir un bytecode diferente al previsto y, por tanto, conllevar el riesgo de introducir una vulnerabilidad. Segundo, el bytecode no es legible por humanos, lo que dificulta mucho verificar lo que el contrato inteligente está haciendo. Pregúntate: ¿firmarías un contrato que no puedas leer? Si tu respuesta es no, ¿por qué debería ser diferente para los contratos inteligentes? Con Clarity, lo que ves es lo que obtienes.
Clarity es decidible
Un lenguaje decidible tiene la propiedad de que, a partir del propio código, puedes saber con certeza lo que hará el programa. Esto evita problemas como el problema de la detención. Con Clarity sabes con seguridad que, dado cualquier entrada, el programa se detendrá en un número finito de pasos. En términos simples: se garantiza que la ejecución del programa terminará. La decidibilidad también permite un análisis estático completo del grafo de llamadas, por lo que obtienes una imagen precisa del costo exacto antes de la ejecución. No hay forma de que una llamada en Clarity "se quede sin gas" en medio de la ejecución. Exploramos esta idea más a fondo, junto con una discusión sobre la completitud de Turing, en el análisis de seguridad sobre decidibilidad.
Clarity no permite la reentrancia
La reentrancia es una situación en la que un contrato inteligente llama a otro, que luego vuelve a llamar al primer contrato: la llamada "reingresa" en la misma lógica. Esto puede permitir a un atacante desencadenar múltiples retiradas de tokens antes de que el contrato tenga la oportunidad de actualizar su balance interno. El diseño de Clarity considera la reentrancia una anti-característica y la prohíbe a nivel del lenguaje.
Clarity protege contra desbordamientos y subdesbordamientos
Los desbordamientos y subdesbordamientos ocurren cuando un cálculo produce un número que es demasiado grande o demasiado pequeño para ser almacenado, respectivamente. Estos eventos sumen a los contratos inteligentes en el desorden y pueden ser provocados intencionalmente en contratos mal escritos por atacantes. Usualmente esto lleva a una situación donde el contrato queda congelado o drenado de tokens. Los desbordamientos y subdesbordamientos de cualquier tipo causan automáticamente que una transacción sea abortada en Clarity.
El soporte para tokens personalizados está integrado
La emisión de tokens fungibles y no fungibles personalizados es un caso de uso popular para los contratos inteligentes. Las funciones de tokens personalizados están integradas en el lenguaje Clarity. Los desarrolladores no necesitan preocuparse por crear una hoja de balances interna, gestionar la oferta o emitir eventos de tokens. La creación de tokens personalizados se trata en profundidad en capítulos posteriores.
En Stacks, las transacciones se aseguran mediante condiciones posteriores
Con el fin de proteger aún más los tokens de los usuarios, se pueden adjuntar condiciones posteriores a las transacciones para afirmar que el estado de la cadena ha cambiado de cierta manera una vez que la transacción ha finalizado. Por ejemplo, un usuario que llame a un contrato inteligente puede adjuntar una condición posterior que indique que después de que la llamada termine, exactamente 500 STX deben haberse transferido de una dirección a otra. Si la verificación de la condición posterior falla, entonces toda la transacción se revierte. Dado que el soporte de tokens personalizados está integrado directamente en Clarity, las condiciones posteriores también pueden usarse para proteger cualquier otro token de la misma manera.
Las respuestas devueltas no pueden quedar sin revisar
Las llamadas públicas a contratos deben devolver una llamada denominada response que indica éxito o fallo. Cualquier contrato que llame a otro contrato está obligado a manejar correctamente la respuesta. Los contratos Clarity que no lo hagan son inválidos y no pueden desplegarse en la red. Otros lenguajes como Solidity permiten el uso de llamadas de bajo nivel sin exigir que se compruebe el valor devuelto. Por ejemplo, una transferencia de tokens puede fallar silenciosamente si el desarrollador olvida comprobar el resultado. En Clarity no es posible ignorar los errores, aunque eso obviamente evita el manejo de errores defectuoso por parte del desarrollador. Las respuestas y el manejo de errores se tratan ampliamente en los capítulos sobre funciones y control de flujo.
Composición sobre herencia
Clarity adopta la composición sobre la herencia. Esto significa que los contratos inteligentes Clarity no heredan unos de otros como ocurre en lenguajes como Solidity. En su lugar, los desarrolladores definen traits que luego son implementados por diferentes contratos inteligentes. Esto permite que los contratos se ajusten a diferentes interfaces con mayor flexibilidad. No hay necesidad de preocuparse por árboles de clases complejos y contratos con comportamientos heredados implícitos.
Acceso a la cadena base: Bitcoin
Los contratos inteligentes Clarity pueden leer el estado de la cadena base de Bitcoin. Esto significa que puedes usar transacciones de Bitcoin como desencadenante en tus contratos inteligentes. Clarity también cuenta con varias funciones incorporadas para verificar firmas secp256k1 y recuperar claves.
Última actualización
¿Te fue útil?