A mentalidade de segurança de contrato inteligente

blog 1NewsDevelopersEnterpriseBlockchain ExplainedEvents and ConferencesPressboletins informativos

Assine a nossa newsletter.

Endereço de email

Nós respeitamos sua privacidade

HomeBlogBlockchain Development

A mentalidade de segurança de contrato inteligente

5 princípios de segurança que todo desenvolvedor Ethereum precisa saber, além de compensações fundamentais. por ConsenSys 17 de junho de 2020Postado em 17 de junho de 2020

Segurança Blockchain

Por ConsenSys Diligence, nossa equipe de especialistas em segurança de blockchain.

Embora a indústria esteja amadurecendo, o desenvolvimento de contratos inteligentes ainda é um campo relativamente novo e em maturação. Portanto, você deve esperar mudanças constantes no cenário de segurança, à medida que novos bugs e riscos de segurança são descobertos e novas práticas recomendadas são desenvolvidas. Aprendendo e seguindo Melhores Práticas é apenas o começo do trabalho de segurança que você precisará fazer como um desenvolvedor de contrato inteligente.

A programação de contrato inteligente requer uma mentalidade de engenharia diferente daquela com a qual você está acostumado. O custo do fracasso pode ser alto e a mudança pode ser difícil, tornando-se, de certa forma, mais semelhante à programação de hardware ou programação de serviços financeiros do que ao desenvolvimento web ou móvel. Portanto, não é suficiente se defender contra vulnerabilidades conhecidas. Em vez disso, você precisará aprender uma nova filosofia de desenvolvimento.

Prepare-se para o fracasso

Qualquer contrato não trivial conterá erros. Seu código deve, portanto, ser capaz de responder a bugs e vulnerabilidades normalmente.

  • Pause o contrato quando as coisas estiverem indo mal (“disjuntor”).
  • Gerenciar a quantidade de dinheiro em risco (limitação de taxa, uso máximo).
  • Tenha um caminho de atualização eficaz para correções de bugs e melhorias.

Lance com cuidado

É sempre melhor detectar bugs antes de uma versão de produção completa.

  • Teste os contratos completamente e adicione testes sempre que novos vetores de ataque forem descobertos.
  • Providenciar recompensas de insetos a partir de versões alpha testnet.
  • Implementação em fases, com uso e testes crescentes em cada fase.

Mantenha os contratos simples

A complexidade aumenta a probabilidade de erros.

  • Certifique-se de que a lógica do contrato é simples.
  • Modularize o código para manter os contratos e funções pequenas.
  • Use ferramentas ou códigos já escritos sempre que possível (por exemplo, não use seu próprio gerador de números aleatórios).
  • Prefira clareza ao desempenho sempre que possível.
  • Use o blockchain apenas para as partes do seu sistema que requerem descentralização.

Mantenha-se atualizado

Acompanhe os novos desenvolvimentos de segurança.

  • Verifique seus contratos para qualquer novo bug assim que for descoberto.
  • Atualize para a versão mais recente de qualquer ferramenta ou biblioteca o mais rápido possível.
  • Adote novas técnicas de segurança que pareçam úteis.

Esteja ciente das idiossincrasias do EVM

Embora grande parte da sua experiência de programação seja relevante para a programação Ethereum, existem algumas armadilhas que você deve conhecer.

  • Seja extremamente cuidadoso com as chamadas de contratos externos, que podem executar códigos maliciosos e alterar o fluxo de controle.
  • Entenda que suas funções públicas são públicas e podem ser chamadas de forma mal-intencionada e em qualquer ordem. Os dados privados em contratos inteligentes também podem ser vistos por qualquer pessoa.
  • Lembre-se dos custos do gás e do limite de bloqueio do gás.
  • Esteja ciente de que os carimbos de data / hora são imprecisos em um blockchain: os mineiros podem influenciar o tempo de execução de uma transação em uma margem de vários segundos.
  • A aleatoriedade não é trivial no blockchain, a maioria das abordagens para geração de números aleatórios podem ser jogados em um blockchain.

Trocas fundamentais

Existem várias compensações fundamentais a serem consideradas ao avaliar a estrutura e a segurança de um sistema de contrato inteligente. A recomendação geral para qualquer sistema de contrato inteligente é identificar o equilíbrio adequado para essas compensações fundamentais.

