Keypairs e Endereços
A identidade na Solana é construída sobre keypairs Ed25519. A chave pública é o endereço da conta; a chave secreta autoriza transações. Entender papéis de assinatura previne bugs de autorização e vazamentos de chave.
Busque em todas as páginas da documentação
A identidade na Solana é construída sobre keypairs Ed25519. A chave pública é o endereço da conta; a chave secreta autoriza transações. Entender papéis de assinatura previne bugs de autorização e vazamentos de chave.
Cartão de receita de referência rápida - pronto para copiar.
solana-keygen new --outfile ./keypair.json --no-bip39-passphrase
solana-keygen pubkey ./keypair.jsonimport { createKeyPairSignerFromBytes, address } from "@solana/kit";
import { readFileSync } from "node:fs";
const secret = Uint8Array.from(JSON.parse(readFileSync("./keypair.json", "utf8")));
const signer = await createKeyPairSignerFromBytes(secret);
console.log(signer.address);Quando usar:
isSigner: trueimport {
createSolanaRpc,
createKeyPairSignerFromBytes,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
getSignatureFromTransaction,
pipe,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
import { readFileSync } from "node:fs";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
// Carregar signer do arquivo keypair
const secret = Uint8Array.from(
JSON.parse(readFileSync(process.env.HOME + "/.config/solana/id.json", "utf8")),
);
const feePayer = await createKeyPairSignerFromBytes(secret);
const recipient = await createKeyPairSignerFromBytes(
crypto.getRandomValues(new Uint8Array(64)),
);
const { value: blockhash } = await rpc.getLatestBlockhash().send();
const message = pipe(
createTransactionMessage({ version: 0 }),
(m) => setTransactionMessageFeePayer(feePayer.address, m),
(m) => setTransactionMessageLifetimeUsingBlockhash(blockhash, m),
(m) =>
appendTransactionMessageInstruction(
getTransferSolInstruction({
source: feePayer.address,
destination: recipient.address,
amount: 1_000_000n,
}),
m,
),
);
const signed = await signTransactionMessageWithSigners(message, [feePayer]);
const signature = getSignatureFromTransaction(signed);
console.log("Signature:", signature);O que isso demonstra:
createKeyPairSignerFromBytes envolve o keypair como signer KitisSigner e isWritable| Papel | Assina? | Conta Típica |
|---|---|---|
| Fee payer | Sim | Primeiro signatário; paga taxa de transação |
| Authority | Sim | Owner de lamports ou conta de token |
| Program | Não | Conta executável invocada pela instrução |
| PDA | Não (programa assina via seeds) | Endereço derivado sem chave privada |
use anchor_lang::prelude::*;
#[derive(Accounts)]
pub struct UpdateData<'info> {
#[account(mut, signer)]
pub authority: Signer<'info>,
#[account(mut, has_one = authority)]
pub data_account: Account<'info, MyData>,
}Signer<'info> verifica que a conta assinou a transaçãoinvoke_signed com seeds em vez de chave privada.gitignore, variáveis de ambiente ou hardware wallets em produção.isSigner ausente - transação rejeitada em runtime. Correção: marque toda conta signatária como signer nas instruções.find_program_address e deixe o programa assinar.solana-keygen ou helpers Kit, não fatiamento bruto de bytes.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
solana-keygen CLI | Carteiras dev rápidas | Gestão de chaves em produção |
| Hardware wallet (Ledger) | Assinatura mainnet | Assinatura automatizada servidor em alto throughput |
Signers @solana/kit | Montagem de transação TypeScript | Lógica de programa on-chain |
| PDAs com seeds | Contas controladas pelo programa | Carteiras de usuário |
Ed25519. Chaves públicas têm 32 bytes, codificadas em base58 para exibição.
Um array JSON de 64 bytes: seed secreto de 32 bytes concatenado com chave pública de 32 bytes.
Sim. Os termos são intercambiáveis - a chave pública Ed25519 de 32 bytes codificada em base58.
Não. Cada keypair válido mapeia para exatamente uma chave pública/endereço.
Endereço derivado de seeds e program ID. Não tem chave privada - o programa assina via invoke_signed.
Até 16 assinaturas por transação no formato atual. O fee payer é sempre um deles.
Não. Apenas a autoridade da conta de origem (e fee payer) deve assinar.
import { address } from "@solana/kit";
try {
address("invalid!");
} catch {
console.log("Invalid address");
}Não. A chave secreta não pode ser derivada da pública (função unidirecional).
11111111111111111111111111111111 - trata criação de conta e transferências SOL.
Não. Use keypairs de serviço dedicados com saldos mínimos financiados e controles de acesso rigorosos.
A chave privada nunca sai do dispositivo. O app envia a mensagem da transação; o dispositivo retorna a assinatura.
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.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026