SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
14.11.2024

Lição: 027: Serialização de Dados com Borsh no Solana

Nesta aula, vamos explorar a serialização de dados no Solana usando o formato Borsh (Binary Object Representation Serializer for Hashing). O Borsh é um formato de serialização binária amplamente utilizado em contratos inteligentes do Solana devido à sua eficiência e compatibilidade com Rust. A serialização de dados é crucial para armazenar dados estruturados em um formato que pode ser facilmente transmitido ou salvo.

O que é Borsh?

Borsh é um formato de serialização que oferece vários benefícios:

  • Compactação: Os dados são serializados em um formato binário, resultando em tamanhos menores em comparação com formatos baseados em texto, como JSON ou XML.
  • Velocidade: A serialização e deserialização Borsh são otimizadas para desempenho, tornando-as adequadas para aplicações em blockchain.
  • Integridade dos Dados: O Borsh pode ser usado para definir rigidamente estruturas de dados, assegurando a integridade dos dados e reduzindo erros.

Começando com Borsh

Para usar o Borsh em seu programa no Solana, você precisa adicionar o crate borsh ao seu Cargo.toml:

[dependencies]
borsh = "0.9"

Definindo Estruturas de Dados

Em Rust, você pode definir suas estruturas de dados usando structs regulares. Em seguida, iremos derivar os traços BorshSerialize e BorshDeserialize para habilitar a serialização e desserialização com Borsh.

Aqui está um exemplo de uma struct que representa uma conta simples que armazena o saldo de um usuário e alguns metadados:

use borsh::{BorshSerialize, BorshDeserialize};

#[derive(BorshSerialize, BorshDeserialize, Debug)]
pub struct ContaUsuario {
    pub nome_usuario: String,
    pub saldo: u64,
}

Neste exemplo, ContaUsuario possui dois campos: um String para o nome do usuário e um u64 para o saldo.

Serializando Dados

Para serializar uma instância de ContaUsuario, você pode usar o método try_to_vec fornecido pelo traço BorshSerialize:

fn main() {
    let usuario = ContaUsuario {
        nome_usuario: String::from("alice"),
        saldo: 100,
    };

    // Serializar a conta do usuário
    let dados_serializados = usuario.try_to_vec().expect("Falha na serialização");
    println!("Dados serializados: {:?}", dados_serializados);
}

Após executar este código, você verá a representação binária da ContaUsuario impressa no console.

Deserializando Dados

Para deserializar os dados serializados de volta em uma ContaUsuario, você pode usar o método try_from_slice do traço BorshDeserialize:

fn main() {
    // Os mesmos dados serializados de antes
    let dados_serializados: Vec<u8> = vec![/* dados binários aqui */];

    // Deserializar a conta do usuário
    let usuario_deserializado: ContaUsuario = ContaUsuario::try_from_slice(&dados_serializados)
        .expect("Falha na deserialização");

    println!("Usuário Deserializado: {:?}", usuario_deserializado);
}

Substitua o comentário pelo dado binário real que você obteve do exemplo anterior de serialização.

Exemplo Completo

Abaixo está um exemplo completo de um programa Rust que serializa e deserializa uma ContaUsuario:

use borsh::{BorshSerialize, BorshDeserialize};

#[derive(BorshSerialize, BorshDeserialize, Debug)]
pub struct ContaUsuario {
    pub nome_usuario: String,
    pub saldo: u64,
}

fn main() {
    // Criar uma nova conta de usuário
    let usuario = ContaUsuario {
        nome_usuario: String::from("alice"),
        saldo: 100,
    };

    // Serializar a conta do usuário
    let dados_serializados = usuario.try_to_vec().expect("Falha na serialização");
    println!("Dados serializados: {:?}", dados_serializados);

    // Deserializar a conta do usuário
    let usuario_deserializado: ContaUsuario = ContaUsuario::try_from_slice(&dados_serializados)
        .expect("Falha na deserialização");

    println!("Usuário Deserializado: {:?}", usuario_deserializado);
}

Conclusão

Nesta aula, aprendemos como usar o formato de serialização Borsh em nossos programas Solana. Cobrimos a definição de estruturas de dados, a serialização de dados em um formato binário e a deserialização de volta em estruturas Rust. O Borsh é uma ferramenta essencial para o manuseio eficiente de dados em aplicações de blockchain. À medida que você desenvolve programas mais complexos, descobrirá que entender a serialização ajudará a manipular dados de maneira eficaz e segura.

Boas codificações!

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

Thank you for voting!