Aula 171: Rollups Otimistas
Os Rollups Otimistas são uma solução de escalabilidade de camada 2 para blockchains que aumentam significativamente o throughput de transações, mantendo a segurança da blockchain subjacente de camada 1. Esta aula irá explorar os conceitos por trás dos Rollups Otimistas, fornecendo exemplos de como eles funcionam e como você pode interagir com eles usando contratos inteligentes.
O que são Rollups Otimistas?
Os Rollups Otimistas agrupam várias transações em um único lote, que é então enviado para a blockchain de camada 1. Eles operam sob a suposição de que todas as transações são válidas. Portanto, em vez de verificar cada transação individualmente antes de adicioná-la ao rollup, os Rollups Otimistas confiam em provas de fraude para garantir a honestidade.
Características Principais
- Escalabilidade: Maior throughput por meio do agrupamento de transações.
- Taxas Reduzidas: Custo mais baixo por transação em comparação à camada 1.
- Confiança, mas com Verificação: Assume que as transações são válidas até que se prove o contrário.
- Provas de Fraude: Usuários podem contestar transações incorretas.
Como Funcionam os Rollups Otimistas
- Coleta de Transações: Usuários enviam suas transações para a cadeia Rollup.
- Agrupamento: As transações são coletadas e reunidas em um único bloco Rollup.
- Envio: O bloco Rollup é enviado para a blockchain de camada 1.
- Período de Contestação: Um período definido durante o qual os participantes podem contestar a validade das transações.
- Finalização: Se não houver contestações, o estado se torna final. Se uma contestação for levantada, a transação é validada na camada 1.
Exemplo de um Contrato Inteligente Simples para um Rollup Otimista
Neste exemplo, vamos escrever um contrato inteligente simples em Solidity que pode ser usado dentro de um ambiente de Rollup Otimista. Este contrato permitirá que os usuários depositem e retirem fundos.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleRollup {
mapping(address => uint256) public balances;
event Deposited(address indexed user, uint256 amount);
event Withdrawn(address indexed user, uint256 amount);
function deposit() external payable {
require(msg.value > 0, "O valor do depósito deve ser maior que zero");
// Atualiza o saldo
balances[msg.sender] += msg.value;
emit Deposited(msg.sender, msg.value);
}
function withdraw(uint256 amount) external {
require(balances[msg.sender] >= amount, "Saldo insuficiente");
// Atualiza o saldo
balances[msg.sender] -= amount;
// Transfere os fundos
payable(msg.sender).transfer(amount);
emit Withdrawn(msg.sender, amount);
}
}
Explicação do Contrato Inteligente
- Mapping: O mapping
balances
mantém os saldos de cada usuário. - Função de Depósito: Os usuários podem depositar Ether, o que atualiza seu saldo e emite um evento
Deposited
. - Função de Retirada: Os usuários podem retirar Ether até o saldo disponível, atualizando os estados conforme necessário e emitindo um evento
Withdrawn
.
Integração com Rollups Otimistas
Para implantar o contrato acima nos Rollups Otimistas, você normalmente interagiria com uma solução de camada 2, como Optimism ou Arbitrum. Os passos de implantação geralmente envolvem:
- Conectar-se à Rede Rollup: Configure seu ambiente de desenvolvimento para apontar para o endpoint RPC do Rollup.
- Implantar o Contrato: Use ferramentas como Truffle ou Hardhat para implantar seu contrato.
- Interagir com o Contrato: Você pode enviar transações para o contrato, que serão processadas pela cadeia Rollup.
Exemplo de Interação
Aqui está um exemplo de como você poderia interagir com o contrato implantado usando JavaScript e ethers.js:
const { ethers } = require("ethers");
// Conectar-se a um provedor de Rollup Otimista
const provider = new ethers.providers.JsonRpcProvider("https://optimism-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID");
const wallet = new ethers.Wallet("YOUR_PRIVATE_KEY", provider);
// O endereço do contrato SimpleRollup implantado
const contractAddress = "YOUR_CONTRACT_ADDRESS";
const contract = new ethers.Contract(contractAddress, [
"function deposit() public payable",
"function withdraw(uint256 amount) public",
"function balances(address) public view returns (uint256)"
], wallet);
async function main() {
// Depositar fundos
const txDeposit = await contract.deposit({ value: ethers.utils.parseEther("1.0") });
await txDeposit.wait();
console.log("Depositados 1 ETH!");
// Retirar fundos
const balance = await contract.balances(wallet.address);
if (balance.gt(0)) {
const txWithdraw = await contract.withdraw(balance);
await txWithdraw.wait();
console.log(`Retirados ${ethers.utils.formatEther(balance)} ETH!`);
}
}
main().catch(console.error);
Conclusão
Os Rollups Otimistas representam uma abordagem promissora para escalar blockchains, permitindo maior throughput e taxas mais baixas, mantendo a segurança e a confiança. Ao entender como implementar e interagir com contratos inteligentes neste ambiente, os desenvolvedores podem aproveitar os benefícios oferecidos pelas soluções de camada 2.
Nesta aula, exploramos os conceitos fundamentais dos Rollups Otimistas, implementamos um contrato simples e demonstramos sua interação em uma plataforma Rollup usando JavaScript. À medida que você continua sua jornada no desenvolvimento de blockchain, considere experimentar com aplicações mais complexas que utilizem Rollups Otimistas para desbloquear todo o seu potencial.