Pular para o conteúdo principal
Todos os estudos de caso
Ethereum Foundation · Blockchain · Python · 2023–2024

Relatando um Bug em integer_squareroot na Especificação de Consenso do Ethereum

O ESBMC-Python, o primeiro verificador baseado em BMC publicamente disponível para programas Python (segundo o artigo ISSTA 2024 §4), identificou uma divisão por zero no auxiliar integer_squareroot da especificação de consenso do Ethereum. A correção foi integrada ao upstream em ethereum/consensus-specs.

PR #3600

Correção integrada ao upstream em ethereum/consensus-specs (15 Feb 2024)

First

Verificador de código Python baseado em BMC publicamente disponível (segundo o artigo ISSTA 2024 §4)

ISSTA 2024

Publicado na ACM SIGSOFT ISSTA, trilha Tool Demonstrations

EF FY22-0751

Grant da Ethereum Foundation concedido à equipe do projeto BMC da University of Manchester

Desafio

A especificação de consenso do Ethereum é a referência em Python que todas as implementações de cliente da camada de consenso do Ethereum devem seguir. Ela governa os processos de inclusão de nós, validação e penalização de validadores. Erros nesta especificação podem se propagar a todo cliente em conformidade e, no pior caso, levar a problemas de disponibilidade ou outras interrupções operacionais da camada de consenso.

A especificação é escrita em Python. Embora trabalhos anteriores de métodos formais tivessem mirado partes da beacon chain do Ethereum 2.0, nenhum verificador baseado em BMC para Python havia sido publicamente disponibilizado; a única ferramenta diretamente comparável (MSV) não tinha código-fonte público nem artefatos reproduzíveis. Não havia, portanto, nenhum verificador limitado de modelos pronto para uso a aplicar à base de código Python do eth2spec.

Abordagem

Nossa equipe liderou o desenvolvimento do ESBMC-Python, o primeiro verificador de código Python baseado em BMC publicamente disponível (segundo o artigo ISSTA 2024 §4). O ESBMC-Python é lançado como parte do projeto open-source ESBMC. Ele faz o parsing de Python em uma AST, realiza inferência de tipos (inserindo nós AnnAssign com informação de tipo explícita) e, então, traduz expressões e comandos Python para a representação intermediária GOTO do ESBMC, onde se aplica o pipeline existente de execução simbólica + resolução SMT. As propriedades verificadas incluem divisão por zero, estouros aritméticos e falhas de asserção.

Para aplicar o ESBMC-Python à especificação de consenso do Ethereum (eth2spec), estendemos o front-end com tipos customizados; uint64, uint128 e uint256; e verificamos cada função individualmente com entradas não determinísticas.

O bug

integer_squareroot helper (Python)
def integer_squareroot(n: uint64) -> uint64:
  x = n
  y = (x + 1) // 2  # ← overflows to 0 when n = 2⁶⁴ − 1
  while y < x:
    x = y                 # x becomes 0 after the overflow
    y = (x + n // x) // 2  # ← ZeroDivisionError: n // 0
  return x

# Input:  n = 2⁶⁴ − 1 (maximum uint64 value)
# Result: ZeroDivisionError, the unsigned integer overflows to 0,
#         then is used as the denominator of a division operation.
# ESBMC-Python: confirmed the bug and produced a counterexample trace.

Resultados

Uma divisão por zero no auxiliar integer_squareroot do eth2spec: um inteiro sem sinal sofreu overflow para zero após ser incrementado e foi posteriormente usado como denominador de uma operação de divisão (segundo o artigo ISSTA 2024 §3.1).

A correção foi integrada ao upstream como ethereum/consensus-specs PR #3600 ("Handle integer_squareroot bound case", integrada em 15 de fevereiro de 2024). A descrição da PR credita nossa equipe por relatar o problema.

O trabalho foi publicado como uma Tool Demonstration na ACM SIGSOFT ISSTA 2024 e apoiado pelo grant FY22-0751 da Ethereum Foundation ("Bounded Model Checking for Verifying and Testing Ethereum Consensus Specifications").

Referências

  1. Bruno Farias, Rafael Menezes, Eddie B. de Lima Filho, Youcheng Sun, Lucas C. Cordeiro. ESBMC-Python: A Bounded Model Checker for Python Programs. ISSTA 2024: 1836–1840. doi.org/10.1145/3650212.3685304
  2. ethereum/consensus-specs PR #3600. Handle integer_squareroot bound case. Merged 15 February 2024. github.com/ethereum/consensus-specs/pull/3600

Nota. Esta página descreve um engajamento de pesquisa acadêmica publicado apoiado pela Ethereum Foundation sob o grant FY22-0751. Afirmações sobre o bug, a ferramenta e a metodologia de verificação acompanham o artigo ISSTA 2024; a correção upstream foi integrada via o pull request do GitHub vinculado, onde a equipe core do Ethereum credita explicitamente a equipe do projeto. Estatísticas em nível de rede sobre a presença de implantação do Ethereum não estão no escopo do artigo publicado e não são afirmadas aqui.