Este artículo fue generado por IA. Por favor, verifica la información importante de forma independiente.

Guía del Solana Anchor Framework

Crypto Wiki|Oct 8, 2026|★★★★★★4.5 (500 valoraciones)
Resumen de IA

Learn to build Solana programs with Anchor Framework. Complete guide covering setup, core concepts, security, testing and deployment to devnet.

El Solana Anchor Framework ayuda a los desarrolladores a construir programas con validación estructurada de cuentas, definiciones de instrucciones, interfaces generadas y comprobaciones de seguridad reutilizables.

Nota sobre la versión: Las versiones de Anchor, Rust, Solana CLI y el cliente de JavaScript cambian de forma independiente. Verifique la compatibilidad actual en la documentación oficial de Anchor antes de realizar la instalación o el despliegue.

Este artículo es solo para fines educativos y no constituye asesoramiento financiero ni de inversión. Las inversiones en criptomonedas conllevan un riesgo significativo. Realice siempre su propia investigación antes de tomar decisiones de inversión.

📌 NOTA: Esta guía utiliza Anchor v0.29.x y Solana CLI v1.18.x+, vigentes a partir de 2024. El Anchor Framework evoluciona rápidamente. Ejecute anchor --version para verificar su versión instalada antes de seguir estas instrucciones.


Índice de contenidos

  1. ¿Qué es el Solana Anchor Framework?
  2. El modelo de cuentas de Solana
  3. Componentes principales del Solana Anchor Framework
  4. Requisitos previos
  5. Cómo instalar el Anchor Framework
  6. Construir y desplegar su primer programa Anchor
  7. Probar programas Anchor
  8. Anchor frente a alternativas
  9. Seguridad en Anchor Framework
  10. Solución de errores comunes de Anchor
  11. El Anchor Framework y el ecosistema de desarrolladores de Solana
  12. Preguntas frecuentes
  13. Conclusión

¿Qué es el Solana Anchor Framework?

El Solana Anchor Framework es un marco de desarrollo de código abierto que elimina el código repetitivo y la complejidad de la validación de cuentas al escribir programas de Solana (el equivalente on-chain de los contratos inteligentes) en Rust puro.

Solana es una blockchain de capa 1 de alto rendimiento que procesa aproximadamente 65.000 transacciones por segundo en condiciones óptimas (a partir de 2024), con una finalidad de menos de un segundo y comisiones que suelen ser inferiores a 0,001 $. Solana logra este rendimiento en parte gracias a un mecanismo de consenso único llamado Proof of History (PoH), que crea un reloj criptográfico que ordena las transacciones sin la sobrecarga de comunicación de los protocolos de consenso tradicionales.

Construir en Solana sin un marco de trabajo significa escribir código Rust de bajo nivel y muy extenso para cada programa. Los desarrolladores deben validar manualmente la propiedad de la cuenta, serializar datos, gestionar errores y administrar las relaciones entre cuentas para cada transacción. Para los ingenieros que provienen de back-ends Web2 o del desarrollo en Ethereum, esta barrera de aprendizaje es lo suficientemente alta como para detener la mayoría de los proyectos antes de que comiencen.

Anchor cambia eso. Piense en Anchor como el Ruby on Rails del desarrollo en Solana: un marco de trabajo con criterios definidos que se encarga de la fontanería interna para que usted pueda centrarse en la lógica de su programa en lugar de en la infraestructura subyacente. Anchor fue creado por Armani Ferrante y es mantenido por Coral XYZ. Puede encontrar el código fuente y las versiones en el repositorio de GitHub de Anchor (coral-xyz/anchor).. La versión estable actual es la v0.29.x.

Anchor permite a los desarrolladores crear aplicaciones descentralizadas (dApps). Una dApp es una aplicación cuya lógica de back-end se ejecuta en una blockchain a través de programas de Solana en lugar de en un servidor centralizado. El programa es el back-end de la dApp; el cliente de TypeScript que genera Anchor es la forma en que su front-end lo invoca. Las categorías de dApps creadas con Anchor incluyen protocolos de finanzas descentralizadas (DeFi), plataformas de tókenes no fungibles (NFT), organizaciones autónomas descentralizadas (DAO) y juegos Web3.

Al final de esta guía, comprenderá la arquitectura principal de Anchor, tendrá un entorno de desarrollo operativo, habrá desplegado un programa en la devnet de Solana (una red de pruebas con SOL gratuito y sin valor) y tendrá suficiente contexto para evaluar si Anchor se adapta a su proyecto. Para una mirada directa sobre cómo se compara Anchor con las herramientas de Ethereum y el desarrollo nativo en Rust, consulte cómo se compara Anchor con Hardhat de Ethereum y el desarrollo nativo en Rust.

Qué aprenderá:

  • Qué es Solana y por qué su arquitectura hace que Anchor sea necesario
  • Qué hacen el IDL, las macros y las PDA, y cómo se invocan los programas entre sí
  • Cómo instalar el entorno completo de desarrollo de Anchor
  • Cómo escribir y desplegar su primer programa Anchor
  • Vulnerabilidades de seguridad que debe evitar antes de lanzar a la mainnet
  • Cómo solucionar los errores más comunes de Anchor

El modelo de cuentas de Solana: la base que necesita entender primero

El modelo de cuentas de Solana es la base arquitectónica que hace que Anchor sea necesario. Es genuinamente diferente de cualquier cosa que encuentre en el desarrollo de Ethereum o Web2. Antes de que las abstracciones de Anchor tengan sentido, necesita entender el problema que resuelven.

Qué es Solana

Solana es una red blockchain de capa 1 diseñada para un alto rendimiento y bajos costes de transacción. A diferencia de Ethereum, que procesa aproximadamente de 15 a 30 transacciones por segundo en la mainnet, Solana procesa aproximadamente 65.000 transacciones por segundo en condiciones óptimas (a partir de 2024). Las comisiones de transacción suelen ser inferiores a 0,001 $. Esta combinación de velocidad y coste hace que Solana sea ideal para aplicaciones que requieren muchas transacciones pequeñas y frecuentes: sistemas de trading de DeFi, plataformas de acuñación de NFT y juegos on-chain.

SOL es el token nativo de Solana. Se utiliza para pagar las comisiones de transacción y el alquiler que las cuentas on-chain deben mantener para seguir activas en la red. Cada programa que despliegue y cada cuenta que cree su programa requiere SOL para existir on-chain. En devnet (la red de pruebas gratuita de Solana), puede obtener repartos de SOL sin coste alguno.

Las ventajas de velocidad existen debido a decisiones arquitectónicas que hacen que el desarrollo en Solana sea más difícil que en Ethereum a nivel básico. Anchor aborda precisamente esas partes difíciles.

Cómo almacena Solana los programas y los datos

En Solana, las "cuentas" no son cuentas de usuario o cuentas de monedero en el sentido cotidiano. Las cuentas son unidades de almacenamiento en la blockchain: contenedores distintos que pueden albergar datos, un balance de SOL o código de programa ejecutable.

