🇵🇹 Combinador torna fácil o trabalho da bifurcação de Shelley

Um olhar por trás das cenas com o Duncan Coutts e Edsko de Vries

Desde o lançamento da rede de testes incentivada que marcou o início da era Shelley no ano passado, a plataforma Cardano entrou num período de rápido desenvolvimento. O protocolo de consenso Ouroboros Classic que tem servido de base à era Byron e à criptomoeda ada nos últimos 30 meses e em breve irá mudar para Ouroboros Praos. Esta é a versão do nosso protocolo à prova de participação (PoS) que irá capacitar Shelley à medida que Cardano se descentraliza. Tem inerente o processo de comprometer participação com recompensas monetárias para detentores de ada e detentores de agrupamentos de participação.

Atualizamos Cardano a 20 de fevereiro com uma bifurcação que mudou a rede principal do protocolo de consenso original, Ouroboros Classic, para uma versão atualizada, Ouroboros BFT. Esta bifurcação BFT iniciou um período de transição com Ouroboros BFT, uma versão mais leve do protocolo concebido para nos ajudar a mudar para Praos, enquanto isso continua a prevenir comportamentos maliciosos. Muitos nem sequer notaram. Para utilizadores da carteira Daedalus, significou uma atualização do software. Câmbios tiveram que atualizar manualmente, mas tiveram várias semanas para assim o fazer e estivemos lá para os ajudar.

O próximo evento foi o reinício de Byron a 30 de março. Este lançamento de código totalmente novo para muitos componentes de Cardano, incluindo o novo nó para apoiar a delegação e a descentralização além de futuras características de Shelley. Uma grande vantagem deste novo código de base é que foi concebido para ser modular, assim, muitos componentes podem ser alterados sem que afete os outros.

Por sua vez, BFT age como uma plataforma de partida para a bifurcação de Shelley, que acontecerá uma vez satisfeitos com a rede de testes de Haskell. A segunda bifurcação terá um processo semelhante ao de fevereiro para os câmbios, detentores de ada e utilizadores da carteira esperançados que seja nada mais do que um não evento.

Contudo, enquanto tudo parece correr sobre rodas à superfície, ainda hã muita atividade oculta. Tal como um pato que nada serenamente pelo lago - enquanto os pés estão a pedalar furiosamente por baixo das águas calmas - os nossos engenheiros blockchain estão no duro.

Assim, sentámo-nos com dois engenheiros líderes do projeto Cardano, Duncan Coutts e Edsko de Vries, para sabermos como é que eles o fizeram. Duncan tem liderado a parte da arquitetura nos últimos três anos e entre eles Duncan e Edsko usaram durante 35 anos Haskell, a linguagem de programação usado para desenvolver Cardano.

Duncan, como é que fizeste?

Conforme descrito no roteiro de Cardano, os engenheiros blockchain da IOHK acreditam em atualizações suaves ao código. Em vez de tentar saltar de Ouroboros Classic a Praos numa só atualização - que seria uma tarefa incrivelmente complexa - foi faseado em duas etapas usando Ouroboros BFT como intermediário (Figura 1). O código BFT é compatível com quer os nós federados da era Byron quer com os nós do estilo Shelley lançados no reinício de Byron. É como uma corrida de estafetas: um corredor (no nosso caso, correr um protocolo) entra na zona de entrega onde o outro corredor aguarda; eles sincronizam as velocidades (para estarem perfeitamente compatíveis um com o outro) e depois entregam o bastão (operar a rede principal) e depois o novo corredor com o bastão continua a corrida para a próxima volta.


Figura 1. Roteiro da rede principal de Byron para Shelley

O processo de Daedalus Flight ajudou-nos a desenvolver rapidamente e testar uma nova carteira e quando estiverem todos a correr na rede principal e uma vez acabada a troca dos nós, o código antigo é redundante. Estamos neste momento nessa fase de transição, com a carteira Daedalus da rede principal lançado no dia 24 de abril.

O nosso objetivo é termos uma entrada graciosa na era Shelley, conforme o chefe da IOHK, Charles Hoskinson descreveu na sua apresentação sobre a bifurcação. Uma ferramenta vital para tornar isto possível foi a criação do combinador de bifurcação.

