Compreensão de Contratos Inteligentes: Leitura, Escrita e Auditoria

Avançado11/26/2023, 12:41:25 PM
Este artigo aborda técnicas de programação de contratos inteligentes, incluindo diretrizes para leitura, escrita e auditoria. Compreender a estrutura e os blocos de código dos contratos inteligentes é o primeiro passo para escrevê-los em Solidity ou em outras linguagens. Dado que os contratos inteligentes são centrais para Finanças Descentralizadas (DeFi) e Aplicações Descentralizadas (DApps), garantir a sua segurança e perfeição é crucial, com auditorias de contratos inteligentes desempenhando um papel fundamental.

Lendo contratos inteligentes

Os contratos inteligentes são pedaços de código programável que são executados apenas quando um conjunto de condições é cumprido. Eles são sinônimos de contratos do mundo real legalmente vinculativos; apenas neste caso, o código é a lei. Como os contratos inteligentes residem na blockchain, eles são imutáveis — não podem ser adulterados. É esta característica de imutabilidade que torna os contratos inteligentes especiais, entre outras coisas.

Compreender contratos inteligentes: noções básicas e finalidade

Contratos inteligentessão destinados a automatizar transações específicas de blockchain. Como são contratos específicos de condições, não requerem intermediários. O que torna os contratos inteligentes úteis é a sua compatibilidade numa ampla gama de casos de uso, incluindo serviços financeiros, gestão da cadeia de abastecimento e muito mais. E ao contrário de pedaços tradicionais de código que são programados de uma só vez, os contratos inteligentes requerem estratégias altamente seguras e intensivas em tempo.

Como os contratos inteligentes se alinham com a tecnologia blockchain: BeInCrypto

A palavra da moda “web3” sugere os hábitos de programação laxistas e inseguros da web. Quando o cripto ou os contratos inteligentes são programados como uma página web, estão condenados. As blockchains e aplicações sustentavelmente bem-sucedidas baseiam-se em métodos de programação muito mais seguros, cuidadosos e lentos.

Nick Szabo, criptógrafo e cientista da computação: Twitter

Os contratos inteligentes podem trabalhar com tokens específicos de blockchain, como ERC-20 para a blockchain Ethereum, incentivando esforços e movimentando transações. Como código, condições e custos estão envolvidos, você deve ter cuidado ao ler, escrever e auditar-los.

Contratos inteligentes e sua importância

O verdadeiro significado dos contratos inteligentes diz respeito à sua natureza e posicionamento. Para um cenário específico - digamos que uma pessoa A transfere fundos para a pessoa B quando B completa um serviço - uma cópia do contrato inteligente é guardada e executada pelos nós da blockchain. Os contratos inteligentes são guardados como códigos de contrato dentro da cadeia. Esta validação de múltiplos caminhos é uma característica central da blockchain e mantém as coisas seguras.

Além disso, existem contratos inteligentes sequenciais ou síncronos e contratos inteligentes assíncronosonde as tarefas são executadas em paralelo. Portanto, o tipo e o objetivo de um contrato inteligente determinam como ele é escrito, lido ou até auditado.

Os contratos tradicionais, escrituras de propriedade, testamentos, etc. são direito privado, 'elaborados por pessoas privadas em vez de políticos ou burocratas do governo.' Os contratos inteligentes são uma nova forma desse processo de elaboração de regras descentralizado.https://t.co/EU2Y28FznK
— Nick Szabo ( @NickSzabo4) 15 de março de 2018

Vamos considerar uma piscina de liquidez padrão governada por contrato inteligente.

Imagine que o pool de tokens pode ser usado para negociação e que, sempre que ocorre uma negociação bem-sucedida, 0,3% do valor total da negociação é enviado ao fornecedor de liquidez que tornou essa negociação possível ou adicionou liquidez para esse ativo negociável específico. Todas as condições que destacam os cenários de negociação, taxas de negociação e condições de não conformidade e falhas de negociação são codificadas como um contrato inteligente, que é armazenado na cadeia como um código de contrato.

Características de contratos inteligentes

Não podemos mergulhar profundamente na leitura, escrita e auditoria de contratos se não estivermos cientes das suas características. Aqui estão os traços padrão do contrato inteligente a ter em conta:

Algumas características de um contrato inteligente padrão: BeInCrypto

Contratos programáveis

Os contratos inteligentes são simplesmente pedaços de código. Você pode escrever contratos inteligentes para executar comandos e cenários com base em condições específicas. É por isso que os desenvolvedores e programadores de contratos inteligentes estão atualmente em demanda, já que a maioria dos DeFiespaço já depende de contratos inteligentes para processar instâncias complexas como lidar com taxas de negociação em pools de liquidez, manter APYrácios e muito mais.

Sem confiança

Contratos inteligentes que residem na blockchain eliminam a intervenção humana. Isso os torna completamente sem confiança. Por exemplo, se um específico DeFiprotocolo, governado por contrato(s) inteligente(s), concorda em liquidar seus ativos uma vez que o valor caia abaixo de um limite, nenhuma intervenção humana pode ou deve impedi-lo. O código lida com pagamento, desempenho, gestão e aplicação de regras, tornando todo o espaço completamente sem confiança.

Autónomo

Como mencionado anteriormente, os contratos inteligentes estão carregados com conjuntos de instruções autoexecutáveis. Em termos de codificação, isso significa ter iterações e loops incorporados no modelo padrão. Isso garante que tarefas como pagamento, saques, depósitos, penalização de validadores via redução de recompensa, e várias outras tarefas sejam tratadas de forma autônoma.

Seguro

E, finalmente, como os contratos inteligentes são protegidos usando criptografia, violá-los é incrivelmente difícil. Sem uma vulnerabilidade integrada, ignorar um contrato inteligente significaria tentar violá-lo a céu aberto, na frente de todo o blockchain.

Verificável

As transações processadas via contratos inteligentes são autoverificáveis. Isso significa que a execução é prova suficiente de que a transação ocorreu em primeiro lugar, já que nenhum elemento humano está envolvido. O mecanismo autoverificável dá aos contratos inteligentes uma vantagem sobre os contratos tradicionais que regem as configurações bancárias hereditárias.

Assim, da próxima vez que planeares ler um contrato inteligente, certifica-te de que o texto padrão ou a documentação têm todas as características mencionadas envolvidas.


Uma versão simplificada de contratos inteligentes: Reddit

Ler contratos inteligentes com base nas características

Aqui está um contrato inteligente simples representando uma conta de depósito em garantia. Os utilizadores depositam os seus fundos na garantia, que depois transfere o mesmo para o destinatário após um determinado período de tempo.

// SPDX-License-Identifier: MITpragma solidity ^0.8.0;// Modelo Básico de Contrato Inteligentecontrato SimpleTrustlessEscrow {// Variáveis de Estadoendereço público depositante; // Conta que deposita etherendereço pagável público beneficiário; // Conta que recebe etheruint256 public releaseTime; // Timestamp para liberar ether// Eventos para verificar atividade do contratoevento Deposited(endereço indexado _from, uint256 _value);evento Released(endereço indexado _to, uint256 _value);// O construtor do contrato inicializa o contrato inteligenteconstructor(address payable _beneficiário, uint256 _releaseTime) {    require(_releaseTime > block.timestamp, “O tempo de liberação deve estar no futuro”);    // Seguro e Descentralizado: O contrato vincula depositante e beneficiário    depositante = msg.sender;    beneficiário = _beneficiário;    releaseTime = _releaseTime;}// Função de depósito - execução autônoma (função fallback)receive() external payable {    emit Deposited(msg.sender, msg.value);}// Liberar o ether para o beneficiáriofunção release() public {    // Programável: Só pode ser executado após o releaseTime    require(block.timestamp >= releaseTime, “Muito cedo para liberar”);    // Autônomo: Executa automaticamente com base na condição    uint256 amount = address(this).balance;    beneficiário.transfer(amount);    emit Released(beneficiário, amount);}}

Embora vamos decifrar e ler este contrato inteligente em detalhe, vamos primeiro verificar se o mesmo adere às características de contrato mencionadas.

A parte “programável”

Olhe de perto para este pedaço de código no contrato:

require(block.timestamp >= releaseTime, “Muito cedo para liberar”);

uint256 valor = address(this).balance;

beneficiário.transferir(quantidade);

Os fundos serão libertados apenas quando uma condição específica de releaseTime for cumprida, tornando estes contratos programáveis.

A parte "sem confiança"

Aqui está um pequeno trecho de código do acima:

depositante = msg.sender;

beneficiário = _beneficiário;

releaseTime = _releaseTime;

No contrato, todos estão vinculados ao código, desde o depositante até a pessoa que recebe os fundos. Ninguém precisa interagir ou confiar no outro, pois a função de transferir fundos é vinculada pelo releaseTime - um parâmetro baseado em código.

A parte "autónoma"

