
Introdução
A comunidade de desenvolvimento de blockchain há muito precisa de abordagens poderosas de segurança e integridade de contratos inteligentes.
## Introdução e resumo
Este novo sistema de verificação formal vai mudar a forma como os programadores podem garantir a correção dos seus contratos inteligentes Solidity. É mais flexível do que outros métodos convencionais automatizados de prova de teoremas, por ser mais programável pelo ser humano, mas também oferece mais flexibilidade na expressão e demonstração das propriedades de correção do que antes.
Isso facilita para os programadores começarem a criar provas de que as especificações vêm da representação abstrata.
Introdução à estrutura
A estrutura compila provas verificáveis por computador da correção dos contratos inteligentes Yul numa sublinguagem do Lean proving assistant e pode compilar especificações para executá-las na EVM em conformidade com testes para verificar a correção do modelo.
Aproveita as ricas bibliotecas matemáticas e a automação de provas do ecossistema Lean e, portanto, este método tem mais intervenção manual do que outros métodos conhecidos de automação, mas qualquer argumento de correção que possa ser escrito em papel pode ser comprovado por computador.
A estrutura acede a bibliotecas de formalização matemática eficazes e opções de automação específicas do domínio. No entanto, como muitos teoremas matemáticos básicos ilustram, sempre haverá afirmações prováveis em nenhum sistema comprovado poderoso o suficiente para prová-las.
Essa possibilidade deve abrir as portas para a verificação de propriedades complexas de correção de contratos inteligentes. A estrutura é especialmente propícia para ilustrar a sua força, verificando propriedades complexas de algoritmos de aproximação numérica aplicados em aplicações financeiras descentralizadas e verificadores de conhecimento zero na cadeia.
Arquitetura técnica e funcionalidades
Para facilitar ao máximo a base de confiança, a estrutura foi apoiada por financiamento para testar a semântica em relação aos conjuntos de testes de conformidade Ethereum e para estender o modelo aos mais recentes planos de atualização Ethereum. Este modelo melhorado será publicado como um bem público.
A estrutura inclui um gerador de condições de verificação, que consegue extrair programas Yul para o assistente de prova Lean. Ele não só divide os programas em blocos gerenciáveis e fáceis de entender, como também gera descrições simplificadas da semântica desses blocos.
A estrutura também suporta a escrita de provas através do fornecimento de uma biblioteca de teoremas e ferramentas de automação. As provas podem então ser verificadas com a ajuda do LeanCompiler, cujo núcleo de verificação de provas é um pouco menor, mas que atualmente é considerado livre de erros no sentido de aceitar provas de proposições falsas.
Essa abordagem tem a vantagem de permitir escrever qualquer propriedade que possa ser escrita e provada formalmente no papel e verificar com o LeanCompiler, que tem um kernel de verificação de provas relativamente pequeno e atualmente é considerado livre de bugs no sentido de aceitar provas de proposições falsas. Essa flexibilidade é mais forte do que a maioria dos métodos automatizados, que são limitados pelo raciocínio embutido dos métodos.
Composicionalidade e abstração
As propriedades de composicionalidade e abstração implicam que os componentes comprovados do código são preservados pelo seu uso em novas situações. Isso permite a substituição de grandes partes do código sofisticado por declarações simples das suas ações.
Ele pode até mesmo suportar a substituição segura de implementações de código por outras alternativas, mas semanticamente equivalentes, por exemplo, otimizando algoritmos e mantendo garantias de correção.
A estrutura oferece automação controlada e extensível por meio de procedimentos personalizados que geram provas verificadas pelo sistema subjacente. Isso reduz bastante o trabalho manual e as garantias de verificação são mantidas.
Componentes do sistema e fluxo de trabalho
A estrutura tem três componentes principais que colaboram para oferecer um amplo poder de verificação:
- •Modelo do dialeto Yul EVM, que explica a semântica do código Yul no ambiente do assistente de prova. É isso que dá ao raciocínio sobre o comportamento dos programas a sua semântica subjacente
- •Coleção de táticas e teoremas personalizados especialmente criados para facilitar a escrita de provas sobre programas Yul. Essas ferramentas processam padrões e operações comuns que ocorrem com frequência na verificação de contratos inteligentes
- •O gerador de condições de verificação cria modelos de prova com estrutura de alto nível e produz automaticamente provas que simplificam os programas Yul para formas canónicas. Essas condições de verificação não são mais especificadas em termos da linguagem Yul, mas sim de uma forma mais acessível
A verificação é um processo estruturado. Os utilizadores começam com um programa Yul e compilam-no com opções especiais do compilador para produzir um código que satisfaça os pressupostos estruturais da estrutura. Este código é então processado pelo gerador de condições de verificação para gerar a infraestrutura de prova necessária.
Comece a verificar os seus contratos inteligentes hoje mesmo
Transforme o seu desenvolvimento Solidity com verificação formal. Comece agora.
Requisitos de compilação do contrato
A estrutura pressupõe alguma estrutura dos códigos Yul.
Implementação prática: função de multiplicação
Para implementar uma função de multiplicação, os seguintes requisitos estruturais devem ser cumpridos compilando o código a seguir com sinalizadores específicos do compilador. Este exemplo mostra como a estrutura é capaz de gerenciar funções escritas pelo usuário e estruturas de fluxo de controle arbitrárias.
O processo de multiplicação tem duas entradas e faz uma multiplicação adicionando um valor a um acumulador o número necessário de vezes.
As quebras condicionais são usadas dentro de loops em vez de condições de loop padrão para mostrar que a estrutura pode funcionar com um cenário de fluxo de controlo complexo.
Processo do Gerador de Condições de Verificação
Executar o gerador de condições de verificação num programa gera uma hierarquia de ficheiros estruturada com os seus ficheiros gerados. A estrutura geral consiste em:
- •Arquivos gerados em relação a cada arquivo Yul e um contrato
- •Outras subpastas comuns de blocos de código abstraídos
A estrutura de trabalho decompõe automaticamente os programas em unidades e produz lógica de integração para garantir que as unidades compostas sejam o programa original. Cada bloco de código elementar produz três tipos de ficheiros que podem ser facilmente compreendidos, componentes reutilizáveis e melhor desempenho e escalabilidade.
O código do programa Yul e o raciocínio específico da estrutura incluem condições de verificação e provas de que a execução do bloco de código resulta numa condição de verificação representada nos ficheiros de família gerados. Esses ficheiros fazem a ponte entre a especificação/satisfação e a execução do código, e deve-se ter um cuidado especial com os ficheiros de família do utilizador, pois são os ficheiros gerados pela estrutura que contêm a lógica de verificação que o utilizador precisa completar.
Para preencher lacunas lógicas, o sistema precisa fornecer especificações de comportamento condicional. Para expressar a semântica de controlo de loop, o sistema oferece utilitários para operações de rotina, como sair do loop e acessar variáveis nos estados do programa.
As especificações não precisam estar incorretas, mas podem não refletir facilmente o comportamento pretendido caso não especifiquem pontos importantes. Os problemas de especificação são geralmente a parte mais difícil da verificação formal, às vezes até mais do que a redação das provas propriamente dita.
Desafios de verificação de loop
Os loops são muito difíceis de verificar com um sistema de verificação, e isso se deve, em parte, ao raciocínio indutivo que muitas vezes é necessário nesse tipo de sistema. A estrutura lida com isso fornecendo especificações sistemáticas dos componentes do loop.
O utilizador precisa especificar:
- •Condições de rescisão
- •Comportamento pós-iteração
- •Comportamento do corpo do loop
- •Invariantes de loop em geral
A estrutura suporta a descrição da semântica de loop de atualizações simples de variáveis para elaborar lógica condicional. Embora esse tipo de tecnicidade possa não parecer muito transparente à primeira vista, ela garante que todas as possibilidades de execução sejam cobertas.
Construção e automação de provas
Com as especificações estabelecidas, o utilizador deve demonstrar que as condições de verificação podem comprovar as especificações definidas. A estrutura oferece automação massiva para processar padrões típicos de provas.
Táticas personalizadas são usadas para processar:
- •Armazene as manipulações em variáveis
- •Raciocínio de fluxo de controlo
- •Outros problemas comuns de verificação
Esses métodos automatizados contribuem para uma redução substancial do esforço manual necessário para realizar as provas e ainda mantêm o nível extremo de verificação.
O processo de prova geralmente começa desdobrando as abstrações correspondentes, uma vez que essas provas estão diretamente ligadas às propriedades definidas pelo utilizador. Ele aplica a estrutura para automatizar uma grande quantidade de condições de verificação com táticas de limpeza de uso geral usadas para gerenciar detalhes técnicos, como operações de armazenamento de variáveis e transições de estado.
Recursos avançados e desenvolvimento futuro
A estrutura é uma ferramenta complexa para transformar qualquer programa Yul num conjunto de declarações sobre o que se espera que o programa faça e provar que o código satisfaz as expectativas. Os programas são inicialmente traduzidos para programas com provas de consistência numa representação abstrata, fornecendo pontos de partida simplificados para provas de especificação adicionais.
Os padrões no raciocínio do programa Yul, como operações em um armazenamento de variáveis, são tratados por procedimentos de automação personalizados.
Desenvolvimento adicional
O desenvolvimento adicional contém várias melhorias notáveis:
- •O modelo hash confiável vai ter a semântica de operação criptográfica correta
- •A modelagem de chamadas entre contratos vai permitir a análise de padrões complexos de interação
- •A precisão semântica vai ser verificada por modelagem de gás, levando em conta o custo de execução
- •A adesão às alterações mais recentes dos planos de atualização da Ethereum tornará a rede compatível com o comportamento da rede existente
- •Melhorar a usabilidade vai permitir que os utilizadores tornem o uso diário mais eficiente e fácil de usar
É possível fazer mais trabalho para extrair clientes de execução Ethereum das especificações e criar compiladores Yul para bytecode EVM formalmente verificados.
Integração com bibliotecas matemáticas
A estrutura baseia-se numa ampla gama de bibliotecas matemáticas e de ciência da computação no seu sistema de prova subjacente. Essas bibliotecas oferecem conceitos formalizados que frequentemente ocorrem durante o raciocínio sobre programas, simplificando muito o esforço necessário para fazer provas complexas.
As táticas personalizadas são baseadas num ambiente de metaprogramação robusto, sem comprometer a verificação. A natureza composível da automação, ancorada em padrões de uso observados, é o que garante que a usabilidade continue a melhorar ao longo do tempo.
A arquitetura para codificar Yul diretamente no ambiente de prova torna a interface transparente e natural para os programadores habituados à linguagem e oferece capacidades nunca antes vistas na verificação automatizada para garantir que o código está correto.