Um sistema de contrato inteligente ideal de um viés de engenharia de software é modular, reutiliza o código em vez de duplicá-lo e oferece suporte a componentes atualizáveis. Um sistema de contrato inteligente ideal de um viés de arquitetura segura pode compartilhar essa mentalidade, especialmente no caso de sistemas de contrato inteligente mais complexos.

No entanto, existem exceções importantes nas quais as melhores práticas de segurança e engenharia de software podem não estar alinhadas. Em cada caso, o equilíbrio adequado é obtido identificando a combinação ideal de propriedades ao longo das dimensões do sistema de contrato, como:

  • Rígido vs. atualizável
  • Monolítico vs. Modular
  • Duplicação vs. Reutilização
Rígido vs. atualizável

Embora vários recursos, incluindo este, enfatizem as características de maleabilidade, como padrões Killable, Upgradeable ou Modifiable, há uma troca fundamental entre maleabilidade e segurança.

Os padrões de maleabilidade, por definição, adicionam complexidade e superfícies de ataque em potencial. A simplicidade é particularmente eficaz sobre a complexidade nos casos em que o sistema de contrato inteligente executa um conjunto muito limitado de funcionalidade por um período de tempo limitado predefinido, por exemplo, um sistema de contrato de venda de tokens de prazo finito livre de governança.

Monolítico vs. Modular

Um contrato monolítico independente mantém todo o conhecimento localmente identificável e legível. Embora existam poucos sistemas de contrato inteligente tidos em alta consideração que existem como monólitos, há um argumento a ser feito para a localização extrema de dados e fluxo – por exemplo, no caso de otimizar a eficiência da revisão de código.

Tal como acontece com as outras compensações consideradas aqui, as melhores práticas de segurança tendem a se distanciar das melhores práticas de engenharia de software em contratos simples de curta duração e a tendência a melhores práticas de engenharia de software no caso de sistemas de contrato perpétuo mais complexos.

Duplicação vs. Reutilização

Um sistema de contrato inteligente, de uma perspectiva de engenharia de software, deseja maximizar a reutilização onde for razoável. Existem muitas maneiras de reutilizar o código do contrato no Solidity. Usar contratos comprovados previamente implantados que você possui geralmente é a maneira mais segura de obter a reutilização de código.

A duplicação é frequentemente considerada em casos em que contratos próprios previamente implantados não estão disponíveis. Esforços como Biblioteca Solidity do OpenZeppelin procuram fornecer padrões de forma que o código seguro possa ser reutilizado sem duplicação. Qualquer análise de segurança do contrato deve incluir qualquer código reutilizado que não tenha previamente estabelecido um nível de confiança proporcional aos fundos em risco no sistema de contrato inteligente alvo.

Construir e lançar aplicativos no Ethereum é indiscutivelmente a fronteira mais empolgante para engenheiros de software hoje, mas requer modelagem contínua de ameaças, auditoria de segurança e planejamento de resposta a incidentes.

A equipe Diligence está aqui para ajudá-lo a permanecer vigilante e a construir confiança em suas implantações.

Reserve uma verificação pontual de segurança do Blockchain

Nossas análises de 1 dia ajudam a criar segurança em seu código de blockchain desde o início, para que você possa economizar tempo e dinheiro no longo prazo. Reserve o seu hoje mesmo SecuritySmart ContractsNewsletterSubscreva a nossa newsletter para obter as últimas notícias da Ethereum, soluções empresariais, recursos para desenvolvedores e muito mais. Endereço de e-mailConteúdo exclusivoComo construir um produto blockchain de sucessoWebinar

Como construir um produto blockchain de sucesso

Como configurar e executar um nó EthereumWebinar

Como configurar e executar um nó Ethereum

Como construir sua própria API EthereumWebinar

Como construir sua própria API Ethereum

Como criar um token socialWebinar

Como criar um token social

Usando ferramentas de segurança no desenvolvimento de contrato inteligenteWebinar

Usando ferramentas de segurança no desenvolvimento de contrato inteligente

O Futuro dos Ativos Digitais Financeiros e DeFiWebinar

O futuro das finanças: ativos digitais e DeFi