Compreendendo Contrato Inteligente: Leia, Escreva e Audite

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 outras linguagens. Dado que os contratos inteligentes são centrais para Finanças Descentralizadas (DeFi) e Aplicações Descentralizadas (DApps), garantir sua segurança e perfeição é crucial, com auditorias de contratos inteligentes desempenhando um papel fundamental.

Lendo contratos inteligentes

Contratos inteligentes são pedaços programáveis de código que são executados apenas quando um conjunto de condições é atendido. Eles são sinônimos de contratos do mundo real juridicamente 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. É esse quociente de imutabilidade que torna os contratos inteligentes especiais, entre outras coisas.

Compreendendo contratos inteligentes: noções básicas e propósito

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

Como contratos inteligentes se alinham com a tecnologia blockchain: BeInCrypto

"A palavra da moda 'web3' sugere os hábitos de programação relaxados e inseguros da web. Quando criptomoedas ou contratos inteligentes são programados como uma página web, estão condenados. Blockchains e seus aplicativos sustentavelmente bem-sucedidos são baseados em métodos de programação muito mais seguros, cuidadosos e lentos."

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

Contratos inteligentes podem trabalhar com tokens específicos de blockchain, como ERC-20 para o blockchain Ethereum, incentivando esforços e movimentando transações. Como envolvem código, condições e custos, você deve ter cuidado ao ler, escrever e auditá-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 transfira fundos para a pessoa B quando B completar um serviço - uma cópia do contrato inteligente é salva e executada pelos nós da blockchain. Os contratos inteligentes são salvos como códigos contratuais dentro da cadeia. Essa validação de múltiplos caminhos é uma característica centrada na 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 propósito de um contrato inteligente determinam como ele é escrito, lido ou mesmo auditado.

Contratos tradicionais, escrituras de imóveis, 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 de elaboração de regras descentralizadas.https://t.co/EU2Y28FznK
— Nick Szabo (@NickSzabo4) 15 de março de 2018

Vamos considerar um pool de liquidez padrão governado por um contrato inteligente.

Imagine que o pool de tokens pode ser usado para negociação e, sempre que houver uma negociação bem-sucedida, 0,3% do valor total da negociação é enviado ao provedor de liquidez que possibilitou essa negociação ou adicionou liquidez para o ativo negociável em questão. 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 dentro da cadeia como um código de contrato.

Características de contratos inteligentes

Não podemos nos aprofundar na leitura, escrita e auditoria de contratos se não estivermos cientes de suas características. Aqui estão os traços padrão do contrato inteligente para estar ciente:

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

Contratos programáveis

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 DeFio espaço já depende de contratos inteligentes para processar instâncias complexas como lidar com taxas de negociação em pools de liquidez, mantendo APYrazões, e mais.

Sem confiança

Contratos inteligentes residentes na blockchain eliminam a intervenção humana. Isso os torna completamente sem confiança. Por exemplo, se um específico DeFi O protocolo, regido 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, gerenciamento 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 esqueleto. Isso garante que tarefas como pagamento, saques, depósitos, penalização de validadores via redução, e várias outras tarefas sejam autonomamente tratadas.

Seguro

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

Verificável

Transações processadas através de contratos inteligentes são auto-verificá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 auto-verificável confere aos contratos inteligentes uma vantagem sobre contratos tradicionais que regulam as configurações bancárias legadas.

Portanto, da próxima vez que planejar ler um contrato inteligente, certifique-se de que o texto padrão ou a documentação contenha todas as características mencionadas envolvidas.


Uma versão simplificada de contratos inteligentes: Reddit

Lendo contratos inteligentes com base nas características

Aqui está um contrato inteligente simples que representa uma conta de garantia. Os usuários depositam seus fundos na garantia, que então transfere o mesmo para o destinatário após um período de tempo específico.

/ SPDX-License-Identifier: MITpragma solidez ^0.8.0;// Contrato inteligente básico Boilerplatecontract SimpleTrustlessEscrow {// Variáveis de estadoendereço público depositor; // Conta depositando etherendereço pagável público beneficiário; // Conta recebendo etheruint256 público releaseTime; // Timestamp para liberar ether// Eventos para verificar a atividade do contratoevento Depositado(endereço indexado _from, uint256 _value);evento Liberado(endereço indexado _to, uint256 _value);// O construtor do contrato inicializa o contrato inteligenteconstructor(endereço pagável _beneficiário, uint256 _releaseTime) {    exige(_releaseTime > block.timestamp, “O tempo de liberação deve estar no futuro”);    // Seguro e Sem Confiança: O contrato vincula depositante e beneficiário    depositor = msg.sender;    beneficiário = _beneficiário;    releaseTime = _releaseTime;}// Função de depósito - execução autônoma (função de fallback)receber() externo pagável {    emitido Depositado(msg.sender, msg.value);}// Liberar o ether para o beneficiáriofunção liberar() público {    // Programável: Só pode ser executado após releaseTime    exige(block.timestamp >= releaseTime, “Muito cedo para liberar”);    // Autônomo: Executa automaticamente com base na condição    uint256 montante = endereço(this).saldo;    beneficiário.transfer(montante);    emitido Liberado(beneficiário, montante);}}

Enquanto vamos conseguir decifrar e ler este contrato inteligente em detalhes, vamos primeiro verificar se o mesmo adere às características do contrato mencionadas.

A parte "programável"

Olhe de perto o contrato para este trecho de código:

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

uint256 quantidade = address(this).balance;

beneficiário.transferir(valor);

Os recursos devem ser liberados somente quando uma condição específica de liberação for atendida, tornando esses contratos programáveis.

A parte "sem confiança"

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

depositante = msg.sender;

beneficiário = _beneficiário;

releaseTime = _releaseTime;

No contrato, todos estão vinculados por 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 transferência de fundos é vinculada pelo releaseTime - um parâmetro baseado em código.

A parte "autônoma"

Aqui está a parte de “liberação de fundos” do código:

function release() público {require(block.timestamp >= releaseTime, “Muito cedo para liberar”);uint256 montante = address(this).balance;beneficiário.transfer(montante);emit Liberado(beneficiário, montante);}

