Aprenda como construir um smart contract seguro de marketplace escrow usando Solidity e Foundry, permitindo transações sem necessidade de confiança entre compradores e vendedores.
React to this article
Smart contracts revolucionaram como pensamos sobre acordos digitais e transações. Hoje, mergulharemos profundamente na construção de um smart contract prático de marketplace escrow—um sistema que permite transações seguras entre compradores e vendedores sem exigir confiança em uma autoridade central.
O Que São Smart Contracts?
Um smart contract é um programa que roda em uma rede blockchain. A ideia foi proposta por Nick Szabo em 1994. Na prática, ele funciona como um acordo digital que executa automaticamente quando condições predeterminadas são atendidas, sem intermediários.
Uma vez implantado, smart contracts operam independentemente sem intervenção humana. O código é a lei—se condições A, B e C são atendidas, ação X executará automaticamente.
Após implantação, smart contracts não podem ser alterados (a menos que especificamente projetados com mecanismos de atualização), garantindo que as regras permaneçam constantes.
Smart contracts rodam em uma rede descentralizada de computadores, eliminando pontos únicos de falha e reduzindo a necessidade de intermediários confiáveis.
Entendendo Sistemas Escrow
Antes de mergulhar no código, vamos entender o que um sistema escrow faz:
Escrow Tradicional: Uma terceira parte neutra mantém fundos ou ativos até que obrigações contratuais sejam atendidas por todas as partes envolvidas.
Escrow Smart Contract: O próprio blockchain age como a terceira parte neutra, liberando automaticamente fundos quando condições são satisfeitas.
Benefícios do Escrow Baseado em Blockchain
O escrow baseado em blockchain oferece taxas reduzidas ao eliminar comissões de agentes tradicionais e liquidações mais rápidas através de execução automatizada após cumprimento de condições. Fornece acessibilidade global — qualquer pessoa com conexão à internet pode participar — junto com transparência que permite a todas as partes verificar a lógica e estado do contrato. E como as regras são imutáveis, termos não podem ser alterados unilateralmente.
Configuração do Projeto com Foundry
Foundry é um toolkit moderno e rápido, baseado em Rust, para desenvolvimento Ethereum. Ele reúne construção, testes e deploy de smart contracts no mesmo fluxo. Isso acelera bastante o trabalho.
# Criar novo projeto Foundry
forge init escrow-marketplace
cd escrow-marketplace
# Estrutura do projeto
# ├── src/ # Smart contracts
# ├── test/ # Arquivos de teste
# ├── script/ # Scripts de implantação
# ├── foundry.toml # Configuração
# └── lib/ # Dependências
Arquitetura do Smart Contract
Nosso marketplace escrow consistirá em vários componentes-chave:
Componentes Principais:
Listagens de Itens: Vendedores podem listar itens para venda
Pedidos de Compra: Compradores podem criar pedidos de compra com fundos em escrow
Resolução de Disputas: Mecanismo para lidar com conflitos
Gerenciamento de Taxas: Taxas do marketplace e distribuição
Fluxo completo de transação do marketplace escrow mostrando interações entre Vendedor, Comprador, smart contract Escrow e proprietário do Contrato. O diagrama ilustra o ciclo de vida completo incluindo listagem de itens, colocação de fundos, confirmação de entrega, resolução de disputas e distribuição de taxas.
Máquina de estado de compra escrow: transações fluem de Pending (fundos em escrow) através de vários estados. O caminho feliz é Pending → Delivered (fundos liberados). Caminhos alternativos lidam com disputas e cancelamentos, garantindo transações sem necessidade de confiança entre partes.
function confirmDelivery(uint256 _purchaseId) external onlyBuyer(_purchaseId) purchaseExists(_purchaseId){ Purchase storage purchase = purchases[_purchaseId]; require(purchase.status == PurchaseStatus.Pending, "Purchase not pending"); purchase.status = PurchaseStatus.Delivered; // Release funds to seller payable(purchase.seller).transfer(purchase.amount); // Send fee to marketplace owner if (purchase.fee > 0) { payable(owner).transfer(purchase.fee); } emit DeliveryConfirmed(_purchaseId);}
Esta função demonstra o valor central do escrow: distribuição de fundos sem necessidade de confiança baseada em confirmação de entrega.
Sequência de fluxo de fundos: fundos do comprador são mantidos em escrow até que a entrega seja confirmada. Após confirmação, fundos são distribuídos atomicamente ao vendedor e proprietário do marketplace. O caminho de resolução de disputas mostra como conflitos são tratados através de intervenção do proprietário.
# Executar todos os testesforge test# Executar teste específico com saída verbosaforge test --match-test testPurchaseItem -vvv# Teste com relatório de gasforge test --gas-report# Gerar relatório de coberturaforge coverage
Recursos Avançados
Descoberta de Preço e Lances
// Adicionar ao contrato principalmapping(uint256 => Bid[]) public itemBids;struct Bid { address bidder; uint256 amount; uint256 timestamp;}function placeBid(uint256 _itemId) external payable { Item storage item = items[_itemId]; require(item.status == ItemStatus.Active, "Item not active"); require(msg.sender != item.seller, "Seller cannot bid"); require(msg.value > 0, "Bid must be greater than 0"); // Check if bid is higher than current highest Bid[] storage bids = itemBids[_itemId]; if (bids.length > 0) { require(msg.value > bids[bids.length - 1].amount, "Bid too low"); } // Store previous bidder funds for refund if (bids.length > 0) { Bid storage previousBid = bids[bids.length - 1]; payable(previousBid.bidder).transfer(previousBid.amount); } bids.push(Bid({ bidder: msg.sender, amount: msg.value, timestamp: block.timestamp }));}
Sistema de Reputação
mapping(address => UserReputation) public reputations;struct UserReputation { uint256 totalSales; uint256 totalPurchases; uint256 successfulTransactions; uint256 disputesLost; uint256 rating; // Out of 10000 (100.00%)}function updateReputation(address _user, bool _positive) internal { UserReputation storage rep = reputations[_user]; if (_positive) { rep.successfulTransactions++; } else { rep.disputesLost++; } // Calculate new rating uint256 total = rep.successfulTransactions + rep.disputesLost; if (total > 0) { rep.rating = (rep.successfulTransactions * 10000) / total; }}
Considerações de Segurança
Proteção contra Reentrância
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";contract EscrowMarketplace is ReentrancyGuard { // Add nonReentrant modifier to functions that transfer ETH function confirmDelivery(uint256 _purchaseId) external nonReentrant onlyBuyer(_purchaseId) purchaseExists(_purchaseId) { // Implementation... }}
// Empacotar structs para usar menos slots de armazenamentostruct Item { uint128 price; // Reduced from uint256 uint64 createdAt; // Unix timestamp fits in uint64 uint32 id; // Supports up to 4.2B items uint8 status; // Enum fits in uint8 address seller; // 20 bytes string title; // Variable length string description; // Variable length}
Operações em Lote
function listMultipleItems( string[] memory _titles, string[] memory _descriptions, uint256[] memory _prices) external returns (uint256[] memory) { require(_titles.length == _descriptions.length && _titles.length == _prices.length, "Array length mismatch"); uint256[] memory itemIds = new uint256[](_titles.length); for (uint i = 0; i < _titles.length; i++) { itemIds[i] = listItem(_titles[i], _descriptions[i], _prices[i]); } return itemIds;}
Conclusão
Construímos um smart contract abrangente de marketplace escrow que demonstra o poder da tecnologia blockchain para criar software autônomo e transparente. Nossa implementação inclui:
Recursos-Chave Implementados:
✅ Listagem e gerenciamento de itens
✅ Mecanismo escrow seguro
✅ Liberação automática de fundos
✅ Sistema de resolução de disputas
✅ Gerenciamento de taxas
✅ Testes abrangentes
Medidas de Segurança:
✅ Proteção contra reentrância
✅ Validação de entrada
✅ Controle de acesso
✅ Reembolsos baseados em tempo
Cobertura de Testes:
✅ Testes unitários para todas as funções
✅ Testes de integração
✅ Tratamento de casos extremos
✅ Verificação de otimização de gas
Este marketplace escrow demonstra como smart contracts podem eliminar a necessidade de intermediários tradicionais enquanto fornecem segurança, transparência e automação. O código serve como uma base que pode ser estendida com integração NFT para bens digitais, suporte multi-token além de ETH, mecanismos de governança para ajustes de taxas, sistemas de reputação avançados e integração com armazenamento descentralizado como IPFS.
Caminho de Aprendizado à Frente
Implantar em testnets (Sepolia, Goerli) para testes ao vivo
Construir uma aplicação frontend usando React e bibliotecas Web3
Implementar auditorias de segurança adicionais usando ferramentas como Slither
Explorar implantação Layer 2 para custos de gas reduzidos
Estudar marketplaces existentes como OpenSea para inspiração
O mundo de smart contracts é vasto e evolui rapidamente. Este marketplace escrow é apenas o começo—use-o como um trampolim para construir aplicações descentralizadas mais complexas que podem verdadeiramente transformar como transacionamos e interagimos na economia digital.
Código Fonte: A implementação completa com testes está disponível no GitHub.
Lembre-se: Sempre realize testes e auditorias de segurança abrangentes antes de implantar smart contracts no mainnet. A natureza imutável do blockchain significa que bugs podem ser caros e difíceis de corrigir.