Isso parece uma máquina agrícola. O que é isso?

Um combinador é apenas um nome técnico para algo que combina outras coisas. Por exemplo, a adição é um combinador de números. Uma bifurcação combina dois protocolos num único protocolo. Chamamos a isto uma combinação sequencial dos dois protocolos porque corre o primeiro protocolo durante um período e a certa altura muda para o segundo protocolo. No nosso caso, estas são as duas versões de Ouroboros à medida que mudamos de BFT para Praos.

A parte habilidosa de tudo isto tem sido o uso de módulos discretos que executa o seu trabalho, enquanto sabem o mínimo possível sobre cada um e da blockchain. Aqui a simplicidade é a chave e este processo de retirar detalhes nós chamamos de “abstrair”. A maior parte dos módulos do protocolo de consenso nem sequer têm que saber que estão a lidar com uma criptomoeda e podem estar a colocar qualquer coisa na blockchain. Por exemplo, fizemos seminários usando o exemplo do razão do Pokémon na blockchain Ouroboros. A única coisa que é diferente são as regras do razão; o consenso é todo igual. Apenas configura-se - instanciar no calão de programação - com as regras de jogo de Pokémon em vez das regras de contabilidade do UTXO. [Para os leitores com interesse técnico, atenção ao Edsko que irá ao detalhe do processo de abstração e combinadores numa publicação futura do blog.]

Fazes parecer tão simples.

Na verdade, é complicado porque Cardano corre a criptomoeda ada e uma data de outras coisas ao mesmo tempo. Pensa nisto como estar a mudar as rodas do carro enquanto estás a conduzir o mesmo e a rebocar uma caravana. Assim, temos que ter a certeza de que estamos a fazer isto de uma maneira com total confiança.

Podíamos ter encarado esta tarefa como uma única, mas fazia sentido realizá-la de forma genérica usando um combinador de protocolo. Escolhemos este caminho porque conseguimos um melhor resultado e testar, que é vital para assegurar que o código funciona, torna-se muito mais fácil. Em cima disso, haverá mais bifurcações no futuro, o que tornou a escolha ainda mais clara. Por exemplo, à medida que nos aproximamos do culminar do desenvolvimento de Cardano e nos movemos para as eras Goguen, Basho e Voltaire, haverá pelo menos uma bifurcação em cada etapa.

Então como é que lidastes com as partes complicadas?

Bem, em primeiro lugar, tivemos que realizá-lo sem que existisse investigação para onde nos virássemos. Investigadores descrevem um único protocolo independente e perfeitamente isolado. Mas não é aí que nós estamos. Estamos a tentar executar Praos depois de ter começado com uma blockchain que estava a usar outra coisa qualquer. O que o Edsko está a desenvolver, ir de um protocolo para outro de uma forma genérica, não está coberto em termos de investigação. E é difícil, é complicado. Todos os detalhes precisam de muita reflexão e coçar muito a cabeça. Mas alternar entre códigos de base de Cardano não é o tipo de atividade sobre a qual se espera que académicos publiquem. Não tem um aspeto inovador e é encarado como apenas um desafio de implementação.

Edsko, podes-nos dar um exemplo?

Conforme diz o Duncan, para os investigadores, estas questões de implementação são triviais, mas lidar com elas é 99% do que nós fazemos. Toma como exemplo o problema de tempo para a blockchain. É sobre o qual tenho dado voltas à cabeça nas últimas semanas. Tempo é dividido em slots onde a blockchain pode conter no máximo um bloco por slot. Por vezes precisamos de converter entre número de slot e tempo no mundo real, por exemplo quando um nó precisa de saber “É a minha vez?” para gerar o próximo bloco. Isto é fundamental para Cardano, mas o comprimento de um slot muda depois de uma bifurcação. Para Byron, um slot é de 20 segundos, para Shelley será dois segundos ou talvez um. Para realmente complicar as coisas, o momento exato de tempo quando a bifurcação se realiza é decidido pela própria blockchain. No entanto, preciso de saber qual o momento de transição. É um dilema: para fazer conversões de slots preciso de saber o estado da blockchain, mas para saber o estado da blockchain preciso de saber fazer conversões de slots.