La distinción arquitectónica principal: en Solana, los programas (código ejecutable) y los datos (estado) residen en cuentas separadas. Los programas son apátridas (stateless). Una cuenta de programa contiene solo el bytecode compilado. Los datos residen en cuentas de datos separadas que los programas leen y escriben.

En Ethereum, un contrato inteligente es como un apartamento independiente: el código y el mobiliario viven en el mismo espacio. En Solana, un programa se parece más a una empresa con departamentos separados: la lógica ejecutable vive en una cuenta, y los datos que lee y escribe viven en cuentas totalmente diferentes.

AtributoContrato inteligente de EthereumPrograma + Cuenta de Solana
Almacenamiento de códigoDentro del contratoCuenta de programa independiente
Almacenamiento de estadoDentro del contratoCuenta(s) de datos independiente(s)
¿El desarrollador gestiona las cuentas?NoSí (Anchor automatiza esto)
LenguajeSolidityRust (vía Anchor)
¿Tiene estado?SíLos programas no tienen estado; el estado reside en las cuentas

Cada cuenta de Solana tiene tres propiedades: un propietario (un programa que la controla), una dirección de clave pública (su identificador en la cadena) y un saldo de lamports (la unidad más pequeña de SOL, donde 1 SOL equivale a 1.000 millones de lamports). Las cuentas de datos también contienen datos de programa serializados.

La consecuencia práctica: cuando invocas un programa de Solana, debes pasar explícitamente cada cuenta que el programa leerá o escribirá. Debes demostrar la propiedad. Debes declarar qué cuentas son mutables. Debes verificar qué cuentas son firmantes. En Rust puro, esta gestión de cuentas requiere cientos de líneas de código de validación por programa.

Esta gestión explícita de cuentas es precisamente el problema que el sistema de restricciones de Anchor está diseñado para resolver.


Componentes principales del marco de trabajo Anchor de Solana: IDL, Macros, PDA y CPI

Anchor proporciona cuatro mecanismos interconectados que, en conjunto, eliminan la mayor parte de la complejidad del desarrollo nativo en Solana. Comprender cada uno en secuencia es el requisito previo para escribir tu primer programa.

El IDL (Lenguaje de Definición de Interfaz): El contrato de comunicación de Anchor

Anchor genera automáticamente un archivo JSON llamado Lenguaje de Definición de Interfaz (IDL) cada vez que ejecutas anchor build. Piénsalo como una especificación OpenAPI para tu programa en la cadena: una descripción legible por máquina de cada instrucción que acepta tu programa, cada cuenta que esas instrucciones requieren y cada tipo de datos involucrado.

El IDL es para Anchor lo que una ABI (Interfaz Binaria de Aplicación) es para un contrato de Solidity en Ethereum. Si has desarrollado en Ethereum, ya sabes cómo las ABI permiten que el código del front-end llame a las funciones del contrato con seguridad de tipos. El IDL de Anchor hace lo mismo para los programas de Solana y se genera automáticamente a partir de tu código en Rust. Nunca lo escribes a mano.

El archivo IDL se deposita en target/idl/nombre_de_tu_programa.json tras ejecutar anchor build. Junto a él, Anchor genera target/types/nombre_de_tu_programa.ts, un archivo de tipos de TypeScript que tus scripts de front-end o de prueba importan para obtener acceso totalmente tipado a las instrucciones de tu programa.

Un IDL abreviado tiene este aspecto:

{
  "version": "0.1.0",
  "name": "balance_tracker",
  "instructions": [
    {
      "name": "initialize",
      "accounts": [
        { "name": "balanceAccount", "isMut": true, "isSigner": false },
        { "name": "user",           "isMut": true, "isSigner": true  },
        { "name": "systemProgram",  "isMut": false, "isSigner": false }
      ],
      "args": []
    },
    {
      "name": "deposit",
      "accounts": [
        { "name": "balanceAccount", "isMut": true, "isSigner": false },
        { "name": "user",           "isMut": false, "isSigner": true }
      ],
      "args": [{ "name": "amount", "type": "u64" }]
    }
  ]
}

El cliente de TypeScript lee este IDL y te ofrece llamadas a métodos totalmente tipadas (program.methods.initialize() y program.methods.deposit(amount)) sin necesidad de escribir interfaces manualmente. Tus habilidades en TypeScript son directamente aplicables aquí.

Macros de Anchor: Cómo Anchor elimina el código repetitivo

Anchor proporciona un conjunto de macros de Rust, que son generadores de código que escriben lógica de validación repetitiva por ti. Una macro en Rust es una anotación que se expande en código en tiempo de compilación. Las macros de Anchor generan el código de validación de cuentas, serialización y manejo de errores que, de otro modo, tendrías que escribir a mano.

Tres macros forman el núcleo de todo programa de Anchor:

#[program] marca el módulo que contiene las funciones de manejo de tus instrucciones. Anchor trata cada función pública en este módulo como una instrucción invocable.

#[derive(Accounts)] genera código de validación de cuentas a partir de la definición de una estructura de Rust. Declaras qué cuentas necesita una instrucción y Anchor genera automáticamente el código para verificar la propiedad y la mutabilidad, además del tipo de cada cuenta.

#[account] marca una estructura como un tipo de datos de cuenta gestionado por Anchor y añade el discriminador de 8 bytes que permite a Anchor distinguir tu tipo de cuenta de otros.

Así es como se ven estas macros en contexto:

#[derive(Accounts)]
pub struct Initialize<'info> {
    #[account(
        init,           // Anchor crea esta cuenta (valida que no exista)
        payer = user,   // La cuenta 'user' financia el depósito de exención de renta
        space = 8 + 8   // Discriminador de 8 bytes + 8 bytes para el campo total u64
    )]
    pub balance_account: Account<'info, BalanceAccount>,

    #[account(mut)]          // Declara que el saldo de lamports de esta cuenta cambiará
    pub user: Signer<'info>, // Tipo Signer: Anchor verifica que esta cuenta firmó la tx

    pub system_program: Program<'info, System>,
}

Restricciones de cuenta: Cómo Anchor valida cuentas automáticamente

Cada atributo dentro de #[account(...)] es una restricción de Anchor. Las restricciones son reglas de validación que se ejecutan automáticamente antes de que se ejecute la lógica de tu instrucción. Son la razón principal por la que los programas de Anchor requieren mucho menos código de validación manual que los programas de Rust puro.

Las restricciones más comunes son:

#[derive(Accounts)]
pub struct ExampleAccounts<'info> {
    #[account(init, payer = user, space = 8 + 8)]
    // init: crea la cuenta; revierte si ya existe
    pub new_account: Account<'info, MyData>,

    #[account(mut)]
    // mut: declara que los datos o el saldo de lamports de esta cuenta cambiarán
    pub existing_account: Account<'info, MyData>,

    #[account(seeds = [b"vault", user.key().as_ref()], bump)]
    // seeds + bump: deriva una dirección PDA y verifica el bump canónico
    pub pda_account: Account<'info, VaultData>,

    #[account(constraint = user_account.authority == user.key())]
    // constraint: evalúa una expresión booleana; falla si es falsa
    pub user_account: Account<'info, UserData>,

    pub user: Signer<'info>,
    // Signer: verifica que la cuenta firmó la transacción
}

