🇵🇹 Cardano Janeiro Post-Mortem

Lanningham

18 de abril de 2023 - 5 minutos de leitura

Cardano Janeiro Post-Mortem

Introdução

Em 23 de janeiro, a blockchain Cardano passou por seu primeiro teste de resiliência em larga escala no mundo real. Aproximadamente 60% de todos os nós Cardano travaram e reiniciaram. Como parte da equipe de triagem, fui solicitado a escrever uma postagem no blog fornecendo uma análise post mortem centrada na comunidade do incidente, a resposta rápida da IOG e da comunidade e a robustez da rede Cardano.

O incidente

Em 23 de janeiro às 19:09:01 EST, a rede Cardano enfrentou um desafio inesperado quando um número significativo de nós caiu e foi reiniciado. O problema foi prontamente relatado no GitHub pelo membro da comunidade Smaug, que pode ser encontrado aqui . Você pode encontrar o relatório oficial do incidente da IOG, divulgado hoje, aqui .

Uma resposta rápida

Em resposta ao problema relatado, a IOG rapidamente formou uma força-tarefa, reunindo membros da comunidade, inclusive eu, para identificar a causa do acidente e desenvolver uma solução. A força-tarefa conseguiu identificar prováveis ​​candidatos para o travamento e liberar uma correção para os nós de produção de blocos a serem adotados em uma semana.

De acordo com uma política de divulgação responsável, para minimizar o risco de um ataque enquanto os produtores de blocos estavam atualizando, os detalhes exatos foram mantidos internamente. Recentemente, os detalhes da correção foram publicados como uma solicitação pull aberta que pode ser encontrada aqui .

Uma rede resiliente

Um dos pontos-chave a enfatizar é a resiliência da rede Cardano. Apesar do número significativo de nós travando, a rede conseguiu se recuperar em minutos, conforme planejado. Essa rápida recuperação mostra a robustez do blockchain Cardano e sua capacidade de lidar com desafios inesperados.

Reproduzindo a validação do problema e correção

Os engenheiros da equipe IOG Ledger identificaram com sucesso a provável causa do bug. A força-tarefa teve um papel de apoio ao debater ideias e validar as hipóteses apresentadas pelos engenheiros. Aproveitando o QuickCheck, uma estrutura de teste baseada em propriedade, os testes de unidade foram criados para reproduzir o problema em pequena escala. Este processo permitiu a validação da correção proposta em um ambiente controlado. Apesar de nosso sucesso em resolver o problema usando o QuickCheck, enfrentamos desafios ao tentar reproduzir o bug em uma rede de teste totalmente privada. Embora isso limitasse nossa capacidade de confirmar a correção em uma escala maior, a equipe permaneceu confiante de que a causa raiz do problema foi abordada e que a correção evitaria falhas semelhantes no futuro.

Divulgação Responsável

A IOG esperou por um período apropriado antes de publicar os detalhes da correção, junto com esta postagem no blog, a fim de aderir às práticas de divulgação responsável. Essa decisão foi tomada para minimizar o risco de atores mal-intencionados reproduzirem o bug e causarem travamentos repetidos, garantindo a segurança e a estabilidade da rede Cardano.

Detalhes técnicos

A causa raiz da vulnerabilidade pode ser rastreada até as invariantes violadas em Data.Map, que ocorreram devido à implementação de um mapa semipersonalizado chamado “CanonicalMap” para rastrear dados MultiAsset. A função de inserção personalizada no CanonicalMap pode levar a estruturas de árvore desequilibradas e, por sua vez, travar os nós.

Para acionar esse bug raro, uma sequência específica de eventos precisava ocorrer:

  • Uma sequência de transações criou o estado interno correto no UTXO para preparar o sistema para a vulnerabilidade.

  • Um nó reiniciado, redefinindo seu UTXO para uma estrutura interna diferente.

  • O nó recebeu uma transação em seu mempool, consumindo UTXOs com vários IDs de política diferentes ou tokens nativos. Esta transação não causou travamento no nodo ao qual foi submetida, mas desencadeou travamentos em outros nodos com a estrutura interna “perigosa”.

  • A transação se propagou para mempools de outros nós sem causar falhas imediatas.

  • O nodo cunhou um bloco contendo a transação e a propagou para os pares.

  • Quando o bloco alcançou outros nós, eles travaram ao tentar adotar o bloco.

O bug era difícil de reproduzir devido à complexa interação de fatores e à sequência precisa de eventos necessários. É notável que esse bug raro tenha sido descoberto relativamente cedo na história dos retornos de multiativos e colaterais, considerando o conjunto único de condições necessárias para que ele ocorra.

cardano-slurp

Uma coisa que saiu desse incidente foi um projeto pessoal meu, cardano-slurp . Parte do que dificultou a triagem desse incidente é que todos os nós que viram os dados que causaram a falha… travaram. Cardano-slurp é um programa que age como um cardano-node para a rede, fofocando sobre blocos e transações, mas simplesmente os arquiva, sem processá-los de forma alguma. Isso nos permitirá capturar qualquer resíduo tóxico no futuro, bem como escrever análises interessantes sobre os padrões de tráfego de rede do mundo real.

Conclusão

É importante destacar a rapidez de resposta da IOG e da comunidade, bem como a resiliência da rede. Os esforços da força-tarefa levaram a uma correção oportuna, e o incidente serve como um lembrete da importância da colaboração e da comunicação transparente no mundo da tecnologia blockchain.

image