O que é um contrato inteligente?
Visão geral dos contratos inteligentes: o que são, de onde surgiram, como funcionam e por que executar código na blockchain custa gas.
Um contrato inteligente é um programa armazenado em uma blockchain, em seu próprio endereço, que é executado exatamente como foi escrito sempre que alguém lhe envia uma transação. Como todos os nós executam o mesmo código e registram o resultado, nenhuma parte isolada pode alterar o desfecho. Contratos inteligentes sustentam tokens, exchanges descentralizadas e mercados de empréstimo, mas não conseguem corrigir os próprios bugs.
De onde veio a ideia
O termo “contrato inteligente” foi criado pelo cientista da computação Nick Szabo na década de 1990 para descrever acordos executados por código, e não pelos tribunais. A ideia se tornou prática quando a Ethereum foi lançada em julho de 2015, com um ambiente de programação integrado à própria blockchain. Hoje a maioria dos contratos inteligentes roda na Ethereum e em redes que copiaram o seu design.
Uma máquina de venda automática, e onde a analogia termina
A ilustração favorita do próprio Szabo era a máquina de venda automática. Insira o dinheiro certo, escolha um item, e a máquina o libera; nenhum lojista precisa aprovar a venda, e as regras estão embutidas na máquina. Um contrato inteligente funciona da mesma forma: envie a transação certa, cumpra as condições do código, e o resultado segue automaticamente.
A analogia falha em dois pontos. O dono de uma máquina de venda pode abri-la, consertá-la ou removê-la; muitos contratos inteligentes não podem ser alterados por ninguém depois de implantados. E uma máquina de venda guarda alguns dólares em salgadinhos, enquanto um único contrato inteligente pode guardar bilhões de dólares de dinheiro alheio, o que torna qualquer falha em suas regras muito mais consequente.
Como um contrato inteligente funciona
- Um desenvolvedor escreve o código, normalmente em uma linguagem como Solidity, e o compila para a Ethereum Virtual Machine (EVM).
- O código é implantado em uma transação. Ele recebe seu próprio endereço, como uma carteira, e pode manter fundos.
- Os usuários chamam suas funções enviando transações para esse endereço, por exemplo “trocar este token” ou “pagar este empréstimo”.
- Todo nó executa o mesmo código e precisa chegar ao mesmo resultado. Se qualquer condição do código falhar, toda a transação é revertida.
- Quem chama paga pela computação em gas. Cada operação tem um custo definido, o que impede que programas rodem para sempre. Veja o limite de gas.
Figura: O que acontece quando você chama um contrato inteligente na Ethereum.
Um exemplo simples: um contrato de custódia (escrow)
Imagine dois desconhecidos negociando um notebook usado por 1 ETH. Nenhum dos dois quer ir primeiro. Um contrato de escrow pode ficar entre eles:
- O comprador envia 1 ETH ao contrato, que registra e bloqueia o valor.
- O vendedor vê o pagamento bloqueado na blockchain e envia o notebook.
- Ao chegar, o comprador chama a função “confirmar” do contrato, e o contrato libera 1 ETH ao vendedor.
- Se o comprador nunca confirmar nem contestar, uma regra de tempo limite no código pode liberar os fundos ao vendedor após um período definido; se o vendedor nunca enviar o produto, outra regra pode devolver o valor ao comprador.
Nenhuma empresa guarda o dinheiro, e nenhuma das partes pode retirá-lo fora das regras. Mas o contrato não consegue verificar se o notebook foi realmente entregue ou se chegou quebrado. Tudo o que acontece fora da blockchain precisa ser informado ao contrato por alguém, e é aí que entram as disputas, os árbitros ou os oráculos.
Gas: por que executar código custa dinheiro
Cada etapa que um contrato executa, desde somar dois números até armazenar um valor, tem um custo fixo em unidades de gas. Quem chama o contrato define uma quantidade máxima de gas e paga um preço por unidade, de modo que a taxa total é o gas usado multiplicado pelo preço. Armazenar dados de forma permanente está entre as operações mais caras, e por isso os desenvolvedores se esforçam para manter os contratos enxutos.
Duas consequências surpreendem quem está começando. Uma transação que falha no meio do caminho ainda paga pelo gas consumido até a falha, porque a rede já realizou o trabalho. E a mesma ação pode custar valores muito diferentes conforme o movimento da rede, pois o preço por unidade de gas sobe com a demanda.
Para que os contratos inteligentes são usados
- Tokens: a maioria dos tokens, incluindo as principais stablecoins, são contratos inteligentes que registram saldos e processam transferências.
- Exchanges descentralizadas: pools de tokens que precificam e executam trocas automaticamente.
- Empréstimos: contratos que aceitam garantias, emitem empréstimos e liquidam posições quando a garantia cai demais.
- Carteiras multi-assinatura: fundos que só são movimentados quando várias chaves aprovadas assinam.
- Bridges: contratos que travam ativos em uma blockchain para que possam ser representados em outra; veja o que é uma bridge entre cadeias.
- Staking e governança: contratos que retêm moedas em staking, distribuem recompensas e contabilizam votos sobre mudanças no protocolo.
Padrões: por que os tokens funcionam em todo lugar
Grande parte do que os usuários consideram garantido depende de padrões compartilhados, conjuntos acordados de funções que os contratos implementam da mesma forma. O padrão ERC-20 define como tokens fungíveis informam saldos e processam transferências e aprovações, por isso uma carteira ou exchange consegue suportar um novo token sem trabalho personalizado. O ERC-721 faz o mesmo para tokens não fungíveis, atribuindo a cada token um ID único e um proprietário. Como os contratos seguem esses modelos, uma única carteira pode exibir milhares de tokens diferentes e um único contrato de exchange pode negociar qualquer um deles. Os padrões também concentram riscos: a função “approve”, que permite a um contrato gastar seus tokens, faz parte do ERC-20, e é exatamente a função que os drainers exploram.
O que os diferencia de software comum
Um aplicativo comum roda em servidores controlados por uma empresa, que pode mudar as regras ou desligá-lo. Um contrato inteligente roda em uma rede pública: seu código é visível, sua execução é verificada por milhares de nós e, a menos que tenha sido construído para ser atualizável, ninguém pode alterá-lo após a implantação. Essa é a origem tanto da sua confiança quanto do seu risco.
Os contratos também podem chamar uns aos outros. Um contrato de empréstimo pode ler preços de um contrato de oráculo, aceitar um token emitido por outro contrato e enviar garantias liquidadas para um contrato de exchange, tudo em uma única transação. Essa composabilidade permite que desenvolvedores construam sobre o trabalho uns dos outros, e também significa que uma falha em um contrato pode se propagar por todos os contratos que dependem dele.
Contratos atualizáveis e chaves de administrador
Como o código implantado não pode ser alterado, muitas equipes usam um design atualizável. Os usuários interagem com um contrato “proxy” fixo que encaminha chamadas para um contrato de lógica separado, e a equipe pode apontar o proxy para uma nova lógica para corrigir bugs ou adicionar recursos. Isso é prático, mas reintroduz a confiança: quem controla a atualização pode mudar as regras, incluindo como os fundos são tratados.
Projetos bem administrados limitam esse poder. Salvaguardas comuns incluem exigir várias assinaturas independentes para qualquer atualização, impor um timelock para que as mudanças sejam anunciadas com dias de antecedência antes de entrarem em vigor e, eventualmente, remover por completo os direitos de atualização quando o código estiver maduro. Verificar quais dessas medidas estão em vigor é uma das coisas mais úteis que um usuário pode fazer.
Onde os contratos inteligentes falham
Bugs são permanentes. Uma falha em código implantado pode ser explorada por qualquer pessoa que a encontre, e a rede executará a exploração fielmente. O hack do DAO, em 2016, no qual um atacante explorou uma falha em um dos primeiros grandes contratos da Ethereum, tornou-se tão grave que levou a um hard fork da rede. Veja o que aconteceu no hack do DAO.
Eles só conhecem o que está na cadeia. Um contrato não consegue, por conta própria, verificar o preço de uma ação ou o clima. Ele depende de oráculos de blockchain para dados externos, e dados ruins levam a resultados errados.
Chaves de administrador podem sobrescrevê-los. Poderes de atualização que permitem correções também permitem abusos, e chaves roubadas dão aos atacantes os mesmos poderes. O hack da bridge Ronin mostrou o quanto pode depender de um punhado de chaves.
Usuários podem ser enganados para aprovar contratos. Muitos roubos não quebram nenhum código. Um site malicioso pede que o usuário aprove um contrato para gastar seus tokens, e o contrato então faz exatamente o que foi autorizado a fazer. Veja o que é um wallet drainer.
Código não é um contrato jurídico. Um contrato inteligente executa instruções; se ele cria direitos legais depende da lei do lugar onde as partes estão. Veja mitos sobre blockchain.
Auditorias, programas de recompensa por bugs e verificação formal
Como os erros são muito custosos, projetos sérios combinam várias defesas. Auditorias de segurança independentes revisam o código antes do lançamento, embora uma auditoria seja um retrato de uma única versão e não possa garantir que nenhum bug permaneça. Programas de recompensa por bugs (bug bounty) pagam pesquisadores que encontram e relatam falhas de forma responsável, o que oferece a pessoas talentosas uma alternativa legítima à exploração dessas falhas. Para o código mais crítico, a verificação formal usa métodos matemáticos para provar que um contrato se comporta de acordo com sua especificação. Cada método reduz o risco; nenhum o elimina, e um código que manteve grandes quantias com segurança por anos ainda oferece a evidência mais forte.
Como ler um contrato em um explorador de blocos
Você não precisa escrever código para aprender bastante sobre um contrato. Em um explorador de blocos, a página de um contrato normalmente mostra seu saldo, seu histórico de transações e, se os desenvolvedores o publicaram, uma aba de código-fonte “verificado” que permite a qualquer pessoa comparar o código com o que está implantado. Os exploradores frequentemente listam as funções de leitura do contrato, que mostram suas configurações atuais, e suas funções de escrita, que mostram o que ele pode fazer. Código não verificado, implantação muito recente ou um grande saldo controlado por um endereço desconhecido são motivos para cautela extra. Veja o que é um explorador de blocos.
Contratos inteligentes além da Ethereum
Muitas outras redes executam contratos inteligentes. Algumas são compatíveis com a Ethereum Virtual Machine, de modo que o mesmo código e as mesmas ferramentas funcionam nelas com pequenas mudanças. Outras usam máquinas virtuais e linguagens de programação diferentes, o que pode oferecer vantagens de velocidade ou custo, mas significa que contratos e auditorias não se transferem diretamente. As mesmas questões sobre qualidade do código, poderes de atualização e dependências se aplicam em todas as redes.
Como avaliar um contrato inteligente antes de usá-lo
- O código foi auditado? Por quem e com que frequência recente?
- O contrato é atualizável, quem controla as chaves de atualização e existe um timelock (bloqueio temporal)?
- Há quanto tempo ele está em funcionamento e quanto valor ele já manteve com segurança?
- Ele depende de oráculos ou pontes (bridges)? Quais?
- O que exatamente sua carteira pede para você aprovar quando você o utiliza?
Nenhuma dessas respostas torna um contrato livre de risco, mas cada uma mostra onde o risco está.
Perguntas frequentes
Um contrato inteligente pode ser alterado depois de implantado?
Somente se tiver sido projetado para isso. Contratos imutáveis funcionam sem alterações para sempre; os atualizáveis podem ser modificados por quem controla o mecanismo de atualização, e por isso esse controle importa tanto.
Contratos inteligentes são juridicamente vinculantes?
Não automaticamente. Um contrato inteligente executa o próprio código, mas se ele cria obrigações legais exigíveis depende da lei aplicável às pessoas envolvidas e de qualquer acordo feito em torno dele.
Preciso saber programar para usar contratos inteligentes?
Não. A maioria das pessoas os usa por meio de carteiras e sites sem ver nenhum código. Saber o que você está aprovando e onde estão os riscos do contrato importa muito mais do que lê-lo linha por linha.
Para a rede onde a maioria dos contratos inteligentes funciona, leia o que é a Ethereum.
Este artigo é conteúdo educacional e não constitui aconselhamento financeiro, de investimento, jurídico ou tributário. Ativos digitais são voláteis e você pode perder o valor que investir.
Fontes
- Introdução a contratos inteligentes — ethereum.org
- História da Ethereum (lançamento em julho de 2015) — ethereum.org
- DigiCash (Nick Szabo cunhou o termo “contratos inteligentes”) — Wikipedia
- Gas e taxas — Documentação para desenvolvedores do ethereum.org
- Atualização de contratos inteligentes (padrões proxy, timelocks, controle multisig) — Documentação para desenvolvedores do ethereum.org
- Padrões de tokens (ERC-20, ERC-721) — Documentação para desenvolvedores do ethereum.org