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!