Sin restricciones, tendrías que escribir cada una de estas comprobaciones a mano en el cuerpo de tu instrucción. Con las restricciones, Anchor las aplica antes de que se ejecute la lógica de tu instrucción. Esto supone tanto una ganancia de productividad como una característica de seguridad, porque las restricciones son más difíciles de olvidar que las comprobaciones manuales enterradas en el código de la instrucción.

Direcciones derivadas del programa (PDA): Almacenamiento determinista de On-Chain

Una dirección derivada del programa (PDA) es uno de los conceptos más complejos en el desarrollo de Solana. Prepárate para leer esta sección dos veces. Las PDA desbloquean uno de los patrones más potentes de Solana, y Anchor hace que sean mucho más manejables que en Rust puro.

Una PDA es una dirección de cuenta derivada determinísticamente a partir de un conjunto de semillas (seeds) y un ID de programa. A diferencia de una dirección de billetera normal, una PDA no tiene una clave privada correspondiente. Ningún usuario individual puede firmar por una PDA. Solo el programa propietario puede autorizar transacciones que la involucren.

Piensa en una PDA como una caja de seguridad que solo el banco (el programa) puede abrir. Ningún cliente tiene la llave; el banco controla el acceso mediante programación. Esto hace que las PDA sean ideales para bóvedas controladas por programas, cuentas de depósito en garantía (escrow) y almacenamiento específico del usuario donde el programa, y no el usuario, debe tener la autoridad.

En Rust puro, derivar una PDA requiere llamar a Pubkey::find_program_address(&seeds, &program_id) y verificar manualmente el resultado. Anchor gestiona esto con la restricción seeds:

#[derive(Accounts)]
pub struct CreateVault<'info> {
    #[account(
        init,
        payer = authority,
        space = 8 + 32,
        seeds = [b"vault", authority.key().as_ref()], // Las semillas determinan la dirección PDA
        bump                 // Anchor encuentra y almacena la semilla bump canónica
    )]
    pub vault: Account<'info, Vault>,   // Cuenta PDA, sin clave privada

    #[account(mut)]
    pub authority: Signer<'info>,

    pub system_program: Program<'info, System>,
}

La restricción seeds le indica a Anchor cómo derivar la dirección PDA. El campo bump almacena el seed de salto canónico, un número entero pequeño que garantiza que la dirección derivada quede fuera de la curva elíptica y no tenga ninguna Clave privada. En Anchor v0.29.x, el salto canónico se deriva y verifica automáticamente.

Las PDA son deterministas: dadas las mismas semillas y el mismo ID del programa, siempre producen la misma dirección. Esta propiedad permite a los clientes calcular la dirección PDA Off-Chain para recuperar datos, mientras que el programa controla el acceso de escritura.

Invocación entre programas (CPI): Cómo se comunican los programas entre sí

La Invocación entre programas (CPI) es el mecanismo de Solana para que un programa llame a las instrucciones de otro. Es el equivalente On-Chain de llamar a una función de una biblioteca compartida. La CPI permite la componibilidad: tu protocolo DeFi puede llamar al programa SPL Token para transferir tokens, tu contrato de gobernanza puede llamar a un programa de staking, y así sucesivamente.

La Solana Program Library (SPL) es el equivalente en Solana a una biblioteca estándar para programas On-Chain. SPL Token es para Solana lo que ERC-20 es para Ethereum, pero implementado como un programa On-Chain compartido en lugar de una plantilla de contrato que cada proyecto despliega de forma independiente. Cuando tu programa Anchor necesita acuñar o transferir tokens, llama a SPL Token a través de una CPI.

Anchor simplifica las llamadas CPI con el crate anchor-spl y CpiContext:

use anchor_spl::token::{self, Transfer, Token};

pub fn withdraw(ctx: Context<Withdraw>, amount: u64) -> Result<()> {
    let cpi_accounts = Transfer {
        from: ctx.accounts.vault_token_account.to_account_info(), // Cuenta de token de origen
        to: ctx.accounts.user_token_account.to_account_info(),   // Cuenta de token de destino
        authority: ctx.accounts.vault.to_account_info(),         // La PDA firma por la bóveda (vault)
    };
    let cpi_ctx = CpiContext::new(ctx.accounts.token_program.to_account_info(), cpi_accounts);
    token::transfer(cpi_ctx, amount)?;  // Llama a la instrucción de transferencia de SPL Token
    Ok(())
}

Sin Anchor, reunir la información de las cuentas, construir la instrucción y llamar a invoke_signed requiere aproximadamente 30 líneas. Los ayudantes de CPI de Anchor reducen esto a una llamada a función tipada y legible.

Pondrás en práctica estos conceptos en el tutorial paso a paso del programa.


Requisitos previos: Lo que necesitas antes de instalar el Framework Anchor

Se requieren cuatro herramientas antes de poder construir con el Framework Anchor en Solana.

Herramientas requeridas:

  1. Rust y Cargo (vía rustup), se recomienda la versión 1.70.0 o posterior
  2. Solana CLI (v1.18.x o posterior), la herramienta de línea de comandos oficial para interactuar con la red Solana; gestiona la administración de carteras, solicitudes de Airdrop y configuración de clústeres
  3. Node.js (v18 o posterior) más Yarn o npm, necesarios para el cliente TypeScript y las pruebas de Anchor
  4. Anchor Version Manager (avm), que instala y gestiona las versiones de Anchor CLI; instala siempre Anchor a través de avm en lugar de hacerlo directamente vía Cargo

Sobre Rust: Los programas de Anchor se escriben en Rust. Rust es obligatorio. No hay forma de evitarlo. Dicho esto, las macros de Anchor abstraen los patrones de Rust más pesados: la validación y serialización de cuentas, además de la propagación de errores. No necesitas un dominio profundo de Rust para construir tu primer programa.

Lo que necesitas para empezar: estructuras (structs), funciones, propiedad (ownership) básica y límites de rasgos (trait bounds) a nivel superficial. Lo que puedes posponer para más adelante: tiempos de vida (lifetimes), Rust asíncrono y los detalles del comprobador de préstamos (borrow checker). Tus habilidades en TypeScript o JavaScript se aplican directamente al código del lado del cliente de Anchor. Las pruebas, las interacciones front-end y las llamadas al cliente generadas por IDL utilizan TypeScript. No necesitas ser un experto en Rust para construir con Anchor, del mismo modo que no necesitas ser un experto en Ruby para construir con Ruby on Rails. Pero te encontrarás con Rust, y una familiaridad básica ayuda.

Si te interesa la abstracción de los patrones de Rust que hace Anchor, la sección de componentes principales explica en detalle lo que Anchor abstrae de Rust.

Sobre Solana CLI frente a Anchor CLI: Estas son dos herramientas independientes con responsabilidades diferentes. La CLI de solana gestiona la interacción con la red: consultar saldos, solicitar airdrops y cambiar entre devnet y Mainnet. La CLI de anchor gestiona el ciclo de vida de tu programa: inicializar proyectos, compilar programas, ejecutar pruebas y desplegar. Ambas son necesarias.