Aqui está a parte "liberação de fundo" do código:

 function release() public {require(block.timestamp >= releaseTime, “Muito cedo para lançar”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}

O processo inteiro é autónomo, uma vez que os fundos são libertados apenas quando o releaseTime cumpre um certo critério. Note-se que o código não é parcialmente programável, mas totalmente autónomo.

Outros elementos do código do contrato inteligente, incluindo a função de depósito, também podem ser completamente autónomos, dependendo das funcionalidades que pretende incluir. Por exemplo, pode iniciar um plano de depósito recorrente sempre que o utilizador carteiracruza os $100, com o montante excedente a mover-se para o beneficiário.

A parte "segura"

Preocupado com qual elemento emprestasegurançapara o contrato? Verifique esta parte do código:

constructor(address payable _beneficiário, uint256 _releaseTime) {require(_releaseTime > block.timestamp, “O tempo de liberação deve estar no futuro”);depositante = msg.sender;beneficiário = _beneficiário;releaseTime = _releaseTime;}

Observe como há uma precedência definida da função releaseTime em relação ao carimbo de data/hora. Nada é aleatório e as condições devem ser cumpridas.

A parte "verificável"

Cada transação associada ao contrato inteligente é registada na cadeia, cortesia de elementos de atividade de registo separados.

event Deposited(address indexed _from, uint256 _value);

evento Lançado(endereço indexado _para, uint256 _valor);

emitir Deposited(msg.sender, msg.value);

emit Released(beneficiary, amount);

Ler outras partes de um contrato inteligente

Agora que identificamos os elementos que definem as características de um contrato inteligente, aqui estão os outros elementos do contrato para ajudá-lo a entender melhor o procedimento.

Solidez de Pragma ^0.8.0; – A versão da linguagem de programação Solidity necessária para escrever este contrato inteligente.

// SPDX-License-Identifier: MIT - Este identificador, denominado Software Package Data Exchange, indica a licença da versão do código. É aconselhável incluir este identificador para informar as pessoas se é de código aberto e se pode ser trabalhado ou não.

Tempo de Bloqueio de Contrato { - Atribui um nome ao contrato inteligente, como um rótulo.

Endereço público do depositante; - Como o contrato envolve um depositante e um beneficiário, este é o ponto onde o endereço público do depositante é mencionado. Esta variável é o Carteira Ethereumendereço e é publicamente visível.

Endereço público do beneficiário pagável; – Este é o endereço público do beneficiário para onde o contrato de garantia transfere fundos. Também é legível e confere transparência aos contratos inteligentes baseados em blockchain.

Uint256 lançamento público; – Por se tratar de um contrato vinculado no tempo, o uint256 atribui a variável baseada no tempo ao contrato. Este será o prazo segundo o qual as liberações do fundo acontecerão.

Em Solidity, uint (inteiro sem sinal) é a forma de atribuir valores baseados em inteiros. O sufixo 256 representa um grande armazenamento de números.

após 5 anos a escrever contratos inteligentes, só hoje percebo que o logótipo do Solidity é o logótipo do Ethereum desdobrado 🤯pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden) 8 de julho de 2023

Pode considerar a leitura Documentação Soliditypara se familiarizar com a sintaxe, expressões e outros elementos de código.

Outros elementos

constructor(address payable _beneficiary, uint256 _releaseTime) { – O “Constructor” é uma função especial única que é chamada uma vez quando o contrato inteligente é implantado. Ele inicia o contrato. Note como, neste ponto, todas as variáveis de endereço que declaramos anteriormente são chamadas e inicializadas.

Receive() external payable { – Esta é uma função especial chamada quando os fundos se movem para o endereço do contrato de fora. Externo sugere de fora, e “Pagável” define a natureza do movimento, ou seja, para receber tokens ERC-20.

Função release() pública { - Esta é uma função pública que indica o movimento de tokens ERC-20 do endereço do contrato para o beneficiário. Esta função depende de releaseTime.

Todos estes elementos são partes do contrato de Escrow hipotético que discutimos. Certifique-se de ler toda a documentação do Solidity para aprender melhor sobre a linguagem.

Conheça os elementos antes de planear escrever contratos inteligentes: BeInCrypto

DApps e contratos inteligentes: a relação

Neste momento, você deve ter uma vantagem na leitura e compreensão de um contrato inteligente já escrito. E muitos contratos inteligentes, como os que discutimos, fazem parte do backend de uma aplicação descentralizada — um blockchainversão de uma aplicação móvel padrão.

Cada característica de um contrato inteligente, incluindo segurança do contrato, execução autônoma e programável, ausência de confiança nas transações e muito mais, é prontamente implementada durante o desenvolvimento de uma aplicação descentralizada. Assim, da próxima vez que se deparar com uma DApp, note que se trata de um backend alimentado por um contrato inteligente hospedado na blockchain - ajudando a iniciar múltiplas tarefas sem intervenção humana. Os contratos inteligentes formam a lógica das DApps.

Blockchains para contratos inteligentes

Sabemos que o Ethereum permite desenvolver contratos inteligentes, como uma solução de software massiva. No entanto, não é o único protocolo blockchain ao redor. Se você quiser mergulhar fundo no mundo do desenvolvimento de contratos inteligentes, você pode querer olhar para outras blockchains. Diferentes blockchains têm diferentes jargões quando se trata de desafiar contratos.

Mas primeiro, vamos discutir Ethereum— a plataforma de eleição para a maioria dos desenvolvedores de contratos inteligentes.

Ethereum

Contratos inteligentes na Ethereum são escritos na linguagem de programação Solidity. E a interface de token para esta plataforma de desenvolvimento de contrato inteligente é ERC-20.

Pode voltar ao contrato inteligente baseado em depósito discutido anteriormente para ver como um contrato inteligente convencional baseado em Etheruem é escrito.

Mesmo lançar um token ERC-20 na blockchain Ethereum é uma característica intensiva de contrato inteligente, algo que discutiremos em profundidade ao escrever um contrato inteligente.

Aqui está como se parece a estrutura básica de um código, desde que planejemos lançar uma nova criptomoeda BIC.

Considere este um cenário hipotético. Não exatamente lançar uma criptomoeda BIC.

pragma solidez ^0.8.0;import "@openzeppelin/contratos/token/ERC20/ERC20.sol";contrato BICToken é ERC20 {    constructor(uint256 ofertaInicial) ERC20("BIC Token", "BIC") {        _mint(msg.sender, ofertaInicial);    }}

Vamos discutir cada elemento deste código mais tarde ao escrever o nosso contrato inteligente.

Outras blockchains

Como o Ethereum, você pode até criar contratos inteligentes em plataformas como Solana, usando Rust e Cardano, usando Plutus, um subconjunto de Haskell, uma linguagem de programação funcional.

"A Cordona sequer tem contratos inteligentes?"
A piada é contigo, amigo. #CardanoADApic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28) 9 de julho de 2023

Aqui está a estrutura de código em Rust ( Solana) parece:

Nota: É um contrato simples onde um contador é incrementado.

use anchor_lang::prelude::*;declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);#[program] pub mod hello_world {use super::*;pub fn initialize(ctx: Context<Initialize>) -> ProgramResult {    let greeting_account = &mut ctx.accounts.greeting_account;    greeting_account.counter = 0;    Ok(())}pub fn increment(ctx: Context<Increment>) -> ProgramResult {    let greeting_account = &mut ctx.accounts.greeting_account;    greeting_account.counter += 1;    Ok(())}}

Você sabia? Enquanto Rust é a linguagem de programação para criar contratos inteligentes baseados em Solana, Âncoraé o framework de desenvolvimento de contratos inteligentes que é usado. Para criar contratos inteligentes usando Rust, os desenvolvedores precisam puxar módulos do framework Anchor — algo a primeira linha do nosso código de exemplo (use anchor_lang::prelude::*;) representa.

Documentação Solanairá ajudá-lo a entender a linguagem de contrato inteligente específica do Rust.

Da mesma forma, Cardano segue Plutus como a escolha de linguagem, seguido pela linguagem Ink! para Polkadot, TEAL para Algorand, C# para NEO e muito mais. Aprender a documentação em cadeia em detalhes é aconselhável antes de prosseguir com a escrita de contratos inteligentes compatíveis.

Por que deveria aprender a ler contratos inteligentes?

A capacidade de escrever contratos inteligentes é muito reconhecida, mas mesmo ser capaz de ler vem com sua quota de benefícios:

  1. A capacidade de aprender sobre as complexidades de automação associadas às apps DeFi.
  2. Analisando os padrões de propriedade associados ao ativotokenização.
  3. Compreender comoorganizações autônomas descentralizadas (DAOs)função.
  4. Compreensão e implementação de lógica orientada por casos de uso relacionada a seguros, monetização de conteúdo, votaçãosistema, royalties e outros setores verticais.

Como escrever contratos inteligentes

Agora que a leitura dos contratos inteligentes está fora do caminho, vamos focar na escrita dos contratos inteligentes. Antes de aprofundar, é necessário reiterar que diferentes blockchains podem ter padrões e linguagens diferentes relacionadas ao desenvolvimento de contratos inteligentes. É necessário focar nos padrões definidos por qualquer blockchain específico para começar a escrever e implantar contratos.

Para a maioria da nossa discussão, vamos focar no Ethereum como a cadeia e Solidity como a linguagem.

O papel da programação

Programar um contrato inteligente é facilmente a parte mais importante do ciclo de desenvolvimento. E para entrar no desenvolvimento de contratos inteligentes na Ethereum ou em qualquer outra blockchain, você deve ter alguma experiência com linguagens de programação não relacionadas a blockchain como Javascript.

Diferentes blockchains e a linguagem para escrever contratos inteligentes: BeInCrypto

A capacidade de programar um contrato inteligente permite-lhe implementar lógica, lidar com os elementos de segurança do mesmo, otimizar o código para taxas de gás, personalizar o mesmo e até mesmo torná-lo interoperável, se necessário.

EVM e contratos inteligentes: uma visão geral

Qualquer pessoa que esteja a planear escrever contratos inteligentes na Ethereum precisa de compreender o que é a Máquina Virtual Ethereum (EVM) e como funciona com os contratos inteligentes. Para começar, a EVM é um componente da Ethereum que fornece programas um ambiente isolado e controlado para trabalhar. Considere isto como um computador global que hospeda cada pedaço de código de contrato que existe na Ethereum. Cadana rede Ethereum é executado o EVM.

Se você aspira a ser um desenvolvedor de contratos inteligentes, aqui está o que você precisa saber em relação aos contratos inteligentes e EVM.

Uma vez que escreva o programa em Solidity, que é uma linguagem de alto nível, precisa de o compilar em bytecode - um formato de baixo nível compreensível pela máquina. Este bytecode entra na blockchain da Ethereum e aí reside. Qualquer pessoa que interaja com o contrato inteligente precisa de enviar uma transação para o endereço do contrato.

Cada nó com o EVM instalado pode ver esta transação e, uma vez que os validadores aprovem o mesmo, o código do contrato inteligente é executado. Como cada nó tem visibilidade da transação, nada pode ser adulterado e o código é executado tal como foi escrito. E uma vez que o código é executado, o estado da blockchain muda, tornando o processo de ponta a ponta e completamente transparente.

Qualquer pessoa pode escrever um contrato inteligente?

Escrever contratos inteligentes requer conhecimentos técnicos. Mas não é só isso. Também precisa compreender completamente como funciona a tecnologia blockchain, quais são as necessidades específicas de linguagem relevantes para a blockchain que está a visar.interoperabilidade, e muito mais. Além disso, você também deve saber bastante sobre vulnerabilidades de contrato inteligente — coisas a evitar ao escrever código. E, finalmente, conhecimento de testes de contrato e implantação de contrato também é fundamental.

Tudo isso pode se tornar avassalador. Por isso, aqui está uma folha de dicas rápida para começar:

  1. Comece por escolher a plataforma ou cadeia com a qual deseja trabalhar.
  2. Aprenda a linguagem de programação associada à cadeia, como Solidity para Ethereum.
  3. Saiba como usar as ferramentas de desenvolvimento como o Ambiente de Desenvolvimento Integrado como o Remix.
  4. Comece por escrever o seu primeiro contrato e depois teste usando testnets.
  5. Uma vez que esteja satisfeito com os elementos do código, pode implementá-lo na cadeia. Lembre-se de que a implementação do contrato na cadeia terá um custo sob a forma de taxas de gás.

Aqui está um rápido tópico com algumas dicas para escrever melhores contratos inteligentes:

🥧 FREI-PI
‼️ Por que os desenvolvedores de contratos inteligentes PRECISAM saber disso!
Função:
– Requisitos
– Efeitos
– Interações
Protocol
– Invariáveis
Este é o padrão em que todos devem pensar ao construir contratos inteligentes.
Aqui está o porquê 👇
— Patrick Collins (@PatrickAlphaC) 6 de julho de 2023

Mergulhando na programação

É hora de entrar nos aspectos técnicos do desenvolvimento de contratos inteligentes. Embora blockchains como Solana e Cardano permitam que você desenvolva contratos inteligentes, o Ethereum continua a ser a plataforma de desenvolvimento de contratos inteligentes mais popular.

Sabia? Apenas em 2022, mais de 100.000 aplicativos descentralizados foram adicionados à rede Ethereum.

Porquê Ethereum?

O Ethereum tem uma enorme comunidade de desenvolvedores. Tudo o que desenvolver irá receber imediatamente atenção. Além disso, a sua linguagem nativa, Solidity, é relativamente fácil para indivíduos que conhecem bem o Python ou JavaScript. Por fim, o software global do Ethereum, EVM, ajuda na execução de contratos sem problemas.

Se estiver na maioria e preferir usar Ethereum e Solidity, aqui está uma lista rápida de coisas que precisa acompanhar antes de começar o desenvolvimento de contratos inteligentes:

  1. Pragmas ou a versão do compilador
  2. Definição de contrato para rotulagem
  3. Variáveis de estado para armazenar dados
  4. Eventos para registo EVM
  5. Modificadores para conceder direitos específicos a determinados órgãos
  6. Funções ou as atividades do contrato inteligente em jogo
  7. Herança para interoperabilidade
  8. Compreensão de estruturas de controlo como if, else, for loops, tipos de dados como string, inteiro e mais.

Escrever e implementar o primeiro contrato inteligente

Agora que sabemos como as coisas acontecem na cadeia, vamos mergulhar na escrita e implementação do primeiro contrato inteligente. Mesmo que “Olá Mundo” continue a ser o primeiro passo, começaremos por criar um contrato inteligente para lançar um token BIC hipotético com um fornecimento desbloqueado de 100% de 1 milhão.

Os conceitos básicos

O primeiro passo é instalar a versão mais recente do Node.js e do NPM ou Node Package Manager. Isso cuida das ferramentas de desenvolvimento e do ambiente local para o desenvolvimento. Além disso, o Node.js e o NPM permitem que você defina o front-end da web para o seu contrato inteligente.

Agora, você precisa configurar um IDE para escrever o código do contrato. Para isso, você pode instalar rapidamente o Visual Studio Code. Ou você pode cortar a desordem e hopsobre a Alchemy - uma plataforma de desenvolvimento blockchain. Com a Alchemy, você pode obter algum ETH de testnet. Isso cobrirá as taxas de gás quando você implantar o contrato inteligente na testnet Goerli ou mesmo na testnet Sepolia.

Note que a Sepolia é um testnet mais recente e, portanto, requer menos espaço em disco quando se trata de implementação de nós.

Por agora, vamos persistir com a rede de testes Goerli, pois possui um número maior de aplicações implementadas.

Com a testnet e o ETH falso prontos, vamos passar para a escrita específica do contrato inteligente. Aqui está o trecho de código para criar um token BIC com um fornecimento fixo de 1 milhão.

Nota: Vamos implementar o nosso contrato inteligente localmente no MacOS e não na testnet. Para a implementação de contratos inteligentes na testnet e mainnet, teremos uma parte separada, que está além do âmbito desta discussão.

Passos para escrever e implementar

Aqui está o simples trecho de código para o token hipotético:

pragma solidez ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contrato BIC is ERC20 {    constructor() ERC20("BIC Token", "BIC") {        _mint(msg.sender, 1000000 * 10 ** decimals());    }}

Se estiver familiarizado com a sintaxe, saberá o que significa cada componente de código. Quanto ao Openzepplinparte, é a biblioteca ideal para importar contratos inteligentes ERC-20. Esta biblioteca oferece os padrões operacionais básicos para tokens ERC-20.

A função de cunhagem fala sobre o fornecimento inicial, que é implantado no endereço do contrato inteligente ou no msg.sender.

Para configurar este código localmente e testá-lo, precisaremos de três componentes:

  1. Node.js e NPM (já discutidos): Funciona como um motor para alimentar seus contratos inteligentes
  2. Truffle: Funciona como uma caixa de ferramentas, ajudando-o a organizar código, scripts e outras partes de um contrato
  3. Ganache: Funciona como um recreio virtual no dispositivo. Pense nele como uma blockchain pessoal.

O que é a execução do contrato?

Se passou pelo processo detalhado de escrever um contrato inteligente, é imperativo saber bastante sobre a execução do contrato. É um processo pelo qual o código do contrato inteligente é executado numa cadeia pelos nós.

É a uniformidade associada à execução do contrato que torna os contratos inteligentes transparentes e imutáveis. Vamos agora entender o processo escalonado associado à execução do contrato:

Passo 1

Os trechos de código que temos estado a escrever precisam de ser executados em algum lugar. No caso dos contratos inteligentes, este local de execução é a blockchain. Os nós ou os membros participantes da cadeia ajudam a executar o contrato.

Passo 2

Os nós aceitam a responsabilidade de executar blocos de código de contrato em troca de incentivos relacionados à cadeia. Cada comando ou ação que ocorre dentro da cadeia é liderado por contratos inteligentes.

Passo 3

Cada contrato inteligente tem um endereço específico. Para executar o contrato, as transações são enviadas para esse endereço do contrato. Note que cada nó executa o EVM, que então tem uma cópia do código do contrato inteligente, o que torna mais fácil verificar a autenticidade das transações.

Passo 4

As transações destinadas ao contrato inteligente são selecionadas pelos validadores, que depois as incluem em blocos específicos.

Passo 5

Uma vez que a transação é enviada e validada com sucesso, ela passa a fazer parte da blockchain. A função do contrato inteligente associada à transação é então chamada e executada em todos os nós da blockchain.

Passo 6

Cada nó que executa o contrato inteligente deve chegar a uma conclusão determinística — a mesma saída para o mesmo conjunto de entradas — tornando a natureza dos contratos completamente sem confiança e transparente.

Nota: Qualquer erro relativo à execução do código ou questões relacionadas com as taxas de gás reverte as transações. Isto significa que a transação baseada num código de contrato inteligente específico deixará de existir. Isto é exatamente o que acontece com Empréstimos Flashquando a incapacidade de aderir a normas específicas reverte toda a transação, dando a impressão de que os fundos nem sequer se moveram no primeiro lugar.

Cada alteração de estado associada a contratos inteligentes é registada dentro da blockchain e torna-se uma parte imutável da mesma.

Desenvolvimento de contrato inteligente e melhores práticas

Agora que você sabe bastante sobre contratos inteligentes, aqui estão algumas dicas para começar o desenvolvimento de contratos:

  1. Ao escrever contratos, é aconselhável confiar em bibliotecas confiáveis como as da OpenZeppelin para cumprir os padrões desejados de otimização de código e segurança.
  2. A ideia é manter o contrato modular e mais simples — tornando mais fácil testar e rever.
  3. Uma boa ideia é implementar controles de acesso específicos ao contrato. Isso significa declarar trechos de código onde apenas uma pessoa ou entidade específica pode alterar os traços cruciais do contrato. O controle de acesso facilita a manutenção da segurança dos contratos inteligentes.
  4. Ao escrever um contrato, faça sempre disposições para lidar com casos limite e exceções - tudo enquanto escreve vários testes.

Cuidar da sustentabilidade do código

Cada uma das práticas mencionadas acima ajuda na otimização de código e implementações específicas de segurança. No entanto, existem algumas práticas específicas do contrato que você deve seguir e implementar para cuidar da sustentabilidade do código. Isso visa manter o código do contrato leve e utilizável para que cada nó em execução e execução do mesmo não tenha que dedicar muito poder computacional ao mesmo.

  1. Manipular o armazenamento de forma eficiente, utilizando conjuntos de dados mais pequenos. Por exemplo, ao escrever um contrato, utilize uint8 como o valor operacional em vez de uint256.
  2. Ao escrever um contrato, é aconselhável otimizar o código combinando várias operações em uma. Vamos aprofundar isso em nossa peça detalhada sobre “escrever contratos inteligentes”.
  3. Uma boa ideia é usar avaliação preguiçosa no que diz respeito à execução de contratos inteligentes. Desta forma, só precisa de executar uma função quando necessário e não sempre que algo é enviado para o endereço do contrato inteligente.
  4. Por fim, confiar em cálculos fora da cadeia também é uma boa maneira de focar na sustentabilidade. Isso ajuda a reduzir os requisitos de taxas de gás e pode até acelerar a execução do contrato.

Apesar de seguir as melhores práticas ao escrever e desenvolver contratos inteligentes, é necessário focar nas vulnerabilidades de segurança do contrato ao enviá-los para a mainnet.

Como auditar contratos inteligentes?

Cada contrato inteligente que tem presença na mainnet precisa ser avaliado quanto ao desempenho do código, segurança e outras características. É aqui que a auditoria — um processo rigoroso de teste de contrato — vem à tona, permitindo que descubra possíveis vulnerabilidades e fraquezas no contrato.

Aqui está uma lista de verificação rápida de auditoria para começar:
Lista de verificação incrível de auditoria de Contratos Inteligentes😈
Certifique-se de verificá-los na sua próxima auditoria✅
Agradeceria um retweet, espalhe o conhecimento🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv) 7 de julho de 2023

Relação entre leitura, escrita e auditoria: por que mesmo auditar contratos inteligentes?

Ao ler e escrever contratos inteligentes estão interligados quando se trata de desenvolver pedaços inteligentes de código, a auditoria tem um lugar especial e envolve verificar a lógica em primeiro lugar. Quando se trata de execução de código baseado em blockchain, tudo é imutável e qualquer coisa catastrófica pode ter consequências irreversíveis na execução do contrato. É exatamente por isso que uma verificação minuciosa do código do contrato e de outros aspectos através de auditoria é necessária.

Vulnerabilidades de contrato e correções

Pode haver uma série devulnerabilidades do contratoque uma auditoria detalhada de contrato inteligente pode identificar. Estes incluem a verificação de ataques de reentrância, overflows ou underflows, problemas relacionados com o controlo de acesso e muito mais. Uma vez determinada a natureza exata do problema, o auditor pode até sugerir as melhores práticas para o corrigir.

Violações lançam estudos e aprendizados

Ainda não tem a certeza de como a auditoria de contratos inteligentes pode ajudar? Bem, vamos voltar ao famoso DAOhack em 2016, que explorou um problema de recursividade e causou uma perda de quase 3,6 milhões de ETH. Da mesma forma, houve o hack do contrato da carteira Parity em 2017, levando a uma perda de quase 500.000 ETH. Esses problemas poderiam ter sido evitados com o conjunto certo de auditorias.


Fluxograma do hack do DAO: BeInCrypto

Estratégias para auditar contratos inteligentes

Existem inúmeras estratégias para auditar contratos inteligentes. Algumas das mais populares incluem:

Ferramentas de auditoria

Essas ferramentas atuam como o primeiro conjunto de defesas e são melhor usadas para localizar vulnerabilidades comuns. Algumas das ferramentas mais populares incluem Securify, Mythril e muito mais — capazes de realizar análises estáticas do código, detetar padrões de violação e ajudar a obter um avanço específico de segurança.

Ferramentas para auditar contratos inteligentes: BeInCrypto

Revisão do código

É aqui que entram em cena os revisores de código manuais, escrutinando a base de código e identificando vulnerabilidades complexas, se houver. Uma revisão manual pode ajudar a cuidar da lógica de negócios, do contexto e dos padrões de uso.

Aqui está como as revisões manuais de código o ajudam a localizar ameaças:

Uma pequena curiosidade para os nossos auditores juniores!
Vamos e retweet se encontrou o bug!pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles)8 de julho de 2023

Digitalizações automáticas

Ferramentas como Snyk e GuardRails ajudam na verificação automática de contratos - uma implementação de segurança que é invocada sempre que o código é atualizado. Esta forma de auditoria garante que as novas alterações feitas a um código sejam seguras e não invasivas por natureza.

Verificação formal

Este é um processo complexo que depende exclusivamente da verificação da lógica de negócios do código. Note que a verificação formal não é realmente destinada a verificar a sintaxe, mas apenas a lógica para ver se o código é executado como desejado.

Além das estratégias mencionadas, a auditoria de contratos inteligentes também pode ser iniciada usando revisões por pares, programas de recompensa por bugs e coberturas de teste por meio de ferramentas como a Solidity Coverage para maximizar a eficácia.

Uma maneira simples de auditar contratos inteligentes: BeInCrypto

Como rever o código corretamente?

Se é novo na auditoria de contratos inteligentes, é importante notar que existem duas formas de analisar amplamente o código e identificar problemas. Estas incluem:

Análise estática

Este tipo de análise de código ajuda a identificar vulnerabilidades básicas de segurança, erros de codificação e outros problemas de acordo com os padrões e convenções de codificação fornecidos. Ameaças como chamadas não verificadas para fontes externas, transbordamentos de inteiros e mais podem ser destacadas usando análise estática. A melhor coisa sobre análise estática é que o código não precisa ser executado para ser verificado.

Análise dinâmica

Esta abordagem para auditar testes a alinhamento do código com o EVM. Em vez de apenas verificar o código, a análise dinâmica verifica a resposta dos contratos inteligentes a uma ampla gama de entradas. A análise dinâmica pode identificar problemas como consumo incoerente de gás e até lógica de contrato errônea. Ambientes de blockchain pessoais como Ganache podem funcionar como plataformas de análise dinâmica, permitindo que os desenvolvedores realizem transações, executem comandos e façam muito mais com seus contratos.

Testando um pedaço real de código

Aqui está um trecho de contrato inteligente que funciona como um armazenamento de fundos, tendo uma função de retirada:

pragma solidez ^0.6.1;contrato VulnerableContract {    mapeamento(endereço => uint256) saldos públicos;    função depósito() público pagável {        saldos[msg.sender] += msg.value;    }    função retirar(uint256 _montante) público {        exigir(saldos[msg.sender] >= _montante, "Saldo insuficiente.");        (bool sucesso, ) = msg.sender.call{value: _montante}("");        exigir(sucesso, "Transferência falhou.");        saldos[msg.sender] -= _montante;    }}

Se olhar de perto para o código, há uma vulnerabilidade chave:

No caso anterior, a função “levantar” pode ser chamada novamente se o utilizador que recebe os fundos também for um contrato inteligente, embora malicioso. Portanto, antes da última função ou da atualização do saldo acontecer, um ataque de reentrância pode ser iniciado para transferir fundos adicionais. Auditores experientes identificam este tipo de vulnerabilidade.

Aqui está o código corrigido para o mesmo:

function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Saldo insuficiente.");    saldos[msg.sender] -= _amount;    (sucesso bool, ) = msg.sender.call{value: _amount}("");
require(success, “Transferência falhou.”);

Verifique como a função de atualização de saldo é chamada primeiro e depois o primeiro movimento para o usuário. Esta mudança na ordem de operação é o que corrige o contrato.

Cadeias não relacionadas com Ethereum e revisão de código

O mundo das aplicações descentralizadas e dos contratos inteligentes foi além do Ethereum. Mesmo que a maior parte da ação ainda aconteça dentro do ecossistema do Ethereum, existem outras blockchains como Cardano, Solana e mais que suportam contratos inteligentes e exigem diferentes padrões de auditoria.

Por que é que cada plataforma é única?

Diferentes blockchains usam diferentes linguagens de programação. A semântica, a sintaxe e as propriedades do código são diferentes, tornando os contratos inteligentes responsivos a diferentes práticas de escrita e auditoria. Por exemplo, o Ethereum usa Solidity, enquanto Polkadotusa Ink e Rust — tornando-o reativo a padrões de auditoria específicos.

Ferramentas para não ir para o Ethereum

Agora, se você deseja avançar além do Ethereum, existem algumas ferramentas de auditoria especializadas para começar. Por exemplo, com Cardano, existe o conjunto Marlowe para verificação formal e auditoria. Quando se trata de Solana, libfuzzer específico do Rust e cargo-fuzz são destinados à auditoria e teste de contrato. Um auditor multi-cadeia deve estar familiarizado com esses conceitos para manter as vulnerabilidades do contrato afastadas.

Quais são os diferentes tipos de auditoria de contrato inteligente?

Apenas para reiterar, pode-se segmentar a auditoria de contratos inteligentes em três tipos: manual, automática e híbrida. Note que as pessoas preferem estratégias de auditoria híbridas para contratos complexos com lógica de negócios profunda, pois são as mais abrangentes.

A terceirização das suas auditorias

Organizações e indivíduos com conhecimentos mínimos de codificação frequentemente terceirizam suas necessidades de escrita e auditoria para empresas de renome. Quando se trata de auditoria, escolher a empresa certa torna-se ainda mais importante, pois mesmo queFerramentas de IAgostarChatGPTpode ajudar a escrever código de contrato inteligente, verificar o mesmo requer insights manuais.

Além disso, aqui estão os fatores a ter em conta ao externalizar as tarefas de auditoria:

Escolher a empresa certa

Antes de se concentrar na empresa de outsourcing certa, é crucial verificar auditorias passadas, avaliar a experiência e até mesmo focar nos membros-chave da equipa.

Compreender responsabilidades, custos e despesas

Antes de contratar, tome nota dos custos e serviços associados às auditorias. É imperativo entender primeiro a natureza dos serviços oferecidos — como identificação de problemas, resolução de problemas e mais. Deve também verificar se são fornecidas reauditorias após a implementação da primeira linha de correções. O custo de uma auditoria de contrato inteligente pode variar dependendo dos serviços, e portanto, é necessário rastrear todos os requisitos e ofertas antes de avançar.

Melhores práticas de auditoria de contratos inteligentes

Caso queira abandonar uma empresa e auditar contratos inteligentes por si próprio, aqui estão as melhores estratégias e práticas a ter em mente:

  1. Sempre foque numa revisão de código minuciosa, incluindo a sintaxe e lógica
  2. Comece por identificar vulnerabilidades comuns usando ferramentas como Slither, MythX e mais
  3. Navegue pelo Registro de Classificação de Vulnerabilidades de Contratos Inteligentes ou SWC para localizar as vulnerabilidades conhecidas e verificá-las antecipadamente.
  4. Testar os contratos inteligentes rigorosamente, incluindo testes de integração, testes unitários e mais, para testar o código em uma ampla gama de cenários.
  5. É importante verificar as chances de ataques de reentrância especificamente. A melhor maneira de combater o mesmo é verificar chamadas recursivas que os hackers podem chamar antes da primeira função do contrato inteligente.
  6. Concentre-se nas funções que levam a chamadas externas. Um erro neste sentido pode alterar o estado e o fluxo de controle, o que não é desejável.
  7. Mantenha sempre um olho nos pedaços de código que apontam para o uso de gás. Não quer que o seu contrato inicie interações que sejam proibitivamente caras.

Desenvolvimento de contrato inteligente e IA: o futuro

A inteligência artificial está, de facto, a tornar mais fácil escrever contratos inteligentes. No entanto, independentemente da inovação em IA, a capacidade de auditar contratos inteligentes da melhor forma possível ainda requer intervenção humana. Portanto, se planeia construir o seu próximo produto web3 enfatizando contratos inteligentes e aplicações descentralizadas, é crucial focar-se religiosamente nos melhores recursos de auditoria para os seus contratos inteligentes. Com hacks e violações de criptomoedas a surgir a cada dia que passa e hackers a planear novas estratégias para penetrar, auditar um contrato até à perfeição é certamente uma das competências mais importantes dos tempos modernos.

Aviso legal:

  1. Este artigo é reproduzido a partir de [GateBeincrypto], e os direitos de autor pertencem ao autor original [Ananda Banerjee]. Se houver objeções à reprodução, entre em contato com a equipe Gate Learn e a equipa irá processá-la prontamente de acordo com os procedimentos relevantes.
  2. Aviso legal: As opiniões expressas neste artigo representam apenas as opiniões pessoais do autor e não constituem qualquer conselho de investimento.
  3. Outras versões do artigo são traduzidas pela equipe Gate Learn. Sem mencionar a Gate.io, não é permitido copiar, disseminar ou plagiar os artigos traduzidos.

Partilhar

Compreensão de Contratos Inteligentes: Leitura, Escrita e Auditoria

Avançado11/26/2023, 12:41:25 PM
Este artigo aborda técnicas de programação de contratos inteligentes, incluindo diretrizes para leitura, escrita e auditoria. Compreender a estrutura e os blocos de código dos contratos inteligentes é o primeiro passo para escrevê-los em Solidity ou em outras linguagens. Dado que os contratos inteligentes são centrais para Finanças Descentralizadas (DeFi) e Aplicações Descentralizadas (DApps), garantir a sua segurança e perfeição é crucial, com auditorias de contratos inteligentes desempenhando um papel fundamental.

Lendo contratos inteligentes

Os contratos inteligentes são pedaços de código programável que são executados apenas quando um conjunto de condições é cumprido. Eles são sinônimos de contratos do mundo real legalmente vinculativos; apenas neste caso, o código é a lei. Como os contratos inteligentes residem na blockchain, eles são imutáveis — não podem ser adulterados. É esta característica de imutabilidade que torna os contratos inteligentes especiais, entre outras coisas.

Compreender contratos inteligentes: noções básicas e finalidade

Contratos inteligentessão destinados a automatizar transações específicas de blockchain. Como são contratos específicos de condições, não requerem intermediários. O que torna os contratos inteligentes úteis é a sua compatibilidade numa ampla gama de casos de uso, incluindo serviços financeiros, gestão da cadeia de abastecimento e muito mais. E ao contrário de pedaços tradicionais de código que são programados de uma só vez, os contratos inteligentes requerem estratégias altamente seguras e intensivas em tempo.

Como os contratos inteligentes se alinham com a tecnologia blockchain: BeInCrypto

A palavra da moda “web3” sugere os hábitos de programação laxistas e inseguros da web. Quando o cripto ou os contratos inteligentes são programados como uma página web, estão condenados. As blockchains e aplicações sustentavelmente bem-sucedidas baseiam-se em métodos de programação muito mais seguros, cuidadosos e lentos.

Nick Szabo, criptógrafo e cientista da computação: Twitter

Os contratos inteligentes podem trabalhar com tokens específicos de blockchain, como ERC-20 para a blockchain Ethereum, incentivando esforços e movimentando transações. Como código, condições e custos estão envolvidos, você deve ter cuidado ao ler, escrever e auditar-los.

Contratos inteligentes e sua importância

O verdadeiro significado dos contratos inteligentes diz respeito à sua natureza e posicionamento. Para um cenário específico - digamos que uma pessoa A transfere fundos para a pessoa B quando B completa um serviço - uma cópia do contrato inteligente é guardada e executada pelos nós da blockchain. Os contratos inteligentes são guardados como códigos de contrato dentro da cadeia. Esta validação de múltiplos caminhos é uma característica central da blockchain e mantém as coisas seguras.

Além disso, existem contratos inteligentes sequenciais ou síncronos e contratos inteligentes assíncronosonde as tarefas são executadas em paralelo. Portanto, o tipo e o objetivo de um contrato inteligente determinam como ele é escrito, lido ou até auditado.

Os contratos tradicionais, escrituras de propriedade, testamentos, etc. são direito privado, 'elaborados por pessoas privadas em vez de políticos ou burocratas do governo.' Os contratos inteligentes são uma nova forma desse processo de elaboração de regras descentralizado.https://t.co/EU2Y28FznK
— Nick Szabo ( @NickSzabo4) 15 de março de 2018

Vamos considerar uma piscina de liquidez padrão governada por contrato inteligente.

Imagine que o pool de tokens pode ser usado para negociação e que, sempre que ocorre uma negociação bem-sucedida, 0,3% do valor total da negociação é enviado ao fornecedor de liquidez que tornou essa negociação possível ou adicionou liquidez para esse ativo negociável específico. Todas as condições que destacam os cenários de negociação, taxas de negociação e condições de não conformidade e falhas de negociação são codificadas como um contrato inteligente, que é armazenado na cadeia como um código de contrato.

Características de contratos inteligentes

Não podemos mergulhar profundamente na leitura, escrita e auditoria de contratos se não estivermos cientes das suas características. Aqui estão os traços padrão do contrato inteligente a ter em conta:

Algumas características de um contrato inteligente padrão: BeInCrypto

Contratos programáveis

Os contratos inteligentes são simplesmente pedaços de código. Você pode escrever contratos inteligentes para executar comandos e cenários com base em condições específicas. É por isso que os desenvolvedores e programadores de contratos inteligentes estão atualmente em demanda, já que a maioria dos DeFiespaço já depende de contratos inteligentes para processar instâncias complexas como lidar com taxas de negociação em pools de liquidez, manter APYrácios e muito mais.

Sem confiança

Contratos inteligentes que residem na blockchain eliminam a intervenção humana. Isso os torna completamente sem confiança. Por exemplo, se um específico DeFiprotocolo, governado por contrato(s) inteligente(s), concorda em liquidar seus ativos uma vez que o valor caia abaixo de um limite, nenhuma intervenção humana pode ou deve impedi-lo. O código lida com pagamento, desempenho, gestão e aplicação de regras, tornando todo o espaço completamente sem confiança.

Autónomo

Como mencionado anteriormente, os contratos inteligentes estão carregados com conjuntos de instruções autoexecutáveis. Em termos de codificação, isso significa ter iterações e loops incorporados no modelo padrão. Isso garante que tarefas como pagamento, saques, depósitos, penalização de validadores via redução de recompensa, e várias outras tarefas sejam tratadas de forma autônoma.

Seguro

E, finalmente, como os contratos inteligentes são protegidos usando criptografia, violá-los é incrivelmente difícil. Sem uma vulnerabilidade integrada, ignorar um contrato inteligente significaria tentar violá-lo a céu aberto, na frente de todo o blockchain.

Verificável

As transações processadas via contratos inteligentes são autoverificáveis. Isso significa que a execução é prova suficiente de que a transação ocorreu em primeiro lugar, já que nenhum elemento humano está envolvido. O mecanismo autoverificável dá aos contratos inteligentes uma vantagem sobre os contratos tradicionais que regem as configurações bancárias hereditárias.

Assim, da próxima vez que planeares ler um contrato inteligente, certifica-te de que o texto padrão ou a documentação têm todas as características mencionadas envolvidas.


Uma versão simplificada de contratos inteligentes: Reddit

Ler contratos inteligentes com base nas características

Aqui está um contrato inteligente simples representando uma conta de depósito em garantia. Os utilizadores depositam os seus fundos na garantia, que depois transfere o mesmo para o destinatário após um determinado período de tempo.

// SPDX-License-Identifier: MITpragma solidity ^0.8.0;// Modelo Básico de Contrato Inteligentecontrato SimpleTrustlessEscrow {// Variáveis de Estadoendereço público depositante; // Conta que deposita etherendereço pagável público beneficiário; // Conta que recebe etheruint256 public releaseTime; // Timestamp para liberar ether// Eventos para verificar atividade do contratoevento Deposited(endereço indexado _from, uint256 _value);evento Released(endereço indexado _to, uint256 _value);// O construtor do contrato inicializa o contrato inteligenteconstructor(address payable _beneficiário, uint256 _releaseTime) {    require(_releaseTime > block.timestamp, “O tempo de liberação deve estar no futuro”);    // Seguro e Descentralizado: O contrato vincula depositante e beneficiário    depositante = msg.sender;    beneficiário = _beneficiário;    releaseTime = _releaseTime;}// Função de depósito - execução autônoma (função fallback)receive() external payable {    emit Deposited(msg.sender, msg.value);}// Liberar o ether para o beneficiáriofunção release() public {    // Programável: Só pode ser executado após o releaseTime    require(block.timestamp >= releaseTime, “Muito cedo para liberar”);    // Autônomo: Executa automaticamente com base na condição    uint256 amount = address(this).balance;    beneficiário.transfer(amount);    emit Released(beneficiário, amount);}}

Embora vamos decifrar e ler este contrato inteligente em detalhe, vamos primeiro verificar se o mesmo adere às características de contrato mencionadas.

A parte “programável”

Olhe de perto para este pedaço de código no contrato:

require(block.timestamp >= releaseTime, “Muito cedo para liberar”);

uint256 valor = address(this).balance;

beneficiário.transferir(quantidade);

Os fundos serão libertados apenas quando uma condição específica de releaseTime for cumprida, tornando estes contratos programáveis.

A parte "sem confiança"

Aqui está um pequeno trecho de código do acima:

depositante = msg.sender;

beneficiário = _beneficiário;

releaseTime = _releaseTime;

No contrato, todos estão vinculados ao código, desde o depositante até a pessoa que recebe os fundos. Ninguém precisa interagir ou confiar no outro, pois a função de transferir fundos é vinculada pelo releaseTime - um parâmetro baseado em código.

A parte "autónoma"

Aqui está a parte "liberação de fundo" do código:

 function release() public {require(block.timestamp >= releaseTime, “Muito cedo para lançar”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}

O processo inteiro é autónomo, uma vez que os fundos são libertados apenas quando o releaseTime cumpre um certo critério. Note-se que o código não é parcialmente programável, mas totalmente autónomo.

Outros elementos do código do contrato inteligente, incluindo a função de depósito, também podem ser completamente autónomos, dependendo das funcionalidades que pretende incluir. Por exemplo, pode iniciar um plano de depósito recorrente sempre que o utilizador carteiracruza os $100, com o montante excedente a mover-se para o beneficiário.

A parte "segura"

Preocupado com qual elemento emprestasegurançapara o contrato? Verifique esta parte do código:

constructor(address payable _beneficiário, uint256 _releaseTime) {require(_releaseTime > block.timestamp, “O tempo de liberação deve estar no futuro”);depositante = msg.sender;beneficiário = _beneficiário;releaseTime = _releaseTime;}

Observe como há uma precedência definida da função releaseTime em relação ao carimbo de data/hora. Nada é aleatório e as condições devem ser cumpridas.

A parte "verificável"

Cada transação associada ao contrato inteligente é registada na cadeia, cortesia de elementos de atividade de registo separados.

event Deposited(address indexed _from, uint256 _value);

evento Lançado(endereço indexado _para, uint256 _valor);

emitir Deposited(msg.sender, msg.value);

emit Released(beneficiary, amount);

Ler outras partes de um contrato inteligente

Agora que identificamos os elementos que definem as características de um contrato inteligente, aqui estão os outros elementos do contrato para ajudá-lo a entender melhor o procedimento.

Solidez de Pragma ^0.8.0; – A versão da linguagem de programação Solidity necessária para escrever este contrato inteligente.

// SPDX-License-Identifier: MIT - Este identificador, denominado Software Package Data Exchange, indica a licença da versão do código. É aconselhável incluir este identificador para informar as pessoas se é de código aberto e se pode ser trabalhado ou não.

Tempo de Bloqueio de Contrato { - Atribui um nome ao contrato inteligente, como um rótulo.

Endereço público do depositante; - Como o contrato envolve um depositante e um beneficiário, este é o ponto onde o endereço público do depositante é mencionado. Esta variável é o Carteira Ethereumendereço e é publicamente visível.

Endereço público do beneficiário pagável; – Este é o endereço público do beneficiário para onde o contrato de garantia transfere fundos. Também é legível e confere transparência aos contratos inteligentes baseados em blockchain.

Uint256 lançamento público; – Por se tratar de um contrato vinculado no tempo, o uint256 atribui a variável baseada no tempo ao contrato. Este será o prazo segundo o qual as liberações do fundo acontecerão.

Em Solidity, uint (inteiro sem sinal) é a forma de atribuir valores baseados em inteiros. O sufixo 256 representa um grande armazenamento de números.

após 5 anos a escrever contratos inteligentes, só hoje percebo que o logótipo do Solidity é o logótipo do Ethereum desdobrado 🤯pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden) 8 de julho de 2023

Pode considerar a leitura Documentação Soliditypara se familiarizar com a sintaxe, expressões e outros elementos de código.

Outros elementos

constructor(address payable _beneficiary, uint256 _releaseTime) { – O “Constructor” é uma função especial única que é chamada uma vez quando o contrato inteligente é implantado. Ele inicia o contrato. Note como, neste ponto, todas as variáveis de endereço que declaramos anteriormente são chamadas e inicializadas.

Receive() external payable { – Esta é uma função especial chamada quando os fundos se movem para o endereço do contrato de fora. Externo sugere de fora, e “Pagável” define a natureza do movimento, ou seja, para receber tokens ERC-20.

Função release() pública { - Esta é uma função pública que indica o movimento de tokens ERC-20 do endereço do contrato para o beneficiário. Esta função depende de releaseTime.

Todos estes elementos são partes do contrato de Escrow hipotético que discutimos. Certifique-se de ler toda a documentação do Solidity para aprender melhor sobre a linguagem.

Conheça os elementos antes de planear escrever contratos inteligentes: BeInCrypto

DApps e contratos inteligentes: a relação

Neste momento, você deve ter uma vantagem na leitura e compreensão de um contrato inteligente já escrito. E muitos contratos inteligentes, como os que discutimos, fazem parte do backend de uma aplicação descentralizada — um blockchainversão de uma aplicação móvel padrão.

Cada característica de um contrato inteligente, incluindo segurança do contrato, execução autônoma e programável, ausência de confiança nas transações e muito mais, é prontamente implementada durante o desenvolvimento de uma aplicação descentralizada. Assim, da próxima vez que se deparar com uma DApp, note que se trata de um backend alimentado por um contrato inteligente hospedado na blockchain - ajudando a iniciar múltiplas tarefas sem intervenção humana. Os contratos inteligentes formam a lógica das DApps.

Blockchains para contratos inteligentes

Sabemos que o Ethereum permite desenvolver contratos inteligentes, como uma solução de software massiva. No entanto, não é o único protocolo blockchain ao redor. Se você quiser mergulhar fundo no mundo do desenvolvimento de contratos inteligentes, você pode querer olhar para outras blockchains. Diferentes blockchains têm diferentes jargões quando se trata de desafiar contratos.

Mas primeiro, vamos discutir Ethereum— a plataforma de eleição para a maioria dos desenvolvedores de contratos inteligentes.

Ethereum

Contratos inteligentes na Ethereum são escritos na linguagem de programação Solidity. E a interface de token para esta plataforma de desenvolvimento de contrato inteligente é ERC-20.

Pode voltar ao contrato inteligente baseado em depósito discutido anteriormente para ver como um contrato inteligente convencional baseado em Etheruem é escrito.

Mesmo lançar um token ERC-20 na blockchain Ethereum é uma característica intensiva de contrato inteligente, algo que discutiremos em profundidade ao escrever um contrato inteligente.

Aqui está como se parece a estrutura básica de um código, desde que planejemos lançar uma nova criptomoeda BIC.

Considere este um cenário hipotético. Não exatamente lançar uma criptomoeda BIC.

pragma solidez ^0.8.0;import "@openzeppelin/contratos/token/ERC20/ERC20.sol";contrato BICToken é ERC20 {    constructor(uint256 ofertaInicial) ERC20("BIC Token", "BIC") {        _mint(msg.sender, ofertaInicial);    }}

Vamos discutir cada elemento deste código mais tarde ao escrever o nosso contrato inteligente.

Outras blockchains

Como o Ethereum, você pode até criar contratos inteligentes em plataformas como Solana, usando Rust e Cardano, usando Plutus, um subconjunto de Haskell, uma linguagem de programação funcional.

"A Cordona sequer tem contratos inteligentes?"
A piada é contigo, amigo. #CardanoADApic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28) 9 de julho de 2023

Aqui está a estrutura de código em Rust ( Solana) parece:

Nota: É um contrato simples onde um contador é incrementado.

use anchor_lang::prelude::*;declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);#[program] pub mod hello_world {use super::*;pub fn initialize(ctx: Context<Initialize>) -> ProgramResult {    let greeting_account = &mut ctx.accounts.greeting_account;    greeting_account.counter = 0;    Ok(())}pub fn increment(ctx: Context<Increment>) -> ProgramResult {    let greeting_account = &mut ctx.accounts.greeting_account;    greeting_account.counter += 1;    Ok(())}}

Você sabia? Enquanto Rust é a linguagem de programação para criar contratos inteligentes baseados em Solana, Âncoraé o framework de desenvolvimento de contratos inteligentes que é usado. Para criar contratos inteligentes usando Rust, os desenvolvedores precisam puxar módulos do framework Anchor — algo a primeira linha do nosso código de exemplo (use anchor_lang::prelude::*;) representa.

Documentação Solanairá ajudá-lo a entender a linguagem de contrato inteligente específica do Rust.

Da mesma forma, Cardano segue Plutus como a escolha de linguagem, seguido pela linguagem Ink! para Polkadot, TEAL para Algorand, C# para NEO e muito mais. Aprender a documentação em cadeia em detalhes é aconselhável antes de prosseguir com a escrita de contratos inteligentes compatíveis.

Por que deveria aprender a ler contratos inteligentes?

A capacidade de escrever contratos inteligentes é muito reconhecida, mas mesmo ser capaz de ler vem com sua quota de benefícios:

  1. A capacidade de aprender sobre as complexidades de automação associadas às apps DeFi.
  2. Analisando os padrões de propriedade associados ao ativotokenização.
  3. Compreender comoorganizações autônomas descentralizadas (DAOs)função.
  4. Compreensão e implementação de lógica orientada por casos de uso relacionada a seguros, monetização de conteúdo, votaçãosistema, royalties e outros setores verticais.

Como escrever contratos inteligentes

Agora que a leitura dos contratos inteligentes está fora do caminho, vamos focar na escrita dos contratos inteligentes. Antes de aprofundar, é necessário reiterar que diferentes blockchains podem ter padrões e linguagens diferentes relacionadas ao desenvolvimento de contratos inteligentes. É necessário focar nos padrões definidos por qualquer blockchain específico para começar a escrever e implantar contratos.

Para a maioria da nossa discussão, vamos focar no Ethereum como a cadeia e Solidity como a linguagem.

O papel da programação

Programar um contrato inteligente é facilmente a parte mais importante do ciclo de desenvolvimento. E para entrar no desenvolvimento de contratos inteligentes na Ethereum ou em qualquer outra blockchain, você deve ter alguma experiência com linguagens de programação não relacionadas a blockchain como Javascript.

Diferentes blockchains e a linguagem para escrever contratos inteligentes: BeInCrypto

A capacidade de programar um contrato inteligente permite-lhe implementar lógica, lidar com os elementos de segurança do mesmo, otimizar o código para taxas de gás, personalizar o mesmo e até mesmo torná-lo interoperável, se necessário.

EVM e contratos inteligentes: uma visão geral

Qualquer pessoa que esteja a planear escrever contratos inteligentes na Ethereum precisa de compreender o que é a Máquina Virtual Ethereum (EVM) e como funciona com os contratos inteligentes. Para começar, a EVM é um componente da Ethereum que fornece programas um ambiente isolado e controlado para trabalhar. Considere isto como um computador global que hospeda cada pedaço de código de contrato que existe na Ethereum. Cadana rede Ethereum é executado o EVM.

Se você aspira a ser um desenvolvedor de contratos inteligentes, aqui está o que você precisa saber em relação aos contratos inteligentes e EVM.

Uma vez que escreva o programa em Solidity, que é uma linguagem de alto nível, precisa de o compilar em bytecode - um formato de baixo nível compreensível pela máquina. Este bytecode entra na blockchain da Ethereum e aí reside. Qualquer pessoa que interaja com o contrato inteligente precisa de enviar uma transação para o endereço do contrato.

Cada nó com o EVM instalado pode ver esta transação e, uma vez que os validadores aprovem o mesmo, o código do contrato inteligente é executado. Como cada nó tem visibilidade da transação, nada pode ser adulterado e o código é executado tal como foi escrito. E uma vez que o código é executado, o estado da blockchain muda, tornando o processo de ponta a ponta e completamente transparente.

Qualquer pessoa pode escrever um contrato inteligente?

Escrever contratos inteligentes requer conhecimentos técnicos. Mas não é só isso. Também precisa compreender completamente como funciona a tecnologia blockchain, quais são as necessidades específicas de linguagem relevantes para a blockchain que está a visar.interoperabilidade, e muito mais. Além disso, você também deve saber bastante sobre vulnerabilidades de contrato inteligente — coisas a evitar ao escrever código. E, finalmente, conhecimento de testes de contrato e implantação de contrato também é fundamental.

Tudo isso pode se tornar avassalador. Por isso, aqui está uma folha de dicas rápida para começar:

  1. Comece por escolher a plataforma ou cadeia com a qual deseja trabalhar.
  2. Aprenda a linguagem de programação associada à cadeia, como Solidity para Ethereum.
  3. Saiba como usar as ferramentas de desenvolvimento como o Ambiente de Desenvolvimento Integrado como o Remix.
  4. Comece por escrever o seu primeiro contrato e depois teste usando testnets.
  5. Uma vez que esteja satisfeito com os elementos do código, pode implementá-lo na cadeia. Lembre-se de que a implementação do contrato na cadeia terá um custo sob a forma de taxas de gás.

Aqui está um rápido tópico com algumas dicas para escrever melhores contratos inteligentes:

🥧 FREI-PI
‼️ Por que os desenvolvedores de contratos inteligentes PRECISAM saber disso!
Função:
– Requisitos
– Efeitos
– Interações
Protocol
– Invariáveis
Este é o padrão em que todos devem pensar ao construir contratos inteligentes.
Aqui está o porquê 👇
— Patrick Collins (@PatrickAlphaC) 6 de julho de 2023

Mergulhando na programação

É hora de entrar nos aspectos técnicos do desenvolvimento de contratos inteligentes. Embora blockchains como Solana e Cardano permitam que você desenvolva contratos inteligentes, o Ethereum continua a ser a plataforma de desenvolvimento de contratos inteligentes mais popular.

Sabia? Apenas em 2022, mais de 100.000 aplicativos descentralizados foram adicionados à rede Ethereum.

Porquê Ethereum?

O Ethereum tem uma enorme comunidade de desenvolvedores. Tudo o que desenvolver irá receber imediatamente atenção. Além disso, a sua linguagem nativa, Solidity, é relativamente fácil para indivíduos que conhecem bem o Python ou JavaScript. Por fim, o software global do Ethereum, EVM, ajuda na execução de contratos sem problemas.

Se estiver na maioria e preferir usar Ethereum e Solidity, aqui está uma lista rápida de coisas que precisa acompanhar antes de começar o desenvolvimento de contratos inteligentes:

  1. Pragmas ou a versão do compilador
  2. Definição de contrato para rotulagem
  3. Variáveis de estado para armazenar dados
  4. Eventos para registo EVM
  5. Modificadores para conceder direitos específicos a determinados órgãos
  6. Funções ou as atividades do contrato inteligente em jogo
  7. Herança para interoperabilidade
  8. Compreensão de estruturas de controlo como if, else, for loops, tipos de dados como string, inteiro e mais.

Escrever e implementar o primeiro contrato inteligente

Agora que sabemos como as coisas acontecem na cadeia, vamos mergulhar na escrita e implementação do primeiro contrato inteligente. Mesmo que “Olá Mundo” continue a ser o primeiro passo, começaremos por criar um contrato inteligente para lançar um token BIC hipotético com um fornecimento desbloqueado de 100% de 1 milhão.

Os conceitos básicos

O primeiro passo é instalar a versão mais recente do Node.js e do NPM ou Node Package Manager. Isso cuida das ferramentas de desenvolvimento e do ambiente local para o desenvolvimento. Além disso, o Node.js e o NPM permitem que você defina o front-end da web para o seu contrato inteligente.

Agora, você precisa configurar um IDE para escrever o código do contrato. Para isso, você pode instalar rapidamente o Visual Studio Code. Ou você pode cortar a desordem e hopsobre a Alchemy - uma plataforma de desenvolvimento blockchain. Com a Alchemy, você pode obter algum ETH de testnet. Isso cobrirá as taxas de gás quando você implantar o contrato inteligente na testnet Goerli ou mesmo na testnet Sepolia.

Note que a Sepolia é um testnet mais recente e, portanto, requer menos espaço em disco quando se trata de implementação de nós.

Por agora, vamos persistir com a rede de testes Goerli, pois possui um número maior de aplicações implementadas.

Com a testnet e o ETH falso prontos, vamos passar para a escrita específica do contrato inteligente. Aqui está o trecho de código para criar um token BIC com um fornecimento fixo de 1 milhão.

Nota: Vamos implementar o nosso contrato inteligente localmente no MacOS e não na testnet. Para a implementação de contratos inteligentes na testnet e mainnet, teremos uma parte separada, que está além do âmbito desta discussão.

Passos para escrever e implementar

Aqui está o simples trecho de código para o token hipotético:

pragma solidez ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contrato BIC is ERC20 {    constructor() ERC20("BIC Token", "BIC") {        _mint(msg.sender, 1000000 * 10 ** decimals());    }}

Se estiver familiarizado com a sintaxe, saberá o que significa cada componente de código. Quanto ao Openzepplinparte, é a biblioteca ideal para importar contratos inteligentes ERC-20. Esta biblioteca oferece os padrões operacionais básicos para tokens ERC-20.

A função de cunhagem fala sobre o fornecimento inicial, que é implantado no endereço do contrato inteligente ou no msg.sender.

Para configurar este código localmente e testá-lo, precisaremos de três componentes:

  1. Node.js e NPM (já discutidos): Funciona como um motor para alimentar seus contratos inteligentes
  2. Truffle: Funciona como uma caixa de ferramentas, ajudando-o a organizar código, scripts e outras partes de um contrato
  3. Ganache: Funciona como um recreio virtual no dispositivo. Pense nele como uma blockchain pessoal.

O que é a execução do contrato?

Se passou pelo processo detalhado de escrever um contrato inteligente, é imperativo saber bastante sobre a execução do contrato. É um processo pelo qual o código do contrato inteligente é executado numa cadeia pelos nós.

É a uniformidade associada à execução do contrato que torna os contratos inteligentes transparentes e imutáveis. Vamos agora entender o processo escalonado associado à execução do contrato:

Passo 1

Os trechos de código que temos estado a escrever precisam de ser executados em algum lugar. No caso dos contratos inteligentes, este local de execução é a blockchain. Os nós ou os membros participantes da cadeia ajudam a executar o contrato.

Passo 2

Os nós aceitam a responsabilidade de executar blocos de código de contrato em troca de incentivos relacionados à cadeia. Cada comando ou ação que ocorre dentro da cadeia é liderado por contratos inteligentes.

Passo 3

Cada contrato inteligente tem um endereço específico. Para executar o contrato, as transações são enviadas para esse endereço do contrato. Note que cada nó executa o EVM, que então tem uma cópia do código do contrato inteligente, o que torna mais fácil verificar a autenticidade das transações.

Passo 4

As transações destinadas ao contrato inteligente são selecionadas pelos validadores, que depois as incluem em blocos específicos.

Passo 5

Uma vez que a transação é enviada e validada com sucesso, ela passa a fazer parte da blockchain. A função do contrato inteligente associada à transação é então chamada e executada em todos os nós da blockchain.

Passo 6

Cada nó que executa o contrato inteligente deve chegar a uma conclusão determinística — a mesma saída para o mesmo conjunto de entradas — tornando a natureza dos contratos completamente sem confiança e transparente.

Nota: Qualquer erro relativo à execução do código ou questões relacionadas com as taxas de gás reverte as transações. Isto significa que a transação baseada num código de contrato inteligente específico deixará de existir. Isto é exatamente o que acontece com Empréstimos Flashquando a incapacidade de aderir a normas específicas reverte toda a transação, dando a impressão de que os fundos nem sequer se moveram no primeiro lugar.

Cada alteração de estado associada a contratos inteligentes é registada dentro da blockchain e torna-se uma parte imutável da mesma.

Desenvolvimento de contrato inteligente e melhores práticas

Agora que você sabe bastante sobre contratos inteligentes, aqui estão algumas dicas para começar o desenvolvimento de contratos:

  1. Ao escrever contratos, é aconselhável confiar em bibliotecas confiáveis como as da OpenZeppelin para cumprir os padrões desejados de otimização de código e segurança.
  2. A ideia é manter o contrato modular e mais simples — tornando mais fácil testar e rever.
  3. Uma boa ideia é implementar controles de acesso específicos ao contrato. Isso significa declarar trechos de código onde apenas uma pessoa ou entidade específica pode alterar os traços cruciais do contrato. O controle de acesso facilita a manutenção da segurança dos contratos inteligentes.
  4. Ao escrever um contrato, faça sempre disposições para lidar com casos limite e exceções - tudo enquanto escreve vários testes.

Cuidar da sustentabilidade do código

Cada uma das práticas mencionadas acima ajuda na otimização de código e implementações específicas de segurança. No entanto, existem algumas práticas específicas do contrato que você deve seguir e implementar para cuidar da sustentabilidade do código. Isso visa manter o código do contrato leve e utilizável para que cada nó em execução e execução do mesmo não tenha que dedicar muito poder computacional ao mesmo.

  1. Manipular o armazenamento de forma eficiente, utilizando conjuntos de dados mais pequenos. Por exemplo, ao escrever um contrato, utilize uint8 como o valor operacional em vez de uint256.
  2. Ao escrever um contrato, é aconselhável otimizar o código combinando várias operações em uma. Vamos aprofundar isso em nossa peça detalhada sobre “escrever contratos inteligentes”.
  3. Uma boa ideia é usar avaliação preguiçosa no que diz respeito à execução de contratos inteligentes. Desta forma, só precisa de executar uma função quando necessário e não sempre que algo é enviado para o endereço do contrato inteligente.
  4. Por fim, confiar em cálculos fora da cadeia também é uma boa maneira de focar na sustentabilidade. Isso ajuda a reduzir os requisitos de taxas de gás e pode até acelerar a execução do contrato.

Apesar de seguir as melhores práticas ao escrever e desenvolver contratos inteligentes, é necessário focar nas vulnerabilidades de segurança do contrato ao enviá-los para a mainnet.

Como auditar contratos inteligentes?

Cada contrato inteligente que tem presença na mainnet precisa ser avaliado quanto ao desempenho do código, segurança e outras características. É aqui que a auditoria — um processo rigoroso de teste de contrato — vem à tona, permitindo que descubra possíveis vulnerabilidades e fraquezas no contrato.

Aqui está uma lista de verificação rápida de auditoria para começar:
Lista de verificação incrível de auditoria de Contratos Inteligentes😈
Certifique-se de verificá-los na sua próxima auditoria✅
Agradeceria um retweet, espalhe o conhecimento🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv) 7 de julho de 2023

Relação entre leitura, escrita e auditoria: por que mesmo auditar contratos inteligentes?

Ao ler e escrever contratos inteligentes estão interligados quando se trata de desenvolver pedaços inteligentes de código, a auditoria tem um lugar especial e envolve verificar a lógica em primeiro lugar. Quando se trata de execução de código baseado em blockchain, tudo é imutável e qualquer coisa catastrófica pode ter consequências irreversíveis na execução do contrato. É exatamente por isso que uma verificação minuciosa do código do contrato e de outros aspectos através de auditoria é necessária.

Vulnerabilidades de contrato e correções

Pode haver uma série devulnerabilidades do contratoque uma auditoria detalhada de contrato inteligente pode identificar. Estes incluem a verificação de ataques de reentrância, overflows ou underflows, problemas relacionados com o controlo de acesso e muito mais. Uma vez determinada a natureza exata do problema, o auditor pode até sugerir as melhores práticas para o corrigir.

Violações lançam estudos e aprendizados

Ainda não tem a certeza de como a auditoria de contratos inteligentes pode ajudar? Bem, vamos voltar ao famoso DAOhack em 2016, que explorou um problema de recursividade e causou uma perda de quase 3,6 milhões de ETH. Da mesma forma, houve o hack do contrato da carteira Parity em 2017, levando a uma perda de quase 500.000 ETH. Esses problemas poderiam ter sido evitados com o conjunto certo de auditorias.


Fluxograma do hack do DAO: BeInCrypto

Estratégias para auditar contratos inteligentes

Existem inúmeras estratégias para auditar contratos inteligentes. Algumas das mais populares incluem:

Ferramentas de auditoria

Essas ferramentas atuam como o primeiro conjunto de defesas e são melhor usadas para localizar vulnerabilidades comuns. Algumas das ferramentas mais populares incluem Securify, Mythril e muito mais — capazes de realizar análises estáticas do código, detetar padrões de violação e ajudar a obter um avanço específico de segurança.

Ferramentas para auditar contratos inteligentes: BeInCrypto

Revisão do código

É aqui que entram em cena os revisores de código manuais, escrutinando a base de código e identificando vulnerabilidades complexas, se houver. Uma revisão manual pode ajudar a cuidar da lógica de negócios, do contexto e dos padrões de uso.

Aqui está como as revisões manuais de código o ajudam a localizar ameaças:

Uma pequena curiosidade para os nossos auditores juniores!
Vamos e retweet se encontrou o bug!pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles)8 de julho de 2023

Digitalizações automáticas

Ferramentas como Snyk e GuardRails ajudam na verificação automática de contratos - uma implementação de segurança que é invocada sempre que o código é atualizado. Esta forma de auditoria garante que as novas alterações feitas a um código sejam seguras e não invasivas por natureza.

Verificação formal

Este é um processo complexo que depende exclusivamente da verificação da lógica de negócios do código. Note que a verificação formal não é realmente destinada a verificar a sintaxe, mas apenas a lógica para ver se o código é executado como desejado.

Além das estratégias mencionadas, a auditoria de contratos inteligentes também pode ser iniciada usando revisões por pares, programas de recompensa por bugs e coberturas de teste por meio de ferramentas como a Solidity Coverage para maximizar a eficácia.

Uma maneira simples de auditar contratos inteligentes: BeInCrypto

Como rever o código corretamente?

Se é novo na auditoria de contratos inteligentes, é importante notar que existem duas formas de analisar amplamente o código e identificar problemas. Estas incluem:

Análise estática

Este tipo de análise de código ajuda a identificar vulnerabilidades básicas de segurança, erros de codificação e outros problemas de acordo com os padrões e convenções de codificação fornecidos. Ameaças como chamadas não verificadas para fontes externas, transbordamentos de inteiros e mais podem ser destacadas usando análise estática. A melhor coisa sobre análise estática é que o código não precisa ser executado para ser verificado.

Análise dinâmica

Esta abordagem para auditar testes a alinhamento do código com o EVM. Em vez de apenas verificar o código, a análise dinâmica verifica a resposta dos contratos inteligentes a uma ampla gama de entradas. A análise dinâmica pode identificar problemas como consumo incoerente de gás e até lógica de contrato errônea. Ambientes de blockchain pessoais como Ganache podem funcionar como plataformas de análise dinâmica, permitindo que os desenvolvedores realizem transações, executem comandos e façam muito mais com seus contratos.

Testando um pedaço real de código

Aqui está um trecho de contrato inteligente que funciona como um armazenamento de fundos, tendo uma função de retirada:

pragma solidez ^0.6.1;contrato VulnerableContract {    mapeamento(endereço => uint256) saldos públicos;    função depósito() público pagável {        saldos[msg.sender] += msg.value;    }    função retirar(uint256 _montante) público {        exigir(saldos[msg.sender] >= _montante, "Saldo insuficiente.");        (bool sucesso, ) = msg.sender.call{value: _montante}("");        exigir(sucesso, "Transferência falhou.");        saldos[msg.sender] -= _montante;    }}

Se olhar de perto para o código, há uma vulnerabilidade chave:

No caso anterior, a função “levantar” pode ser chamada novamente se o utilizador que recebe os fundos também for um contrato inteligente, embora malicioso. Portanto, antes da última função ou da atualização do saldo acontecer, um ataque de reentrância pode ser iniciado para transferir fundos adicionais. Auditores experientes identificam este tipo de vulnerabilidade.

Aqui está o código corrigido para o mesmo:

function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Saldo insuficiente.");    saldos[msg.sender] -= _amount;    (sucesso bool, ) = msg.sender.call{value: _amount}("");
require(success, “Transferência falhou.”);

Verifique como a função de atualização de saldo é chamada primeiro e depois o primeiro movimento para o usuário. Esta mudança na ordem de operação é o que corrige o contrato.

Cadeias não relacionadas com Ethereum e revisão de código

O mundo das aplicações descentralizadas e dos contratos inteligentes foi além do Ethereum. Mesmo que a maior parte da ação ainda aconteça dentro do ecossistema do Ethereum, existem outras blockchains como Cardano, Solana e mais que suportam contratos inteligentes e exigem diferentes padrões de auditoria.

Por que é que cada plataforma é única?

Diferentes blockchains usam diferentes linguagens de programação. A semântica, a sintaxe e as propriedades do código são diferentes, tornando os contratos inteligentes responsivos a diferentes práticas de escrita e auditoria. Por exemplo, o Ethereum usa Solidity, enquanto Polkadotusa Ink e Rust — tornando-o reativo a padrões de auditoria específicos.

Ferramentas para não ir para o Ethereum

Agora, se você deseja avançar além do Ethereum, existem algumas ferramentas de auditoria especializadas para começar. Por exemplo, com Cardano, existe o conjunto Marlowe para verificação formal e auditoria. Quando se trata de Solana, libfuzzer específico do Rust e cargo-fuzz são destinados à auditoria e teste de contrato. Um auditor multi-cadeia deve estar familiarizado com esses conceitos para manter as vulnerabilidades do contrato afastadas.

Quais são os diferentes tipos de auditoria de contrato inteligente?

Apenas para reiterar, pode-se segmentar a auditoria de contratos inteligentes em três tipos: manual, automática e híbrida. Note que as pessoas preferem estratégias de auditoria híbridas para contratos complexos com lógica de negócios profunda, pois são as mais abrangentes.

A terceirização das suas auditorias

Organizações e indivíduos com conhecimentos mínimos de codificação frequentemente terceirizam suas necessidades de escrita e auditoria para empresas de renome. Quando se trata de auditoria, escolher a empresa certa torna-se ainda mais importante, pois mesmo queFerramentas de IAgostarChatGPTpode ajudar a escrever código de contrato inteligente, verificar o mesmo requer insights manuais.

Além disso, aqui estão os fatores a ter em conta ao externalizar as tarefas de auditoria:

Escolher a empresa certa

Antes de se concentrar na empresa de outsourcing certa, é crucial verificar auditorias passadas, avaliar a experiência e até mesmo focar nos membros-chave da equipa.

Compreender responsabilidades, custos e despesas

Antes de contratar, tome nota dos custos e serviços associados às auditorias. É imperativo entender primeiro a natureza dos serviços oferecidos — como identificação de problemas, resolução de problemas e mais. Deve também verificar se são fornecidas reauditorias após a implementação da primeira linha de correções. O custo de uma auditoria de contrato inteligente pode variar dependendo dos serviços, e portanto, é necessário rastrear todos os requisitos e ofertas antes de avançar.

Melhores práticas de auditoria de contratos inteligentes

Caso queira abandonar uma empresa e auditar contratos inteligentes por si próprio, aqui estão as melhores estratégias e práticas a ter em mente:

  1. Sempre foque numa revisão de código minuciosa, incluindo a sintaxe e lógica
  2. Comece por identificar vulnerabilidades comuns usando ferramentas como Slither, MythX e mais
  3. Navegue pelo Registro de Classificação de Vulnerabilidades de Contratos Inteligentes ou SWC para localizar as vulnerabilidades conhecidas e verificá-las antecipadamente.
  4. Testar os contratos inteligentes rigorosamente, incluindo testes de integração, testes unitários e mais, para testar o código em uma ampla gama de cenários.
  5. É importante verificar as chances de ataques de reentrância especificamente. A melhor maneira de combater o mesmo é verificar chamadas recursivas que os hackers podem chamar antes da primeira função do contrato inteligente.
  6. Concentre-se nas funções que levam a chamadas externas. Um erro neste sentido pode alterar o estado e o fluxo de controle, o que não é desejável.
  7. Mantenha sempre um olho nos pedaços de código que apontam para o uso de gás. Não quer que o seu contrato inicie interações que sejam proibitivamente caras.

Desenvolvimento de contrato inteligente e IA: o futuro

A inteligência artificial está, de facto, a tornar mais fácil escrever contratos inteligentes. No entanto, independentemente da inovação em IA, a capacidade de auditar contratos inteligentes da melhor forma possível ainda requer intervenção humana. Portanto, se planeia construir o seu próximo produto web3 enfatizando contratos inteligentes e aplicações descentralizadas, é crucial focar-se religiosamente nos melhores recursos de auditoria para os seus contratos inteligentes. Com hacks e violações de criptomoedas a surgir a cada dia que passa e hackers a planear novas estratégias para penetrar, auditar um contrato até à perfeição é certamente uma das competências mais importantes dos tempos modernos.

Aviso legal:

  1. Este artigo é reproduzido a partir de [GateBeincrypto], e os direitos de autor pertencem ao autor original [Ananda Banerjee]. Se houver objeções à reprodução, entre em contato com a equipe Gate Learn e a equipa irá processá-la prontamente de acordo com os procedimentos relevantes.
  2. Aviso legal: As opiniões expressas neste artigo representam apenas as opiniões pessoais do autor e não constituem qualquer conselho de investimento.
  3. Outras versões do artigo são traduzidas pela equipe Gate Learn. Sem mencionar a Gate.io, não é permitido copiar, disseminar ou plagiar os artigos traduzidos.
Comece agora
Registe-se e ganhe um cupão de
100 USD
!