Ciência e Tecnologia

A programação funcional é ideal para desenvolver blockchains

Existem muitos blockchains por aí, mas existem apenas algumas implementações independentes. Tezos é um deles e, como um dos primeiros arquitetos da cadeia, tive a chance de estar envolvido em sua criação e desenvolvimento desde o início. Uma decisão precoce e fortuita foi seguir o paradigma da programação funcional para construir a cadeia, utilizando a linguagem de programação OCaml. Ao longo dessa experiência, descobri que a programação funcional e as blockchains se encaixavam perfeitamente. Vamos tentar ver porque!

Segurança

Desde o início, ficou claro que a segurança deveria estar no centro das escolhas de design técnico. Blockchains e criptomoedas apresentam um ambiente quase de pior caso para bugs:

  • Bugs críticos não podem ser discutidos abertamente porque afetam sistemas ativos, mas eles precisam ser implantados simultaneamente em muitos participantes sem o uso de um terceiro confiável. Isso deixa muito poucas opções para resolvê-los, além de correções de bugs secretas.
  • Existem incentivos financeiros grandes e diretos para hackers criminosos descobrirem bugs nesses sistemas, uma vez que garantem valor financeiro real.

Embora a segurança seja crítica, infelizmente não há uma maneira infalível de garanti-la. Mesmo as abordagens mais rigorosas, como a verificação formal, continuam caras e estão sujeitas a bugs nas próprias especificações. Algumas opções técnicas, no entanto, podem ajudar.

Uma das principais razões para selecionar o OCaml como linguagem de programação foi que ele poderia ajudar a eliminar grandes classes de bugs. Como uma linguagem gerenciada por memória, não há necessidade de se preocupar com estouros de buffer, por exemplo, mas isso apenas arranha a superfície. O Tezos aproveita o sistema de tipo estático muito forte do OCaml para impor isolamento e permissões. O código que gerencia uma transação não pode acessar o armazenamento subjacente do livro-razão; ele não pode nem mesmo construir os tipos que precisaria gravar no armazenamento. Em vez disso, o sistema de tipos o restringe a gravar em uma abstração superior que pode verificar e sanear todas as ações. É claro que o encapsulamento não é exclusivo da programação funcional, mas o mecanismo de assinatura do módulo do OCaml torna muito simples revisar e refinar as permissões.

O protocolo Tezos incorpora um interpretador para Michelson, a máquina virtual por trás dos contratos inteligentes Tezos, que é estaticamente tipado e funcional. Esse intérprete aproveita o sistema GADT do OCaml para garantir que os contratos Michelson digitados incorretamente não possam ser construídos. Esta é outra boa propriedade de segurança que herdamos da própria linguagem.

Um velho ditado afirma que, se um programa é escrito em uma linguagem de programação funcional, ele funciona. A declaração é obviamente irreverente, embora eu me lembre que a primeira versão do Tezos que compilou, após meses de desenvolvimento, foi executada na primeira tentativa e foi capaz de processar transações.

Nenhuma dessas propriedades pode garantir a segurança, mas elas cuidam de falhas mais óbvias, liberando programadores e pesquisadores de segurança para se concentrarem em assuntos de nível superior.

Se o padrão-ouro é a verificação formal, o OCaml está extremamente bem posicionado. Coq, um provador de teoremas interativo líder e verificador de provas é escrito em OCaml e pode produzir OCaml naturalmente. Além disso, o Coq-of-OCaml pode fazer o inverso e preparar o código Coq a partir do código OCaml existente.

Blockchains parecem um problema de programação funcional

À medida que o Tezos começou a tomar forma, percebi que muitos dos problemas que precisam ser resolvidos ao implementar uma blockchain são semelhantes aos tipos de problemas com os quais os programadores funcionais estão muito familiarizados. Em sua essência, uma blockchain é uma maneira de representar um estado mutável usando uma estrutura de dados somente anexada. O estado é o que você obtém quando segura os blocos com um acumulador. Isso é típico de como lidamos com dados e sua imutabilidade no mundo funcional. 