Cómo instalar el Framework Anchor: Configuración paso a paso

📌 NOTA: Todos los comandos a continuación están validados para Anchor v0.29.x y Solana CLI v1.18.x a partir de 2024. Ejecuta anchor --version después de la instalación para confirmar tu versión. Si lees esto después de su publicación, verifica la versión actual en el repositorio de GitHub de Anchor (coral-xyz/anchor).

Paso 1: Instala Rust a través de rustup

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Sigue las instrucciones en pantalla y selecciona la instalación predeterminada
source "$HOME/.cargo/env"
rustc --version
# Debería imprimir: rustc 1.70.0 o posterior

Paso 2: Instala la Solana CLI

sh -c "$(curl -sSfL https://release.solana.com/stable/install)"
# Sigue las instrucciones de PATH de la salida del instalador
solana --version
# Debería imprimir: solana-cli 1.18.x o posterior

Cuando despliegas un programa Anchor en Solana, se almacena On-Chain y lo ejecutan los nodos validadores de la red cada vez que una transacción lo invoca. La Solana CLI es la forma en que interactúas con esos validadores desde tu terminal.

Paso 3: Configura Solana CLI para devnet y crea una cartera

solana config set --url devnet
solana-keygen new
# Crea un archivo de par de claves local (tu cartera de desarrollo)
# Guarda la ruta de salida. Anchor usa este par de claves para firmar los despliegues

💡 SUGERENCIA: Guarda la ruta del archivo de tu par de claves. Anchor lee este par de claves de tu configuración Anchor.toml para firmar las transacciones de despliegue en devnet.

Paso 4: Solicita un Airdrop de SOL en devnet

solana airdrop 2
solana balance
# Confirma que el saldo muestra 2 SOL

Paso 5: Instala avm (Anchor Version Manager) y Anchor

cargo install --git https://github.com/coral-xyz/avm avm --locked --force
avm install latest
avm use latest
anchor --version
# Debería imprimir: anchor-cli 0.29.x

📌 NOTA: Instala siempre Anchor a través de avm en lugar de hacerlo directamente mediante cargo install anchor-cli. avm te permite cambiar entre versiones de Anchor sin tener que reinstalar. Esto es importante cuando los proyectos están anclados a una versión específica o cuando estás actualizando un proyecto existente.

Paso 6: Inicializa tu primer proyecto

anchor init mi-primer-programa
cd mi-primer-programa

La estructura de tu proyecto después de anchor init:

mi-primer-programa/
├── Anchor.toml
├── programs/
│   └── mi-primer-programa/
│       └── src/
│           └── lib.rs
├── tests/
│   └── mi-primer-programa.ts
└── app/

💡 SUGERENCIA: El comando anchor init crea una estructura de programa de ejemplo funcional en lib.rs. Ejecuta anchor test inmediatamente para confirmar que tu entorno funciona antes de escribir tu propio código.


Construcción y despliegue de tu primer programa Anchor: Una guía completa

Esta sección te lleva desde un proyecto vacío hasta un programa desplegado en la devnet de Solana. El ejemplo es un rastreador de saldo: un programa que inicializa un saldo almacenado a cero y luego acepta instrucciones de Depósitos para incrementarlo. Esto demuestra el ciclo de vida completo de la cuenta y es funcionalmente idéntico a un programa contador pero utiliza nombres de variables originales.

Escribiendo el programa rastreador de Balance

Tu archivo programs/mi-primer-programa/src/lib.rs ya contiene una estructura de anchor init. Sustituye su contenido por lo siguiente:

// Programa rastreador de Balance en Anchor v0.29.x
use anchor_lang::prelude::*;

declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkgHH5WfZCnQ");

#[program]
pub mod balance_tracker {
    use super::*;

    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
        ctx.accounts.balance_account.total = 0;  // El saldo inicial es cero
        Ok(())
    }

    pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
        ctx.accounts.balance_account.total += amount;  // Incrementa el saldo almacenado
        Ok(())
    }
}

#[derive(Accounts)]
pub struct Initialize<'info> {
    #[account(
        init,
        payer = user,
        space = 8 + 8   // Discriminador de Anchor de 8 bytes + 8 bytes para u64
    )]
    pub balance_account: Account<'info, BalanceAccount>,

    #[account(mut)]
    pub user: Signer<'info>,

    pub system_program: Program<'info, System>,
}

#[derive(Accounts)]
pub struct Deposit<'info> {
    #[account(mut)]
    pub balance_account: Account<'info, BalanceAccount>,
    pub user: Signer<'info>,
}

#[account]
pub struct BalanceAccount {
    pub total: u64,
}

Tres patrones en este código son importantes antes de continuar. Primero, #[derive(Accounts)] genera la lógica de validación de cuentas por completo. Anchor lee la definición de tu estructura y escribe las comprobaciones de propiedad, mutabilidad y verificación del firmante. Tú declaras la intención; Anchor la hace cumplir. Segundo, space = 8 + 8 asigna exactamente los bytes que la cuenta necesita: 8 bytes para el discriminador de Anchor (una etiqueta única que identifica el tipo de cuenta y evita ataques de confusión de cuentas) más 8 bytes para el total u64. Tercero, Signer<'info> es el tipo incorporado de Anchor que verifica que la cuenta firmó la transacción. Sin él, cualquier cuenta podría llamar a tu instrucción de depósito.

Probando tu programa con Mocha y TypeScript

Mocha es un ejecutor de pruebas de JavaScript; Chai proporciona la sintaxis de aserción. Ambos están preinstalados al ejecutar anchor init. Abre tests/my-first-program.ts y reemplaza su contenido:

import * as anchor from "@coral-xyz/anchor";
import { Program } from "@coral-xyz/anchor";
import { MyFirstProgram } from "../target/types/my_first_program";
import { assert } from "chai";

describe("balance-tracker", () => {
  const provider = anchor.AnchorProvider.env();
  anchor.setProvider(provider);

  const program = anchor.workspace.MyFirstProgram as Program<MyFirstProgram>;
  const balanceAccount = anchor.web3.Keypair.generate();

  it("Initializes a balance account with total = 0", async () => {
    await program.methods
      .initialize()
      .accounts({
        balanceAccount: balanceAccount.publicKey,
        user: provider.wallet.publicKey,
        systemProgram: anchor.web3.SystemProgram.programId,
      })
      .signers([balanceAccount])
      .rpc();

    const account = await program.account.balanceAccount.fetch(
      balanceAccount.publicKey
    );
    assert.equal(account.total.toNumber(), 0, "Initial balance should be 0");
  });

  it("Deposits 500 and updates the stored balance", async () => {
    await program.methods
      .deposit(new anchor.BN(500))
      .accounts({
        balanceAccount: balanceAccount.publicKey,
        user: provider.wallet.publicKey,
      })
      .rpc();

    const account = await program.account.balanceAccount.fetch(
      balanceAccount.publicKey
    );
    assert.equal(account.total.toNumber(), 500, "Balance debe ser 500 después del depósito");
  });
});

