Data Layouts
O SDK Wormhole e o Sistema de Layout
O Wormhole SDK utiliza o pacote layout para definir, serializar e desserializar estruturas de dados de maneira eficiente. Esse sistema modular garante formatação consistente de dados e compatibilidade entre ambientes, sendo ideal para projetos que exigem um gerenciamento robusto de dados estruturados.
BenefÃcios do Sistema de Layout
Compreender o mecanismo de layout permite que você:
Defina estruturas de dados: como números, arrays e tipos personalizados.
Serialização e desserialização eficientes: converta dados estruturados para binário e vice-versa.
Lide com layouts especÃficos do protocolo: ideal para aplicações que envolvam comunicação cross-chain.
Essa abordagem é particularmente útil para desenvolvedores que desejam integrar o Wormhole em suas aplicações, especialmente ao trabalhar com payloads complexos ou comunicação entre blockchains.
Conceitos-Chave
Itens de Layout
Um layout define como estruturas de dados devem ser:
Serializadas: convertidas para um formato binário.
Desserializadas: reconstruÃdas para sua estrutura original.
Um layout é composto por itens de layout, que especificam campos individuais ou conjuntos de campos na sua estrutura de dados. Cada item de layout inclui:
name
: Nome do campo.binary
: Tipo de dado (e.g.,uint
,bytes
).size
: Tamanho fixo em bytes (para tipos comouint
ebytes
).
Exemplo de Layout
Abaixo, um exemplo de layout para serializar uma mensagem no protocolo Wormhole:
Neste exemplo:
sourceChain
: Inteiro não assinado de 2 bytes, identifica a blockchain de origem.orderSender
: Array de bytes fixo (32 bytes), representa o endereço do remetente.redeemer
: Outro array de 32 bytes, usado para o endereço do recebedor.redeemerMessage
: Sequência de bytes de comprimento variável, especificada por um inteiro de 4 bytes.
Essa definição garante que todos os campos necessários sejam codificados de maneira consistente e interpretados corretamente.
Serialização e Desserialização
Serialização
Converte dados estruturados em formato binário. Use a função serializeLayout
:
Resultado: serializedData
será um Uint8Array
representando os dados em binário.
Desserialização
Reconstrói objetos estruturados a partir de binário. Use a função deserializeLayout
:
Resultado: Um objeto reconstruÃdo, facilitando o trabalho com dados transmitidos entre blockchains.
Conversões Personalizadas
Os layouts permitem mapeamentos personalizados para tipos complexos. Isso é útil ao lidar com dados que não se encaixam em tipos simples como inteiros ou arrays de bytes.
Exemplo: Conversão personalizada para um Chain ID:
Essa configuração permite conversões entre formatos legÃveis e dados codificados usados em payloads.
Tratamento de Erros
O sistema de layout realiza verificações durante a serialização/desserialização. Erros são lançados se os dados estiverem no formato ou tamanho errado.
Exemplo de tratamento de erro:
Aplicações de Layouts
Definição de Layouts
Estruturas são definidas como listas de campos:
Campos de Comprimento Variável
O layout suporta arrays e sequências de bytes com comprimento variável, usando lengthSize
para especificar o tamanho do campo:
O sistema de layout do Wormhole SDK oferece uma maneira eficiente de gerenciar dados estruturados para comunicação cross-chain, garantindo consistência e suporte a casos de uso complexos, como payloads de comprimento variável e conversões personalizadas.
Layouts Aninhados e Tipagem Forte O Wormhole SDK simplifica o manuseio de estruturas complexas ao adotar layouts aninhados e tipagem forte. Enquanto os layouts aninhados organizam dados hierárquicos de forma clara, a tipagem forte garante consistência dos dados e identifica erros durante o desenvolvimento.
Layouts Aninhados
Em protocolos complexos, estruturas aninhadas são comuns. Esses layouts permitem organizar dados hierárquicos (como transações ou mensagens multipartes) em formatos estruturados.
Exemplo de layout aninhado onde uma mensagem possui campos aninhados:
Aqui:
source
contém dois campos:chainId
esender
.redeemer
possuiaddress
e uma mensagem com comprimento prefixado.
Tipagem Forte
Ao usar TypeScript, o Wormhole SDK implementa tipagem forte para garantir que dados serializados/deserializados sigam a estrutura esperada, minimizando erros.
Com o utilitário LayoutToType
, cria-se uma estrutura tipada a partir de um layout:
Qualquer dado com tipo incorreto resulta em erro em tempo de compilação.
Serialização e Desserialização
Com layouts aninhados, a serialização e desserialização seguem o mesmo padrão:
A tipagem forte em TypeScript assegura que os objetos de mensagem estejam em conformidade com o layout.
Layouts Usados Comumente
O SDK inclui layouts otimizados para campos padrão como IDs de blockchain, endereços e assinaturas.
Chain ID Layouts
Os layouts de ID de blockchain derivam do chainItemBase
, que define a representação binária de um ID como um inteiro não assinado de 2 bytes:
Dynamic Chain ID Layout: Permite validação em tempo de execução e suporte a valores nulos.
Fixed Chain ID Layout: RÃgido, ideal para um único ID de blockchain.
Layouts de Assinatura
O layout de assinatura no Wormhole define como serializar/desserializar assinaturas criptográficas.
Custom Conversion: Integra dados binários brutos com objetos de assinatura de alto nÃvel.
Essa integração melhora a confiabilidade no processamento de dados de assinatura.
VAAs e Protocolos Wormhole
As VAAs (Verified Action Approval) são mensagens assinadas que conectam cadeias distintas. O layout para VAAs organiza dados em três componentes principais:
Header: Metadados como Ãndice do conjunto de guardiões e assinaturas.
Envelope: Detalhes especÃficos da cadeia, como ID de emissor e sequência.
Payload: Dados de aplicação.
Header Example:
A arquitetura modular do Wormhole SDK facilita a interoperabilidade entre cadeias, garantindo consistência nos dados.
Como funciona?
Internamente, a função serialize
combina dinamicamente o baseLayout
(cabeçalho e envelope) com o layout do payload definido pelo payloadLiteral
. O layout completo é então passado para a função serializeLayout
, que converte os dados no formato binário.
Desserializando os dados do VAA
O SDK Wormhole fornece a função deserialize
para analisar um VAA no formato binário de volta para um objeto estruturado. Esta função usa o baseLayout
e a lógica do discriminador de payload para garantir que o VAA seja interpretado corretamente.
Como funciona?
Internamente, a função deserialize
usa o baseLayout
(cabeçalho e envelope) para analisar a estrutura principal do VAA. Ela então identifica o layout do payload apropriado usando o tipo de payload ou discriminador fornecido.
Registrando Payloads Personalizados
No SDK Wormhole, os payloads dependem de layouts para definir sua estrutura binária, garantindo consistência e segurança de tipo entre os protocolos. Payloads personalizados expandem essa funcionalidade, permitindo que os desenvolvedores tratem caracterÃsticas especÃficas de protocolo ou casos de uso únicos.
Para aprender como definir e registrar payloads usando layouts, consulte a página "Building Protocols and Payloads" para um guia detalhado.
Erros Comuns e Melhores Práticas
Ao trabalhar com o sistema de layout do SDK Wormhole, é importante estar ciente de alguns problemas comuns que podem surgir. Abaixo estão alguns erros a evitar e melhores práticas para garantir uma integração tranquila.
Erros a Evitar
Definindo Tamanhos para Tipos de Dados
Ao definir os tamanhos para cada tipo de dado, certifique-se de que o comprimento real dos dados corresponda ao tamanho especificado para evitar erros de serialização e desserialização:
uint
eint
- o tamanho especificado deve ser grande o suficiente para acomodar o valor dos dados. Por exemplo, armazenar um valor maior que 255 em um único byte (uint8
) falhará, pois excede a capacidade do byte. Da mesma forma, um inteiro subdimensionado (por exemplo, especificar 2 bytes para um inteiro de 4 bytes) pode resultar em perda de dados ou falha na desserialização.bytes
- os dados devem corresponder ao comprimento de byte especificado no layout. Por exemplo, definir um campo como 32 bytes (tamanho: 32) exige que os dados fornecidos tenham exatamente 32 bytes de comprimento; caso contrário, a serialização falhará.
Arrays Definidos Incorretamente
Arrays podem ser de comprimento fixo ou prefixados por comprimento, então é importante defini-los corretamente. Arrays de comprimento fixo devem corresponder ao comprimento especificado, enquanto arrays prefixados por comprimento necessitam de um campo lengthSize
.
Melhores Práticas
Essas melhores práticas e erros comuns podem ajudar a prevenir bugs e melhorar a confiabilidade de sua implementação ao trabalhar com layouts no SDK Wormhole.
Reutilize Itens de Layout Predefinidos
Em vez de definir manualmente os tamanhos ou tipos, reutilize os itens de layout predefinidos fornecidos pelo SDK Wormhole. Esses itens garantem formatação consistente e aplicam tipagem forte.
Por exemplo, use o layout chainItem
para IDs de cadeia ou universalAddressItem
para endereços de blockchain:
Ao aproveitar os itens de layout predefinidos, você reduz redundâncias, mantém a consistência e garante compatibilidade com os padrões do Wormhole.
Use Instâncias de Classe
Sempre que possÃvel, converta os dados desserializados em instâncias de classes de nÃvel superior. Isso facilita a validação, manipulação e interação com dados estruturados. Por exemplo, a classe UniversalAddress
garante o manuseio consistente de endereços:
Focar em reutilizar itens de layout predefinidos e converter dados desserializados em abstrações de nÃvel superior pode garantir uma implementação mais robusta e de fácil manutenção.
Tratamento Consistente de Erros
Sempre trate os erros durante as operações de serialização e desserialização. Capturar exceções permite registrar ou resolver problemas de forma elegante ao trabalhar com dados potencialmente corrompidos ou inválidos.
Aproveite Layouts Reutilizáveis
Criar layouts reutilizáveis para estruturas comumente repetidas melhora a manutenção do código e reduz a duplicação. Esses layouts podem representar campos ou combinações de campos frequentemente encontrados em comunicação cross-chain, como IDs de cadeia, endereços e assinaturas.
Por exemplo, defina um layout reutilizável para IDs de cadeia e endereços:
Ao abstrair elementos comuns em um único layout, você garante consistência em diferentes partes da aplicação e simplifica futuras atualizações.
Considerações de Performance
A serialização e desserialização eficientes são cruciais ao lidar com grandes quantidades de dados cross-chain. Abaixo estão algumas estratégias e melhores práticas para garantir o desempenho ideal ao usar layouts do SDK Wormhole.
Instanciação Preguiçosa
A criação de um discriminador pode ser intensiva em recursos para conjuntos de dados complexos ou grandes. As estruturas de layout não acarretam custos significativos de forma antecipada, mas adiar a criação de discriminadores até que sejam necessários pode melhorar a eficiência.
Essa abordagem garante que os discriminadores sejam criados apenas quando necessário, ajudando a otimizar o desempenho, especialmente para layouts complexos ou condicionais.
Recursos
Para mais aprendizado e experiência prática, explore os seguintes recursos:
Wormhole TypeScript SDK - O repositório do SDK Wormhole contém a implementação central dos layouts, incluindo itens de layout predefinidos e utilitários como
serializeLayout
edeserializeLayout
.Repositório de testes de layouts - Para experimentação prática, confira o repositório do pacote de layouts, que fornece exemplos e testes unitários para ajudar a entender melhor a serialização, desserialização e o mecanismo de tipagem forte. Executar esses testes localmente é uma ótima maneira de aprofundar seu entendimento de como os layouts funcionam em cenários do mundo real.
Last updated