Análise da segurança da linguagem Move: o revolucionário das linguagens de contratos inteligentes
A linguagem Move é uma linguagem de contratos inteligentes que pode ser executada em ambientes de blockchain que implementam a MoveVM. Desde o seu design inicial, considerou diversas questões de segurança relacionadas a blockchain e contratos inteligentes, e se baseou no design de segurança da linguagem RUST. Como uma nova geração de linguagem de contratos inteligentes com segurança como característica principal, qual é o seu nível de segurança? Pode ela evitar, a nível de linguagem ou através de mecanismos relacionados, as ameaças de segurança comuns em máquinas virtuais de contratos como EVM, WASM, etc.? Existem problemas de segurança específicos que ela própria apresenta?
Este artigo irá explorar a questão da segurança da linguagem Move a partir de três aspectos: características da linguagem, mecanismo de execução e ferramentas de verificação.
1. Características de segurança da linguagem Move
Ao contrário de muitas linguagens de programação existentes, a linguagem Move foi projetada para suportar a escrita de programas que interagem de forma segura com código não confiável, além de suportar a verificação estática. A Move possui essas características de segurança porque abandonou a lógica não linear baseada em considerações de flexibilidade, não suporta despacho dinâmico e também não suporta chamadas externas recursivas, mas utiliza conceitos como genéricos, armazenamento global, recursos, entre outros, para implementar alguns padrões de programação alternativos. Por exemplo, a Move omite as características de despacho dinâmico e chamadas recursivas, que em outras linguagens de contratos inteligentes levam a vulnerabilidades de reentrada custosas.
As principais características de segurança do Move incluem:
módulo (Module): Cada módulo Move é composto por uma série de tipos de estrutura e definições de procedimentos. Os módulos podem importar definições de tipo e chamar procedimentos declarados em outros módulos.
Estruturas(: podem ser definidas como tipos de recursos, indicando que podem ser armazenados em armazenamento persistente de chave/valor global.
过程)Function(: define a lógica de negócios do contrato.
Armazenamento Global: Permite que programas Move armazenem dados persistentes, que só podem ser lidos/escritos programaticamente pelo módulo que os possui.
Verificação de invariantes: é possível definir invariantes de verificação estática, que representam a conservação de recursos no sistema.
validador de bytecode: realiza a validação de tipo de segurança e linearização do bytecode, impondo regras de criação, destruição e acesso a recursos.
Através dessas características, o Move pode garantir uma alta segurança em tempo de compilação. A seguir, vamos analisar o mecanismo de execução do Move e ver como o MoveVM garante a segurança em tempo de execução.
![Análise de segurança do Move: a linguagem de contratos inteligentes que muda o jogo])https://img-cdn.gateio.im/webp-social/moments-69101617731b12c40620802eecf76caf.webp(
2. Mecanismo de funcionamento do Move
O programa Move é executado em uma máquina virtual e não pode acessar a memória do sistema durante a execução. Isso permite que o Move funcione de forma segura em ambientes não confiáveis, sem ser comprometido ou abusado.
O programa Move é executado na pilha. O armazenamento global é dividido em memória ) pilha ( e variáveis globais ) pilha (. A memória é um armazenamento de primeira ordem, não pode armazenar ponteiros que apontam para unidades de memória. As variáveis globais são usadas para armazenar ponteiros que apontam para unidades de memória, mas o método de indexação é diferente da memória.
As instruções de bytecode do Move são executadas em um interpretador baseado em pilha. A máquina virtual baseada em pilha é fácil de implementar e controlar, exige menos do ambiente de hardware e é adequada para cenários de blockchain. Ao mesmo tempo, em comparação com um interpretador baseado em registradores, o interpretador baseado em pilha torna mais fácil controlar e detectar cópias e movimentos entre variáveis.
O estado de execução do programa Move é uma quádrupla ⟨C, M, G, S⟩, composta pela pilha de chamadas )C(, pela memória )M(, pelas variáveis globais )G( e pelos operandos )S(. A pilha também mantém uma tabela de funções para resolver instruções que contêm o corpo da função.
A pilha de chamadas contém todas as informações de contexto e números de instrução da execução do processo. Um novo objeto de pilha de chamadas é criado ao executar a instrução Call, armazenando os parâmetros da chamada e, em seguida, executando as instruções do novo contrato. Quando uma instrução de ramificação é encontrada, ocorre um salto estático dentro do processo. Este design evita a despachação dinâmica, reforçando a imutabilidade das chamadas de função, evitando assim a possibilidade de reentrância.
O MoveVM separa o armazenamento de dados e a pilha de chamadas do processo lógico ), que é a maior diferença em relação ao EVM. No MoveVM, os recursos sob o endereço da conta de estado do usuário ( são armazenados de forma independente, e as chamadas de programa devem cumprir regras obrigatórias relacionadas a permissões e recursos. Embora esse design sacrifique certa flexibilidade, ele proporciona uma grande melhoria em segurança e eficiência de execução.
![Análise de segurança do Move: A mudança de jogo da linguagem de contratos inteligentes])https://img-cdn.gateio.im/webp-social/moments-372ff914a241634ca57784dc9685a03d.webp(
3. Mover Prover
Move Prover é uma ferramenta de verificação formal baseada em raciocínio. Utiliza uma linguagem formal para descrever o comportamento do programa e algoritmos de raciocínio para verificar se o programa está conforme o esperado, ajudando os desenvolvedores a garantir a correção dos contratos inteligentes e assim reduzindo o risco de transações.
O Move Prover utiliza um algoritmo de verificação dedutiva para validar se o programa está de acordo com as expectativas. Ele pode inferir o comportamento do programa com base em informações conhecidas e garantir que corresponda ao comportamento esperado. Isso ajuda a garantir a correção do programa e reduz a carga de trabalho dos testes manuais.
O fluxo de trabalho do Move Prover é o seguinte:
Receber o arquivo fonte Move como entrada, sendo necessário definir as especificações de entrada do programa nesse arquivo.
Move Parser extrai a especificação do código-fonte.
O compilador Move compila o arquivo de origem em bytecode, transformando-o em conjunto com o sistema de referência no modelo de objeto do validador.
O modelo é traduzido para a linguagem intermediária Boogie.
O sistema de verificação Boogie realiza a "geração de condições de verificação" para a entrada.
As condições de verificação são passadas para o solucionador Z3 para verificação.
Se a norma for válida, a verificação é aprovada; caso contrário, gera-se um relatório de diagnóstico.
Para descrever o sistema de especificações, o Move utiliza a Move Specification Language, que é um subconjunto da linguagem Move, introduzindo suporte para a descrição estática do comportamento de correção do programa. A Move Specification Language pode ser independente como um arquivo de especificação dedicado, permitindo que o código de negócios e o código de verificação formal sejam separados.
Move Prover é uma ferramenta muito útil que pode ajudar os desenvolvedores a garantir a correção dos contratos inteligentes. Ela utiliza uma linguagem formal para descrever o comportamento do programa e usa algoritmos de raciocínio para verificar se o programa está de acordo com as expectativas. Isso ajuda a reduzir o risco de transações, permitindo que os desenvolvedores implantem contratos inteligentes em ambientes de produção com mais confiança.
![Análise de Segurança do Move: a Mudança de Jogo da Linguagem de Contratos Inteligentes])https://img-cdn.gateio.im/webp-social/moments-f7cd11fef1c66709b219e1a1e8d2e4da.webp(
4. Resumo
A linguagem Move é excepcional em termos de design de segurança, oferecendo uma consideração abrangente nas características da linguagem, execução da máquina virtual e ferramentas de segurança. Nas características da linguagem, sacrifica parte da flexibilidade, impondo verificação de tipos e lógica linear, facilitando uma maior automação e verificabilidade de segurança durante a verificação de compilação e validação formal. O design da MoveVM separa o estado da lógica, alinhando-se melhor às necessidades de gestão de segurança de ativos na blockchain.
Em termos de linguagem, o Move pode evitar eficazmente vulnerabilidades comuns na EVM, como reentrância, estouro, injeções de Call/DeleGateCall, entre outras. No entanto, problemas como autenticação, lógica de código e estouro de estruturas de inteiros grandes ainda requerem atenção adicional dos desenvolvedores. Embora o Move Prover seja poderoso, pode não ser eficaz se houver negligência em termos gerais.
Embora a linguagem Move tenha considerado muitos aspectos de segurança para os programadores, não existe uma linguagem e um programa totalmente seguros. Recomenda-se que os desenvolvedores de contratos inteligentes Move utilizem serviços de auditoria de empresas de segurança terceirizadas e que a parte da especificação do código seja redigida e verificada por empresas de segurança terceirizadas, a fim de aumentar ainda mais a segurança dos contratos.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
Análise Profundidade da segurança da linguagem Move: o novo padrão para desenvolvimento de contratos inteligentes
Análise da segurança da linguagem Move: o revolucionário das linguagens de contratos inteligentes
A linguagem Move é uma linguagem de contratos inteligentes que pode ser executada em ambientes de blockchain que implementam a MoveVM. Desde o seu design inicial, considerou diversas questões de segurança relacionadas a blockchain e contratos inteligentes, e se baseou no design de segurança da linguagem RUST. Como uma nova geração de linguagem de contratos inteligentes com segurança como característica principal, qual é o seu nível de segurança? Pode ela evitar, a nível de linguagem ou através de mecanismos relacionados, as ameaças de segurança comuns em máquinas virtuais de contratos como EVM, WASM, etc.? Existem problemas de segurança específicos que ela própria apresenta?
Este artigo irá explorar a questão da segurança da linguagem Move a partir de três aspectos: características da linguagem, mecanismo de execução e ferramentas de verificação.
1. Características de segurança da linguagem Move
Ao contrário de muitas linguagens de programação existentes, a linguagem Move foi projetada para suportar a escrita de programas que interagem de forma segura com código não confiável, além de suportar a verificação estática. A Move possui essas características de segurança porque abandonou a lógica não linear baseada em considerações de flexibilidade, não suporta despacho dinâmico e também não suporta chamadas externas recursivas, mas utiliza conceitos como genéricos, armazenamento global, recursos, entre outros, para implementar alguns padrões de programação alternativos. Por exemplo, a Move omite as características de despacho dinâmico e chamadas recursivas, que em outras linguagens de contratos inteligentes levam a vulnerabilidades de reentrada custosas.
As principais características de segurança do Move incluem:
módulo (Module): Cada módulo Move é composto por uma série de tipos de estrutura e definições de procedimentos. Os módulos podem importar definições de tipo e chamar procedimentos declarados em outros módulos.
Estruturas(: podem ser definidas como tipos de recursos, indicando que podem ser armazenados em armazenamento persistente de chave/valor global.
过程)Function(: define a lógica de negócios do contrato.
Armazenamento Global: Permite que programas Move armazenem dados persistentes, que só podem ser lidos/escritos programaticamente pelo módulo que os possui.
Verificação de invariantes: é possível definir invariantes de verificação estática, que representam a conservação de recursos no sistema.
validador de bytecode: realiza a validação de tipo de segurança e linearização do bytecode, impondo regras de criação, destruição e acesso a recursos.
Através dessas características, o Move pode garantir uma alta segurança em tempo de compilação. A seguir, vamos analisar o mecanismo de execução do Move e ver como o MoveVM garante a segurança em tempo de execução.
![Análise de segurança do Move: a linguagem de contratos inteligentes que muda o jogo])https://img-cdn.gateio.im/webp-social/moments-69101617731b12c40620802eecf76caf.webp(
2. Mecanismo de funcionamento do Move
O programa Move é executado em uma máquina virtual e não pode acessar a memória do sistema durante a execução. Isso permite que o Move funcione de forma segura em ambientes não confiáveis, sem ser comprometido ou abusado.
O programa Move é executado na pilha. O armazenamento global é dividido em memória ) pilha ( e variáveis globais ) pilha (. A memória é um armazenamento de primeira ordem, não pode armazenar ponteiros que apontam para unidades de memória. As variáveis globais são usadas para armazenar ponteiros que apontam para unidades de memória, mas o método de indexação é diferente da memória.
As instruções de bytecode do Move são executadas em um interpretador baseado em pilha. A máquina virtual baseada em pilha é fácil de implementar e controlar, exige menos do ambiente de hardware e é adequada para cenários de blockchain. Ao mesmo tempo, em comparação com um interpretador baseado em registradores, o interpretador baseado em pilha torna mais fácil controlar e detectar cópias e movimentos entre variáveis.
O estado de execução do programa Move é uma quádrupla ⟨C, M, G, S⟩, composta pela pilha de chamadas )C(, pela memória )M(, pelas variáveis globais )G( e pelos operandos )S(. A pilha também mantém uma tabela de funções para resolver instruções que contêm o corpo da função.
A pilha de chamadas contém todas as informações de contexto e números de instrução da execução do processo. Um novo objeto de pilha de chamadas é criado ao executar a instrução Call, armazenando os parâmetros da chamada e, em seguida, executando as instruções do novo contrato. Quando uma instrução de ramificação é encontrada, ocorre um salto estático dentro do processo. Este design evita a despachação dinâmica, reforçando a imutabilidade das chamadas de função, evitando assim a possibilidade de reentrância.
O MoveVM separa o armazenamento de dados e a pilha de chamadas do processo lógico ), que é a maior diferença em relação ao EVM. No MoveVM, os recursos sob o endereço da conta de estado do usuário ( são armazenados de forma independente, e as chamadas de programa devem cumprir regras obrigatórias relacionadas a permissões e recursos. Embora esse design sacrifique certa flexibilidade, ele proporciona uma grande melhoria em segurança e eficiência de execução.
![Análise de segurança do Move: A mudança de jogo da linguagem de contratos inteligentes])https://img-cdn.gateio.im/webp-social/moments-372ff914a241634ca57784dc9685a03d.webp(
3. Mover Prover
Move Prover é uma ferramenta de verificação formal baseada em raciocínio. Utiliza uma linguagem formal para descrever o comportamento do programa e algoritmos de raciocínio para verificar se o programa está conforme o esperado, ajudando os desenvolvedores a garantir a correção dos contratos inteligentes e assim reduzindo o risco de transações.
O Move Prover utiliza um algoritmo de verificação dedutiva para validar se o programa está de acordo com as expectativas. Ele pode inferir o comportamento do programa com base em informações conhecidas e garantir que corresponda ao comportamento esperado. Isso ajuda a garantir a correção do programa e reduz a carga de trabalho dos testes manuais.
O fluxo de trabalho do Move Prover é o seguinte:
Para descrever o sistema de especificações, o Move utiliza a Move Specification Language, que é um subconjunto da linguagem Move, introduzindo suporte para a descrição estática do comportamento de correção do programa. A Move Specification Language pode ser independente como um arquivo de especificação dedicado, permitindo que o código de negócios e o código de verificação formal sejam separados.
Move Prover é uma ferramenta muito útil que pode ajudar os desenvolvedores a garantir a correção dos contratos inteligentes. Ela utiliza uma linguagem formal para descrever o comportamento do programa e usa algoritmos de raciocínio para verificar se o programa está de acordo com as expectativas. Isso ajuda a reduzir o risco de transações, permitindo que os desenvolvedores implantem contratos inteligentes em ambientes de produção com mais confiança.
![Análise de Segurança do Move: a Mudança de Jogo da Linguagem de Contratos Inteligentes])https://img-cdn.gateio.im/webp-social/moments-f7cd11fef1c66709b219e1a1e8d2e4da.webp(
4. Resumo
A linguagem Move é excepcional em termos de design de segurança, oferecendo uma consideração abrangente nas características da linguagem, execução da máquina virtual e ferramentas de segurança. Nas características da linguagem, sacrifica parte da flexibilidade, impondo verificação de tipos e lógica linear, facilitando uma maior automação e verificabilidade de segurança durante a verificação de compilação e validação formal. O design da MoveVM separa o estado da lógica, alinhando-se melhor às necessidades de gestão de segurança de ativos na blockchain.
Em termos de linguagem, o Move pode evitar eficazmente vulnerabilidades comuns na EVM, como reentrância, estouro, injeções de Call/DeleGateCall, entre outras. No entanto, problemas como autenticação, lógica de código e estouro de estruturas de inteiros grandes ainda requerem atenção adicional dos desenvolvedores. Embora o Move Prover seja poderoso, pode não ser eficaz se houver negligência em termos gerais.
Embora a linguagem Move tenha considerado muitos aspectos de segurança para os programadores, não existe uma linguagem e um programa totalmente seguros. Recomenda-se que os desenvolvedores de contratos inteligentes Move utilizem serviços de auditoria de empresas de segurança terceirizadas e que a parte da especificação do código seja redigida e verificada por empresas de segurança terceirizadas, a fim de aumentar ainda mais a segurança dos contratos.