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.
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.
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.
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
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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);
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.
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
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.
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.
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.
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::*;) 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.
A capacidade de escrever contratos inteligentes é muito reconhecida, mas mesmo ser capaz de ler vem com sua quota de benefícios:
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.
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.
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. Cadanóna 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.
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:
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
É 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.
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:
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.
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.
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:
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:
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.
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.
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.
As transações destinadas ao contrato inteligente são selecionadas pelos validadores, que depois as incluem em blocos específicos.
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.
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.
Agora que você sabe bastante sobre contratos inteligentes, aqui estão algumas dicas para começar o desenvolvimento de contratos:
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.
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.
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
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.
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.
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
Existem inúmeras estratégias para auditar contratos inteligentes. Algumas das mais populares incluem:
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
É 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
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.
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
Se é novo na auditoria de contratos inteligentes, é importante notar que existem duas formas de analisar amplamente o código e identificar problemas. Estas incluem:
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.
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:
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.
Partilhar
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.
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.
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.
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
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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);
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.
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
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.
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.
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.
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::*;) 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.
A capacidade de escrever contratos inteligentes é muito reconhecida, mas mesmo ser capaz de ler vem com sua quota de benefícios:
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.
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.
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. Cadanóna 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.
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:
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
É 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.
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:
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.
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.
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:
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:
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.
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.
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.
As transações destinadas ao contrato inteligente são selecionadas pelos validadores, que depois as incluem em blocos específicos.
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.
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.
Agora que você sabe bastante sobre contratos inteligentes, aqui estão algumas dicas para começar o desenvolvimento de contratos:
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.
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.
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
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.
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.
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
Existem inúmeras estratégias para auditar contratos inteligentes. Algumas das mais populares incluem:
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
É 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
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.
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
Se é novo na auditoria de contratos inteligentes, é importante notar que existem duas formas de analisar amplamente o código e identificar problemas. Estas incluem:
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.
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:
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.