El paquete npm @coral-xyz/anchor es la biblioteca de cliente de TypeScript de Anchor. El tipo Program<MyFirstProgram> se generó automáticamente a partir del IDL cuando se ejecutó anchor build. Este es el valor práctico del IDL en acción: tu código TypeScript obtiene seguridad de tipos completa sobre la interfaz de tu programa Rust sin necesidad de escribir interfaces manualmente.

Este programa es también el back-end de una dApp. El cliente TypeScript mostrado arriba es cómo una aplicación front-end lo llamaría. Añade una IU de React o Next.js sobre estas llamadas a métodos y tendrás una aplicación descentralizada completa ejecutándose en Solana.

Compilar y Desplegar en Devnet

Ejecuta estos tres comandos en secuencia desde la raíz de tu proyecto:

anchor build
# Resultados: target/deploy/my_first_program.so, target/idl/my_first_program.json, target/types/my_first_program.ts
anchor test
# Inicia el validador local, despliega, ejecuta las pruebas de Mocha y se cierra
anchor deploy --provider.cluster devnet
# El resultado incluye tu Program Id: ABC123...xyz789

💡 CONSEJO: Copiar tu Program ID del resultado del despliegue. Actualiza el valor de declare_id!("...") en lib.rs con él, luego ejecuta anchor build de nuevo para incrustar la dirección correcta en tu programa compilado. También actualiza la sección [programs.devnet] en Anchor.toml.

📌 NOTA: Estás desplegando en devnet, la red de pruebas de Solana. Esto no cuesta SOL real. Tu Airdrop de devnet de la sección de configuración cubre la tarifa de despliegue.

Ahora has escrito y probado un programa de Solana, y luego lo has desplegado utilizando el Anchor Framework. El programa reside en devnet en tu Program ID y se ejecuta cada vez que una transacción lo invoca.


Pruebas de programas Anchor: El flujo de trabajo anchor test

anchor test es un comando único que inicia un validador de Solana local, despliega tu programa en él, ejecuta tu suite completa de pruebas de Mocha y cierra el validador al finalizar. No necesitas gestionar el validador manualmente.

El flujo de trabajo de prueba en secuencia:

  1. anchor test lee tu Anchor.toml para la configuración
  2. Inicia un proceso de validador local en segundo plano
  3. Compila y despliega tu programa en ese validador
  4. Ejecuta todos los archivos de prueba de TypeScript en tu directorio tests/ usando Mocha
  5. Imprime los resultados de éxito/fallo y cierra el validador

Estructura de los archivos de prueba: Cada archivo de prueba importa desde @coral-xyz/anchor, configura un proveedor (que se conecta al validador local) y hace referencia a tu programa a través del objeto de espacio de trabajo generado por el IDL. Los bloques describe e it son sintaxis estándar de Mocha.

Obtención de datos de cuenta: Después de llamar a una instrucción, obtén la cuenta On-Chain para afirmar su estado:

const account = await program.account.balanceAccount.fetch(
  balanceAccount.publicKey
);
assert.equal(account.total.toNumber(), 0);

Prueba de casos de Error: Prueba que las entradas no válidas fallen correctamente. Un programa bien probado incluye pruebas negativas:

it("Rejects deposit from an unsigned account", async () => {
  const badActor = anchor.web3.Keypair.generate();
  try {
    await program.methods
      .deposit(new anchor.BN(100))
      .accounts({
        balanceAccount: balanceAccount.publicKey,
        user: badActor.publicKey,
      })
      .rpc();
    assert.fail("Transaction should have been rejected");
  } catch (err) {
    assert.ok(err, "Anchor rejected the unsigned transaction");
  }
});

Localnet vs. devnet: Usa anchor test (localnet) para todo el desarrollo activo. Localnet es instantánea y gratuita, y se reinicia entre ejecuciones. Despliega en devnet solo cuando quieras compartir una URL persistente o realizar pruebas en condiciones reales de red.

Mocha es el ejecutor de pruebas (la estructura de bloques describe e it). Chai proporciona la sintaxis de aserción (assert.equal, assert.ok, expect). Ambos están preconfigurados en cada proyecto de anchor init y no requieren instalación por separado.


Anchor vs. Alternativas: Eligiendo tu camino de desarrollo en Solana

Existen tres caminos de desarrollo para construir en Solana: el Anchor Framework, Rust nativo sin un framework y Seahorse. Solana en sí es una de las varias blockchains que vale la pena evaluar para tu proyecto. Las tablas a continuación presentan las diferencias clave sin propugnar por ninguna.

Tabla 1: Enfoques de desarrollo de Solana

AnchorRust Nativo (Sin Framework)Seahorse
LenguajeRust + cliente TypeScriptSolo RustPython (se compila a Rust)
Boilerplate necesarioBajo (las macros gestionan la validación)Alto (código de validación manual)Bajo
Madurez de producciónListo para producciónListo para producciónExperimental
Tamaño de la comunidadGrande (estándar de facto)MedianoPequeño
Curva de aprendizajeModerada (requiere conceptos básicos de Rust)Empinada (requiere Rust completo)Baja (sintaxis de Python)
Generación de IDL/clienteAutomáticaManualVía Anchor (internamente)
Ideal paraLa mayoría de desarrollos de aplicaciones en SolanaProgramas a nivel de sistema que requieren control totalDesarrolladores de Python para prototipado

Tabla 2: Herramientas de Solana vs. Ethereum

Anchor (Solana)Hardhat (Ethereum)Foundry (Ethereum)
BlockchainSolanaEthereumEthereum
Lenguaje principalRustSolidity + JavaScriptSolidity
Lenguaje de pruebasTypeScript (Mocha)JavaScript/TypeScriptSolidity (nativo)
Modelo de programaProgramas sin estado + cuentas separadasContratos inteligentes con estadoContratos inteligentes con estado
Rendimiento~65.000 TPS (óptimo, a partir de 2024)~15–30 TPS (Mainnet, a partir de 2024)~15–30 TPS (Mainnet, a partir de 2024)
Comisiones de transacciónNormalmente inferior a 0,001 $Variable (a menudo 1-50 $+ por tx)Variable (a menudo 1-50 $+ por tx)
Madurez del ecosistemaEn crecimiento; más jovenEl mayor ecosistema de contratos inteligentesEl mayor ecosistema de contratos inteligentes
Grupo de auditoría de seguridadMás pequeño, en crecimientoMás grande, consolidadoMás grande, consolidado
Ideal paraAplicaciones de alta frecuencia y bajas comisionesEcosistema más amplio; máximo historial de seguridadUsuarios avanzados de Ethereum que prefieren pruebas nativas en Solidity

Cuándo elegir Anchor en lugar de Rust nativo: Para muchos casos de uso de desarrollo de aplicaciones en Solana, incluidos los protocolos DeFi, las plataformas NFT, los sistemas de acceso restringido por tokens (token-gating), las DAO y los juegos On-Chain, Anchor es el punto de partida habitual. La reducción de código repetitivo (boilerplate) es sustancial: un programa que requiere 300 líneas en Rust puro podría ocupar 80 líneas con Anchor. El desarrollo en Rust nativo tiene sentido cuando un programa requiere un control preciso sobre el consumo de unidades de computación, cuando las abstracciones de Anchor entran en conflicto con una arquitectura inusual, o cuando un equipo tiene una profunda experiencia en Rust y necesita la máxima flexibilidad.

