logo
Towards The Internet of Value

Aug 1212 min read

Entender “Clarity”- El lenguaje de programación de Smart Contracts.


[Traducción del artículo original en inglés publicado en Medium, firmado por Harini Anantha Rajan]

Con la creciente adopción de la tecnología Blockchain, surgen muchas blockchains que tiene su propio lenguaje de smart contracts. El más conocido y popular es Solidity en la blockchain Ethereum. A Facebook se le ocurrió su blockchain Libra que tiene su lenguaje de programación, Move. Igualmente, Clarity es el nuevo lenguaje de programación de Smart Contracts, presentado por Blockstack para su propia Stacks blockchain. [En La fecha del artículo original, Blockstack todavía no habia lanzado su rebranding y cadena Stacks. para esta traducción tomaremos el nombre actual de está blockchain: Stacks]

Bien, pero ¿qué es Stacks?

Stacks es una poderosa plataforma que pretende construir un Internet descentralizado, poniendo a los usuarios en control de su identidad y de sus datos. Supone un giro completo sobre cómo los usuarios utilizan software, lo crean, y se benefician de Internet. Pone de nuevo a los usuarios en control de los sistemas de computación que manejan el mundo de hoy.

En este blog vamos a hacer camino juntos para entender el nuevo lenguaje de programación Clarity.

Entonces, ¿Qué son los Smart Contracts?

Un smart contract o contrato inteligente es un protocolo de computación que facilita, verifica, y resuelve la negociación y firma de un contrato. (ver wiki) A smart contract is a computer protocol intended to digitally facilitate, verify, or enforce the negotiation or performance of a contract. (as per wiki ). Los Smart Contracts corren sobre tecnología blockchain - son inmutables y se resuelven por el sistema mismo. Y como el contrato es verificable públicamente, las posibilidades de conflicto son mínimizadas. .

Cuando se implementa, un smart contract puede sustituir perfectamente la necesidad de un abogado o un notario para la firma del documento que puede presentarse ante los tribunales. Estos contratos se auto-ejecutan cuando todas las cláusulas del mismo se alcanzan.

