Construindo mensagens de transação
Componha mensagens de transação versionadas com fee payer, lifetime e instruções.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
import {
createTransactionMessage,
pipe,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
} from "@solana/kit";Quando usar:
- Qualquer bundle de instrução customizada (DeFi, NFT, jogo).
- Transações atômicas multi-instrução.
- Mensagens versão 0 com lookup tables.
- Fluxos client-side antes da assinatura da carteira.
Exemplo prático
import {
createSolanaRpc,
createTransactionMessage,
pipe,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstructions,
address,
} from "@solana/kit";
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
const rpc = createSolanaRpc(process.env.RPC_URL!);
const { value: blockhash } = await rpc.getLatestBlockhash().send();
const budgetIxs = [
getSetComputeUnitLimitInstruction({ units: 200_000 }),
getSetComputeUnitPriceInstruction({ microLamports: 5_000n }),
];
const message = pipe(
createTransactionMessage({ version: 0 }),
(m) => setTransactionMessageFeePayerSigner(walletSigner, m),
(m) => setTransactionMessageLifetimeUsingBlockhash(blockhash, m),
(m) => appendTransactionMessageInstructions(budgetIxs, m),
(m) => appendTransactionMessageInstructions(programIxs, m)
);O que isso demonstra:
- Instruções compute budget tipicamente vêm primeiro.
pipemantém transformações legíveis e imutáveis.- Lifetime de blockhash deve estar fresca por submissão.
Mergulho profundo
Como funciona
- Mensagens listam contas, instruções e assinaturas exigidas no wire.
- Versão 0 habilita address lookup tables para encolher chaves estáticas.
- Fee payer paga taxa de rede; signers adicionais assinam se writable/signing.
- Lifetime pode ser blockhash ou durable nonce (avançado).
Checklist de mensagem
| Etapa | API |
|---|---|
| Versão | createTransactionMessage({ version: 0 }) |
| Fee payer | setTransactionMessageFeePayerSigner |
| Lifetime | setTransactionMessageLifetimeUsingBlockhash |
| Instruções | appendTransactionMessageInstruction(s) |
Erros comuns
- Blockhash obsoleto - confirmação falha após ~60-90s. Correção: busque novamente e reconstrua.
- Signer ausente na mensagem - erro de simulação. Correção: anexe todos os signers exigidos.
- Ordem de instruções - budget antes de ixs de programa. Correção: prepend compute budget.
- Mismatch de lista de contas - programa espera metas diferentes. Correção: use builders gerados.
- v0 sem ALT quando necessário - tx muito grande. Correção: veja Address Lookup Tables.
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| Builders Codama | Ixs de programa tipadas | Transferência system one-off |
| Helpers gill | Bootstrap mais rápido | Metas de conta customizadas |
CLI solana transfer | Envio manual de SOL | Integração em app |
FAQs
Funciona na devnet?
Sim - aponte RPC e carteira para o mesmo cluster.
Posso misturar kit e web3.js?
Evite em um módulo - migre por rota inteira.
E os wallet adapters?
Carteiras fornecem signers; kit constrói mensagens.
Como fixar @solana/kit?
Trave 7.0.0 no package.json e CI.
Onde estão priority fees?
Instruções compute budget antes do envio.
Como testar?
Surfpool 0.12.0 ou validador local com clones devnet.
Lamports ou SOL?
Sempre lamports bigint no código kit.
Qual commitment?
confirmed para UI; finalized para tesouraria.
Server components Next.js?
Leituras no servidor; assinatura em client components.
Depurar txs falhas?
Simule, leia logs, verifique owners de conta.
Relacionados
- Assinatura e envio - assinar e confirmar
- Address Lookup Tables - encolher txs v0
- Codecs e serialização - dados customizados
Versões da stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0 e LiteSVM 0.6.x.