O processo inteiro é autônomo, já que os fundos são liberados apenas quando o releaseTime atende a um certo critério. Observe 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 totalmente autônomos, dependendo das funcionalidades que você deseja incluir. Por exemplo, você pode iniciar um plano de depósito recorrente toda vez que o usuário's carteiraultrapassa $100, com o valor excedente sendo transferido para o beneficiário.

A parte "segura"

Preocupado com o elemento emprestado segurançapara o contrato? Confira 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 timestamp. Nada é aleatório e as condições devem ser atendidas.

A parte "verificável"

Cada transação associada ao contrato inteligente é registrada dentro da cadeia, cortesia de elementos de atividade de log separados.

evento Depositado(endereço indexado _from, uint256 _value);

evento Liberado (endereço indexado _to, uint256 _value);

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

emit Liberado(beneficiário, quantia);

Lendo 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 processo.

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

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

Contrato TimeLock { - Atribui um nome ao contrato inteligente, como um rótulo.

Endereço público depositante; – Uma vez que o contrato envolve um depositante e um beneficiário, este é o ponto em que o endereço público do depositante é mencionado. Esta variável é o Carteira Ethereumendereço e é visível publicamente.

Endereço do beneficiário público a pagar; – Este é o endereço público do beneficiário para onde a caução transfere fundos. Ele também é legível e empresta uma sensação de transparência aos contratos inteligentes alimentados por blockchain.

Uint256 public releaseTime; - Como é um contrato vinculado ao tempo, o uint256 atribui a variável baseada no tempo ao contrato. Este será o período de tempo de acordo com o qual as liberações de fundos ocorrerão.

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

depois de 5 anos escrevendo contratos inteligentes, só hoje percebo que o logo do solidity é o logo do ethereum desdobrado 🤯pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden) 8 de julho de 2023

Você pode considerar a leitura Documentação do 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. Observe como, neste ponto, todas as variáveis de endereço que declaramos anteriormente são chamadas e inicializadas.