Así que, por ejemplo, si escribes un smart contract para prestar tu apartamento con las dos condiciones del pago de una renta y el momento de la entrega de la llave (asumiendo aquí una llave digital). En cuanto el arrendatario para la cantidad acordada -el contrato se encarga de que la llave sea transferida al tenedor. El propietario no puede evitar que la transferencia de la llave se produzca en el momento en la renta es abonada. Porque es contrato ha sido inscrito públicamente con las identidades permaneciendo anónimas, ni el propietario, ni el arrendatario pueden acusar errores. El smart contract actúa como vínculo asegurando que las condiciones del contrato se alcanzan siempre. (Source:- 

Fuente:- https://codebrahma.com/brief-intro-smart-contracts-endless-possibilities/

Bueno, ahora sé lo que son los smart contracts, pero entonces...

¿Qué es Clarity?

Clarity es un “lenguaje de programación decidible”, que está diseñado como “non-Turíng complete” y “no necesariamente compilable”.

Espera, ¿qué es un lenguaje de programación Non-Turing complete?

Para comprender Por qué Clarity está diseñado como lenguaje de programación non-Turín complete, deberíamos saber antes qué es Turing complete y por qué Clarity no lo es. Vamos a profundizar en esto.

Primero, ¿qué es un lenguaje de programación Turing complete?

Un lenguaje de programación es considerado Turing complete si puede hacer lo que una máquina Turing puede hacer.

Un lenguaje se considera Turing Complete si cumple con las siguientes condiciones:

  • Tiene la capacidad de implementar cualquier función computable.
  • Incluye siempre una función que no termina por sí misma.
  • Incluye una función que teóricamente puede usar una cantidad infinita de memoria.

(Fuente:- https://hackernoon.com/should-smart-contracts-be-non-turing-complete-fe304203a49e)

Recomiendo ver los videos de Computerphile para entender cómo funciona una máquina Turing.

Como todos sabemos, la mayoría de los lenguajes utilizados a día de hoy son Turing complete. ¿qué daño puede hacer entonces un lenguaje de programación de smart contracts Turing complete?

As we all know, most of the language which we are using to date are Turing complete.

What harm does a Turing complete smart contract programming language cause?

Los smart contracts son poderosos, pero no son completamente fiables por la historia de fallos ocurridos.
La blockchain más popular para los smart contracts es Ethereum, y su ampliamente extendido lenguaje de smart contract es Solidity. Solidity es un lenguaje de alto nivel, orientado a contratos, y escrito estáticamente. Es un lenguaje muy efectivo, pero se han señalado varios problemas, algunos de ellos indicados a bajo, y una de las razones de este hecho es que se trata de un lenguaje De programación Turing Complete.

Smart contracts are powerful, but they cannot be fully entrusted due to the history of bugs reported. The most popular blockchain for smart contracts is Ethereum and its widely used smart contract language is Solidity. Solidity is a statically typed, contract-oriented, high-level language. It is a very effective language but had several issues reported, few of them listed below and one of the reasons is the fact that this is Turing complete programming language.

  1. DAO hack. (explotación de llamadas recurrentes)
  2. Reentrancy attacks. (Causadas por contratos pobremente implementados)
  3. Halting problem.
  4. Predecir la tarifa a pagar por transacción de antemano es muy difícil pues un análisis estático, static analysis, no puede realizarse.

¿Qué es Clarity y cómo se diferencia de los lenguajes de programación de smart contracts existentes?

Clarity es el lenguaje para smart contracts usado en la blockchain Stacks. Clarity apoya el control programático de activos digitales dentro de la blockchain Stacks (por ejemplo, nombres BNS, Stacks tokens, y más).

A diferencia de los lenguajes de programación Turing complete conocidos hasta la fecha, Clarity es un lenguaje non-Turing complete, que persigue evitar los problemas mencionados arriba de los lenguajes que de programación que son Turing complete. También aspira a ofrecer a los usuarios la opción de hacer un análisis estático antes dede que el código sea implementado.

Veamos cuáles son pues las ventajas de Clarity al no tratarse de un lenguaje de programación Turing complete.

El ser non-Turing complete hace posible los análisis estáticos para determinar el coste de la ejecución de una transacción determinada. Esto ayudará a la red a calcular la tarifa de la transacción con tiempo por adelantado, y esto será transmitido al usuario.

El ser non-Turing complete permite al análisis estático averiguar qué otros contratos invoca una determinada transacción. Analizando esto, los posibles efectos colaterales pueden predecirse y evitarse. Esto mejora la experiencia de usuario y ayuda a los clientes a ganar credibilidad por parte de los usuarios.

Los análisis estáticos mejorados y precisos ayudarán a los desarrolladores a analizar y encontrar los posibles fallos, antes incluso de implementar/ejecutar el código, lo cual evita todo un montón de problemas a futuro, y la calidad del código puede ser mejorado.

En Clarity, los análisis estáticos llevados a cabo antes de emitir un smart contract pueden proporcionar información como la siguiente:
1. Coste de la emisión de una determinada transacción como una función de size input.
2. Los conjuntos de transacciones que aerán capaces de modificar una tabla particular. Futuros desarrollos podrían respaldar capacidades para análisis más avanzados, como la posibilidad de lanzar automáticamente pruebas sobre código de contratación inteligente.

Clarity es un lenguaje interpretado, lo cual significa que no pretende ser compilado. En Solidity, el contrato tiene que ser compilado. Antes de implementar Smart contracts, necesitamos compilar el código solidity en Bytecode para EVM (Ethereum Virtual Machine). Como para blockchain “el código es ley”, y las reglas que se aplican a una blockchain son la fuente de verdad final. Sin embargo, ¿está mostrando exactamente lo que estaba en la mente del desarrollador? La respuesta a esta pregunta es no al 100%. Al fin, los fallos pueden ser introducidos también a la hora de compilar. Además, si hay un error en el código fuente, es fácil arreglarlo en el interpreter directamente y reiniciar los nodos, en lugar de arreglarlo,en el compilador. Esta es la razón por la que, en Clarity, El Paso intermedio de la compilación se evita, y este lenguaje trata de publicar la intención exacta del desarrollador, escrita como contrato (código fuente), para ser directamente publicada/implementada en la blockchain.

Vale, ahora tenemos una idea clara de por qué Clarity fue diseñada como un lenguaje interpretado y non-Turing complete. Lo,siguiente será profundizar en el lenguaje.

Ahora, ¿cuáles son las características esenciales de Clarity?

De acuerdo con los Stacks docs, las partes fundamentales de Clarity son los data-spaces y las functions. Clarity es un lenguaje LISP (List Processing language) y tiene sus propios tipos nativos. Además, en Clarity, por defecto todas las funciones son privadas, a menos que se declaren públicas.

Los bloques básicos de construcción de Clarity son “atoms” y “lists”.

La definición dice así:

Un atom es un número o string de caracteres contiguos. Los atoms pueden ser funciones nativas, funciones definidas por los usuarios, variable, y valores que aparecen en un programa. Una list es una secuencia de atoms entre paréntesis (). Las lists pueden contener otras lists.

El manejo de los datos en Clartity es diferente. Las características so las siguientes:

1) Cada smart contracts tiene su propio data-space. Los datos dentro de los data-space son almacenados en mapas.

2) Estos almacenes vinculan un typed-tuple con otro typed-tuple (casi como un typed key-value store).

3) A diferencia de una estructura de tabla de datos, un mapa solamente asocia una llave dada exactamente con un valor único.

4) Cualquier smart contract puede tomar datos de cualquier otro mapa de smart contract. Sin embargo, solamente un smart contracto puede actualizar directamente datos dentro de su propio mapa.

