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ĆŖ:

  1. Defina estruturas de dados: como nĆŗmeros, arrays e tipos personalizados.

  2. Serialização e desserialização eficientes: converta dados estruturados para binÔrio e vice-versa.

  3. 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 como uint e bytes).

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 e sender.

  • redeemer possui address 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 e int - 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 e deserializeLayout.

  • 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