Trata-se de um problema da galinha e do ovo com muitas coisas complexas para desembaraçar. Temos de ser bastante precisos na forma como fazemos as coisas. Em teoria pode ser trivial, mas é muito difícil desembaraçar coisas e garantir que não se trata de um problema circular.

Não podemos permitir que corra mal, por isso como é que sabes que está correto?

Duncan: Essa é uma excelente pergunta. A minha resposta é que alcanças a resposta a dois níveis. A primeira é intelectual: analisas o problema, fazes os cálculos, falas com colegas e lutas com o problema até conseguires ver como todas as peças se encaixam todas juntas. Segundo, fazemos todos os nossos testes no QuickCheck para nos dar a confiança que isto faz o que concebemos que faça. Fazemos muitos testes que realmente leva-nos a casos muitos particulares que nunca imaginaríamos, incluindo esta mudança entre protocolos. Podemos fazer 100000 testes de todas as vezes mudamos uma linha de código. [Lars escreveu sobre John Hughes, um dos criadores de Haskell, e que ajudou a IOHK com estratégias de testes.]

Edsko: Sim, concordo com ambos os pontos. Em termos de combinador eu resolvo estas coisas ao pensar nas garantias que o código que escrevo preciso para fornecer e que garantias que por sua vez precisa do razão. Esquiço uma evidência matemática que este raciocínio “se-então” é na verdade justificado e depois viro-me para as equipas de métodos formais. Na equipa de métodos formais estão pessoas que montam regras matemáticas que descrevem a blockchain e eles conseguem ajustar as regras de tal forma que fornecem as garantias necessárias.

No que se refere ao segundo ponto do Duncan, sei que o tópico do tempo que referi atrás, está correto por pensar em termos matemáticos e por testar. Decisões sobre o tempo são mais fáceis quando temos a blockchain toda, mas são mais difíceis quando temos que fazer previsões sobre o futuro. Felizmente, a forma como montamos as coisas significa que posso criar blockchain de teste. Assim, posso criar uma blockchain completa e depois cortar a meio. Posso usar a primeira metade e considerá-la sendo o presente e determinar que a outra metade seja o futuro. Depois posso usar o “presente” (primeira metade) para fazer previsões sobre o “futuro” (segunda metade) e verificá-las contra toda a blockchain inteira (sobre a qual os cálculos são simples). Se coincidirem, então sei que está tudo OK.

Quando é que começaram com isto?

Logo depois do Duncan ter aparecido com a ideal genial do OBFT. Por isso, tenho estado a pensar sobre o combinador alternado com outras coisas há 18 meses. Era um objetivo de conceção desde o início da nossa conceção de Ouroboros em outubro de 2018, com o meu primeiro commit no repositório GitHub. Fizemos um protótipo de demonstração com OBFT e Praos logo depois em dezembro 2018.

E quantas pessoas tiveram envolvidas?

Duncan: Muitas pessoas estiveram a trabalhar no código do consenso, mas sempre que temos algo complexo e difícil, entregámos ao Edsko: ele é o nosso engenheiro de software extraordinaire! Trata-se de programação Haskell em escalada livre, em vez de escalada com corda conforme os métodos formais nos apoiam.

Algum comentário final?

Duncan: O código que estava a correr está a ser descontinuado e em breve o código que estava a correr Cardano a mais de um mês deixará de existir. Uma vez que toda a gente corra o novo código na rede principal e uma vez acabados de trocar os nós principais, o código antigo será redundante. Estamos neste momento na fase de transição e ninguém está a gritar que os céus estão a cair. Ninguém notou nada.

Edsko: Isto é uma grande realização em si. A ideia do OBFT foi crucial na realização da transição, mas deixa de ser relevante uma vez que façamos a transição para Shelley. Isto foi uma forma genial de nos livrarmos de código legado, que por vezes é muito difícil de fazer, conforme os bancos sabem a seu grande custo.

Duncan: E se tudo correr bem, nem sequer notas.

Duncan e Edsko, agradecemos o vosso tempo. Penso que é melhor deixá-los voltar.