La simplicidad de las mapas de datos permite dos cosas: una simple implementación dentro del VM, y a la vez un razonamiento más fácil sobre las funciones. Inspeccionando la definición de una función dada, queda claro qué mapa será modificado e incluso dentro de esos mapas, qué llaves son afectadas por una determinada invocación.

La interfaz de los mapas de datos asegura que los return types de las operaciones de mapa tiene una extensión fija, lo cual es un requisito para el análisis estático de las propiedades, costes y tiempo de ejecución de los smart contracts.

Los smart contract de Clarity tienen las siguientes limitaciones/características/aspectos de diseño:

  • los únicos tipos de átomo son: booleans, integers, fixed-length buffers, y principals.
  • La recursión es ilegal y no hay función lambda.
  • Looping sólo puede realizarse via map, filter, o fold.
  • Admite listas de atomic types; sin embargo, las únicas listas de longitud variable admitidas en el lenguaje aparecen como function inputs; no se admiten list operations como append or join.
  • Las Variables son creadas via let binding y no se admiten funciones mutantes como  set.
  • La definición de constantes y funciones está permitida para la simplificación del código, utilizando define statements. En todo caso, éstos son puramente sintácticos. Si una definición no puede ser inlined, el contrato será rechazado como ilegal. Estas definiciones son sólo privadas en las funciones así definidas que sólo pueden ser llamadas por otras funciones definidas en el smart contract dado.
  • Funciones especificadas via define-public statements son funciones públicas. Los argumentos en esas funciones deben especificar su tipo.
  • Los smart contracts tienen el poder de: 1. Llamar funciones públicas desde otros smart contracts. Estos smart contracts son identificados por su hash (huella) y deben existir ya en el momento en que el smart contract que hace la llamada es publicado. Esto, aparejado con la ilegalidad de la recursion, previene la función de reentrancy (re-entrada) que es un vector común de arquee en las plataformas de smart contracts existentes. 2. Propiedad y control de los activos digitales. Smart contracts son principals de primer orden como lo son las llaves públicas o direcciones multi-firma.

Un ejemplo de Clarity smart contract:

Aquí tienes un Clarity smart contract a lado de un smart contract escrito en Solidity para Ethereum

(Fuente:- https://blog.blockstack.org/introducing-clarity-the-language-for-predictable-smart-contracts/)

Conclusión:

Los smart contracts permiten a dos partes intercambiar cualquier cosa de valor (dinero, propiedad, participaciones) de una forma automatizada, auditadle y segura, sin los servicios de un intermediario. No todas las aplicaciones necesitan smart contracts.

Clarity es un nuevo lenguaje de smart contracts, que corre sobre al blockchain Stacks, creada por la comunidad Blockstack y se declara como un lenguaje decidible. Este lenguaje es non-Turing complete y no pretende ser compilado.

Clarity es lenguaje LISP (List processing language ) y tiene sus propias limitaciones y características. Los building blocks de Clarity son átomos (número o string de caracteres contiguos) y listas (secuencia de átomos entre () paréntesis).

Clarity se compone de 2 partes:

  1. Data-spaces (espacios de datos). Cada contrato es asociado con un data-space. Los datos dentro del data-space no está almacenado como una estructura de tabla, en cambio está almacenado como un mapa y cada almacén vincula a una typed -tuple con otra typed-tuple. Solamente el smart contract asociado puede modificar su data-space correspondiente en la blockchain.
  2. Functions (funciones). Por defecto todas las funciones serán privadas, a menos que se señale que son públicas.
  3. Clarity tiene su conjunto de limitaciones al ser un lenguaje non-Turing complete, tales como que los únicos tipos de átomos son booleans, integers, fixed-length buffers, and principals. La recursion es ilegal, y no hay función lambda. Looping sólo puede realizarse via map, fold, etc. Las Variables pueden crearse sólo via let and no aceptan set. Clarity tiene sus propios tipos nativos, como los “principals”.


Articulo firmado por Harini Anantha Rajan (para el blog de BlockSurvey).

Traducción de Georgina García-Mauriño (Stacks advocate & Smartists co-founder)

Referencias:-

Stacks White Paper

Stacks docs on Clarity

Hackernoon article on “Should Smart contracts be non-Turing complete?”

Blockgeeks article on “Smart contracts.”

Smart Contracts - A brief intro

Computerphile Video on Turing completeness.

Computerphile Video on Turing machine.

Computerphile Video on Halting problem.

Decentralization reference.

Artículo original publicado en el Blog de BlockSurvey.
Sobre
Blocksurvey . BlockSurvey es una plataforma centrada en privacidad para la creación de encuestas y formularios con absoluta confidencialidad. A través de BlockSurvey, todos tus datos son encriptados end to end, y sólo tú puedes verlos. Tú eres el propietario de tus datos. Es tu derecho digital. No hay seguimiento alguno y te mantenemos como anónimo ante los colectores de datos. Nuestra plataforma utiliza Stacks, y ayuda a mantener la privacidad y la anonimidad, produciendo encuestas efectivas. ¡Prueba a crear tus encuestas con nosotros!

Share this story