El Framework Seahorse: Seahorse permite a los desarrolladores escribir programas de Solana en Python, que luego Seahorse compila internamente a Rust compatible con Anchor. Esto reduce la barrera del lenguaje para los desarrolladores de Python que desean experimentar con Solana sin aprender Rust. La contrapartida es la madurez: Seahorse es un proyecto comunitario con una base de usuarios mucho menor que la de Anchor y no se recomienda para aplicaciones de producción a partir de 2024. Para el prototipado es una opción razonable; para la producción, Anchor sigue siendo el estándar de facto.

Ethereum vs. Solana: Ethereum ofrece el mayor ecosistema de desarrolladores de contratos inteligentes, el historial de auditorías de seguridad más profundo y el soporte de herramientas más amplio. Solana ofrece un rendimiento sustancialmente mayor y comisiones más bajas, lo que la hace más adecuada para aplicaciones donde la frecuencia de las transacciones y el coste son las principales limitaciones. Estas plataformas se adaptan a diferentes perfiles de aplicación. Los desarrolladores que crean infraestructuras de trading de alta frecuencia o juegos de microtransacciones pueden preferir Solana; los desarrolladores que crean sistemas de gobernanza o estándares de tokens que necesitan la máxima compatibilidad con el ecosistema pueden preferir Ethereum. Para la mayoría de las aplicaciones de Solana en producción, Anchor es el punto de partida común, confirmado por protocolos importantes como Raydium, Marinade Finance y Metaplex que eligen Anchor como su base.


Seguridad del Framework Anchor: Cinco vulnerabilidades que todo desarrollador de Solana debe conocer

⚠️ ADVERTENCIA: Las vulnerabilidades de seguridad en los programas de Solana pueden provocar la pérdida permanente e irreversible de los fondos de los usuarios. Antes de desplegar cualquier programa en Mainnet, pásalo por una herramienta de análisis estático como Soteria y considera una auditoría de seguridad profesional. El ecosistema de Solana ha sufrido exploits significativos debido exactamente a las vulnerabilidades descritas a continuación. La revisión de seguridad no es opcional para los programas de producción. Para una lectura más profunda, consulte la documentación oficial de Anchor.

El sistema de restricciones de Anchor, los atributos #[account(...)] en sus estructuras de cuenta, es su primera línea de defensa de seguridad. Aplica automáticamente comprobaciones de propiedad, permisos de mutabilidad y verificación de tipos que, de otro modo, tendría que escribir manualmente en Rust puro. Pero las restricciones solo protegen lo que se declara. Las vulnerabilidades que se detallan a continuación surgen de lo que los desarrolladores olvidan declarar.

Falta de comprobación del firmante (Signer Check)

Cualquier cuenta puede invocar su instrucción si no se requiere que el llamante firme la transacción. Esto permite que cualquier monedero llame a instrucciones que deberían estar restringidas.

// VULNERABLE: AccountInfo no verifica que el llamante haya firmado la transacción
#[derive(Accounts)]
pub struct Deposit<'info> {
    #[account(mut)]
    pub balance_account: Account<'info, BalanceAccount>,
    pub user: AccountInfo<'info>,  // Sin verificación de firma
}
// SEGURO: Signer<'info> falla la transacción si la cuenta no firmó
#[derive(Accounts)]
pub struct Deposit<'info> {
    #[account(mut)]
    pub balance_account: Account<'info, BalanceAccount>,
    pub user: Signer<'info>,  // La transacción se revierte si el usuario no firmó
}

Use Signer<'info> para cualquier cuenta que deba autorizar una instrucción.

Falta de comprobación de propiedad (Sustitución de cuenta)

Un atacante puede sustituir una cuenta creada maliciosamente que tenga el mismo diseño de datos que la cuenta esperada pero que sea propiedad de un programa diferente.

// VULNERABLE: AccountInfo no verifica el programa propietario de la cuenta
pub balance_account: AccountInfo<'info>,  // Acepta cualquier cuenta
// SEGURO: Account<'info, T> verifica que la cuenta es propiedad de su programa
pub balance_account: Account<'info, BalanceAccount>,  // La comprobación de propiedad es automática

Utilice siempre el contenedor tipado Account<'info, T> de Anchor en lugar de AccountInfo<'info> puro para las cuentas que contienen datos controlados por el programa.

Ataque de reinicialización

Si una instrucción initialize puede ejecutarse más de una vez en la misma cuenta, un atacante puede restablecer el estado que debería ser permanente.

// VULNERABLE: init_if_needed acepta silenciosamente cuentas ya inicializadas
#[account(init_if_needed, payer = user, space = 8 + 8)]
pub balance_account: Account<'info, BalanceAccount>,
// SEGURO: init se revierte si la cuenta ya existe
#[account(init, payer = user, space = 8 + 8)]
pub balance_account: Account<'info, BalanceAccount>,

Use init (no init_if_needed) para las cuentas que solo deben crearse una vez. Si init_if_needed es realmente necesario, añada una bandera de inicialización explícita y compruébela en la lógica de su instrucción.

Desbordamiento y subdesbordamiento de enteros (Integer Overflow/Underflow)

La aritmética de Rust entra en pánico por desbordamiento en las compilaciones de depuración (debug), pero se envuelve (wraps) silenciosamente en las compilaciones de lanzamiento (release), lo que puede corromper los saldos financieros sin generar un error.

// VULNERABLE: la aritmética directa se envuelve silenciosamente en modo release
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
    ctx.accounts.balance_account.total += amount;
    Ok(())
}
// SEGURO: checked_add devuelve un Err en lugar de envolverse en caso de desbordamiento
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
    ctx.accounts.balance_account.total = ctx.accounts.balance_account.total
        .checked_add(amount)
        .ok_or(error!(ErrorCode::Overflow))?;
    Ok(())
}

Use checked_add, checked_sub y checked_mul para toda la aritmética en valores financieros. Defina un enum ErrorCode personalizado con una variante Overflow para obtener mensajes de error claros.

El uso de una semilla de bump no canónica puede producir una dirección PDA válida pero inesperada, lo que permite ataques de suplantación de identidad de direcciones.

// VULNERABLE: el bump manual no garantiza ser canónico
#[account(seeds = [b"vault", user.key().as_ref()], bump = ctx.accounts.vault.bump)]
pub vault: Account<'info, Vault>,
// SEGURO: omita el valor de bump explícito. Anchor v0.29.x deriva y verifica
// el bump canónico automáticamente
#[account(
    seeds = [b"vault", user.key().as_ref()],
    bump,
)]
pub vault: Account<'info, Vault>,

En Anchor v0.29.x, omita el valor del bump explícito y deje que Anchor derive el bump canónico. Si guarda el bump en los datos de la cuenta, rellénelo durante init usando ctx.bumps.vault.

Para los mensajes de error que encuentre al implementar estos patrones de seguridad, consulte la sección de resolución de problemas.


Resolución de problemas comunes en Anchor

