SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
03.12.2024

Aula 217: Canais de Estado

Canais de estado são um conceito poderoso na tecnologia de blockchain, permitindo interações fora da cadeia entre partes, enquanto retêm os benefícios da blockchain, como segurança, escalabilidade e finalização. Nesta aula, vamos explorar o que são os canais de estado, como funcionam e fornecer uma implementação simples em Solidity.

O que são Canais de Estado?

Canais de estado permitem que os participantes realizem transações fora da cadeia, apenas concretizando o estado final na cadeia. Isso reduz significativamente os custos associados às transações em cadeia, melhora a velocidade das interações e preserva a privacidade, já que as etapas intermediárias não são registradas na blockchain.

Como Funcionam os Canais de Estado

  1. Criação do Canal: Duas partes concordam em abrir um canal. Isso geralmente envolve uma transação de financiamento na cadeia, onde ambas as partes bloqueiam uma certa quantia de criptomoeda como garantia.

  2. Interações Fora da Cadeia: Após a abertura do canal, as partes podem interagir livremente fora da cadeia sem maiores compromissos na cadeia. Elas podem enviar mensagens de um lado para o outro para atualizar o estado do canal.

  3. Fechamento do Canal: Quando os participantes concordam em fechar o canal, eles submetem o estado mais recente à blockchain. O contrato inteligente verifica o estado e distribui os fundos de acordo.

Benefícios dos Canais de Estado

  • Taxas Reduzidas: Transações fora da cadeia não incurram em taxas de gás por transação.
  • Velocidade: Interações instantâneas sem esperar por confirmações de bloco.
  • Privacidade: Transações fora da cadeia não são visíveis ao público.

Exemplo de Implementação

Abaixo está uma implementação simples de um canal de estado em Solidity. O objetivo é demonstrar a abertura do canal, a atualização do estado e o seu fechamento.

Contrato Inteligente

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract CanalDeEstadoSimples {
    address public parteA;
    address public parteB;
    uint256 public saldoA;
    uint256 public saldoB;

    enum EstadoDoCanal { Aberto, Fechado }
    EstadoDoCanal public estado;

    event CanalAberto(address indexed parteA, address indexed parteB);
    event EstadoAtualizado(uint256 novoSaldoA, uint256 novoSaldoB);
    event CanalFechado(uint256 saldoFinalA, uint256 saldoFinalB);

    modifier apenasPartes() {
        require(msg.sender == parteA || msg.sender == parteB, "Não autorizado");
        _;
    }

    modifier estaAberto() {
        require(estado == EstadoDoCanal.Aberto, "Canal não está aberto");
        _;
    }

    constructor(address _parteB) {
        parteA = msg.sender;
        parteB = _parteB;
        estado = EstadoDoCanal.Aberto;
        emit CanalAberto(parteA, parteB);
    }

    function atualizarEstado(uint256 _saldoA, uint256 _saldoB) external apenasPartes estaAberto {
        saldoA = _saldoA;
        saldoB = _saldoB;
        emit EstadoAtualizado(saldoA, saldoB);
    }

    function fecharCanal() external apenasPartes estaAberto {
        estado = EstadoDoCanal.Fechado;
        emit CanalFechado(saldoA, saldoB);

        // Transferir saldos finais
        payable(parteA).transfer(saldoA);
        payable(parteB).transfer(saldoB);
    }

    // Função de fallback para receber Ether
    receive() external payable {}
}

Explicação do Contrato

  1. Variáveis de Estado:

    • parteA e parteB armazenam os endereços dos participantes.
    • saldoA e saldoB rastreiam os saldos de cada parte no canal.
    • estado enumera se o canal está Aberto ou Fechado.
  2. Modificadores:

    • apenasPartes garante que apenas as partes designadas possam chamar certas funções.
    • estaAberto verifica se o canal ainda está aberto.
  3. Funções:

    • constructor: Inicializa o contrato e abre o canal.
    • atualizarEstado: Permite que as partes atualizem seus respectivos saldos.
    • fecharCanal: Finaliza o canal e transfere os fundos com base nos saldos mais recentes.
  4. Eventos: Emitem eventos para registrar ações significativas no canal, como criação, atualizações e fechamento.

Como Usar o Contrato

  1. Primeiro, implemente o contrato CanalDeEstadoSimples passando o endereço da parteB.
  2. Ambas as partes podem chamar a função atualizarEstado para alterar seus saldos a qualquer momento durante a vida útil do canal.
  3. Quando estiverem prontos para finalizar seus saldos, um deles chama fecharCanal, que irá resolver seus saldos e fechar o canal.

Conclusão

Canais de estado são um desenvolvimento empolgante na tecnologia de blockchain que proporcionam maior escalabilidade, redução de custos e aumento de privacidade para transações. Ao implementar um contrato simples em Solidity, demonstramos como um canal de estado pode facilitar interações fora da cadeia, garantindo que o resultado final seja resolvido de forma segura na cadeia.

À medida que você explora mais, considere como os canais de estado podem ser aplicados em várias aplicações descentralizadas, como jogos ou micropagamentos. Boa codificação!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!