VAAs (Verified Action Approvals)
Os VAAs (Verified Action Approvals) são a principal primitiva de mensagens da Wormhole. Eles consistem em pacotes de dados cross-chain emitidos sempre que um contrato de aplicativo cross-chain interage com o contrato principal (Core Contract).
As Guardiãs validam mensagens emitidas por contratos antes de enviá-las à cadeia de destino. Uma vez que a maioria das Guardiãs observa a mensagem e determina sua finalização, elas assinam um hash keccak256 do corpo da mensagem.
A mensagem é encapsulada em uma estrutura chamada VAA, que combina a mensagem com as assinaturas das Guardiãs para formar uma prova.
Indexação de VAAs
Os VAAs são identificados de forma única por meio da tupla (emitter_chain, emitter_address, sequence)
. Para obter um VAA, é possÃvel consultar a API Wormholescan usando essas informações.
Os contratos inteligentes na cadeia de destino processam os VAAs para receber mensagens da Wormhole.
Formato do VAA
Um VAA básico possui dois componentes principais: cabeçalho e corpo.
Cabeçalho
O cabeçalho contém metadados sobre o VAA atual, o conjunto de Guardiãs ativo e as assinaturas coletadas até o momento.
Estrutura:
version byte
: versão do VAA.guardian_set_index u32
: Ãndice do conjunto de Guardiãs que assina o VAA.len_signatures u8
: número de assinaturas armazenadas.signatures []signature
: coleção de assinaturas das Guardiãs, onde cada assinatura inclui:index u8
: Ãndice da Guardiã no conjunto.signature [65]byte
: assinatura ECDSA.
Corpo
O corpo é derivado de forma determinÃstica de uma mensagem on-chain e deve ser idêntico para todas as Guardiãs que processam a mesma mensagem.
Estrutura:
timestamp u32
: marca temporal do bloco em que a mensagem foi publicada.nonce u32
: identificador único.emitter_chain u16
: ID da cadeia que emitiu a mensagem.emitter_address [32]byte
: endereço do contrato que chamou o Core Contract.sequence u64
: número incremental de mensagens publicadas pelo emissor.consistency_level u8
: nÃvel de consistência exigido pelo emissor.payload []byte
: dados arbitrários que serão processados.
Assinaturas
O corpo do VAA é hashado duas vezes com keccak256 para produzir a mensagem de digest a ser assinada:
Atenção: Algumas implementações da validação de assinatura ECDSA aplicam hash adicional à mensagem fornecida. Por isso, é essencial passar os argumentos corretamente, como ocorre no programa secp256k1
da Solana.
Tipos de Payload
Os payloads em VAAs variam conforme o aplicativo e podem conter informações sobre a cadeia de destino e contrato, permitindo a execução de ações especÃficas. Exemplos incluem:
Transferência de Tokens Estrutura:
payload_id u8
: ID do payload (1 para transferências).amount u256
: quantidade de tokens transferidos.token_address u8[32]
: endereço do token na cadeia de origem.token_chain u16
: ID numérico da cadeia de origem.to u8[32]
: endereço de destino.to_chain u16
: ID da cadeia de destino.fee u256
: taxa paga ao relayer.
Atestação de Token Permite registrar metadados de um token (nome, sÃmbolo, precisão decimal). Estrutura:
payload_id u8
: ID do payload (2 para atestação).token_address [32]byte
: endereço do contrato do token.token_chain u16
: ID da cadeia de origem.decimals u8
: número de casas decimais.symbol [32]byte
: nome curto do ativo.name [32]byte
: nome completo do ativo.
Transferência com Mensagem Semelhante à transferência de tokens, mas com um campo adicional de payload para comportar dados arbitrários.
Governança
VAAs de governança não possuem payload_id
e são utilizados para acionar ações predefinidas em contratos implantados.
Estrutura:
module u8[32]
: identificador do módulo.action u8
: ação de governança a ser executada.chain u16
: cadeia alvo (0 para todas as cadeias).args any
: argumentos adicionais.
Estrutura de Ação
Mensagens de governança contêm ações predefinidas que podem ser direcionadas aos vários módulos Wormhole atualmente implantados on-chain. A estrutura contém os seguintes campos:
module u8[32]
- contém um identificador de módulo alinhado à direitaaction u8
- ação de governança predefinida a ser executadachain u16
- cadeia na qual a ação está sendo direcionada. Isso deve ser definido como 0 para todas as cadeiasargs any
- argumentos para a ação
Abaixo está um exemplo de mensagem contendo uma ação de governança que aciona uma atualização de código para o contrato principal da Solana. O campo module
aqui é uma codificação alinhada à direita do ASCII "Core", representado como uma string hexadecimal de 32 bytes.
Ciclo de Vida de uma Mensagem
Uma mensagem é emitida por um contrato na Cadeia A.
Guardiãs observam e assinam a mensagem individualmente.
O VAA é submetido à cadeia de destino, servindo como prova da mensagem.
Qualquer pessoa pode submeter o VAA à cadeia de destino, com o custo de transação sendo responsabilidade do remetente.
Last updated