(Publicado originalmente no blog IOHK, no dia 06/05/2020, traduzido por Joselmo Cabral)
Combinador facilita o trabalho para o hard fork Shelley
Um olhar nos bastidores com Duncan Coutts e Edsko de Vries
Desde que o lançamento da Rede de Testes Incentivada marcou a chegada da era Shelley no ano passado, a plataforma Cardano entrou em um período de desenvolvimento veloz. O protocolo de consenso do Ouroboros Classic ofereceu suporte a Cardano Byron e a criptomoeda ada nos últimos 30 meses, e em breve mudaremos para o Ouroboros Praos. Esta é a versão do nosso protocolo de proof-of-stake (PoS) que inicialmente permitirá a Shelley durante a descentralização da Cardano. Ele introduz o processo de staking com recompensas monetárias para os detentores de ada e proprietários de stakepools.
Atualizamos o Cardano em 20 de fevereiro com um hard fork que mudou a rede principal do protocolo de consenso original, Ouroboros Classic, para uma versão atualizada, Ouroboros BFT. Esse hard fork da BFT iniciou um período de transição sob o Ouroboros BFT, uma versão reduzida do protocolo projetada para nos ajudar a mudar para o Praos, enquanto ainda impedia qualquer comportamento malicioso. Muitos provavelmente nem perceberam. Para os usuários da carteira Daedalus, isso significava uma atualização de software padrão. As trocas tiveram que ser atualizadas manualmente, mas eles tiveram várias semanas para fazer isso e estávamos à disposição para ajudar.
O próximo evento foi a ‘Byron reboot’ em 30 de março. Isso introduziu um código totalmente novo para muitos dos componentes do Cardano, incluindo um novo nó para dar suporte à delegação e descentralização, e aos futuros recursos da Shelley. Uma grande vantagem da nova base de código é que ela foi reprojetada para ser modular, de modo que muitos componentes podem ser alterados sem afetar os outros.
Por sua vez, a BFT atuará como o ponto de partida para o hard fork Shelley, o que acontecerá quando ficarmos felizes com a rede de testes Haskell. Esse segundo hard fork será um processo semelhante ao de fevereiro para as casas de câmbio, titulares de ada e usuários de carteiras e, esperançosamente, tão imperceptível quanto o primeiro.
No entanto, embora tudo pareça suave na superfície, há muita atividade oculta acontecendo. Como um pato nadando serenamente em um lago - enquanto seus pés estão furiosamente remando sob as águas calmas - nossos engenheiros de blockchain estão trabalhando duro nisso.
Então, sentamos dois dos principais engenheiros do projeto Cardano, Duncan Coutts e Edsko de Vries, para descobrir como eles o fizeram. Duncan é o líder arquitetônico de Cardano nos últimos três anos e, entre eles, Duncan e Edsko passaram 35 anos usando Haskell, a linguagem de programação usada para desenvolver a Cardano.
Duncan, como você fez?
Conforme descrito no roadmap da Cardano, os engenheiros de blockchain da IOHK acreditam em atualizações suaves de código. Em vez de tentar dar um salto do Ouroboros Classic para o Praos em uma única atualização - o que seria uma tarefa incrivelmente complexa -, foi uma abordagem em duas etapas usando o Ouroboros BFT como intermediário (Figura 1). O código BFT é compatível com os nós federados da era Byron e com os nós do estilo Shelley lançados na reinicialização do Byron. É como uma corrida de revezamento: um corredor (no nosso caso, executando um protocolo) entra na caixa de transferência onde o outro corredor está esperando; eles sincronizam suas velocidades (para que sejam perfeitamente compatíveis entre si) e depois entregam o bastão (operando a rede principal) e, em seguida, o novo corredor com o bastão continua da caixa de transferência para a próxima volta.
Figura 1. Roadmap da rede principal Byron para a Shelley
O processo do Daedalus Flight nos ajudou a desenvolver e testar rapidamente uma nova carteira e, uma vez que todos executam isso na rede principal e quando terminamos de trocar os nós principais, o código antigo se tornará redundante. Estamos nessa fase de transição no momento, com uma nova carteira Daedalus mainnet lançada em 24 de abril.
Nosso objetivo é ter uma ‘entrada elegante em Shelley’, como descreve o chefe da IOHK, Charles Hoskinson, em seu vídeo de whiteboard sobre o hard fork. Uma ferramenta vital para fazer essa mudança foi a criação de um combinador de hard fork.
Isso parece como uma equipamento de fazenda, o que é isso mais especificamente?
Um combinador é apenas um termo técnico para algo que combina outras coisas. Por exemplo, a adição é um combinador de números. Um combinador de hard hork combina dois protocolos em um único protocolo. Chamamos isso de uma combinação seqüencial dos dois protocolos, porque ele executa o primeiro protocolo por um tempo e, em algum momento, passa para o segundo. No nosso caso, são duas versões do Ouroboros à medida que passamos do BTF para o Praos.
A parte inteligente de tudo isso tem sido o uso de módulos discretos que fazem seu trabalho, enquanto sabem o mínimo possível um do outro e do blockchain. Simplicidade é a chave aqui e esse processo de extrair os detalhes chamamos de “abstração”. A maioria dos módulos de consenso nem precisa saber que está lidando com uma criptomoeda e pode estar colocando praticamente qualquer coisa em um blockchain. Por exemplo, realizamos seminários usando o exemplo de um ledger Pokémon em um blockchain Ouroboros. A única coisa diferente são as regras do ledger; o consenso é o mesmo. Você acabou de configurá-lo - instancia-lo no jargão da programação - com as regras para jogar Pokémon e não para a contabilidade no estilo UTXO. [Para leitores com interesse técnico, esteja atento a Edsko que se aprofundará no processo de ‘abstração’ e combinadores em uma futura postagem no blog.]
Você faz isso parecer simples
Na verdade, é complicado porque Cardano está executando a criptomoeda ada e várias outras coisas ao mesmo tempo. Pense nisso como mudar todas as rodas de um carro enquanto você dirige e reboca uma caravana. Portanto, temos que ter certeza de que podemos fazer isso de uma maneira totalmente confiável.
Poderíamos ter encarado isso como uma tarefa pontual, mas fazia sentido fazê-lo de maneira genérica, usando um combinador de protocolo. Escolhemos essa rota porque obteremos um melhor resultado e os testes essenciais para garantir que o código funcione serão muito mais fáceis. Além disso, haverá mais hard forks no futuro, o que tornou a escolha ainda mais clara. Por exemplo, quando nos aproximamos do ponto culminante do desenvolvimento de Cardano e passarmos pelas eras de Goguen, Basho e Voltaire, haverá pelo menos um hard fork em cada estágio.
Então, como você lidou com as partes difíceis?
Bem, primeiro, tivemos que fazer isso sem uma pesquisa a qual recorrer. Os pesquisadores descrevem um único protocolo como algo perfeito e independente. Mas não é onde estamos. Estamos tentando rodar o Praos depois de começar com uma chain que estava usando outra coisa. O que Edsko está trabalhando, passando de um protocolo para outro de maneira genérica, simplesmente não é abordado nas pesquisas. E é difícil, é complicado. Todos os detalhes precisam de muito pensamento, muito coceira na cabeça. Mas alternar entre as bases de código Cardano não é o tipo de coisa que os acadêmicos podem esperar que sejam publicadas. Não possui um aspecto novo e é visto apenas como um problema de implementação.
Edsko, pode nos dar um exemplo?
Como dito por Duncan, para os pesquisadores, esses problemas de implementação são triviais, mas lidar com eles é 99% do que fazemos. Leve o problema do tempo para um blockchain. É no que eu tenho batido minha cabeça por algumas semanas. O tempo é dividido em slots, onde a chain pode conter no máximo um bloco por slot. Geralmente, precisamos converter entre os números de slot e o horário no mundo real, por exemplo, quando um nó precisa saber ‘É a minha vez?’ Para gerar o próximo bloco. Isso é fundamental para Cardano, mas o comprimento de um slot muda após o hard fork. Para Byron, um slot é de 20 segundos; para Shelley, serão dois segundos, ou talvez um. Para realmente complicar as coisas, o momento exato em que o hard fork é feito é decidido na própria chain. No entanto, precisamos saber quando é o ponto de transição. É um dilema: para fazer conversões de slot, preciso conhecer o estado do blockchain, mas para saber o estado, preciso conhecer as conversões de slot!
Este é um verdadeiro território de ovos e galinhas, com muitas coisas complexas a serem desembaraçadas. Temos que ser muito precisos na maneira como fazemos as coisas. Pode ser trivial em teoria, mas é muito difícil separar as coisas e garantir que não seja um problema circular.
Não podemos nos dar ao luxo de errar, então como você sabe que está certo?
Duncan: Essa é uma excelente pergunta. Minha resposta é que você chega à resposta em dois níveis. O primeiro é intelectual: você analisa o problema, faz as contas, conversa com colegas e luta com ele até ver como tudo se encaixa. Segundo, fazemos todos os nossos testes do QuickCheck para nos dar a confiança de que isso faz o que achamos que faz. Fazemos testes extensivos que realmente nos levam a casos incomuns em que você nunca imaginou, incluindo essa mudança. Podemos fazer 100.000 testes toda vez que alteramos uma linha de código. [Lars Brünjes escreveu sobre como John Hughes, um dos criadores de Haskell, ajudou a IOHK a desenvolver suas estratégias de teste.]
Edsko: Sim, eu concordo com esses dois pontos. Em termos de combinador, resolvo essas coisas pensando nas garantias que o código que escrevo precisa fornecer e que garante que ele, por sua vez, precisa do ledger. Esboço uma prova matemática de que esse raciocínio “se-então” é realmente justificado e depois recorro às equipes de métodos formais. A equipe de métodos formais são as pessoas que configuram as regras matemáticas que descrevem o blockchain e, em seguida, podem ajustar as regras de forma a fornecer as garantias necessárias.
Em termos do segundo ponto de Duncan, sei que o problema de tempo que mencionei acima está correto, pensando muito matematicamente e testando. As decisões de tempo são fáceis quando temos o blockchain completo, mas são difíceis quando temos que fazer previsões sobre o futuro. Felizmente, a maneira como configuramos as coisas significa que posso criar facilmente blockchains de teste. Então, eu posso criar um blockchain completa e depois cortar essa chain pela metade. Pego a primeira metade e considero que está no presente; e defino a outra metade no futuro. Depois, posso usar o “presente” (primeira metade) para fazer previsões sobre o “futuro” (segunda metade) e verificá-las em relação à coisa toda (na qual os cálculos são fáceis). Se eles combinam, então eu sei que está tudo bem.
Quando você começou isso?
Logo após Duncan surgir com a idéia genial do OBFT. Estou pensando no combinador há 18 meses. Era um objetivo de design desde o início de nossa reescrita modular de Ouroboros a partir de outubro de 2018, com meu primeiro commit no repositório GitHub. Tivemos uma demonstração de protótipo com OBFT e Praos logo depois, em dezembro de 2018.
E quantas pessoas foram envolvidas?
Duncan: Muitas pessoas estão trabalhando no código de consenso, mas sempre que temos algo realmente difícil, como esse combinador, damos a Edsko: ele é extraordinário como nosso engenheiro de software! Essa é a programação Haskell como escalada livre, em vez de escalar com as cordas de métodos formais de apoio.
Alguma ideia final?
Duncan: O código que estava sendo executado está sendo eliminado no momento e logo o código que estava executando o Cardano há um mês não existirá mais. Depois que todos executam o novo código na rede principal e quando terminamos de trocar os nós principais, o código antigo será redundante. Estamos nessa fase de transição agora e ninguém está gritando que o céu está caindo. Ninguém notou isso.
Edsko: Essa é uma conquista por si só. A ideia do OBFT foi crucial para fazer a transição, mas não será mais relevante que quando fizermos a transição para Shelley. Essa tem sido uma maneira de abandonarmos genuinamente o código legado, o que geralmente é muito difícil de fazer, como os bancos sabem quanto custa.
Duncan: E se tudo funcionar bem, você não notará nada.
Duncan e Edsko, obrigado pelo tempo. Acho melhor deixar vocês voltarem ao trabalho.