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 comouintebytes).
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:
sourcecontƩm dois campos:chainIdesender.redeemerpossuiaddresse 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:
uinteint- 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
serializeLayoutedeserializeLayout.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