Keypairs e signers
Signers abstraem quem pode assinar transações e mensagens no @solana/kit.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
import { generateKeyPairSigner, createKeyPairSignerFromBytes } from "@solana/kit";
const dev = await generateKeyPairSigner();
// ou carregue bytes JSON do solana-keygenQuando usar:
- Scripts de servidor que pagam taxas com arquivo keypair.
- Testes que precisam de signers determinísticos.
- Conectar wallet adapters em mensagens kit.
- Assinatura de mensagens para auth (off-chain).
Exemplo prático
import {
generateKeyPairSigner,
createTransactionMessage,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
createSolanaRpc,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const payer = await generateKeyPairSigner();
const recipient = await generateKeyPairSigner();
const { value: bh } = await rpc.getLatestBlockhash().send();
let msg = createTransactionMessage({ version: 0 });
msg = setTransactionMessageFeePayerSigner(payer, msg);
msg = setTransactionMessageLifetimeUsingBlockhash(bh, msg);
msg = appendTransactionMessageInstruction(
getTransferSolInstruction({ source: payer, destination: recipient.address, amount: 1_000n }),
msg
);
const signed = await signTransactionMessageWithSigners(msg);O que isso demonstra:
- Fee payer é um
Signer, não string de public key bruta. signTransactionMessageWithSignersresolve signers embutidos na mensagem.- Carteiras implementam a mesma interface de signer em runtime.
Mergulho profundo
Como funciona
- Keypairs Ed25519 mapeiam para
Address(public key base58). KeyPairSignermantém material secreto para scripts Node.- Carteiras browser expõem
TransactionSendingSignersem revelar segredos. - Caminhos de import
CryptoKeyexistem para integrações Web Crypto.
Tipos de signer
| Tipo | Segredo exposto | Fonte típica |
|---|---|---|
| Key pair | Sim (servidor) | Arquivo keypair JSON |
| Wallet | Não | Phantom, Solflare |
| No-op | N/A | Placeholder em builds parciais |
Notas TypeScript
// Nunca logue ou serialize bytes de chave secreta
const { address } = await generateKeyPairSigner();Erros comuns
- Fee payer apenas como string de endereço - mensagem não assina. Correção:
setTransactionMessageFeePayerSigner. - Commitar keypair JSON - risco de drenagem total da carteira. Correção: gitignore e secrets manager.
- Mesma chave no mainnet e devnet - gastos acidentais no mainnet. Correção: keypairs por cluster.
- Assumir wallet = fee payer - usuário pode rejeitar mismatch. Correção: alinhe pubkey conectada.
- Valores SOL float - perda de precisão. Correção: lamports bigint.
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| Signers Wallet Standard | dApps browser | Scripts CI headless |
| Hardware wallet | Chaves de alto valor | Iteração local rápida |
| Serviço KMS/HSM | Servidores produção | Apenas dev local |
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
- Construindo mensagens de transação - compor mensagens
- Assinatura e envio - broadcast
- Noções básicas de carteira - carteiras browser
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.