Assinando Transações e Mensagens
Assine mensagens de transação e payloads de auth off-chain com wallets conectadas.
Receita
import { signTransactionMessageWithSigners } from "@solana/kit";
// wallet adapter provides TransactionSendingSigner compatible adapterQuando usar:
- Qualquer transação paga pelo usuário no browser.
- Mints NFT, swaps e ações de game.
- Sign-in com mensagens Solana.
Exemplo Funcional
"use client";
import { useWallet } from "@solana/wallet-adapter-react";
import {
createTransactionMessage,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
createSolanaRpc,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
export function useSendSol() {
const { publicKey, signTransaction } = useWallet();
const rpc = createSolanaRpc(process.env.NEXT_PUBLIC_RPC_URL!);
return async function send(recipient: string, lamports: bigint) {
if (!publicKey || !signTransaction) throw new Error("Wallet not connected");
const { value: bh } = await rpc.getLatestBlockhash().send();
// Wire wallet signer helper from your adapter bridge
let msg = createTransactionMessage({ version: 0 });
// ... append transfer ix, sign with wallet, send via rpc
};
}O que isso demonstra:
- Construa mensagem com kit; wallet fornece capacidade de assinatura.
- Fee payer deve corresponder à pubkey conectada.
- Simule antes do modal da wallet quando possível.
Aprofundamento
Como Funciona
- Wallets nunca expõem secret keys - assinam dentro da extensão.
- Partial signing suportado para fluxos multisig.
signMessageretorna assinatura ed25519 sobre bytes arbitrários.- TransactionSendingSigner faz bridge adapter para pipeline kit.
Erros Comuns
- Mismatch de fee payer - wallet rejeita. Correção: use endereço conectado como payer.
- Transações oversized - UI da wallet falha. Correção: ALTs e menos contas.
- Blind signing em hardware - risco de segurança. Correção: preview de transação verificado.
- Assumir signTransaction retorna tx confirmada - apenas assina; você ainda envia.
- Reusar blockhash após UX longa - expiração. Correção: reconstrua mensagem.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Tx patrocinada server | Onboarding gasless | Self-custody trustless |
| Mobile Wallet Adapter | React Native | Apenas extensão desktop |
FAQs
Devnet ou mainnet?
Corresponda RPC URL, rede da wallet e program IDs a um cluster.
kit vs web3.js?
Use @solana/kit 7.0.0 para código frontend novo.
Testes?
Surfpool 0.12.0 ou devnet com SOL de faucet.
Nível de commitment?
confirmed para UX; finalized para reads de alto valor.
Next.js App Router?
Providers em layout client; reads podem ser server-side.
Wallet rejeitou sign?
Mostre retry; nunca assuma aprovação.
Priority fees?
Instructions compute budget em mainnet congestionada.
Mobile?
Use Mobile Wallet Adapter para apps React Native.
Segurança?
Nunca exponha keypairs de servidor ao browser.
Mudanças de IDL?
Regenere clients tipados em CI.
Relacionado
- Assinatura Client-Side - padrões Next.js
- Assinando e Enviando - pipeline send kit
- Keypairs e Signers - modelo de signer
Versões do 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.