solana-program & solana-sdk
solana-program é a biblioteca padrão on-chain para programas Rust nativos que visam Agave 4.1.1 sBPF. solana-sdk (e crates de cliente divididos) alimentam binários Rust off-chain que constroem transações, assinam e se comunicam com RPC. Juntos, eles são a base sob o Anchor 0.32.1 e frameworks leves como Pinocchio.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
# On-chain (Cargo.toml)
[dependencies]
solana-program = "2.2"
# Cliente binário off-chain
[dependencies]
solana-sdk = "2.2"use solana_program::{
account_info::AccountInfo,
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
};Quando usar isto:
- Escrevendo programas on-chain nativos sem macros Anchor.
- Construindo CLIs Rust, bots ou harnesses de teste off-chain.
- Entendendo o que o Anchor expande nos bastidores.
- Auditando validação de conta de baixo nível e helpers de CPI.
Exemplo de Trabalho
// programs/native_counter/src/lib.rs (on-chain)
use solana_program::{
account_info::{next_account_info, AccountInfo},
entrypoint,
entrypoint::ProgramResult,
msg,
program_error::ProgramError,
pubkey::Pubkey,
};
entrypoint!(process_instruction);
pub fn process_instruction(
_program_id: &Pubkey,
accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
let iter = &mut accounts.iter();
let payer = next_account_info(iter)?;
if !payer.is_signer {
return Err(ProgramError::MissingRequiredSignature);
}
msg!("payer: {}", payer.key);
Ok(())
}// client/src/main.rs (off-chain)
use solana_sdk::{
signature::{Keypair, Signer},
system_instruction,
transaction::Transaction,
};
use solana_client::rpc_client::RpcClient;
fn main() {
let rpc = RpcClient::new("https://api.devnet.solana.com".to_string());
let payer = Keypair::new();
let ix = system_instruction::transfer(&payer.pubkey(), &payer.pubkey(), 1);
let bh = rpc.get_latest_blockhash().unwrap();
let tx = Transaction::new_signed_with_payer(&[ix], Some(&payer.pubkey()), &[&payer], bh);
let _sig = rpc.send_and_confirm_transaction(&tx).unwrap();
}O que isto demonstra:
- O ponto de entrada on-chain recebe contas e dados de instrução.
- Verificações de assinante são manuais em código nativo.
- O SDK off-chain compõe instruções do sistema e assina transações.
- O cliente RPC é separado (
solana-client), mas emparelha com tipossolana-sdk.
Mergulho Profundo
Como Funciona
solana-programé compatível comno_stdpara alvos sBPF viacargo build-sbf.solana-sdkvisa o std Rust completo para hosts que constroem e assinam transações.- Crates divididos nas linhas 2.x - importe apenas o que cada binário precisa para reduzir o tempo de compilação.
- Anchor
anchor-langreexporta e envolve muitos primitivos desolana-program.
Tabela de Crates Rust (on-chain vs off-chain)
| Crate | Alvo | Papel | Linha de versão típica |
|---|---|---|---|
solana-program | Programa sBPF | AccountInfo, CPI, sysvars, program_error | Alinhar com o pacote SDK Agave 4.1.1 |
solana-sdk | Binário host | Pubkey, Instruction, Transaction, Signer | Mesma versão principal que solana-program |
solana-client | Binário host | RpcClient, wrappers RPC finos | Corresponde à semântica RPC do validador |
solana-rpc-client-api | host | Tipos de requisição | Interno às pilhas de cliente |
Tabela TypeScript / NPM (paridade de cliente)
| Pacote | Papel | Pin (este site) |
|---|---|---|
@solana/kit | Pipeline RPC + tx funcional moderno | 7.0.0 |
@solana/web3.js | Cliente legado (fonte de migração) | Evitar novo uso de greenfield |
@solana/spl-token | Helpers SPL | Corresponder à revisão do programa de token |
Notas Rust
// Programas: evite crates apenas std em Cargo.toml
// Clientes: prefira solana_sdk::commitment_config::CommitmentConfig::confirmed()
// Importações de exemplo de CPI
use solana_program::program::invoke;Armadilhas
- Mistura de famílias de crates 1.x e 2.x - incompatibilidade de tipos entre workspaces. Correção: uma geração de SDK por repositório, alinhada com Agave 4.1.1.
stdem crates on-chain - quebracargo build-sbf. Correção: auditarcargo treepara dependências proibidas.- Usando
solana-sdkdentro de programas - puxa recursos incompatíveis. Correção: apenassolana-programon-chain. - Tipos de pubkey duplicados entre crates - churn de conversão. Correção: padronizar importações por binário.
- Assumindo que o Anchor esconde a validação - o código nativo deve impor proprietário/assinante manualmente.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
anchor-lang 0.32.1 | Velocidade do produto, IDL | Nativo com CU/tamanho mínimo |
pinocchio | Nativo leve | Precisa do ecossistema IDL do Anchor |
@solana/kit | dApps TypeScript | Backend apenas Rust |
solana-py / solders | Serviços Python | Caminho crítico de desempenho Rust |
FAQs
Qual versão corresponde ao Agave 4.1.1?
Siga as notas de lançamento do Agave e as versões dos crates do SDK solana-install 3.0.10 para esse canal.
O solana-sdk é obsoleto?
Dividido em crates mais finos ao longo do tempo - siga os guias de migração do Agave; os conceitos permanecem os mesmos.
Macro de ponto de entrada é necessária?
Sim para carregadores de implantação padrão; Pinocchio usa padrões de entrada alternativos.
Testando programas nativos?
LiteSVM 0.6.x ou Mollusk com tipos solana-sdk em testes.
Geração de IDL?
Programas nativos não possuem IDL do Anchor, a menos que você escreva manualmente ou use Shank.
Clientes entre linguagens?
Prefira Codama de IDL para @solana/kit 7.0.0 em vez de ports manuais.
Flags de recursos?
Mantenha o Cargo.toml do programa mínimo - cada recurso pode inchar o tamanho do ELF.
Builds verificáveis?
Os hashes de solana-verify devem corresponder ao .so implantado por esta toolchain.
Logging no_std?
msg! mapeia para logs de programa consumidos off-chain via RPC.
Onde está o sysvar do clock?
solana_program::sysvar::clock::Clock on-chain; helpers de sysvar do SDK off-chain.
Relacionados
- anchor-lang & anchor-spl - crates de framework
- Noções Básicas de Programas Nativos - padrões nativos
- Noções Básicas de Rust para Solana - introdução a Rust
- Noções Básicas de @solana/kit - pilha de cliente TS
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.