Los errores a continuación representan los problemas más comunes que los desarrolladores encuentran al construir con Anchor Framework. Cada entrada incluye el mensaje de error exacto, la causa y la solución.

📌 NOTA: Las discrepancias de versión causan la mayoría de los fallos de anchor build. Consulte esta tabla primero antes de investigar otras causas.

Versión de AnchorCLI de Solana requeridaRust requerido
v0.29.xv1.18.x o posterior1.70.0 o posterior
v0.28.xv1.16.x o posterior1.69.0 o posterior

Error 1: AccountNotInitialized

AnchorError causado por la cuenta: balance_account.
Error Código: AccountNotInitialized.
Error Número: 3012.

Causa: Su programa intentó leer una cuenta de datos que aún no existe On-Chain. La instrucción initialize no ha sido llamada.

Solución: Llame a su instrucción initialize antes de cualquier instrucción que lea de la cuenta. En las pruebas, asegúrese de que el bloque it de inicialización se ejecute antes del bloque de prueba de depósito.


Error 2: Discrepancia de tipos en anchor build

error[E0308]: tipos no coincidentes
se esperaba la estructura `anchor_lang::prelude::AccountInfo`
se encontró la estructura `anchor_lang::accounts::signer::Signer`

Causa: Su código utiliza una sintaxis de restricciones de cuenta de Anchor v0.26.x o anterior, que cambió en la v0.29.x.

Solución: Consulte la documentación oficial de Anchor para la sintaxis de restricciones de v0.29.x. Ejecute avm use 0.29.0 para confirmar que su versión de CLI coincide con su dependencia en Cargo.toml.


Error 3: Incompatibilidad de versiones de CLI de Anchor/Solana

Error: Error de respuesta RPC -32002: Falló la simulación de la transacción

Causa: Su versión de Anchor CLI y la versión de Solana CLI son incompatibles.

Solución:

avm use 0.29.0
solana --version     # Confirmar que Solana CLI es 1.18.x o posterior

Error 4: Discrepancia de declare_id! después de un redespliegue

Error: Discrepancia de Program Id

Causa: Realizó un redespliegue a una nueva dirección pero declare_id!() en lib.rs todavía mantiene el Program ID antiguo.

Solución:

anchor keys sync
anchor build

Error 5: Fondos insuficientes en Devnet

Error: Falló la simulación de la transacción: fondos insuficientes

Causa: Su monedero de devnet no tiene suficiente SOL para pagar la tarifa de despliegue o de transacción.

Solución:

solana airdrop 2
solana balance

Error 6: El binario del programa excede el límite de tamaño

Error: datos de la cuenta demasiado pequeños para la instrucción

Causa: El binario de su programa compilado excede el límite de tamaño de programa de Solana para programas actualizables.

Solución: Añada optimizaciones de lanzamiento a su Cargo.toml:

[profile.release]
opt-level = "z"
lto = true

Elimine las dependencias no utilizadas y las etiquetas de características (feature flags) de su Cargo.toml y Anchor.toml.

Si está experimentando errores de versión, regrese a la guía de instalación y verifique que las versiones de sus herramientas coincidan con la tabla de compatibilidad anterior.


El Anchor Framework y el ecosistema de desarrolladores de Solana

El Anchor Framework impulsa la mayoría de los programas de producción desplegados en la Mainnet de Solana, incluidos los protocolos en Finanzas Descentralizadas (DeFi), infraestructura de NFT y gobernanza On-Chain.

Protocolos de producción construidos con Anchor:

  • Raydium: Maker de mercado automatizado (AMM) y protocolo de Liquidez
  • Marinade Finance: Protocolo de staking líquido para SOL
  • Metaplex: Estándar de NFT, metadatos de tokens y suite de herramientas
  • Drift Protocol: Exchange de perpetuos Descentralizado
  • Kamino Finance: Protocolo de Liquidez y préstamos
  • Jito: Infraestructura de staking y validadores consciente de MEV

Los protocolos DeFi representan la categoría dominante de programas desplegados con Anchor. Los exchanges descentralizados, las plataformas de préstamos y los agregadores de rendimiento dependen del rendimiento de Solana (aproximadamente 65.000 transacciones por segundo en condiciones óptimas, a partir de 2024) y de las bajas tarifas (normalmente inferiores a 0,001 $ por transacción) para sus operaciones principales. El crecimiento de los instrumentos financieros On-Chain y la tokenización de Activos del mundo real en Solana refleja esta madurez de la infraestructura.

Según el Informe de Desarrolladores de Electric Capital (disponible en electriccapital.com para cifras actuales), la base de desarrolladores activos de Solana creció año tras año durante 2023 y hasta 2024. La creciente adopción por parte de los desarrolladores generalmente contribuye a la salud del ecosistema Blockchain, aunque esto no debe interpretarse como un consejo de inversión.

El SOL sirve como moneda para las comisiones de la red Solana. Cada transacción que invoca un programa On-Chain cuesta una pequeña cantidad de SOL (negociable en los principales exchanges de Criptomoneda, incluidos Coinbase y Binance). Para obtener datos de mercado actuales de SOL, consulte el precio actual de SOL y los datos de mercado en CoinGecko.

Más desarrolladores construyendo con Anchor significa más programas desplegados, lo que se traduce en un uso más activo de la red Solana. Esta conexión es una observación sobre la dinámica del ecosistema, no una señal de inversión.


Preguntas frecuentes sobre el Solana Anchor Framework

¿Qué lenguaje de programación utiliza Solana?

Los programas de Solana están escritos en Rust. El entorno de ejecución también admite C y C++, pero Rust es el estándar para el desarrollo en producción. Para el código del lado del cliente, incluidas las pruebas, las interacciones de front-end y los scripts que llaman a sus programas, se utilizan TypeScript y JavaScript a través del paquete npm @coral-xyz/anchor. El Anchor Framework cubre ambas capas: Rust para la lógica del programa y TypeScript para todo lo que interactúa con ella.

¿Es necesario Rust para usar el Anchor Framework?

Sí. Los programas de Anchor están escritos en Rust, y no hay otra forma de hacerlo. Dicho esto, las macros de Anchor abstraen las partes más intensivas en Rust del desarrollo en Solana: la validación de cuentas y la propagación de errores. Un desarrollador con conocimientos básicos de Rust (estructuras, funciones, traits, propiedad básica) puede construir y desplegar un programa de Anchor funcional. No se requiere una experiencia profunda en Rust en cuanto a ciclos de vida (lifetimes), patrones asíncronos y genéricos avanzados para comenzar. Sus habilidades en TypeScript o JavaScript se aplican directamente al lado del cliente de cada proyecto de Anchor.

¿Qué es una dirección derivada del programa (PDA) en términos sencillos?

Una Dirección Derivada del Programa (PDA) es una dirección de cuenta que un programa controla en lugar de un usuario con una Clave privada. Debido a que las PDA no tienen clave privada, solo el programa propietario puede autorizar transacciones que las involucren. Dados los mismos seeds e ID de programa, una PDA siempre se resuelve en la misma dirección, lo que permite a los clientes encontrar cuentas controladas por el programa sin almacenar sus direcciones por separado. Anchor gestiona la derivación de PDA automáticamente a través de la restricción seeds en sus estructuras de cuenta. Las PDA se utilizan comúnmente para bóvedas controladas por programas, cuentas de depósito en garantía (escrow) y almacenamiento de datos por usuario.

