Tabelas de Consulta de Endereços
As Tabelas de Consulta de Endereços (Address Lookup Tables - ALTs), também conhecidas como Tabelas de Consulta (Lookup Tables - LUTs), surgiram como uma tecnologia inovadora no desenvolvimento da Solana. Introduzidas com a atualização de Transações Versionadas, as ALTs permitem que os desenvolvedores carreguem e gerenciem eficientemente uma coleção de endereços relacionados em uma única transação. Ao contrário das abordagens tradicionais, as ALTs oferecem uma solução escalável para interações complexas com várias contas, revolucionando a forma como as aplicações são construídas na Solana.
Transações Versionadas
Em 2022, a Solana introduziu o conceito de Transações Versionadas ou 'TransactionV0'. Isso introduziu uma nova tecnologia chamada ALTs. Ela permite a criação de uma coleção de endereços relacionados para carregar mais endereços eficientemente em uma única transação.
Após a atualização das Transações Versionadas, o runtime da Solana reconhece dois tipos de transações. Primeiro, as transações sempre usadas (Transação Legada), e um novo formato de transação chamado Transação Versão, que pode fazer uso de tabelas de consulta de endereços na cadeia.
Envio de uma Transação Versão
Transação Legada
Uma transação na Solana tem um tamanho máximo de 1232 bytes.
Uma transação é composta por:
Um conjunto compacto de assinaturas
Uma mensagem
Devido ao limite de tamanho da transação de 1232 bytes, uma transação pode armazenar no máximo 35 endereços de conta (cada conta tem 32 bytes), levando em consideração algum espaço para cabeçalhos, assinaturas e outros metadados.
Transação V0
Na Transação V0, ao alterar o formato da mensagem de uma transação legada e adicionar Tabelas de Consulta de Endereços, uma transação pode conter no máximo 256 contas.
Nas Tabelas de Consulta de Endereços, armazenamos os endereços das contas em uma estrutura de dados semelhante a uma tabela na cadeia, com um índice associado a cada endereço.
O endereço da tabela pode ser referenciado em uma mensagem de transação.
Para apontar para uma conta individual dentro da tabela, é necessário um índice u8 de 1 byte, o que leva à possibilidade de referenciar 2⁸=256 contas, já que as contas são formatadas usando um índice u8.
Este é o formato de uma Tabela de Consulta de Endereços.
A Necessidade de Otimizar Transações
Desenvolvedores avançados da Solana frequentemente se veem lidando com várias contas em transações complexas, ultrapassando os limites das abordagens tradicionais. Nesse cenário, a necessidade de otimização se torna fundamental. Sem ferramentas eficientes, gerenciar e interagir com inúmeras contas em uma única transação pode ser uma tarefa assustadora, levando a custos aumentados e desempenho reduzido.
Benefícios e Vantagens das Tabelas de Consulta de Endereços
1. Eficiência Melhorada
Em aplicações descentralizadas complexas (DApps), os desenvolvedores frequentemente precisam interagir e atualizar várias contas em uma única transação. Sem uma estrutura organizacional eficiente, o código pode se tornar confuso, propenso a erros e difícil de manter.
Cenário: Vamos pegar o exemplo de uma bolsa descentralizada (DEX) em que uma negociação envolve a atualização do saldo de tokens do usuário, o pool de liquidez da DEX e uma conta de coletor de taxas. Tradicionalmente, os desenvolvedores poderiam abordar isso manipulando individualmente cada operação de conta, levando a um código repetitivo e maior risco de erros.
Solução ALT: Com ALT, você pode organizar essas contas em uma tabela de consulta. A lógica da transação se torna mais simplificada, permitindo buscar, processar e atualizar essas contas em uma única transação. Isso melhora a legibilidade do código e reduz o risco de erros.
2. Economia de Custos
Altos custos de transação podem ser uma preocupação significativa em aplicações descentralizadas, especialmente em cenários em que várias operações precisam ser realizadas em várias contas. Executar essas operações individualmente pode levar a custos de gás mais altos para os usuários.
Cenário: Em uma plataforma de empréstimos descentralizada, a execução de um pagamento de empréstimo envolve a atualização do saldo do mutuário, o saldo do credor e possivelmente o ajuste de contas relacionadas à taxa de juros. Realizar essas ações em transações separadas pode resultar em custos de gás mais altos para os usuários.
Solução ALT: Ao usar ALT para gerenciar as contas envolvidas, você pode agrupar essas operações em uma única transação. Isso reduz o número de transações necessárias, resultando em custos de gás mais baixos para os usuários e em uma plataforma de empréstimos mais eficiente.
3. Escalabilidade e Desempenho
Do ponto de vista de um desenvolvedor avançado, escalabilidade e desempenho não são apenas metas; são requisitos. As ALTs desempenham um papel fundamental na conquista desses objetivos. Ao gerenciar eficientemente os endereços, essas tabelas se tornam ferramentas para otimizar a utilização de recursos, garantindo a escalabilidade e o desempenho de aplicações baseadas na Solana, mesmo diante de requisitos complexos.
Cenário: Em uma plataforma de mídia social descentralizada, ações como postar conteúdo, atualizar perfis de usuários e gerenciar seguidores envolvem várias contas. Sem ALT, dimensionar a plataforma para lidar com um grande número de interações de usuários simultâneas poderia se tornar um gargalo.
Solução ALT: Ao usar ALT para gerenciar as contas envolvidas, você pode agrupar essas operações em uma única transação. Isso reduz o número de transações necessárias, resultando em custos de
gás mais baixos para os usuários e em uma plataforma de empréstimos mais eficiente.
4. Aumento da Taxa de Transações
A taxa de transações é uma métrica importante para desenvolvedores avançados da Solana que buscam construir DApps escaláveis e de alto desempenho. As Tabelas de Consulta de Endereços contribuem significativamente, permitindo o carregamento e a manipulação de dados de vários endereços em uma única transação. O resultado é uma taxa de transações elevada, uma característica desejada no cenário competitivo do desenvolvimento blockchain.
Casos de Uso
Protocolos de Finanças Descentralizadas (DeFi)
No complexo mundo das finanças descentralizadas, as ALTs brilham intensamente. Desenvolvedores avançados podem navegar facilmente em cenários DeFi em que várias contas precisam de atenção em uma única transação. Seja calculando pagamentos de juros, gerenciando índices de colateral ou executando liquidações, as ALTs simplificam o processo, tornando as aplicações DeFi mais eficientes e econômicas.
Coleções de Tokens Não Fungíveis (NFTs)
Desenvolvedores avançados no espaço de NFTs compreendem a diversidade e complexidade das coleções de NFTs. As ALTs se tornam ferramentas indispensáveis, especialmente ao lidar com transferências em lote, distribuição de royalties ou estruturas de governança complexas em aplicações avançadas de NFTs. A capacidade de gerenciar endereços de forma eficiente se torna um diferencial chave para oferecer uma experiência superior ao usuário.
Carteiras Multiassinatura
A segurança e eficiência são fundamentais nas operações de multiassinatura. Desenvolvedores experientes podem aproveitar as ALTs para organizar e gerenciar os endereços de signatários autorizados de forma eficaz. Isso garante que cenários de autorização complexos sejam tratados com destreza, aumentando a segurança e a eficiência das transações de multiassinatura.
Pré-requisitos para Usar ALTs
Node.js (versão 16.15 ou superior) instalado
Experiência com TypeScript e ts-node instalado
Experiência com a execução de Transações Básicas no Solana
RPC no Desenvolvimento do Solana
Chamada de Procedimento Remoto (RPC) é um protocolo de comunicação usado no desenvolvimento de blockchain para facilitar interações entre um cliente (como a aplicação de um desenvolvedor) e um servidor (a rede blockchain). A RPC permite que os desenvolvedores consultem informações, enviem transações e interajam com a blockchain.
Transações Versionadas e o Impacto no RPC
A introdução de Transações Versionadas no Solana representa uma evolução significativa nas capacidades das transações na blockchain. Essa atualização expande o formato tradicional de transação e introduz um novo tipo de transação, oferecendo aos desenvolvedores maior flexibilidade e eficiência.
Mudanças no RPC
As respostas das transações exigirão um novo campo de versão: maxSupportedTransactionVersion, para indicar aos clientes qual estrutura de transação deve ser seguida para a deserialização.
Os seguintes métodos precisam ser atualizados para evitar erros:
getTransaction
getBlock
O seguinte parâmetro precisa ser adicionado às solicitações: maxSupportedTransactionVersion: 0
(O '0' representa a versão da transação, para V0 é definido como 0)
Se maxSupportedTransactionVersion não for adicionado explicitamente à solicitação, a versão da transação voltará ao legado e não será possível usar Tabelas de Consulta de Endereços. Qualquer bloco que contenha uma transação versionada retornará um erro para o cliente no caso de uma transação legada.
Exemplo de solicitações formatadas em JSON para o endpoint RPC:
Enviando uma Transação Versionada:
Você deve usar a classe VersionedTransaction da biblioteca Solana web3js em vez da classe Transaction para enviar uma transação.
// crie um array com suas instruções desejadas
// neste caso, apenas uma instrução de transferência
const instructions = [
SystemProgram.transfer({
fromPubkey: publicKey,
toPubkey: publicKey,
lamports: minRent,
}),
];
// crie uma mensagem compatível com a versão V0
const messageV0 = new TransactionMessage({
payerKey: publicKey,
recentBlockhash: blockhash,
instructions,
}).compileToV@Message([lookupTableAddress]);
// faça uma transação versionada
const transactionV0 = new VersionedTransaction(messageV0);
const signature = await signAndSendTransaction(provider, transactionV0);
Assinando e Enviando uma Transação Versionada:
Depois de criar uma transação versionada, ela pode ser assinada e enviada via Phantom usando o método signAndSendTransaction no provedor. A chamada retorna uma Promise para um objeto contendo a assinatura. Isso é feito da mesma maneira que uma transação legada é enviada via provedor Phantom.
const provider = getProvider(); // veja "Detectando o Provedor"
const network = "<URL_DA_REDE>";
const connection = new Connection(network);
const versionedTransaction = new VersionedTransaction();
const { signature } = await provider.signAndSendTransaction(versionedTransaction);
await connection.getSignatureStatus(signature);
Você também pode especificar um objeto SendOptions como segundo argumento em sendAndSendTransaction() ou como um parâmetro de opções ao usar request.
Construindo uma Tabela de Consulta de Endereços (LUT):
Depois de termos a instrução de tabela de consulta, podemos construir uma transação, assiná-la e enviá-la para criar uma tabela de consulta na cadeia. Tabelas de consulta de endereços podem ser criadas com uma transação V0 ou uma transação legada. No entanto, o runtime da Solana só pode recuperar e lidar com os endereços adicionais dentro de uma tabela de consulta ao usar transações V0.
// crie uma Tabela de Consulta de Endereços
const [lookupTableInst, lookupTableAddress] = AddressLookupTableProgram.createLookupTable({
authority: publicKey,
payer: publicKey,
recentSlot: slot,
});
// Para criar a Tabela de Consulta de Endereços na cadeia:
// envie a instrução `lookupTableInst` em uma transação
const lookupMessage = new TransactionMessage({
payerKey: publicKey,
recentBlockhash: blockhash,
instructions: [lookupTableInst],
}).compileToVOMessage();
const lookupTransaction = new VersionedTransaction(lookupMessage);
const lookupSignature = await signAndSendTransaction(provider, lookupTransaction);
Expandindo uma Tabela de Consulta de Endereços (LUT):
Depois que uma Tabela de Consulta de Endereços é criada, ela pode ser expandida (ou seja, contas podem ser adicionadas à tabela). Usando a biblioteca @solana/web3.js, você pode criar uma nova instrução de extensão usando o método extendLookupTable. Depois que a instrução de extensão é criada, ela pode ser enviada em uma transação.
// adicione endereços à tabela `lookupTableAddress` por meio de uma instrução de extensão
const extendInstruction = AddressLookupTableProgram.extendLookupTable({
payer: publicKey,
authority: publicKey,
lookupTable: lookupTableAddress,
addresses: [
publicKey,
SystemProgram.programId,
// mais endereços `publicKey` podem ser listados aqui.
],
});
// Envie esta instrução de extensão em uma transação para a rede
// para inserir a lista de endereços em sua tabela de consulta com AddressLookupTableAddress
const extensionMessageV0 = new TransactionMessage({
payerKey: publicKey,
recentBlockhash: blockhash,
instructions: [extendInstruction],
}).compileToVOMessage();
const extensionTransactionV0 = new VersionedTransaction(extensionMessageV0);
const extensionSignature = await signAndSendTransaction(provider, extensionTransactionV0);
Assinando e Enviando uma Transação Versionada utilizando uma LUT:
Primeiro, precisamos buscar a conta da Tabela de Consulta de Endereços criada. Também podemos analisar e ler todos os endereços atualmente armazenados na Tabela de Consulta de Endereços recuperada.
// obtenha a tabela da rede
const lookupTableAccount = await connection.getAddressLookupTable(lookupTableAddress).then((res) => res.value);
// `lookupTableAccount` agora será um objeto `AddressLookupTableAccount`
console.log('Endereço da tabela da rede:', lookupTableAccount.key.toBase58());
// Percorra e analise todos os endereços armazenados na tabela
for (let i = 0; i < lookupTableAccount.state.addresses.length; i++) {
const address = lookupTableAccount.state.addresses[i];
console.log(i, address.toBase58());
}
Assinando e Enviando uma Transação Versionada utilizando uma LUT (continuação):
Agora podemos criar a matriz de instruções com uma instrução de transferência arbitrária, da mesma forma que fizemos ao criar a Transação Versionada anteriormente. Esta Transação Versionada pode então ser enviada usando a função provider signAndSendTransaction().
// crie uma matriz com suas instruções desejadas`
// neste caso, apenas uma instrução de transferência
const instructions = [
SystemProgram.transfer({
fromPubkey: publicKey,
toPubkey: publicKey,
lamports: minRent,
}),
];
// crie uma mensagem compatível com a versão V0
const messageV0 = new TransactionMessage({
payerKey: publicKey,
recentBlockhash: blockhash,
instructions,
}).compileToV@Message([lookupTableAccount]);
// faça uma transação versionada
const transactionV0 = new VersionedTransaction(messageV0);
const signature = await signAndSendTransaction(provider,
transactionV0);
Codifique Você Mesmo
Se você quiser experimentar isso ou implementar ALTs em seu projeto, a Phantom possui um ambiente de desenvolvimento para desenvolvedores que demonstra uma implementação de Tabelas de Consulta de Endereços que você pode conferir.
Ou você pode encontrar o repositório GitHub desse ambiente de desenvolvimento aqui.
Recursos Adicionais:
https://youtu.be/baxpr_EcRCo?si=BZ2jk6DJnBSWmS_W - Minha Principal Fonte
https://solanacookbook.com/guides/versioned-transactions.html
Este artigo foi escrito por Shuvajit Mahanta e traduzido por Adriano P. de Araujo. O original em inglês pode ser encontrado aqui.
Oldest comments (0)