- Contratos autoexecutáveis que operam em um computador descentralizado, ao contrário da computação em nuvem.
- Ethereum é o principal ecossistema para contratos inteligentes, sendo Solidity a linguagem mais utilizada.
- Principais características dos contratos inteligentes da Ethereum:
- Mineradores executam os contratos além de validar transações.
- Contas possuem saldos.
- Os ambientes de desenvolvimento para Ethereum são mais complexos.
- Implantação e Identificação:
- Contratos são desenvolvidos em Solidity ou outras linguagens e compilados em bytecode da Ethereum, executado pela Ethereum Virtual Machine (EVM).
- Contratos são "implantados" na Ethereum, gerando um identificador único (hash).
- Uma vez implantado, um contrato torna-se autônomo.
- Aplicações descentralizadas (DApps):
- DApps enviam transações para contratos inteligentes, interagem com usuários por meio de interfaces gráficas, utilizam IPFS para armazenamento, entre outros.
- A interação com contratos inteligentes é facilitada pela ABI (Application Binary Interface).
- Web3.js é usado para se conectar a um nó Ethereum (local ou remoto) via HTTP, IPC ou WebSocket.
- Ferramentas de Desenvolvimento:
- Hardhat, Foundry e Remix são ferramentas populares para contratos inteligentes.
- Origens e Conceitos:
- Nick Szabo introduziu o conceito de contratos inteligentes, ilustrado pelo contrato mecânico de uma máquina de vendas.
- Contratos tradicionais dependem da confiança no código, no computador e em todas as partes envolvidas.
- Contratos inteligentes incorporam o princípio de "Código é lei!", podendo substituir o sistema legal por contratos híbridos.
- Solução de Problemas com Contratos Inteligentes:
- Contratos inteligentes não envolvem algoritmos complexos como sequências de Fibonacci ou problemas do LeetCode.
- Eles abordam problemas que envolvem:
- Partes com interesses conflitantes (ex: comprador vs. vendedor).
- Incentivar comportamentos honestos, já que não há aplicação externa como agências de proteção ao consumidor.
- Adaptações do mundo real para o âmbito dos contratos inteligentes.
- Soluções completamente novas.
- Aplicações de Contratos Inteligentes:
- Finanças: Compras e vendas, leilões, exchanges descentralizadas (DeX), empréstimos com ou sem garantia, seguros.
- Governança: Votação, sistemas monetários, pagamentos de impostos, saúde, distribuição de riqueza, seguridade social, registro de veículos.
- Outros Setores: Identidade digital, serviços notariais, gestão de cadeia de suprimentos, testes clínicos.
- Exemplo de Leilão e Limitações:
- Um leilão simples implementado em código tradicional requer confiança no computador executante para garantir a justiça.
- Para ser considerado um contrato inteligente, ele deve ser completo, autossuficiente e abordar cenários como não pagamento ou não entrega do item leiloado.
- Isso muitas vezes exige mecanismos como NFTs, garantias ou penalidades para garantir comportamentos honestos.
- Características Essenciais:
- Autoexecutável: Totalmente autônomo, sem necessidade de intervenção externa.
- Sem confiança: Não é necessário confiar em participantes individuais; a confiança está apenas no código do contrato.
É importante lembrar que confiar em um contrato inteligente ainda implica confiança no computador subjacente que o executa.
First Contract
- Princípios Gerais dos Contratos Inteligentes:
- Contratos inteligentes são autônomos, ou seja, executam automaticamente conforme seu código, sem depender de intervenção externa.
- Para garantir um comportamento adequado, os participantes devem ser motivados a agir honestamente; caso contrário, surgirão oportunidades para roubo ou interrupção.
- Conceitos-chave:
- Autoexecutável: Contratos impõem automaticamente seus termos sem depender de fontes externas.
- Sem confiança: A confiança está no código do contrato, não em participantes individuais. No entanto, ainda é necessária confiança no computador que executa.
- Imutáveis, mas podem incorporar "botões de pânico" p/ flexibilidade.
- Contrato VerySimpleToken:
- Este contrato exemplifica uma implementação básica de token, com potencial para melhorias.
- As escolhas de design priorizam a simplicidade, mas podem não ser sempre ideais.
- O contrato permite a criação e transferência de um token simples.
- Erros:
- Três erros intencionais estão presentes no código, exigindo soluções.
- Tipos de possíveis erros:
- Roubo: Transferência não autorizada de tokens.
- Perdas: Perda de tokens devido a falhas no contrato.
- DoS (Negação de Serviço): Tornar o contrato inutilizável.
- Contrato TokenAuction:
- Este contrato estende a funcionalidade do VerySimpleToken, adicionando um mecanismo de leilão para o ativo tokenizado.
- Características:
- Permite a criação e gestão de múltiplos leilões.
- Exige garantia dos participantes para incentivar comportamentos honestos.
- Cobra uma taxa para cada leilão.
- Estrutura do Contrato:
- Utiliza um
struct OneAuction
para armazenar dados de cada leilão.
- Implementa um
enum AuctionStates
para rastrear o estado do leilão (Preparação, Lance, Finalizado).
- Funções-chave:
createAuction
: Cria um novo leilão para um token.
initAuction
: Inicializa um leilão, transferindo a propriedade do token para o contrato.
sendCollateral
: Permite que participantes enviem garantias.
bid
: Permite que participantes façam lances.
claimToken
: Permite ao vencedor reivindicar o token após pagar o lance vencedor.
claimCollateral
: Permite que licitantes não vencedores recuperem sua garantia.
getProfit
: Permite que o proprietário do token colete seu lucro do leilão.
getFee
: Permite que o proprietário do contrato colete as taxas do leilão.
- Erros:
- Erro 1: O token pode ser perdido se transferido e o leilão nunca começar. O limite de bloco também deve ser melhor inicializado durante
initAuction
.
- Erro 2: A função
claimToken
não verifica se o remetente é o vencedor do leilão.
- Erro 3: A função
getFee
tenta incorretamente transferir todo o saldo do contrato para o proprietário do contrato.
- Conceitos do Solidity:
import
: Usado para incluir outros contratos Solidity (ex: import "./VerySimpleToken.sol"
).
struct
: Define uma estrutura de dados personalizada.
address payable
: Representa um endereço que pode receber Ether.
memory
e storage
: Palavras-chave usadas para gerenciar localização e persistência de dados.
this
: Refere-se à instância atual do contrato.
msg.value
: Representa a quantidade de Ether enviada com uma transação.
balance
: Usado para acessar o saldo de Ether de um endereço.
Lupa