Noções básicas do @solana/kit
9 exemplos para começar com @solana/kit - 6 básicos e 3 intermediários.
Pré-requisitos
Instale kit 7.0.0 e os helpers do system program:
npm install @solana/kit@7.0.0 @solana-program/systemDefina RPC_URL para um endpoint devnet (URL de provedor recomendada em vez de limites públicos de taxa).
Exemplos básicos
1. Criar um cliente RPC
JSON-RPC tipado com .send() em todo método.
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const slot = await rpc.getSlot().send();
console.log(slot);createSolanaRpcretorna cliente tree-shakable - importe apenas o que usar.- Toda chamada RPC termina com
.send()para I/O de rede explícita. - Troque a URL para mainnet-beta quando pretender SOL real.
Relacionado: RPC e subscriptions - subscriptions e provedores
2. Ler saldo de conta
Endereços são strings com brand - não arrays de bytes no código do app.
import { createSolanaRpc, address, lamports } from "@solana/kit";
const rpc = createSolanaRpc(process.env.RPC_URL!);
const owner = address("YOUR_WALLET_PUBKEY");
const { value } = await rpc.getBalance(owner).send();
console.log(Number(value) / 1e9);address()valida base58 e retornaAddresstipado.- Saldos retornam
Lamports(bigint) - converta com cuidado para exibição. - Faça cache de leituras na UI; estado da chain muda a cada slot.
Relacionado: RPC e subscriptions - HTTP vs WebSocket
3. Gerar um signer de keypair
Scripts de servidor e testes usam signers explícitos.
import { generateKeyPairSigner } from "@solana/kit";
const signer = await generateKeyPairSigner();
console.log(signer.address);generateKeyPairSignercria chave Ed25519 utilizável em mensagens de transação.- Apps de browser devem preferir signers de carteira, não chaves secretas embutidas.
- Persista segredos com chmod 600 e nunca commite no git.
Relacionado: Keypairs e signers - CryptoKey e import de arquivo
4. Carregar keypair de JSON
Combine com formato de array do solana-keygen.
import { createKeyPairSignerFromBytes } from "@solana/kit";
import { readFileSync } from "node:fs";
const secret = Uint8Array.from(
JSON.parse(readFileSync("./dev-wallet.json", "utf8"))
);
const signer = await createKeyPairSignerFromBytes(secret);- O arquivo JSON é um array de chave secreta de 64 bytes.
- Use keypairs separados por cluster (devnet vs mainnet).
- No CI, carregue de secrets de ambiente - não arquivos do repo.
Relacionado: Keypairs e signers - traits de signer
5. Buscar blockhash mais recente
Blockhashes expiram - atualize por lote de transação.
const { value: blockhash } = await rpc.getLatestBlockhash().send();
console.log(blockhash.blockhash, blockhash.lastValidBlockHeight);- Lifetime ligado a
lastValidBlockHeight- hashes obsoletos falham na confirmação. - Busque uma vez por gesto do usuário, não uma vez por carregamento de página.
- Combine com lógica de retry em erros de blockhash expirado.
Relacionado: Construindo mensagens de transação - lifetimes
6. Construir mensagem versão 0
pipe funcional compõe transformações imutáveis de mensagem.
import {
createTransactionMessage,
pipe,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
const message = pipe(
createTransactionMessage({ version: 0 }),
(m) => setTransactionMessageFeePayerSigner(signer, m),
(m) => setTransactionMessageLifetimeUsingBlockhash(blockhash, m),
(m) =>
appendTransactionMessageInstruction(
getTransferSolInstruction({
source: signer,
destination: recipient,
amount: 10_000_000n,
}),
m
)
);- Mensagens versão 0 suportam address lookup tables.
- Instruções vêm de pacotes
@solana-program/*, não program IDs string. - Valores são lamports
bigint.
Relacionado: Construindo mensagens de transação - pipeline completo
Exemplos intermediários
7. Assinar e enviar
Signers são resolvidos da mensagem, depois RPC submete a transação wire.
import {
signTransactionMessageWithSigners,
getSignatureFromTransaction,
sendAndConfirmTransactionFactory,
} from "@solana/kit";
const signed = await signTransactionMessageWithSigners(message);
const signature = getSignatureFromTransaction(signed);
const sendAndConfirm = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
await sendAndConfirm(signed, { commitment: "confirmed" });signTransactionMessageWithSignerscoleta signers exigidos da mensagem.- Use subscriptions WebSocket para confirmação quando disponível.
- Logue assinaturas para tickets de suporte e links do explorer.
Relacionado: Assinatura e envio - estratégias de confirmação
8. Assinar mudanças de conta
Atualizações push superam polling para UIs de carteira.
import { createSolanaRpcSubscriptions, address } from "@solana/kit";
const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.devnet.solana.com");
const abort = new AbortController();
const notifications = await rpcSubscriptions
.accountNotifications(address("YOUR_ACCOUNT"), { commitment: "confirmed" })
.subscribe({ abortSignal: abort.signal });
for await (const n of notifications) {
console.log(n.value.lamports);
}- Sempre aborte subscriptions no unmount.
- Use endpoints
wss://- URLs HTTP falham para subscriptions. - Tiers de provedor diferem em limites de subscription.
Relacionado: RPC e subscriptions - tipos de subscription
9. Codificar dados de conta com codecs
Codecs do kit substituem layouts Buffer manuais.
import {
getU32Encoder,
getU32Decoder,
getStructEncoder,
getStructDecoder,
} from "@solana/kit";
const layout = getStructEncoder([["count", getU32Encoder()]]);
const bytes = layout.encode({ count: 42 });
const decoded = getStructDecoder([["count", getU32Decoder()]]).decode(bytes);- Encoders e decoders são separados para tree-shaking.
- Combine com layouts gerados pelo Codama para contas de programa.
- Prefira codecs gerados em vez de offsets IDL copiados.
Relacionado: Codecs e serialização - layouts avançados
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.