Receive() external pay { – Esta é uma função especial chamada quando os fundos se movem para o endereço do contrato de fora. Sugestões externas e "Pagável" define a natureza do movimento, ou seja, receber tokens ERC-20.

function release() public { - 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 esses elementos são partes do contrato de garantia hipotético que discutimos. Certifique-se de ler toda a documentação do Solidity para aprender mais sobre a linguagem.

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

DApps e contratos inteligentes: a relação

Até agora, 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 um aplicativo descentralizado — um blockchainversão de um aplicativo móvel padrão.

Todas as características de um contrato inteligente, incluindo segurança do contrato, execução autônoma e programável, falta de confiança das transações e muito mais, são prontamente implementadas durante o desenvolvimento de um aplicativo descentralizado. Portanto, da próxima vez que você se deparar com um DApp, observe que ele é um back-end alimentado por contrato inteligente hospedado no blockchain - ajudando você a iniciar várias tarefas sem intervenção humana. Os contratos inteligentes formam a lógica do DApps.

Blockchains para contratos inteligentes

Sabemos que o Ethereum permite que você desenvolva contratos inteligentes, como uma solução de software em grande escala. No entanto, não é o único protocolo blockchain disponível. Se você deseja mergulhar fundo no mundo do desenvolvimento de contratos inteligentes, pode ser interessante olhar para outras blockchains. Diferentes blockchains têm diferentes termos ao elaborar contratos.

Mas primeiro, vamos discutirEthereum— a plataforma mais utilizada pela maioria dos desenvolvedores de contratos inteligentes.

Ethereum

Contratos inteligentes no 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.

Você pode voltar ao contrato inteligente baseado em garantia que discutimos anteriormente para ver como um contrato inteligente padrão 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 do código, desde que planejemos lançar uma nova criptomoeda BIC.

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

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

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

Outras blockchains

Assim 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.

“Cordona sequer tem contratos inteligentes?”
Brincadeira com você, amigo. #CardanoADA pic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28)9 de julho de 2023

Aqui está a estrutura de código em Rust ( Solanaparece com:

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

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

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

Documentação da 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!Polkadot, TEAL para Algorand, C# para NEO e mais. É aconselhável aprender a documentação detalhada da cadeia antes de prosseguir com a escrita de contratos inteligentes compatíveis.

Por que você deve aprender a ler contratos inteligentes?

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

  1. A capacidade de aprender sobre as complexidades de automação associadas aos aplicativos 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 da lógica orientada por casos de uso relacionada a seguros, monetização de conteúdo, votaçãosistema, royalties e outros verticais.

Como escrever contratos inteligentes

Agora que a leitura dos contratos inteligentes está fora do caminho, vamos nos concentrar em escrever contratos inteligentes. Antes de aprofundar, é necessário reiterar que diferentes blockchains podem ter padrões e idiomas diferentes relacionados 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 de nossa discussão, vamos nos concentrar 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 ingressar no desenvolvimento de contratos inteligentes no 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 que você implemente a lógica, lide com os elementos de segurança do mesmo, otimize 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 planejando escrever contratos inteligentes no Ethereum precisa entender o que é a Máquina Virtual Ethereum (EVM) e como ela funciona com contratos inteligentes. Para começar, a EVM é um componente do Ethereum que fornece programas um ambiente isolado e controlado para trabalhar. Considere isso como um computador global que hospeda cada pedaço de código de contrato que existe no Ethereum. Cadana rede Ethereum roda o EVM.

Se você aspira a ser um desenvolvedor de contrato inteligente, aqui está o que você precisa saber sobre contratos inteligentes e EVM.

Uma vez que você escreve o programa em Solidity, que é uma linguagem de alto nível, é necessário compilá-lo em bytecode - um formato de baixo nível compreensível pela máquina. Esse bytecode é inserido na blockchain do Ethereum e lá permanece. Qualquer pessoa que interaja com o contrato inteligente precisa 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 aprovam 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 como foi escrito. E uma vez que o código é executado, o estado do blockchain muda, tornando o processo completo e totalmente transparente.

Qualquer pessoa pode escrever um contrato inteligente?

Escrever contratos inteligentes requer conhecimento técnico. Mas não é só isso. Você também precisa entender completamente como a tecnologia blockchain funciona, quais são as necessidades específicas de linguagem relevantes para o blockchain que você está mirando,interoperabilidadeAlém disso, você também deve conhecer bastante sobre vulnerabilidades de contratos inteligentes — coisas a serem evitadas ao escrever código. E, por fim, o conhecimento em testes de contrato e implantação de contrato também é essencial.

Tudo isso pode se tornar esmagador. Então aqui está uma folha de dicas rápida para começar:

  1. Comece escolhendo 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 escrevendo seu primeiro contrato e depois teste usando testnets.
  5. Uma vez satisfeito com os elementos do código, você pode implantá-lo na cadeia. Lembre-se de que implantar o contrato na cadeia custará na 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
Protocolo
– Invariantes
Este é o padrão que todos devem considerar ao construir contratos inteligentes.
Aqui está o motivo 👇
— Patrick Collins (@PatrickAlphaC) 6 de julho de 2023

Mergulhando na programação

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

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

Por que Ethereum?

Ethereum tem uma enorme comunidade de desenvolvedores. Qualquer coisa que você desenvolva imediatamente chamará a atenção. Além disso, sua linguagem nativa, Solidity, é relativamente fácil para pessoas que sabem lidar com Python ou JavaScript. Por fim, o software global da Ethereum, EVM, ajuda na execução de contratos sem problemas.

Se você está na maioria e prefere usar Ethereum e Solidity, aqui está uma rápida lista de coisas que você 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 registro EVM
  5. Modificadores para conceder direitos específicos a órgãos específicos
  6. Funções ou atividades do contrato inteligente em jogo
  7. Herança para interoperabilidade
  8. Compreensão das estruturas de controle como if, else, loops for, tipos de dados como string, inteiro e mais.

Escrevendo e implantando 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” permaneça o primeiro passo, começaremos criando um contrato inteligente para lançar um token BIC hipotético com uma oferta totalmente desbloqueada de 1 milhão.

Os fundamentos

O primeiro passo é instalar a última versão do Node.js e o NPM ou Node Package Manager. Isso cuida das ferramentas de desenvolvimento e do ambiente local para desenvolvimento. Além disso, Node.js e NPM permitem configurar 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 bagunça e hoppara a Alquimia - uma plataforma de desenvolvimento blockchain. Com a Alquimia, você pode obter alguns ETH de testnet. Isso cobrirá as taxas de gás quando você implantar o contrato inteligente na testnet Goerli ou mesmo na testnet Sepolia.

Observe que o Sepolia é uma testnet mais recente e, portanto, requer menos espaço em disco quando se trata de implantação de nós.

Por enquanto, vamos persistir com a rede de testes Goerli, pois possui um maior número de aplicativos implantados.

Com a rede de teste e o ETH falso prontos, vamos passar especificamente para escrever o contrato inteligente. Aqui está o trecho de código para criar um token BIC com um fornecimento fixo de 1 milhão.

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

Passos para escrever e implantar

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

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

Se você está ciente da sintaxe, você saberia o que cada componente de código significa. Quanto ao Openzepplinpart, é a biblioteca padrão para importar contratos inteligentes ERC-20. Esta biblioteca oferece os padrões operacionais básicos para tokens ERC-20.

A função mint 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 você a organizar código, scripts e outras partes de um contrato
  3. Ganache: Funciona como um playground virtual, em dispositivo. Pense nele como um blockchain pessoal.

O que é a execução de contrato?

Se você passou pelo processo detalhado de escrever um contrato inteligente, é imperativo saber um pouco sobre a execução do contrato. É um processo pelo qual o código do contrato inteligente é executado em uma 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 em etapas associado à execução do contrato:

Passo 1

Os trechos de código que temos escrito precisam ser executados em algum lugar. No caso dos contratos inteligentes, esse 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 acontece dentro da cadeia é liderado por contratos inteligentes.

Passo 3

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

Passo 4

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

Passo 5

Uma vez que a transação é enviada e validada com sucesso, ela se torna 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 relacionado à execução do código ou questões relacionadas às taxas de gás reverte as transações. Isso significa que a transação baseada em um código de contrato inteligente específico deixará de existir. Isso é exatamente o que acontece comempréstimos instantâneosquando a incapacidade de aderir a normas específicas reverte toda a transação, dando a impressão de que os fundos nem se moveram em primeiro lugar.

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

Desenvolvimento de contratos inteligentes e melhores práticas

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

  1. Ao escrever contratos, é aconselhável confiar em bibliotecas confiáveis como as do OpenZeppelin para aderir às normas desejadas 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 revisar.
  3. Uma boa ideia é implementar controles de acesso específicos do contrato. Isso significa declarar trechos de código nos quais 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, sempre faça disposições para lidar com casos limite e exceções — tudo enquanto escreve vários testes.

Cuidando 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 de contrato que você deve seguir e implementar para cuidar da sustentabilidade do código. Isso tem como objetivo manter o código do contrato leve e utilizável, para que cada nó que o executa não precise dedicar muita potência computacional para o mesmo.

  1. Manuseie o armazenamento de forma eficiente usando conjuntos de dados menores. Por exemplo, ao escrever um contrato, use 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 nos aprofundar nisso em nosso artigo detalhado sobre "escrever contratos inteligentes".
  3. Uma boa ideia é usar avaliação preguiçosa em relação à execução de contratos inteligentes. Dessa forma, você só precisa executar uma função quando necessário e não toda vez que algo é enviado para o endereço do contrato inteligente.
  4. Por fim, depender de cálculos off-chain também é uma boa maneira de focar na sustentabilidade. Isso ajuda a reduzir os requisitos de taxa de gás e pode até mesmo 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 rigoroso processo de teste de contrato — vem à tona, permitindo que você descubra possíveis vulnerabilidades e fraquezas do contrato.

Aqui está uma lista de verificação de auditoria rápida para começar:
Lista de verificação incrível de Auditoria de Contratos Inteligentes😈
Certifique-se de verificá-los em sua próxima auditoria✅
Eu 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 entrelaçados 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 outros aspectos por meio da auditoria é necessária.

Vulnerabilidades de contrato e correções

Pode haver uma série de vulnerabilidades contratuaisque uma auditoria detalhada de contrato inteligente pode identificar. Estes incluem verificação de ataques de reentrada, estouros ou subfluxos, problemas relacionados ao controle de acesso e muito mais. Uma vez determinada a natureza exata do problema, o auditor pode até sugerir as melhores práticas para corrigi-lo.

Violações lançam estudos e aprendizados

Ainda não tem certeza de como a auditoria de contratos inteligentes pode ajudar? Bem, vamos voltar ao infameDAOhack em 2016, que explorou um problema de reentrância 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 correto de auditorias.


Fluxograma do hack do DAO: BeInCrypto

Estratégias para auditar contratos inteligentes

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

Ferramentas de auditoria

Essas ferramentas atuam como o primeiro conjunto de defesas e são melhores usadas para localizar vulnerabilidades comuns. Alguns das ferramentas mais populares incluem Securify, Mythril e mais - capazes de realizar análise estática do código, detectar 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 de código

É aqui que os revisores manuais de código entram em cena, examinando 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 de código manuais ajudam você a localizar ameaças:

Um pequeno jogo de perguntas para nossos auditores juniores!
Vamos lá e retweet se você encontrou o bug! pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles)8 de julho de 2023

Varreduras automáticas

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

Verificação formal

Este é um processo complexo que se baseia exclusivamente na verificação da lógica de negócios do código. Observe 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 conforme 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 Cobertura Solidity para maximizar a eficácia.

Uma maneira simples de auditar contratos inteligentes: BeInCrypto

Como revisar o código corretamente?

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

Análise estática

Esse 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, estouros de números inteiros e muito mais podem ser destacadas usando análise estática. A melhor coisa sobre a análise estática é que o código não precisa ser executado para que ele seja verificado.

Análise dinâmica

Esta abordagem para a auditoria testa o 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 pessoais de blockchain 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 armazenamento de fundos, tendo uma função de saque:

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

Se você olhar atentamente para o código, há uma vulnerabilidade chave:

No caso anterior, a função “retirar” pode ser chamada novamente se o usuário 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 esse tipo de vulnerabilidade.

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

função retirar(uint256 _amount) público {    require(saldos[msg.sender] >= _amount, "Saldo insuficiente.");    saldos[msg.sender] -= _amount;    (bool sucesso, ) = msg.sender.call{value: _amount}("");
require(êxito, "Falha na transferência.");}

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

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

O mundo das aplicações descentralizadas e dos contratos inteligentes ultrapassou o Ethereum. Mesmo que a maior parte da ação ainda aconteça dentro do ecossistema Ethereum, existem outras cadeias como Cardano, Solana e outras que suportam contratos inteligentes e requerem diferentes padrões de auditoria.

Por que cada plataforma é única?

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

Ferramentas para não depender do Ethereum

Agora, se você quiser ir 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 multichain deve estar familiarizado com esses conceitos para manter as vulnerabilidades do contrato à distância.

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

Apenas para reiterar, você pode segmentar a auditoria de contratos inteligentes em três tipos: manual, automática e híbrida. Observe 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.

Terceirizando suas auditorias

Organizações e indivíduos com conhecimento mínimo de codificação frequentemente terceirizam suas necessidades de escrita e auditoria para empresas de renome. Quando se trata de auditoria, escolher a empresa certa se torna ainda mais importante, pois mesmo que Ferramentas 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 serem observados ao terceirizar as tarefas de auditoria:

Escolhendo a empresa certa

Antes de se concentrar na empresa de terceirização certa, é crucial verificar auditorias passadas, avaliar a experiência e até focar nos principais membros da equipe.

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 muito mais. Você também deve verificar se reauditorias também são fornecidas 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, portanto, é necessário acompanhar todos os requisitos e ofertas antes de prosseguir.

Melhores práticas de auditoria de contratos inteligentes

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

  1. Sempre foque em uma revisão de código minuciosa, incluindo a sintaxe e a lógica
  2. Comece escolhendo vulnerabilidades comuns usando ferramentas como Slither, MythX e mais
  3. Navegue pelo Registro de Classificação de Vulnerabilidades do Contrato Inteligente ou SWC para localizar as vulnerabilidades conhecidas e verificá-las antecipadamente.
  4. Teste rigorosamente os contratos inteligentes, incluindo testes de integração, testes unitários e muito 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 fazer antes da primeira função do contrato inteligente.
  6. Concentre-se em funções que levam a chamadas externas. Um erro nesse sentido pode alterar o estado e o fluxo de controle, o que não é desejável.
  7. Sempre fique de olho nos trechos de código que indicam o uso de gás. Você não quer que seu contrato inicie interações que sejam proibitivamente caras.

Desenvolvimento de contratos inteligentes e IA: o futuro

A inteligência artificial está, de fato, tornando mais fácil escrever contratos inteligentes. No entanto, independentemente da inovação da IA, a capacidade de auditar contratos inteligentes da melhor maneira possível ainda requer intervenção humana. Portanto, se você planeja construir seu próximo produto web3 enfatizando contratos inteligentes e aplicativos descentralizados, é crucial focar religiosamente nos melhores recursos de auditoria para seus contratos inteligentes. Com hacks e violações de criptomoeda surgindo a cada dia e hackers planejando novas estratégias para se infiltrar, auditar um contrato com perfeição é certamente um dos conjuntos de habilidades modernos mais importantes.

Isenção de responsabilidade:

  1. Este artigo é reproduzido a partir de [Beincrypto], e os direitos autorais pertencem ao autor original [Ananda Banerjee]. Se houver objeções à reprodução, entre em contato com a equipe Gate Learn, e a equipe a processará 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 nenhum 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.

แชร์

Compreendendo Contrato Inteligente: Leia, Escreva e Audite

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 outras linguagens. Dado que os contratos inteligentes são centrais para Finanças Descentralizadas (DeFi) e Aplicações Descentralizadas (DApps), garantir sua segurança e perfeição é crucial, com auditorias de contratos inteligentes desempenhando um papel fundamental.

Lendo contratos inteligentes

Contratos inteligentes são pedaços programáveis de código que são executados apenas quando um conjunto de condições é atendido. Eles são sinônimos de contratos do mundo real juridicamente 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. É esse quociente de imutabilidade que torna os contratos inteligentes especiais, entre outras coisas.

Compreendendo contratos inteligentes: noções básicas e propósito

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

Como contratos inteligentes se alinham com a tecnologia blockchain: BeInCrypto

"A palavra da moda 'web3' sugere os hábitos de programação relaxados e inseguros da web. Quando criptomoedas ou contratos inteligentes são programados como uma página web, estão condenados. Blockchains e seus aplicativos sustentavelmente bem-sucedidos são baseados em métodos de programação muito mais seguros, cuidadosos e lentos."

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

Contratos inteligentes podem trabalhar com tokens específicos de blockchain, como ERC-20 para o blockchain Ethereum, incentivando esforços e movimentando transações. Como envolvem código, condições e custos, você deve ter cuidado ao ler, escrever e auditá-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 transfira fundos para a pessoa B quando B completar um serviço - uma cópia do contrato inteligente é salva e executada pelos nós da blockchain. Os contratos inteligentes são salvos como códigos contratuais dentro da cadeia. Essa validação de múltiplos caminhos é uma característica centrada na 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 propósito de um contrato inteligente determinam como ele é escrito, lido ou mesmo auditado.

Contratos tradicionais, escrituras de imóveis, 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 de elaboração de regras descentralizadas.https://t.co/EU2Y28FznK
— Nick Szabo (@NickSzabo4) 15 de março de 2018

Vamos considerar um pool de liquidez padrão governado por um contrato inteligente.

Imagine que o pool de tokens pode ser usado para negociação e, sempre que houver uma negociação bem-sucedida, 0,3% do valor total da negociação é enviado ao provedor de liquidez que possibilitou essa negociação ou adicionou liquidez para o ativo negociável em questão. 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 dentro da cadeia como um código de contrato.

Características de contratos inteligentes

Não podemos nos aprofundar na leitura, escrita e auditoria de contratos se não estivermos cientes de suas características. Aqui estão os traços padrão do contrato inteligente para estar ciente:

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

Contratos programáveis

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 DeFio espaço já depende de contratos inteligentes para processar instâncias complexas como lidar com taxas de negociação em pools de liquidez, mantendo APYrazões, e mais.

Sem confiança

Contratos inteligentes residentes na blockchain eliminam a intervenção humana. Isso os torna completamente sem confiança. Por exemplo, se um específico DeFi O protocolo, regido 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, gerenciamento 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 esqueleto. Isso garante que tarefas como pagamento, saques, depósitos, penalização de validadores via redução, e várias outras tarefas sejam autonomamente tratadas.

Seguro

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

Verificável

Transações processadas através de contratos inteligentes são auto-verificá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 auto-verificável confere aos contratos inteligentes uma vantagem sobre contratos tradicionais que regulam as configurações bancárias legadas.

Portanto, da próxima vez que planejar ler um contrato inteligente, certifique-se de que o texto padrão ou a documentação contenha todas as características mencionadas envolvidas.


Uma versão simplificada de contratos inteligentes: Reddit

Lendo contratos inteligentes com base nas características

Aqui está um contrato inteligente simples que representa uma conta de garantia. Os usuários depositam seus fundos na garantia, que então transfere o mesmo para o destinatário após um período de tempo específico.

/ SPDX-License-Identifier: MITpragma solidez ^0.8.0;// Contrato inteligente básico Boilerplatecontract SimpleTrustlessEscrow {// Variáveis de estadoendereço público depositor; // Conta depositando etherendereço pagável público beneficiário; // Conta recebendo etheruint256 público releaseTime; // Timestamp para liberar ether// Eventos para verificar a atividade do contratoevento Depositado(endereço indexado _from, uint256 _value);evento Liberado(endereço indexado _to, uint256 _value);// O construtor do contrato inicializa o contrato inteligenteconstructor(endereço pagável _beneficiário, uint256 _releaseTime) {    exige(_releaseTime > block.timestamp, “O tempo de liberação deve estar no futuro”);    // Seguro e Sem Confiança: O contrato vincula depositante e beneficiário    depositor = msg.sender;    beneficiário = _beneficiário;    releaseTime = _releaseTime;}// Função de depósito - execução autônoma (função de fallback)receber() externo pagável {    emitido Depositado(msg.sender, msg.value);}// Liberar o ether para o beneficiáriofunção liberar() público {    // Programável: Só pode ser executado após releaseTime    exige(block.timestamp >= releaseTime, “Muito cedo para liberar”);    // Autônomo: Executa automaticamente com base na condição    uint256 montante = endereço(this).saldo;    beneficiário.transfer(montante);    emitido Liberado(beneficiário, montante);}}

Enquanto vamos conseguir decifrar e ler este contrato inteligente em detalhes, vamos primeiro verificar se o mesmo adere às características do contrato mencionadas.

A parte "programável"

Olhe de perto o contrato para este trecho de código:

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

uint256 quantidade = address(this).balance;

beneficiário.transferir(valor);

Os recursos devem ser liberados somente quando uma condição específica de liberação for atendida, tornando esses contratos programáveis.

A parte "sem confiança"

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

depositante = msg.sender;

beneficiário = _beneficiário;

releaseTime = _releaseTime;

No contrato, todos estão vinculados por 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 transferência de fundos é vinculada pelo releaseTime - um parâmetro baseado em código.

A parte "autônoma"

Aqui está a parte de “liberação de fundos” do código:

function release() público {require(block.timestamp >= releaseTime, “Muito cedo para liberar”);uint256 montante = address(this).balance;beneficiário.transfer(montante);emit Liberado(beneficiário, montante);}

O processo inteiro é autônomo, já que os fundos são liberados apenas quando o releaseTime atende a um certo critério. Observe 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 totalmente autônomos, dependendo das funcionalidades que você deseja incluir. Por exemplo, você pode iniciar um plano de depósito recorrente toda vez que o usuário's carteiraultrapassa $100, com o valor excedente sendo transferido para o beneficiário.

A parte "segura"

Preocupado com o elemento emprestado segurançapara o contrato? Confira 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 timestamp. Nada é aleatório e as condições devem ser atendidas.

A parte "verificável"

Cada transação associada ao contrato inteligente é registrada dentro da cadeia, cortesia de elementos de atividade de log separados.

evento Depositado(endereço indexado _from, uint256 _value);

evento Liberado (endereço indexado _to, uint256 _value);

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

emit Liberado(beneficiário, quantia);

Lendo 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 processo.

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

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

Contrato TimeLock { - Atribui um nome ao contrato inteligente, como um rótulo.

Endereço público depositante; – Uma vez que o contrato envolve um depositante e um beneficiário, este é o ponto em que o endereço público do depositante é mencionado. Esta variável é o Carteira Ethereumendereço e é visível publicamente.

Endereço do beneficiário público a pagar; – Este é o endereço público do beneficiário para onde a caução transfere fundos. Ele também é legível e empresta uma sensação de transparência aos contratos inteligentes alimentados por blockchain.

Uint256 public releaseTime; - Como é um contrato vinculado ao tempo, o uint256 atribui a variável baseada no tempo ao contrato. Este será o período de tempo de acordo com o qual as liberações de fundos ocorrerão.

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

depois de 5 anos escrevendo contratos inteligentes, só hoje percebo que o logo do solidity é o logo do ethereum desdobrado 🤯pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden) 8 de julho de 2023

Você pode considerar a leitura Documentação do 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. Observe como, neste ponto, todas as variáveis de endereço que declaramos anteriormente são chamadas e inicializadas.

Receive() external pay { – Esta é uma função especial chamada quando os fundos se movem para o endereço do contrato de fora. Sugestões externas e "Pagável" define a natureza do movimento, ou seja, receber tokens ERC-20.

function release() public { - 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 esses elementos são partes do contrato de garantia hipotético que discutimos. Certifique-se de ler toda a documentação do Solidity para aprender mais sobre a linguagem.

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

DApps e contratos inteligentes: a relação

Até agora, 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 um aplicativo descentralizado — um blockchainversão de um aplicativo móvel padrão.

Todas as características de um contrato inteligente, incluindo segurança do contrato, execução autônoma e programável, falta de confiança das transações e muito mais, são prontamente implementadas durante o desenvolvimento de um aplicativo descentralizado. Portanto, da próxima vez que você se deparar com um DApp, observe que ele é um back-end alimentado por contrato inteligente hospedado no blockchain - ajudando você a iniciar várias tarefas sem intervenção humana. Os contratos inteligentes formam a lógica do DApps.

Blockchains para contratos inteligentes

Sabemos que o Ethereum permite que você desenvolva contratos inteligentes, como uma solução de software em grande escala. No entanto, não é o único protocolo blockchain disponível. Se você deseja mergulhar fundo no mundo do desenvolvimento de contratos inteligentes, pode ser interessante olhar para outras blockchains. Diferentes blockchains têm diferentes termos ao elaborar contratos.

Mas primeiro, vamos discutirEthereum— a plataforma mais utilizada pela maioria dos desenvolvedores de contratos inteligentes.

Ethereum

Contratos inteligentes no 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.

Você pode voltar ao contrato inteligente baseado em garantia que discutimos anteriormente para ver como um contrato inteligente padrão 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 do código, desde que planejemos lançar uma nova criptomoeda BIC.

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

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

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

Outras blockchains

Assim 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.

“Cordona sequer tem contratos inteligentes?”
Brincadeira com você, amigo. #CardanoADA pic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28)9 de julho de 2023

Aqui está a estrutura de código em Rust ( Solanaparece com:

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

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

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

Documentação da 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!Polkadot, TEAL para Algorand, C# para NEO e mais. É aconselhável aprender a documentação detalhada da cadeia antes de prosseguir com a escrita de contratos inteligentes compatíveis.

Por que você deve aprender a ler contratos inteligentes?

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

  1. A capacidade de aprender sobre as complexidades de automação associadas aos aplicativos 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 da lógica orientada por casos de uso relacionada a seguros, monetização de conteúdo, votaçãosistema, royalties e outros verticais.

Como escrever contratos inteligentes

Agora que a leitura dos contratos inteligentes está fora do caminho, vamos nos concentrar em escrever contratos inteligentes. Antes de aprofundar, é necessário reiterar que diferentes blockchains podem ter padrões e idiomas diferentes relacionados 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 de nossa discussão, vamos nos concentrar 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 ingressar no desenvolvimento de contratos inteligentes no 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 que você implemente a lógica, lide com os elementos de segurança do mesmo, otimize 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 planejando escrever contratos inteligentes no Ethereum precisa entender o que é a Máquina Virtual Ethereum (EVM) e como ela funciona com contratos inteligentes. Para começar, a EVM é um componente do Ethereum que fornece programas um ambiente isolado e controlado para trabalhar. Considere isso como um computador global que hospeda cada pedaço de código de contrato que existe no Ethereum. Cadana rede Ethereum roda o EVM.

Se você aspira a ser um desenvolvedor de contrato inteligente, aqui está o que você precisa saber sobre contratos inteligentes e EVM.

Uma vez que você escreve o programa em Solidity, que é uma linguagem de alto nível, é necessário compilá-lo em bytecode - um formato de baixo nível compreensível pela máquina. Esse bytecode é inserido na blockchain do Ethereum e lá permanece. Qualquer pessoa que interaja com o contrato inteligente precisa 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 aprovam 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 como foi escrito. E uma vez que o código é executado, o estado do blockchain muda, tornando o processo completo e totalmente transparente.

Qualquer pessoa pode escrever um contrato inteligente?

Escrever contratos inteligentes requer conhecimento técnico. Mas não é só isso. Você também precisa entender completamente como a tecnologia blockchain funciona, quais são as necessidades específicas de linguagem relevantes para o blockchain que você está mirando,interoperabilidadeAlém disso, você também deve conhecer bastante sobre vulnerabilidades de contratos inteligentes — coisas a serem evitadas ao escrever código. E, por fim, o conhecimento em testes de contrato e implantação de contrato também é essencial.

Tudo isso pode se tornar esmagador. Então aqui está uma folha de dicas rápida para começar:

  1. Comece escolhendo 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 escrevendo seu primeiro contrato e depois teste usando testnets.
  5. Uma vez satisfeito com os elementos do código, você pode implantá-lo na cadeia. Lembre-se de que implantar o contrato na cadeia custará na 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
Protocolo
– Invariantes
Este é o padrão que todos devem considerar ao construir contratos inteligentes.
Aqui está o motivo 👇
— Patrick Collins (@PatrickAlphaC) 6 de julho de 2023

Mergulhando na programação

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

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

Por que Ethereum?

Ethereum tem uma enorme comunidade de desenvolvedores. Qualquer coisa que você desenvolva imediatamente chamará a atenção. Além disso, sua linguagem nativa, Solidity, é relativamente fácil para pessoas que sabem lidar com Python ou JavaScript. Por fim, o software global da Ethereum, EVM, ajuda na execução de contratos sem problemas.

Se você está na maioria e prefere usar Ethereum e Solidity, aqui está uma rápida lista de coisas que você 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 registro EVM
  5. Modificadores para conceder direitos específicos a órgãos específicos
  6. Funções ou atividades do contrato inteligente em jogo
  7. Herança para interoperabilidade
  8. Compreensão das estruturas de controle como if, else, loops for, tipos de dados como string, inteiro e mais.

Escrevendo e implantando 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” permaneça o primeiro passo, começaremos criando um contrato inteligente para lançar um token BIC hipotético com uma oferta totalmente desbloqueada de 1 milhão.

Os fundamentos

O primeiro passo é instalar a última versão do Node.js e o NPM ou Node Package Manager. Isso cuida das ferramentas de desenvolvimento e do ambiente local para desenvolvimento. Além disso, Node.js e NPM permitem configurar 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 bagunça e hoppara a Alquimia - uma plataforma de desenvolvimento blockchain. Com a Alquimia, você pode obter alguns ETH de testnet. Isso cobrirá as taxas de gás quando você implantar o contrato inteligente na testnet Goerli ou mesmo na testnet Sepolia.

Observe que o Sepolia é uma testnet mais recente e, portanto, requer menos espaço em disco quando se trata de implantação de nós.

Por enquanto, vamos persistir com a rede de testes Goerli, pois possui um maior número de aplicativos implantados.

Com a rede de teste e o ETH falso prontos, vamos passar especificamente para escrever o contrato inteligente. Aqui está o trecho de código para criar um token BIC com um fornecimento fixo de 1 milhão.

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

Passos para escrever e implantar

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

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

Se você está ciente da sintaxe, você saberia o que cada componente de código significa. Quanto ao Openzepplinpart, é a biblioteca padrão para importar contratos inteligentes ERC-20. Esta biblioteca oferece os padrões operacionais básicos para tokens ERC-20.

A função mint 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 você a organizar código, scripts e outras partes de um contrato
  3. Ganache: Funciona como um playground virtual, em dispositivo. Pense nele como um blockchain pessoal.

O que é a execução de contrato?

Se você passou pelo processo detalhado de escrever um contrato inteligente, é imperativo saber um pouco sobre a execução do contrato. É um processo pelo qual o código do contrato inteligente é executado em uma 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 em etapas associado à execução do contrato:

Passo 1

Os trechos de código que temos escrito precisam ser executados em algum lugar. No caso dos contratos inteligentes, esse 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 acontece dentro da cadeia é liderado por contratos inteligentes.

Passo 3

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

Passo 4

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

Passo 5

Uma vez que a transação é enviada e validada com sucesso, ela se torna 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 relacionado à execução do código ou questões relacionadas às taxas de gás reverte as transações. Isso significa que a transação baseada em um código de contrato inteligente específico deixará de existir. Isso é exatamente o que acontece comempréstimos instantâneosquando a incapacidade de aderir a normas específicas reverte toda a transação, dando a impressão de que os fundos nem se moveram em primeiro lugar.

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

Desenvolvimento de contratos inteligentes e melhores práticas

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

  1. Ao escrever contratos, é aconselhável confiar em bibliotecas confiáveis como as do OpenZeppelin para aderir às normas desejadas 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 revisar.
  3. Uma boa ideia é implementar controles de acesso específicos do contrato. Isso significa declarar trechos de código nos quais 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, sempre faça disposições para lidar com casos limite e exceções — tudo enquanto escreve vários testes.

Cuidando 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 de contrato que você deve seguir e implementar para cuidar da sustentabilidade do código. Isso tem como objetivo manter o código do contrato leve e utilizável, para que cada nó que o executa não precise dedicar muita potência computacional para o mesmo.

  1. Manuseie o armazenamento de forma eficiente usando conjuntos de dados menores. Por exemplo, ao escrever um contrato, use 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 nos aprofundar nisso em nosso artigo detalhado sobre "escrever contratos inteligentes".
  3. Uma boa ideia é usar avaliação preguiçosa em relação à execução de contratos inteligentes. Dessa forma, você só precisa executar uma função quando necessário e não toda vez que algo é enviado para o endereço do contrato inteligente.
  4. Por fim, depender de cálculos off-chain também é uma boa maneira de focar na sustentabilidade. Isso ajuda a reduzir os requisitos de taxa de gás e pode até mesmo 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 rigoroso processo de teste de contrato — vem à tona, permitindo que você descubra possíveis vulnerabilidades e fraquezas do contrato.

Aqui está uma lista de verificação de auditoria rápida para começar:
Lista de verificação incrível de Auditoria de Contratos Inteligentes😈
Certifique-se de verificá-los em sua próxima auditoria✅
Eu 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 entrelaçados 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 outros aspectos por meio da auditoria é necessária.

Vulnerabilidades de contrato e correções

Pode haver uma série de vulnerabilidades contratuaisque uma auditoria detalhada de contrato inteligente pode identificar. Estes incluem verificação de ataques de reentrada, estouros ou subfluxos, problemas relacionados ao controle de acesso e muito mais. Uma vez determinada a natureza exata do problema, o auditor pode até sugerir as melhores práticas para corrigi-lo.

Violações lançam estudos e aprendizados

Ainda não tem certeza de como a auditoria de contratos inteligentes pode ajudar? Bem, vamos voltar ao infameDAOhack em 2016, que explorou um problema de reentrância 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 correto de auditorias.


Fluxograma do hack do DAO: BeInCrypto

Estratégias para auditar contratos inteligentes

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

Ferramentas de auditoria

Essas ferramentas atuam como o primeiro conjunto de defesas e são melhores usadas para localizar vulnerabilidades comuns. Alguns das ferramentas mais populares incluem Securify, Mythril e mais - capazes de realizar análise estática do código, detectar 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 de código

É aqui que os revisores manuais de código entram em cena, examinando 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 de código manuais ajudam você a localizar ameaças:

Um pequeno jogo de perguntas para nossos auditores juniores!
Vamos lá e retweet se você encontrou o bug! pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles)8 de julho de 2023

Varreduras automáticas

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

Verificação formal

Este é um processo complexo que se baseia exclusivamente na verificação da lógica de negócios do código. Observe 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 conforme 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 Cobertura Solidity para maximizar a eficácia.

Uma maneira simples de auditar contratos inteligentes: BeInCrypto

Como revisar o código corretamente?

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

Análise estática

Esse 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, estouros de números inteiros e muito mais podem ser destacadas usando análise estática. A melhor coisa sobre a análise estática é que o código não precisa ser executado para que ele seja verificado.

Análise dinâmica

Esta abordagem para a auditoria testa o 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 pessoais de blockchain 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 armazenamento de fundos, tendo uma função de saque:

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

Se você olhar atentamente para o código, há uma vulnerabilidade chave:

No caso anterior, a função “retirar” pode ser chamada novamente se o usuário 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 esse tipo de vulnerabilidade.

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

função retirar(uint256 _amount) público {    require(saldos[msg.sender] >= _amount, "Saldo insuficiente.");    saldos[msg.sender] -= _amount;    (bool sucesso, ) = msg.sender.call{value: _amount}("");
require(êxito, "Falha na transferência.");}

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

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

O mundo das aplicações descentralizadas e dos contratos inteligentes ultrapassou o Ethereum. Mesmo que a maior parte da ação ainda aconteça dentro do ecossistema Ethereum, existem outras cadeias como Cardano, Solana e outras que suportam contratos inteligentes e requerem diferentes padrões de auditoria.

Por que cada plataforma é única?

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

Ferramentas para não depender do Ethereum

Agora, se você quiser ir 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 multichain deve estar familiarizado com esses conceitos para manter as vulnerabilidades do contrato à distância.

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

Apenas para reiterar, você pode segmentar a auditoria de contratos inteligentes em três tipos: manual, automática e híbrida. Observe 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.

Terceirizando suas auditorias

Organizações e indivíduos com conhecimento mínimo de codificação frequentemente terceirizam suas necessidades de escrita e auditoria para empresas de renome. Quando se trata de auditoria, escolher a empresa certa se torna ainda mais importante, pois mesmo que Ferramentas 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 serem observados ao terceirizar as tarefas de auditoria:

Escolhendo a empresa certa

Antes de se concentrar na empresa de terceirização certa, é crucial verificar auditorias passadas, avaliar a experiência e até focar nos principais membros da equipe.

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 muito mais. Você também deve verificar se reauditorias também são fornecidas 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, portanto, é necessário acompanhar todos os requisitos e ofertas antes de prosseguir.

Melhores práticas de auditoria de contratos inteligentes

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

  1. Sempre foque em uma revisão de código minuciosa, incluindo a sintaxe e a lógica
  2. Comece escolhendo vulnerabilidades comuns usando ferramentas como Slither, MythX e mais
  3. Navegue pelo Registro de Classificação de Vulnerabilidades do Contrato Inteligente ou SWC para localizar as vulnerabilidades conhecidas e verificá-las antecipadamente.
  4. Teste rigorosamente os contratos inteligentes, incluindo testes de integração, testes unitários e muito 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 fazer antes da primeira função do contrato inteligente.
  6. Concentre-se em funções que levam a chamadas externas. Um erro nesse sentido pode alterar o estado e o fluxo de controle, o que não é desejável.
  7. Sempre fique de olho nos trechos de código que indicam o uso de gás. Você não quer que seu contrato inicie interações que sejam proibitivamente caras.

Desenvolvimento de contratos inteligentes e IA: o futuro

A inteligência artificial está, de fato, tornando mais fácil escrever contratos inteligentes. No entanto, independentemente da inovação da IA, a capacidade de auditar contratos inteligentes da melhor maneira possível ainda requer intervenção humana. Portanto, se você planeja construir seu próximo produto web3 enfatizando contratos inteligentes e aplicativos descentralizados, é crucial focar religiosamente nos melhores recursos de auditoria para seus contratos inteligentes. Com hacks e violações de criptomoeda surgindo a cada dia e hackers planejando novas estratégias para se infiltrar, auditar um contrato com perfeição é certamente um dos conjuntos de habilidades modernos mais importantes.

Isenção de responsabilidade:

  1. Este artigo é reproduzido a partir de [Beincrypto], e os direitos autorais pertencem ao autor original [Ananda Banerjee]. Se houver objeções à reprodução, entre em contato com a equipe Gate Learn, e a equipe a processará 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 nenhum 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.
เริ่มตอนนี้
สมัครและรับรางวัล
$100