¿Se pueden crear NFT con el Anchor Framework?

Sí. La mayoría de la infraestructura de NFT de Solana está construida sobre Anchor. El estándar Metaplex, que define los metadatos de los tokens, la estructura de las colecciones y las regalías para los NFT de Solana, es en sí mismo un programa basado en Anchor. Cualquier Plataforma de NFT en Solana interactúa con los programas de Metaplex a través de la Invocación Cruzada de Programas (CPI) utilizando el crate anchor-spl, que proporciona envoltorios de tipo seguro para las instrucciones de SPL Token.

¿Se mantiene activamente el Anchor Framework?

Sí. Anchor es mantenido por Coral XYZ y es el estándar de facto para el desarrollo de programas de Solana a partir de 2024. La versión estable actual es la v0.29.x. El repositorio de GitHub de Anchor (coral-xyz/anchor) recibe lanzamientos regulares que siguen las actualizaciones del tiempo de ejecución de Solana. Los principales protocolos de producción, incluidos Raydium, Marinade Finance y Metaplex, continúan construyendo sobre Anchor, confirmando su preparación para producción.

¿Cómo se compara Anchor con Hardhat de Ethereum?

Anchor y Hardhat desempeñan roles análogos en sus respectivas blockchains: ambos proporcionan andamiaje de proyectos, un entorno de pruebas y herramientas de despliegue. Las diferencias comienzan con la arquitectura subyacente. Hardhat se dirige al modelo de contrato inteligente con estado de Ethereum, donde un contrato inteligente contiene tanto su lógica como su estado. Anchor se dirige al modelo de programa sin estado de Solana, donde los programas y los datos residen en cuentas separadas. Los lenguajes también difieren: los proyectos de Hardhat utilizan Solidity para los contratos y JavaScript o TypeScript para las pruebas; los proyectos de Anchor utilizan Rust para los programas y TypeScript para las pruebas. Los costos de transacción también difieren sustancialmente: las transacciones de Solana suelen costar menos de 0,001 $, mientras que las tarifas de gas de Ethereum varían y pueden alcanzar entre 1 $ y 50 $ o más por transacción. Para una comparación completa lado a lado, consulte las tablas de comparación de Anchor frente a alternativas.

¿Cuánto tiempo se tarda en aprender el Anchor Framework?

Un desarrollador con experiencia en TypeScript o JavaScript y sin conocimiento previo de Rust generalmente puede construir y desplegar un programa Anchor básico en devnet en uno o dos días utilizando una guía estructurada. Pasar de un programa básico a un protocolo de producción DeFi lleva semanas o meses, dependiendo de la complejidad del programa y la profundidad de conocimiento de Rust. La curva de aprendizaje de Rust es la variable principal. Los desarrolladores que invierten tiempo en los fundamentos de Rust junto con Anchor ven un progreso más rápido en programas no triviales.

¿Qué es la Solana Program Library (SPL)?

La Solana Program Library (SPL) es una colección de programas predesplegados y auditados en Solana para operaciones comunes. El programa SPL Token es el equivalente de Solana al estándar ERC-20, implementado como un programa compartido On-Chain en lugar de una plantilla de contrato que cada proyecto implementa de forma independiente. Anchor se integra con la SPL a través de la crate anchor-spl, que proporciona envoltorios seguros de tipos para instrucciones SPL Token, incluidas transfer, mint_to y burn. La SPL es también la base para metadatos de tokens NFT a través del programa Metaplex.

¿Qué es Proof of History (PoH) en Solana?

Proof of History (PoH) es un mecanismo criptográfico de cronometraje que Solana utiliza para ordenar las transacciones antes de que lleguen a los validadores para el consenso. En lugar de requerir que los validadores se comuniquen para acordar el orden de las transacciones, PoH integra una secuencia de marca de tiempo verificable directamente en la Blockchain. Esto reduce la sobrecarga de coordinación de los protocolos de consenso tradicionales y es una de las razones por las que Solana alcanza aproximadamente 65.000 transacciones por segundo en condiciones óptimas a partir de 2024.

¿Es Solana adecuada para el desarrollo de contratos inteligentes?

Solana es muy adecuada para aplicaciones donde el rendimiento de las transacciones y el costo son restricciones primarias: protocolos DeFi de alta frecuencia, mercados NFT con muchas transacciones pequeñas y juegos On-Chain. Su modelo de cuentas requiere más aprendizaje inicial que Ethereum, pero el Anchor Framework reduce significativamente esa fricción. Si Solana es la opción correcta depende de su perfil de aplicación. Ethereum ofrece un ecosistema más grande y un historial de auditoría de seguridad más establecido, mientras que Solana ofrece tarifas más bajas y un mayor rendimiento para casos de uso que se benefician de ambos.


Conclusión: ¿Es el Anchor Framework adecuado para su proyecto de Solana?

Para muchos flujos de trabajo de desarrollo de aplicaciones de Solana, el Anchor Framework es un punto de partida común, mientras que Rust nativo sigue siendo relevante cuando se requiere un control de nivel inferior.

Anchor reduce sustancialmente el código repetitivo del desarrollo nativo de Rust. Los programas que requieren cientos de líneas en código nativo de Solana toman una fracción de eso con el sistema de macros de Anchor. Aplica la seguridad de las cuentas a través de su sistema de restricciones, detectando errores de propiedad y autorización en tiempo de compilación o en tiempo de ejecución en lugar de en producción. Y genera un cliente TypeScript automáticamente a partir del IDL, brindando a los desarrolladores de JavaScript una interfaz tipada y familiar a sus programas sin escribir Rust en el lado del cliente.

Solo vale la pena considerar el desarrollo nativo de Rust cuando su programa requiere un control preciso sobre el consumo de unidades de cómputo o cuando las abstracciones de Anchor realmente entran en conflicto con una arquitectura inusual. Para la gran mayoría de programas, incluidos protocolos DeFi, plataformas NFT, DAO y sistemas de token-gating, Anchor es donde debería empezar.

Próximos pasos:

  1. Despliegue el programa de seguimiento de Balance desde esta guía en devnet usando anchor deploy --provider.cluster devnet
  2. Explore la documentación oficial de Anchor en anchor-lang.com para la referencia completa de la API y funciones avanzadas
  3. Explore el repositorio de ejemplos de GitHub de Anchor para programas con patrones de producción
  4. Únase al Discord de Anchor o al Solana Stack Exchange para obtener soporte de la comunidad cuando encuentre problemas

El programa que desplegó en esta guía es real: vive en devnet de Solana, acepta transacciones y almacena estado On-Chain. Esa es la base sobre la que se construye cada aplicación de producción de Solana.

Guías Técnicas Relacionadas de Solana

Los desarrolladores que siguen SOL junto con las herramientas del ecosistema pueden consultar la página de precios de SOL) como referencia de mercado independiente; no valida la seguridad del programa ni la preparación para el despliegue.