Um problema para o qual a programação funcional é muito adequada é lidar com reorganizações de cadeias, quando os blocos que foram aplicados ao estado precisam ser revertidos porque uma ramificação diferente acaba sendo escolhida por consenso. Quando os dados são armazenados como uma árvore funcional, os participantes da rede podem desfazer o efeito desses blocos no estado de forma eficiente. Então, à medida que a cadeia avança, você precisa limpá-la e liberar a memória com um coletor de lixo, o que é novamente algo muito familiar no mundo da programação funcional.

Além disso, se você estiver criando contratos inteligentes, precisará de uma linguagem de contrato inteligente, o que significa que precisará de um compilador – os compiladores tendem a ser muito bem tratados pela programação funcional em geral e pelo OCaml em particular. Há muitas etapas ao compilar de um idioma de origem para um idioma de destino: analisar lexicalmente o texto para criar tokens individuais, montá-los em uma árvore de sintaxe abstrata e transformar várias partes dessa árvore até chegarmos ao idioma de destino, às vezes passando por uma série de representações intermediárias, onde o sistema de tipos restringe as transformações. O código para todas essas etapas pode ser muito elegante e eficiente quando escrito em OCaml.

O contrato inteligente compilado também se beneficia de ser escrito em um estilo funcional. Cada contrato tem seus próprios dados imutáveis ​​associados a ele, portanto, você não pode tê-lo como uma função pura. O que podemos fazer, no entanto, é carregar esse armazenamento e o contrato em uma máquina virtual isolada para executar. É a melhor coisa depois de uma função pura, determinística e não afetada por valores externos.

Por que OCaml?

OCaml não é uma escolha óbvia. Como linguagem de programação, permanece um pouco de nicho. No entanto, é uma linguagem madura que oferece a segurança de uma linguagem de programação funcional fortemente tipada, sem comprometer o desempenho. Suas raízes estão na academia francesa e é usado por empresas como Facebook, Jane Street Capital e Docker em projetos sensíveis à segurança. É também uma linguagem popular para escrever compiladores. Você pode escrever código muito legível, confiável e eficiente em OCaml e, embora não evite erros de programação, o sistema de tipos forte e a ausência de efeitos colaterais trazidos pela programação funcional ajudam a dar a você alta confiança na correção do seu código.

Haskell, uma linguagem de programação funcional mais popular, oferece um paradigma muito puro baseado em avaliação preguiçosa, mas é mais difícil escrever código Haskell que seja tanto performático quanto idiomático.

Uma objeção comum é que usar uma linguagem de programação incomum como OCaml torna mais difícil contratar programadores. Esse argumento pode ter algum peso para as empresas que tentam recrutar muitos milhares de desenvolvedores, mas ficou claro desde o início que o tamanho mais eficaz para uma equipe de desenvolvimento de protocolo central é muito menor do que isso. Além disso, descobri que os desenvolvedores com talento para construir esses tipos de sistemas não tiveram dificuldade em aprender a linguagem em questão de meses.

Fui inspirado desde o início pela capacidade do WhatsApp de escalar para centenas de milhões de usuários com uma equipe pequena e focada de desenvolvedores de Erlang, e eu diria que essa inspiração resistiu ao teste do tempo.

Embora o OCaml seja usado para os fundamentos do Tezos, a comunidade de desenvolvedores que cria ferramentas e aplicativos em torno dele normalmente o faz em uma ampla variedade de linguagens populares. Da mesma forma, para escrever contratos inteligentes, existem linguagens de alto nível que oferecem uma experiência semelhante a Python ou JavaScript, para citar alguns exemplos.

Conclusão

Em conclusão, há um ajuste muito natural entre blockchains e programação funcional e seria uma pena não usar a ferramenta certa para o trabalho certo! Existem inúmeros problemas ainda a serem resolvidos e oportunidades para desenvolvedores em todos os lugares aplicarem suas habilidades para construir melhores ferramentas, aplicativos e infraestrutura para esta categoria nascente (mas em expansão). Se você estiver interessado em saber mais sobre blockchain e Tezos, acesse tezos.com e junte-se à crescente comunidade de construtores do ecossistema.

Mostrar mais

Artigos relacionados

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Botão Voltar ao topo