Primer Programa y dApp
Esta ruta guiada lleva a un nuevo miembro del equipo desde anchor init a un programa Anchor 0.32.1 desplegado en devnet, además de un cliente mínimo de @solana/kit 7.0.0 que lee y escribe el estado en la cadena. Se espera que tome de uno a dos días en Agave 4.1.1 devnet con Solana CLI 3.0.10.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
avm use 0.32.1
anchor init hello_counter
cd hello_counter
anchor build && anchor test
anchor deploy --provider.cluster devnet
# luego genera el cliente Next.js con @solana/kit@7.0.0Cuándo usar esto:
- Culminación de la incorporación de la semana 1.
- Prueba de la cadena de herramientas antes de unirse al monorepo compartido.
- Enseñanza del flujo full-stack en talleres.
- Plantilla para futuros kits de inicio internos.
Ejemplo de Trabajo
1. Programa (Anchor)
use anchor_lang::prelude::*;
declare_id!("<PROGRAM_ID_GENERADO>");
#[program]
pub mod hello_counter {
use super::*;
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
ctx.accounts.counter.count = 0;
Ok(())
}
pub fn increment(ctx: Context<Increment>) -> Result<()> {
ctx.accounts.counter.count = ctx.accounts.counter.count.checked_add(1).unwrap();
Ok(())
}
}
#[account]
pub struct Counter {
pub count: u64,
}
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(init, payer = user, space = 8 + 8)]
pub counter: Account<'info, Counter>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct Increment<'info> {
#[account(mut)]
pub counter: Account<'info, Counter>,
}anchor build
anchor test # usa LiteSVM o validator según Anchor.toml
anchor deploy --provider.cluster devnet
solana program show <PROGRAM_ID>2. Cliente (kit)
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const counter = address("<CLAVE_PÚBLICA_DE_CUENTA_CONTADOR>");
const info = await rpc.getAccountInfo(counter, { encoding: "base64" }).send();
console.log("longitud de datos de la cuenta:", info.value?.data.length);
// Integra la instrucción de incremento generada por Codama en el siguiente paso de incorporaciónLo que esto demuestra:
- Programa Anchor con instrucciones de inicialización y modificación.
- Cuenta exenta de alquiler con discriminador y carga útil
u64. - Despliegue en Devnet con ID de programa verificado por CLI.
- El cliente lee la existencia de la cuenta antes de la conexión del código.
Análisis Profundo
Hitos Guiados
| Paso | Salida | Verificación |
|---|---|---|
| Inicializar repositorio | Anchor.toml, programs/ | anchor build |
| Pruebas | Pruebas de Rust TS o LiteSVM | anchor test en verde |
| IDL | target/idl/*.json | Comprometido o generado en CI |
| Despliegue | ID de programa en Devnet | solana program show |
| Lectura del cliente | La UI/consola muestra la cuenta | RPC getAccountInfo |
| Escritura del cliente | La transacción de incremento aterriza | Éxito de la firma en el explorador |
Esquema de Arquitectura
Navegador (wallet) --firma--> tx de kit --> RPC de devnet --> Agave 4.1.1
^
|
Programa Anchor (.so)
Notas de Rust / TypeScript
# Generar cliente de kit a partir de IDL (configuración del equipo Codama)
npx codama run --config codama.json
# Mapear variables de entorno
NEXT_PUBLIC_PROGRAM_ID=...
NEXT_PUBLIC_RPC_URL=https://api.devnet.solana.comErrores Comunes
- Desplegar antes de que las pruebas pasen - desperdicia SOL de devnet y tiempo. Solución: Puerta de
anchor testen el script. - Desajuste del ID del programa -
declare_id!vs clave desplegada. Solución:anchor keys syncdespués deanchor deploy. - Deriva del clúster del cliente - UI en RPC de mainnet, programa en devnet. Solución: URL de RPC controlada por variables de entorno.
- Wallet no firmando el pagador de tarifas - errores de simulación. Solución: Conectar wallet antes del pipeline de envío.
- Omitir IDL en el repositorio - código del cliente obsoleto. Solución: Comprometer IDL o generación de código determinista en CI.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Plantilla create-solana-dapp | Scaffold de UI más rápido | Aprendiendo los detalles internos de Anchor |
| Cliente Python AnchorPy | Demostración solo de backend | Experiencia de usuario con wallet en navegador |
| Validador local solamente | Modo avión | Necesita enlaces para compartir en el explorador |
| Bifurcación de Surfpool | Dependencia del estado de Mainnet | Primer "hola mundo" |
Preguntas Frecuentes
¿Next.js o Vite?
Cualquiera de los dos; kit funciona en ambos; la plantilla del equipo elige el predeterminado.
¿Adaptador de Wallet?
Añadir después de que la lectura bruta de kit funcione; reduce las variables del Día 1.
¿Cuánto SOL?
Menos de 2 SOL de devnet para despliegue + alquiler de cuenta con airdrops.
¿Despliegue actualizable?
El predeterminado actualizable está bien en devnet; documentar al poseedor de la autoridad de actualización.
¿Pruebas TS?
Suite opcional de anchor test en TS o Bankrun después de que las pruebas de Rust pasen.
¿Demostración pública?
Compartir enlaces del explorador de devnet; nunca claves de mainnet en README.
¿Fusión al monorepo?
Portar el programa al espacio de trabajo compartido después de la revisión de culminación.
¿Alcance de seguridad?
No es seguro para producción; enfócate en la fluidez del flujo de trabajo, no en la economía.
¿CI?
Añadir GitHub Action ejecutando anchor build + pruebas de LiteSVM en PR.
¿Criterios de finalización?
Un compañero observa el incremento en vivo desde la UI y verifica el conteo en la cadena.
Relacionado
- Lista de Verificación de Incorporación de Desarrolladores - dónde encaja esto
- Lista de Verificación de Configuración del Entorno - prerrequisitos
- create-solana-dapp - plantilla completa
- Conceptos Básicos de @solana/kit - SDK del cliente
Versiones de Stack: Esta página fue 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, y LiteSVM 0.6.x.