Actualización de æpps: Lenguaje Sophia Smart Contract

En æternity continuamos migrando nuestras æpps a la Testnet de æternity en preparación para el lanzamiento de la Mainnet. Mientras tanto, estamos trabajando en una serie de herramientas y tutoriales para desarrolladores, que nos gustaría compartir en las próximas actualizaciones de æpps.

Al momento del lanzamiento de la Mainnet, æternity ofrecerá dos idiomas de contrato inteligentes: Sophia y Varna. Hablaremos de Varna en una publicación separada. Hoy estamos enfocados en Sophia.

Lenguaje Sophia Smart Contract

Sophia es el más expresivo de los dos lenguajes de contrato inteligentes. En los siguientes párrafos, repasaremos algunas de las características que lo convierten en un lenguaje de contrato inteligente superior. Hemos escrito un tutorial que explica e ilustra algunas de estas características como ejemplos de código.

Programación Funcional

Sophia es un lenguaje funcional en la familia ML. Hemos elegido el paradigma de programación funcional porque facilita la escritura de programas correctos, algo que es particularmente importante con los contratos inteligentes. Las cualidades de los lenguajes funcionales que los hacen (potencialmente) más confiables que los programas escritos usando el paradigma imperativo incluyen estado mutable restringido, menos efectos secundarios, componentes de código más fáciles de leer, mejor manejo de concurrencia y facilidad de depuración y prueba.

Estado

Sophia no tiene un estado mutable arbitrario, sino solo una forma limitada de estado asociada a cada instancia de contrato. Puedes encontrar un ejemplo de código específico del estado y las formas de acceder al estado aquí.

Fuertemente Tipificado

Sophia es un lenguaje fuertemente tipado, lo que significa que el compilador verifica si el valor asignado a una variable es efectivamente el tipo que se declaró para esta variable al momento de la compilación. Ser capaz de especificar y probar automáticamente las propiedades de un contrato inteligente hace de Sophia un lenguaje de contrato inteligente más seguro.

Objetos First Class

En Sophia, los siguientes componentes son objetos first class: contratos inteligentes, oráculos, nombres y canales de estado. Esto significa que están disponibles directamente, en lugar de estar definidos por librerías de códigos haciendo que estos objetos sean más fáciles de acceder, más económicos a la vez que reduce la complejidad del código.

Coincidencia de Patrones

Sophia presenta una coincidencia de patrones basada en ReasonML que permite un flujo de control optimizado y la capacidad de construir declaraciones de control fáciles de leer.

Un Ejemplo de Crowdfunding

Para ilustrar algunas de las características mencionadas anteriormente, hemos escrito un ejemplo simple de un contrato inteligente de la Campaña de Crowdfunding, que nos gustaría compartir:

/*
* A simple crowd funding example.
* Not production code (do not use)!
*/
contract FundMe =
type state = { contributions : map(address, uint),
total : uint,
beneficiary : address,
deadline : uint,
goal : uint }
private function require(b : bool, err : string) =
if(!b) abort(err)
public function init(beneficiary, deadline, goal) : state =
{ contributions = Map.empty,
beneficiary = beneficiary,
deadline = deadline,
total = 0,
goal = goal }
// — API —
// Contribute to the project
public stateful function contribute() =
require(chain.height < state.deadline, “Deadline has passed”)
let amount =
switch(Map.lookup(call.caller, state.contributions))
None => call.amount
Some(n) => n + call.amount
put(state{ contributions[call.caller] = amount,
total = state.total + call.amount })
// Withdraw funds after the deadline.
public stateful function withdraw() =
require(chain.height >= deadline, “Cannot withdraw before deadline”)
if(call.caller == state.beneficiary)
withdraw_beneficiary()
elif(is_contributor(call.caller))
withdraw_contributor()
else
abort(“Not a contributor or beneficiary”)
// — Private functions —
private function is_contributor(addr) =
Map.member(addr, state.contributions)
private stateful function withdraw_beneficiary() =
require(state.total >= state.goal, “Project was not funded”)
transaction(SpendTx({recipient = state.beneficiary,
amount = state.total }))
put(state{ beneficiary = #0 })
private stateful function withdraw_contributor() =
require(state.total < state.goal, “Project was funded”)
let to = call.caller
transaction(SpendTx({recipient = to,
amount = state.contributions[to]}))
put(state{ contributions[to] = 0 })

Futuro Cercano

Además del progreso continuo de æpps, estamos trabajando en una serie de nuevas herramientas de desarrollo que anunciaremos pronto. Estén atentos para más y como siempre siéntanse libres de contactarnos directamente en el Foro o en GitHub.


Recientemente publicamos una FAQ de æpps que podría tener la respuesta que está buscando. Accede aquí.

¿Interesado en æternity? Síguenos:

GitHub | Forum | Reddit | Telegram | Twitter | Facebook | Mail


Leave a Reply

Your email address will not be published. Required fields are marked *